DART 6.10.1
Loading...
Searching...
No Matches
Node.hpp
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011-2021, 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_NODE_HPP_
34#define DART_DYNAMICS_NODE_HPP_
35
36#include <memory>
37
42
44
45namespace dart {
46namespace dynamics {
47
48class BodyNode;
49class Node;
50
51//==============================================================================
52class NodeDestructor final
53{
54public:
56 NodeDestructor(Node* _node);
57
59 NodeDestructor(const NodeDestructor& _other) = delete;
60
63
64 Node* getNode() const;
65
66private:
69};
70
71//==============================================================================
79class Node : public virtual common::Subject,
80 public virtual common::VersionCounter
81{
82public:
83 friend class BodyNode;
84 friend class Skeleton;
85 template <class>
86 friend class AccessoryNode;
87 template <class, class>
88 friend class TemplateNodePtr;
89 template <class, class>
90 friend class TemplateWeakNodePtr;
91
104 class State : public common::Cloneable<State>
105 {
106 };
107
110 template <class Mixin>
112
125 class Properties : public common::Cloneable<Properties>
126 {
127 };
128
131 template <class Mixin>
133
135 virtual ~Node() = default;
136
138 virtual const std::string& setName(const std::string& newName) = 0;
139
141 virtual const std::string& getName() const = 0;
142
144 virtual void setNodeState(const State& otherState);
145
148 virtual std::unique_ptr<State> getNodeState() const;
149
153 virtual void copyNodeStateTo(std::unique_ptr<State>& outputState) const;
154
156 virtual void setNodeProperties(const Properties& properties);
157
160 virtual std::unique_ptr<Properties> getNodeProperties() const;
161
166 virtual void copyNodePropertiesTo(
167 std::unique_ptr<Properties>& outputProperties) const;
168
171
174
178 bool isRemoved() const;
179
181 virtual std::shared_ptr<Skeleton> getSkeleton();
182
184 virtual std::shared_ptr<const Skeleton> getSkeleton() const;
185
186private:
187 std::shared_ptr<NodeDestructor> getOrCreateDestructor();
188
189protected:
191 virtual Node* cloneNode(BodyNode* bn) const = 0;
192
194 Node(BodyNode* _bn);
195
200 std::string registerNameChange(const std::string& newName);
201
203 void attach();
204
206 void stageForRemoval();
207
213 std::weak_ptr<NodeDestructor> mDestructor;
214
217
220
222 std::size_t mIndexInBodyNode;
223
225 std::size_t mIndexInSkeleton;
226
228 std::size_t mIndexInTree;
229};
231
232//==============================================================================
236template <class NodeType>
238{
239public:
241 virtual ~AccessoryNode() = default;
242
244 std::size_t getIndexInBodyNode() const;
245
247 std::size_t getIndexInSkeleton() const;
248
250 std::size_t getIndexInTree() const;
251
253 std::size_t getTreeIndex() const;
254
257 void remove();
258
261 void reattach();
262
263protected:
265 AccessoryNode() = default;
266};
267
268} // namespace dynamics
269} // namespace dart
270
272
273#endif // DART_DYNAMICS_NODE_HPP_
#define DART_DECLARE_CLASS_WITH_VIRTUAL_BASE_END
Definition ClassWithVirtualBase.hpp:44
#define DART_DECLARE_CLASS_WITH_VIRTUAL_BASE_BEGIN
Definition ClassWithVirtualBase.hpp:43
BodyPropPtr properties
Definition SdfParser.cpp:80
Cloneable is a CRTP base class that provides an interface for easily creating data structures that ar...
Definition Cloneable.hpp:54
The MakeCloneable class is used to easily create an Cloneable (such as Node::State) which simply take...
Definition Cloneable.hpp:84
The Subject class is a base class for any object that wants to report when it gets destroyed.
Definition Subject.hpp:58
VersionCounter is an interface for objects that count their versions.
Definition VersionCounter.hpp:43
AccessoryNode provides an interface for Nodes to get their index within the list of Nodes,...
Definition Node.hpp:238
std::size_t getTreeIndex() const
Get the index of this Node's tree within its Skeleton.
Definition Node.hpp:68
AccessoryNode()=default
Prevent a non-inheriting class from constructing one.
virtual ~AccessoryNode()=default
Virtual destructor.
std::size_t getIndexInBodyNode() const
Get the index of this Node within its BodyNode.
Definition Node.hpp:47
std::size_t getIndexInSkeleton() const
Get the index of this Node within its Skeleton.
Definition Node.hpp:54
void remove()
Stage the Node for removal.
Definition Node.hpp:75
void reattach()
Undo the effectos of calling remove().
Definition Node.hpp:82
std::size_t getIndexInTree() const
Get the index of this Node within its tree.
Definition Node.hpp:61
BodyNode class represents a single node of the skeleton.
Definition BodyNode.hpp:79
Definition Node.hpp:53
~NodeDestructor()
Non-virtual destructor (this class cannot be inherited)
Definition Node.cpp:52
Node * getNode() const
Definition Node.cpp:58
NodeDestructor(const NodeDestructor &_other)=delete
Do not copy.
Node * mNode
Node that this Destructor is responsible for.
Definition Node.hpp:68
If your Node has a Properties class, then that Properties class should inherit this Node::Properties ...
Definition Node.hpp:126
If your Node has a State class, then that State class should inherit this Node::State class.
Definition Node.hpp:105
The Node class is a base class for BodyNode and any object that attaches to a BodyNode.
Definition Node.hpp:81
BodyNodePtr getBodyNodePtr()
Get a pointer to the BodyNode that this Node is associated with.
Definition Node.cpp:101
void attach()
Attach the Node to its BodyNode.
Definition Node.cpp:185
virtual std::unique_ptr< Properties > getNodeProperties() const
Get the Properties of this Node.
Definition Node.cpp:88
std::string registerNameChange(const std::string &newName)
Inform the Skeleton that the name of this Node has changed.
Definition Node.cpp:168
std::size_t mIndexInTree
Index of this Node within its tree.
Definition Node.hpp:228
bool mAmAttached
bool that tracks whether this Node is attached to its BodyNode
Definition Node.hpp:219
std::size_t mIndexInSkeleton
The index of this Node within its vector in its Skeleton's NodeMap.
Definition Node.hpp:225
virtual void setNodeProperties(const Properties &properties)
Set the Properties of this Node. By default, this does nothing.
Definition Node.cpp:82
std::weak_ptr< NodeDestructor > mDestructor
weak pointer to the destructor for this Node.
Definition Node.hpp:213
bool isRemoved() const
Returns true if this Node has been staged for removal from its BodyNode.
Definition Node.cpp:113
virtual void copyNodeStateTo(std::unique_ptr< State > &outputState) const
Copy the State of this Node into a unique_ptr.
Definition Node.cpp:76
virtual void setNodeState(const State &otherState)
Set the State of this Node. By default, this does nothing.
Definition Node.cpp:64
std::size_t mIndexInBodyNode
The index of this Node within its vector in its BodyNode's NodeMap.
Definition Node.hpp:222
virtual void copyNodePropertiesTo(std::unique_ptr< Properties > &outputProperties) const
Copy the Properties of this Node into a unique_ptr.
Definition Node.cpp:94
virtual std::shared_ptr< Skeleton > getSkeleton()
Return the Skeleton that this Node is attached to.
Definition Node.cpp:125
BodyNode * mBodyNode
Pointer to the BodyNode that this Node is attached to.
Definition Node.hpp:216
virtual Node * cloneNode(BodyNode *bn) const =0
Allow your Node implementation to be cloned into a new BodyNode.
virtual ~Node()=default
Virtual destructor.
virtual const std::string & getName() const =0
Get the name of this Node.
std::shared_ptr< NodeDestructor > getOrCreateDestructor()
Definition Node.cpp:137
virtual std::unique_ptr< State > getNodeState() const
Get the State of this Node.
Definition Node.cpp:70
virtual const std::string & setName(const std::string &newName)=0
Set the name of this Node.
void stageForRemoval()
When all external references to the Node disappear, it will be deleted.
Definition Node.cpp:239
class Skeleton
Definition Skeleton.hpp:59
TemplateBodyNodePtr is a templated class that enables users to create a reference-counting BodyNodePt...
Definition BodyNodePtr.hpp:110
TemplateNodePtr is a templated class that enables users to create a strong reference-counting NodePtr...
Definition NodePtr.hpp:50
TemplateWeakNodePtr is a templated class that enables users to create a weak non-reference-holding We...
Definition NodePtr.hpp:152
Definition BulletCollisionDetector.cpp:65