33 #ifndef DART_COLLISION_COLLISIONGROUP_HPP_ 34 #define DART_COLLISION_COLLISIONGROUP_HPP_ 36 #include <unordered_map> 37 #include <unordered_set> 39 #include "dart/common/Observer.hpp" 40 #include "dart/dynamics/CollisionOption.hpp" 41 #include "dart/dynamics/CollisionResult.hpp" 42 #include "dart/dynamics/DistanceOption.hpp" 43 #include "dart/dynamics/DistanceResult.hpp" 44 #include "dart/dynamics/RaycastOption.hpp" 45 #include "dart/dynamics/RaycastResult.hpp" 46 #include "dart/dynamics/SmartPointer.hpp" 73 const std::vector<const dynamics::ShapeFrame*>& shapeFrames);
83 template <
typename... Others>
88 template <
typename... Others>
90 const std::vector<const dynamics::ShapeFrame*>& shapeFrames,
91 const Others*... others);
95 template <
typename... Others>
101 template <
typename... Others>
107 template <
typename... Others>
120 template <
typename... Others>
122 const dynamics::ConstBodyNodePtr& bodyNode,
const Others&... others);
133 template <
typename... Others>
135 const dynamics::ConstSkeletonPtr& skeleton,
const Others&... others);
149 const std::vector<const dynamics::ShapeFrame*>& shapeFrames);
159 template <
typename... Others>
164 template <
typename... Others>
166 const std::vector<const dynamics::ShapeFrame*>& shapeFrames,
167 const Others*... others);
174 template <
typename... Others>
183 template <
typename... Others>
192 template <
typename... Others>
205 template <
typename... Others>
211 template <
typename... Others>
275 const Eigen::Vector3d& from,
276 const Eigen::Vector3d& to,
319 const std::vector<CollisionObject*>& collObjects)
368 using ObjectInfoList = std::vector<std::unique_ptr<ObjectInfo>>;
412 std::unordered_set<const dynamics::ShapeFrame*> mDeletedFrames;
416 void handleDestructionNotification(
const common::Subject* subject)
override;
422 std::unordered_map<const common::Subject*, const dynamics::ShapeFrame*>
434 void removeShapeFrameInternal(
439 bool mUpdateAutomatically;
444 template <
typename Source,
typename Child =
void>
445 struct CollisionSource
454 std::unordered_map<const dynamics::ShapeFrame*, ObjectInfo*> mObjects;
464 std::unordered_set<const dynamics::ShapeFrame*>
mFrames;
468 explicit ChildInfo(
const std::size_t version) : mLastKnownVersion(version)
476 std::unordered_map<const Child*, ChildInfo> mChildren;
479 CollisionSource(
const Source& source, std::size_t lastKnownVersion)
488 = CollisionSource<dynamics::WeakConstMetaSkeletonPtr, dynamics::BodyNode>;
489 using SkeletonSources
490 = std::unordered_map<const dynamics::MetaSkeleton*, SkeletonSource>;
493 using BodyNodeSource = CollisionSource<dynamics::WeakConstBodyNodePtr>;
494 using BodyNodeSources
495 = std::unordered_map<const dynamics::BodyNode*, BodyNodeSource>;
499 bool updateSkeletonSource(SkeletonSources::value_type& entry);
503 bool updateBodyNodeSource(BodyNodeSources::value_type& entry);
510 SkeletonSources mSkeletonSources;
513 BodyNodeSources mBodyNodeSources;
516 ShapeFrameObserver mObserver;
522 #include "dart/dynamics/detail/CollisionGroup.hpp" 524 #endif // DART_COLLISION_COLLISIONGROUP_HPP_ bool collide(const CollisionOption &option=CollisionOption(false, 1u, nullptr), CollisionResult *result=nullptr)
Perform collision check within this CollisionGroup.
Definition: CollisionGroup.cpp:184
std::size_t mLastKnownVersion
The last known version of the last known shape that was held by the shape frame.
Definition: CollisionGroup.hpp:357
virtual void addCollisionObjectToEngine(CollisionObject *object)=0
Add CollisionObject to the collision detection engine.
The Subject class is a base class for any object that wants to report when it gets destroyed...
Definition: Subject.hpp:57
CollisionGroup(const CollisionDetectorPtr &collisionDetector)
Constructor.
Definition: CollisionGroup.cpp:46
void update()
Check whether this CollisionGroup's subscriptions or any of its objects need an update, and then update them if they do.
Definition: CollisionGroup.cpp:253
const dynamics::ShapeFrame * mFrame
The ShapeFrame for this object.
Definition: CollisionGroup.hpp:347
void setAutomaticUpdate(bool automatic=true)
Set whether this CollisionGroup will automatically check for updates.
Definition: CollisionGroup.cpp:241
std::unordered_set< const void * > mSources
The set of all sources that indicate that this object should be in this group.
Definition: CollisionGroup.hpp:365
void removeShapeFrame(const dynamics::ShapeFrame *shapeFrame)
Remove a ShapeFrame from this CollisionGroup.
Definition: CollisionGroup.cpp:91
bool getAutomaticUpdate() const
Get whether this CollisionGroup is set to automatically check for updates.
Definition: CollisionGroup.cpp:247
Definition: DistanceResult.hpp:46
Information on a collision object belonging to this group.
Definition: CollisionGroup.hpp:344
double distance(const DistanceOption &option=DistanceOption(false, 0.0, nullptr), DistanceResult *result=nullptr)
Get the minimum signed distance between the Shape pairs in this CollisionGroup.
Definition: CollisionGroup.cpp:206
void removeDeletedShapeFrames()
Remove any ShapeFrames that have been deleted.
Definition: CollisionGroup.cpp:265
Definition: Aspect.cpp:40
void unsubscribeFrom(const dynamics::BodyNode *bodyNode, const Others *... others)
Unsubscribe from bodyNode.
Definition: CollisionGroup.hpp:249
std::unordered_set< const dynamics::ShapeFrame * > mFrames
Last known set of frames attached to this child.
Definition: CollisionGroup.hpp:464
Definition: CollisionOption.hpp:44
std::size_t mLastKnownShapeID
The ID of that last known shape that was held by the shape frame.
Definition: CollisionGroup.hpp:353
const dynamics::ShapeFrame * getShapeFrame(std::size_t index) const
Get the ShapeFrame corresponding to the given index.
Definition: CollisionGroup.cpp:173
Definition: CollisionResult.hpp:51
Definition: DistanceOption.hpp:44
void updateEngineData()
Update engine data.
Definition: CollisionGroup.cpp:308
virtual void updateCollisionGroupEngineData()=0
Update the collision detection engine data such as broadphase algorithm.
virtual void removeAllCollisionObjectsFromEngine()=0
Remove all the CollisionObjects from the collision detection engine.
CollisionObjectPtr mObject
The CollisionObject that was generated by the CollisionDetector.
Definition: CollisionGroup.hpp:350
std::size_t getNumShapeFrames() const
Return number of ShapeFrames added to this CollisionGroup.
Definition: CollisionGroup.cpp:167
void addShapeFramesOf()
Do nothing.
Definition: CollisionGroup.cpp:79
virtual void addCollisionObjectsToEngine(const std::vector< CollisionObject *> &collObjects)=0
Add CollisionObjects to the collision detection engine.
bool raycast(const Eigen::Vector3d &from, const Eigen::Vector3d &to, const RaycastOption &option=RaycastOption(), RaycastResult *result=nullptr)
Performs raycast to this collision group.
Definition: CollisionGroup.cpp:228
Definition: CollisionObject.hpp:43
void removeAllShapeFrames()
Remove all the ShapeFrames in this CollisionGroup.
Definition: CollisionGroup.cpp:146
bool hasShapeFrame(const dynamics::ShapeFrame *shapeFrame) const
Return true if this CollisionGroup contains shapeFrame.
Definition: CollisionGroup.cpp:155
Definition: CollisionGroup.hpp:51
BodyNode class represents a single node of the skeleton.
Definition: BodyNode.hpp:74
Definition: RaycastResult.hpp:62
CollisionDetectorPtr mCollisionDetector
Collision detector.
Definition: CollisionGroup.hpp:334
ChildInfo(const std::size_t version)
A constructor that simply accepts a last known version number.
Definition: CollisionGroup.hpp:468
void subscribeTo()
Do nothing.
Definition: CollisionGroup.cpp:85
virtual ~CollisionGroup()=default
Destructor.
This is information pertaining to a child of the source.
Definition: CollisionGroup.hpp:458
Definition: ShapeFrame.hpp:189
void addShapeFrame(const dynamics::ShapeFrame *shapeFrame)
Add a ShapeFrame to this CollisionGroup.
Definition: CollisionGroup.cpp:65
Definition: RaycastOption.hpp:42
void addShapeFrames(const std::vector< const dynamics::ShapeFrame *> &shapeFrames)
Add ShapeFrames to this CollisionGroup.
Definition: CollisionGroup.cpp:71
virtual void initializeEngineData()=0
Initialize the collision detection engine data such as broadphase algorithm.
void removeShapeFramesOf()
Do nothing.
Definition: CollisionGroup.cpp:140
class Skeleton
Definition: Skeleton.hpp:55
std::size_t mLastKnownVersion
Last known version of this child.
Definition: CollisionGroup.hpp:461
void removeShapeFrames(const std::vector< const dynamics::ShapeFrame *> &shapeFrames)
Remove ShapeFrames from this CollisionGroup.
Definition: CollisionGroup.cpp:132
The Observer class should be inherited by any class that wants to respond in a customized way to the ...
Definition: Observer.hpp:51
ObjectInfoList mObjectInfoList
Information about ShapeFrames and CollisionObjects that have been added to this CollisionGroup.
Definition: CollisionGroup.hpp:372
virtual void removeCollisionObjectFromEngine(CollisionObject *object)=0
Remove CollisionObject from the collision detection engine.
CollisionDetectorPtr getCollisionDetector()
Return collision detection engine associated with this CollisionGroup.
Definition: CollisionGroup.cpp:53