DART  6.7.3
Skeleton.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2019, The DART development contributors
3  * All rights reserved.
4  *
5  * The list of contributors can be found at:
6  * https://github.com/dartsim/dart/blob/master/LICENSE
7  *
8  * This file is provided under the following "BSD-style" License:
9  * Redistribution and use in source and binary forms, with or
10  * without modification, are permitted provided that the following
11  * conditions are met:
12  * * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above
15  * copyright notice, this list of conditions and the following
16  * disclaimer in the documentation and/or other materials provided
17  * with the distribution.
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef DART_DYNAMICS_DETAIL_SKELETON_HPP_
34 #define DART_DYNAMICS_DETAIL_SKELETON_HPP_
35 
37 
38 namespace dart {
39 namespace dynamics {
40 
41 //==============================================================================
42 template <class JointType>
44  BodyNode* _bodyNode,
45  const SkeletonPtr& _newSkeleton,
46  BodyNode* _parentNode,
47  const typename JointType::Properties& _joint)
48 {
49  JointType* parentJoint = new JointType(_joint);
50 
51  if(moveBodyNodeTree(parentJoint, _bodyNode, _newSkeleton, _parentNode))
52  return parentJoint;
53 
54  // If the move failed, we should delete the Joint that we created and return
55  // a nullptr.
56  delete parentJoint;
57  return nullptr;
58 }
59 
60 //==============================================================================
61 template <class JointType>
62 std::pair<JointType*, BodyNode*> Skeleton::cloneBodyNodeTree(
63  const BodyNode* _bodyNode,
64  const SkeletonPtr& _newSkeleton,
65  BodyNode* _parentNode,
66  const typename JointType::Properties& _joint, bool _recursive) const
67 {
68  JointType* parentJoint = new JointType(_joint);
69  std::pair<Joint*, BodyNode*> root =
70  cloneBodyNodeTree(parentJoint, _bodyNode, _newSkeleton, _parentNode,
71  _recursive);
72  return std::pair<JointType*, BodyNode*>(parentJoint, root.second);
73 }
74 
75 //==============================================================================
76 template <class JointType, class NodeType>
77 std::pair<JointType*, NodeType*> Skeleton::createJointAndBodyNodePair(
78  BodyNode* _parent,
79  const typename JointType::Properties& _jointProperties,
80  const typename NodeType::Properties& _bodyProperties)
81 {
82  JointType* joint = new JointType(_jointProperties);
83  NodeType* node = new NodeType(_parent, joint, _bodyProperties);
84  registerBodyNode(node);
85 
86  return std::pair<JointType*, NodeType*>(joint, node);
87 }
88 
89 } // namespace dynamics
90 } // namespace dart
91 
92 #endif // DART_DYNAMICS_DETAIL_SKELETON_HPP_
BodyNode class represents a single node of the skeleton.
Definition: BodyNode.hpp:78
std::pair< JointType *, NodeType * > createJointAndBodyNodePair(BodyNode *_parent=nullptr, const typename JointType::Properties &_jointProperties=typename JointType::Properties(), const typename NodeType::Properties &_bodyProperties=typename NodeType::Properties())
Create a Joint and child BodyNode pair of the given types.
Definition: Skeleton.hpp:77
std::pair< Joint *, BodyNode * > cloneBodyNodeTree(Joint *_parentJoint, const BodyNode *_bodyNode, const SkeletonPtr &_newSkeleton, BodyNode *_parentNode, bool _recursive) const
Copy a subtree of BodyNodes onto another Skeleton while leaving the originals intact.
Definition: Skeleton.cpp:2590
bool moveBodyNodeTree(Joint *_parentJoint, BodyNode *_bodyNode, SkeletonPtr _newSkeleton, BodyNode *_parentNode)
Move a subtree of BodyNodes from this Skeleton to another Skeleton.
Definition: Skeleton.cpp:2482
void registerBodyNode(BodyNode *_newBodyNode)
Register a BodyNode with the Skeleton. Internal use only.
Definition: Skeleton.cpp:2113
std::shared_ptr< Skeleton > SkeletonPtr
Definition: SmartPointer.hpp:60
Definition: BulletCollisionDetector.cpp:63