33#ifndef DART_DYNAMICS_DETAIL_NODE_HPP_
34#define DART_DYNAMICS_DETAIL_NODE_HPP_
45template <
class NodeType>
48 return static_cast<const NodeType*
>(
this)->mIndexInBodyNode;
52template <
class NodeType>
55 return static_cast<const NodeType*
>(
this)->mIndexInSkeleton;
59template <
class NodeType>
62 return static_cast<const NodeType*
>(
this)->mIndexInTree;
66template <
class NodeType>
69 return static_cast<const NodeType*
>(
this)->getBodyNodePtr()->getTreeIndex();
73template <
class NodeType>
76 return static_cast<NodeType*
>(
this)->stageForRemoval();
80template <
class NodeType>
83 static_cast<NodeType*
>(
this)->attach();
92#define DART_ENABLE_NODE_SPECIALIZATION() \
95 std::size_t getNumNodes() const \
97 return dart::dynamics::BodyNode::getNumNodes<T>(); \
100 T* getNode(std::size_t index) \
102 return dart::dynamics::BodyNode::getNode<T>(index); \
105 const T* getNode(std::size_t index) const \
107 return dart::dynamics::BodyNode::getNode<T>(index); \
111#define DETAIL_DART_INSTANTIATE_SPECIALIZED_NODE(NodeName, it) \
112 mNodeMap[typeid(NodeName)] = std::vector<dart::dynamics::Node*>(); \
113 it = mNodeMap.find(typeid(NodeName));
116#define DART_INSTANTIATE_SPECIALIZED_NODE_IRREGULAR(NodeName, PluralName) \
117 DETAIL_DART_INSTANTIATE_SPECIALIZED_NODE(NodeName, m##PluralName##Iterator)
120#define DART_INSTANTIATE_SPECALIZED_NODE(NodeName) \
121 DART_INSTANTIATE_SPECIALIZED_NODE_IRREGULAR(NodeName, NodeName##s)
124#define DETAIL_DART_SPECIALIZED_NODE_INLINE(NodeName, PluralName, it) \
126 dart::dynamics::BodyNode::NodeMap::iterator it; \
129 inline std::size_t getNum##PluralName() const \
131 return it->second.size(); \
134 inline NodeName* get##NodeName(std::size_t index) \
136 return static_cast<NodeName*>( \
137 getVectorObjectIfAvailable(index, it->second)); \
140 inline const NodeName* get##NodeName(std::size_t index) const \
142 return static_cast<const NodeName*>( \
143 getVectorObjectIfAvailable(index, it->second)); \
147#define DART_SPECIALIZED_NODE_INLINE_IRREGULAR(NodeName, PluralName) \
148 DETAIL_DART_SPECIALIZED_NODE_INLINE( \
149 NodeName, PluralName, m##PluralName##Iterator)
152#define DART_SPECIALIZED_NODE_INTERNAL(NodeName) \
153 DART_SPECIALIZED_NODE_INLINE_IRREGULAR(NodeName, NodeName##s)
156#define DETAIL_DART_SPECIALIZED_NODE_DECLARE(NodeName, PluralName, it) \
158 dart::dynamics::BodyNode::NodeMap::iterator it; \
161 std::size_t getNum##PluralName() const; \
162 NodeName* get##NodeName(std::size_t index); \
163 const NodeName* get##NodeName(std::size_t index) const;
166#define DART_SPECIALIZED_NODE_DECLARE_IRREGULAR(NodeName, PluralName) \
167 DETAIL_DART_SPECIALIZED_NODE_DECLARE( \
168 NodeName, PluralName, m##PluralName##Iterator)
171#define DART_SPECIALIZED_NODE_DECLARE(NodeName) \
172 DART_SPECIALIZED_NODE_DECLARE_IRREGULAR(NodeName, NodeName##s)
175#define DETAIL_DART_SPECIALIZED_NODE_DEFINE( \
176 BodyNodeType, NodeName, PluralName, it) \
177 std::size_t BodyNodeType ::getNum##PluralName() const \
179 return it->second.size(); \
182 NodeName* BodyNodeType ::get##NodeName(std::size_t index) \
184 return static_cast<NodeName*>( \
185 getVectorObjectIfAvailable(index, it->second)); \
188 const NodeName* BodyNodeType ::get##NodeName(std::size_t index) const \
190 return static_cast<const NodeName*>( \
191 getVectorObjectIfAvailable(index, it->second)); \
195#define DART_SPECIALIZED_NODE_DEFINE_IRREGULAR( \
196 BodyNodeType, NodeName, PluralName) \
197 DETAIL_DART_SPECIALIZED_NODE_DEFINE( \
198 BodyNodeType, NodeName, PluralName, m##PluralName##Iterator)
201#define DART_SPECIALIZED_NODE_DEFINE(BodyNodeType, NodeName) \
202 DART_SPECIALIZED_NODE_DEFINE_IRREGULAR(BodyNodeType, NodeName, NodeName##s)
205#define DETAIL_DART_SPECIALIZED_NODE_TEMPLATE( \
206 BodyNodeType, NodeName, PluralName) \
208 inline std::size_t BodyNodeType ::getNumNodes<NodeName>() const \
210 return getNum##PluralName(); \
213 inline NodeName* BodyNodeType ::getNode<NodeName>(std::size_t index) \
215 return get##NodeName(index); \
218 inline const NodeName* BodyNodeType ::getNode<NodeName>(std::size_t index) \
221 return get##NodeName(index); \
225#define DART_SPECIALIZED_NODE_TEMPLATE_IRREGULAR( \
226 BodyNodeType, NodeName, PluralName) \
227 DETAIL_DART_SPECIALIZED_NODE_TEMPLATE(BodyNodeType, NodeName, PluralName)
230#define DART_SPECIALIZED_NODE_TEMPLATE(BodyNodeType, NodeName) \
231 DART_SPECIALIZED_NODE_TEMPLATE_IRREGULAR(BodyNodeType, NodeName, NodeName##s)
236#define DART_SKEL_ENABLE_NODE_SPECIALIZATION() \
239 std::size_t getNumNodes() const \
241 return dart::dynamics::Skeleton::getNumNodes<T>(); \
244 std::size_t getNumNodes(std::size_t treeIndex) const \
246 return dart::dynamics::Skeleton::getNumNodes<T>(treeIndex); \
249 T* getNode(std::size_t index) \
251 return dart::dynamics::Skeleton::getNode<T>(index); \
254 T* getNode(std::size_t nodeIdx, std::size_t treeIndex) \
256 return dart::dynamics::Skeleton::getNode<T>(nodeIdx, treeIndex); \
259 const T* getNode(std::size_t index) const \
261 return dart::dynamics::Skeleton::getNode<T>(index); \
264 const T* getNode(std::size_t nodeIdx, std::size_t treeIndex) const \
266 return dart::dynamics::Skeleton::getNode<T>(nodeIdx, treeIndex); \
269 T* getNode(const std::string& name) \
271 return dart::dynamics::Skeleton::getNode<T>(name); \
274 const T* getNode(const std::string& name) const \
276 return dart::dynamics::Skeleton::getNode<T>(name); \
280#define DART_SKEL_INSTANTIATE_SPECIALIZED_NODE_IRREGULAR(NodeName, PluralName) \
281 mSpecializedTreeNodes[typeid(NodeName)] = &mTree##PluralName##Iterators; \
282 mSkelCache.mNodeMap[typeid(NodeName)] \
283 = std::vector<dart::dynamics::Node*>(); \
284 m##PluralName##Iterator = mSkelCache.mNodeMap.find(typeid(NodeName)); \
285 mNodeNameMgrMap[typeid(NodeName)] = dart::common::NameManager<Node*>( \
286 std::string("Skeleton::") + #NodeName + " | " \
287 + mAspectProperties.mName); \
288 mNameMgrFor##PluralName = &mNodeNameMgrMap.find(typeid(NodeName))->second;
291#define DART_SKEL_INSTANTIATE_SPECIALIZED_NODE(NodeName) \
292 DART_SKEL_INSTANTIATE_SPECIALIZED_NODE_IRREGULAR(NodeName, NodeName##s);
295#define DETAIL_DART_WARN_TREE_INDEX(treeIts, treeIndex, func) \
296 if (treeIndex >= treeIts.size()) \
298 dterr << "[" << #func << "] Requesting an invalid tree (" << treeIndex \
300 << "The number of trees in this Skeleton is: " << treeIts.size() \
307#define DETAIL_DART_SKEL_SPECIALIZED_NODE_INLINE( \
308 NodeName, PluralName, skelIt, treeIts, NameMgr) \
310 dart::dynamics::Skeleton::NodeMap::iterator skelIt; \
311 std::vector<dart::dynamics::Skeleton::NodeMap::iterator> treeIts; \
312 dart::common::NameManager<dart::dynamics::Node*>* NameMgr; \
315 inline std::size_t getNum##PluralName() const \
317 return skelIt->second.size(); \
319 inline std::size_t getNum##PluralName(std::size_t treeIndex) const \
321 DETAIL_DART_WARN_TREE_INDEX(treeIts, treeIndex, getNum##PluralName); \
322 treeIts[treeIndex]->second.size(); \
325 inline NodeName* get##NodeName(std::size_t index) \
327 return static_cast<NodeName*>( \
328 getVectorObjectIfAvailable(index, skelIt->second)); \
330 inline NodeName* get##NodeName(std::size_t treeIndex, std::size_t nodeIndex) \
332 DETAIL_DART_WARN_TREE_INDEX(treeIts, treeIndex, get##NodeName); \
333 return static_cast<NodeName*>( \
334 getVectorObjectIfAvailable(nodeIndex, treeIts[treeIndex]->second)); \
337 inline const NodeName* get##NodeName(std::size_t index) const \
339 return static_cast<const NodeName*>( \
340 getVectorObjectIfAvailable(index, skelIt->second)); \
342 inline const NodeName* get##NodeName( \
343 std::size_t treeIndex, std::size_t nodeIndex) const \
345 DETAIL_DART_WARN_TREE_INDEX(treeIts, treeIndex, get##NodeName); \
346 return static_cast<const NodeName*>( \
347 getVectorObjectIfAvailable(nodeIndex, treeIts[treeIndex]->second)); \
350 inline NodeName* get##NodeName(const std::string& name) \
352 return static_cast<NodeName*>(NameMgr->getObject(name)); \
354 inline const NodeName* get##NodeName(const std::string& name) const \
356 return static_cast<const NodeName*>(NameMgr->getObject(name)); \
360#define DART_SKEL_SPECIALIZED_NODE_INLINE_IRREGULAR(NodeName, PluralName) \
361 DETAIL_DART_SKEL_SPECIALIZED_NODE_INLINE( \
364 m##PluralName##Iterator, \
365 mTree##PluralName##Iterators, \
366 mNameMgrFor##PluralName);
369#define DART_SKEL_SPECIALIZED_NODE_INLINE(NodeName) \
370 DART_SKEL_SPECIALIZED_NODE_INLINE_IRREGULAR(NodeName, NodeName##s);
373#define DETAIL_DART_SKEL_SPECIALIZED_NODE_DECLARE( \
374 NodeName, PluralName, skelIt, treeIts, NameMgr) \
376 dart::dynamics::Skeleton::NodeMap::iterator skelIt; \
377 std::vector<dart::dynamics::Skeleton::NodeMap::iterator> treeIts; \
378 dart::common::NameManager<dart::dynamics::Node*>* NameMgr; \
381 std::size_t getNum##PluralName() const; \
383 std::size_t getNum##PluralName(std::size_t treeIndex) const; \
385 NodeName* get##NodeName(std::size_t index); \
387 NodeName* get##NodeName(std::size_t treeIndex, std::size_t nodeIndex); \
389 const NodeName* get##NodeName(std::size_t index) const; \
391 const NodeName* get##NodeName(std::size_t treeIndex, std::size_t nodeIndex) \
394 NodeName* get##NodeName(const std::string& name); \
396 const NodeName* get##NodeName(const std::string& name) const;
399#define DART_SKEL_SPECIALIZED_NODE_DECLARE_IRREGULAR(NodeName, PluralName) \
400 DETAIL_DART_SKEL_SPECIALIZED_NODE_DECLARE( \
403 m##PluralName##Iterator, \
404 mTree##PluralName##Iterators, \
405 mNameMgrFor##PluralName);
408#define DART_SKEL_SPECIALIZED_NODE_DECLARE(NodeName) \
409 DART_SKEL_SPECIALIZED_NODE_DECLARE_IRREGULAR(NodeName, NodeName##s);
412#define DETAIL_DART_SKEL_SPECIALIZED_NODE_DEFINE( \
413 SkeletonType, NodeName, PluralName, skelIt, treeIts, NameMgr) \
414 std::size_t SkeletonType ::getNum##PluralName() const \
416 return skelIt->second.size(); \
418 std::size_t SkeletonType ::getNum##PluralName(std::size_t treeIndex) const \
420 DETAIL_DART_WARN_TREE_INDEX(treeIts, treeIndex, getNum##PluralName); \
421 return treeIts[treeIndex]->second.size(); \
424 NodeName* SkeletonType ::get##NodeName(std::size_t index) \
426 return static_cast<NodeName*>( \
427 getVectorObjectIfAvailable(index, skelIt->second)); \
429 NodeName* SkeletonType ::get##NodeName( \
430 std::size_t treeIndex, std::size_t nodeIndex) \
432 DETAIL_DART_WARN_TREE_INDEX(treeIts, treeIndex, get##NodeName); \
433 return static_cast<NodeName*>( \
434 getVectorObjectIfAvailable(nodeIndex, treeIts[treeIndex]->second)); \
437 const NodeName* SkeletonType ::get##NodeName(std::size_t index) const \
439 return static_cast<const NodeName*>( \
440 getVectorObjectIfAvailable(index, skelIt->second)); \
442 const NodeName* SkeletonType ::get##NodeName( \
443 std::size_t treeIndex, std::size_t nodeIndex) const \
445 DETAIL_DART_WARN_TREE_INDEX(treeIts, treeIndex, get##NodeName); \
446 return static_cast<const NodeName*>( \
447 getVectorObjectIfAvailable(nodeIndex, treeIts[treeIndex]->second)); \
450 NodeName* SkeletonType ::get##NodeName(const std::string& name) \
452 return static_cast<NodeName*>(NameMgr->getObject(name)); \
454 const NodeName* SkeletonType ::get##NodeName(const std::string& name) const \
456 return static_cast<const NodeName*>(NameMgr->getObject(name)); \
460#define DART_SKEL_SPECIALIZED_NODE_DEFINED_IRREGULAR( \
461 SkeletonType, NodeName, PluralName) \
462 DETAIL_DART_SKEL_SPECIALIZED_NODE_DEFINE( \
466 m##PluralName##Iterator, \
467 mTree##PluralName##Iterators, \
468 mNameMgrFor##PluralName);
471#define DART_SKEL_SPECIALIZED_NODE_DEFINE(SkeletonType, NodeName) \
472 DART_SKEL_SPECIALIZED_NODE_DEFINED_IRREGULAR( \
473 SkeletonType, NodeName, NodeName##s);
476#define DETAIL_DART_SKEL_SPECIALIZED_NODE_TEMPLATE( \
477 SkelType, NodeName, PluralName) \
479 inline std::size_t SkelType ::getNumNodes<NodeName>() const \
481 return getNum##PluralName(); \
484 inline std::size_t SkelType ::getNumNodes<NodeName>(std::size_t index) const \
486 return getNum##PluralName(index); \
489 inline NodeName* SkelType ::getNode<NodeName>(std::size_t index) \
491 return get##NodeName(index); \
494 inline NodeName* SkelType ::getNode<NodeName>( \
495 std::size_t treeIndex, std::size_t nodeIndex) \
497 return get##NodeName(treeIndex, nodeIndex); \
500 inline const NodeName* SkelType ::getNode<NodeName>(std::size_t index) const \
502 return get##NodeName(index); \
505 inline const NodeName* SkelType ::getNode<NodeName>( \
506 std::size_t treeIndex, std::size_t nodeIndex) const \
508 return get##NodeName(treeIndex, nodeIndex); \
511 inline NodeName* SkelType::getNode<NodeName>(const std::string& name) \
513 return get##NodeName(name); \
516 inline const NodeName* SkelType::getNode<NodeName>(const std::string& name) \
519 return get##NodeName(name); \
523#define DART_SKEL_SPECIALIZED_NODE_TEMPLATE_IRREGULAR( \
524 SkelType, NodeName, PluralName) \
525 DETAIL_DART_SKEL_SPECIALIZED_NODE_TEMPLATE(SkelType, NodeName, PluralName)
528#define DART_SKEL_SPECIALIZED_NODE_TEMPLATE(SkelType, NodeName) \
529 DART_SKEL_SPECIALIZED_NODE_TEMPLATE_IRREGULAR( \
530 SkelType, NodeName, NodeName##s);
std::size_t getTreeIndex() const
Get the index of this Node's tree within its Skeleton.
Definition Node.hpp:67
std::size_t getIndexInBodyNode() const
Get the index of this Node within its BodyNode.
Definition Node.hpp:46
std::size_t getIndexInSkeleton() const
Get the index of this Node within its Skeleton.
Definition Node.hpp:53
void remove()
Stage the Node for removal.
Definition Node.hpp:74
void reattach()
Undo the effectos of calling remove().
Definition Node.hpp:81
std::size_t getIndexInTree() const
Get the index of this Node within its tree.
Definition Node.hpp:60
Definition BulletCollisionDetector.cpp:60