![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /******************************************************************************* 00002 ** Copyright (c) 2004 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 /******************************************************************************* 00006 ** $RCSfile: collisionDetector.h,v $ $Revision: 1.16 $ $State: Exp $ 00007 *******************************************************************************/ 00008 00009 00012 00015 00016 #ifndef collisionDetector_H_ 00017 #define collisionDetector_H_ 00018 00019 #include "vrfmodel/vrfmodelDefines.h" 00020 #include "vrfobjcore/simCmpnt.h" 00021 #include "vrfobjcore/vrfObjMgr.h" 00022 #include "vrfobjcore/vectorObstruction.h" 00023 #include "vrfobjcore/entityCollision.h" 00024 #include "vrfobjcore/vectorObstructionCollision.h" 00025 #include "vrfobjcore/vectorObstructionID.h" 00026 #include "vlutil/vlSmartPointers.h" 00027 00028 #include <list> 00029 #include <set> 00030 #include <vector> 00031 00032 class DtCollision; 00033 class DtString; 00034 class DtSimManager; 00035 class Dt3dBoundingVolume; 00036 class DtObjectType; 00037 00040 template <typename T_Collision> 00041 class DtCollisionProcessor 00042 { 00043 public: 00044 DtCollisionProcessor() {}; 00045 virtual ~DtCollisionProcessor() {}; 00046 00047 virtual void processCollision(const T_Collision& collision) = 0; 00048 }; 00049 00057 class DT_DLL_vrfmodel DtCollisionDetector 00058 { 00059 public: 00060 00061 typedef std::set<DtObjectType> DtObjectObstructionIDContainer; 00062 typedef DtObjectObstructionIDContainer::iterator DtObjectObstructionIDIter; 00063 typedef DtObjectObstructionIDContainer::const_iterator DtObjectObstructionIDConstIter; 00064 00065 typedef std::list<DtVectorObstructionID> DtVectorObstructionIDContainer; 00066 typedef DtVectorObstructionIDContainer::iterator DtVectorObstructionIDIter; 00067 typedef DtVectorObstructionIDContainer::const_iterator DtVectorObstructionIDConstIter; 00068 00069 typedef std::set<DtVrfObject*> DtObjectObstructionContainer; 00070 typedef DtObjectObstructionContainer::iterator DtObjectObstructionIter; 00071 typedef DtObjectObstructionContainer::const_iterator DtObjectObstructionConstIter; 00072 00073 typedef std::set<DtVectorObstruction*> DtVectorObstructionContainer; 00074 typedef DtVectorObstructionContainer::iterator DtVectorObstructionIter; 00075 typedef DtVectorObstructionContainer::const_iterator DtVectorObstructionConstIter; 00076 00077 00087 DtCollisionDetector(DtSimManager* simManager); 00088 00090 virtual ~DtCollisionDetector(); 00091 00092 private: 00094 DtCollisionDetector(const DtCollisionDetector& orig); 00095 00097 DtCollisionDetector& operator=(const DtCollisionDetector& orig); 00098 00099 public: 00100 00102 virtual void setObjectToIgnore(DtVrfObject* vrfObject); 00103 00106 virtual void addObjectObstructionID(const DtObjectType& objectObstructionID); 00107 virtual void addVectorObstructionID(const DtVectorObstructionID& vectorObstructionIDs); 00108 00109 virtual void removeObjectObstructionID(const DtObjectType& objectObstructionID); 00110 virtual void removeVectorObstructionID(const DtVectorObstructionID& vectorObstructionID); 00111 00113 virtual void setObjectObstructionIDs(const DtObjectObstructionIDContainer& objectIDs); 00115 virtual void setVectorObstructionIDs(const DtVectorObstructionIDContainer& vectorIDs); 00117 00120 virtual DtObjectObstructionIDIter objectIDsBegin(); 00121 virtual DtObjectObstructionIDConstIter objectIDsBegin() const; 00122 00123 virtual DtVectorObstructionIDIter vectorIDsBegin(); 00124 virtual DtVectorObstructionIDConstIter vectorIDsBegin() const; 00125 00126 virtual DtObjectObstructionIDIter objectIDsEnd(); 00127 virtual DtObjectObstructionIDConstIter objectIDsEnd() const; 00128 00129 virtual DtVectorObstructionIDIter vectorIDsEnd(); 00130 virtual DtVectorObstructionIDConstIter vectorIDsEnd() const; 00132 00144 virtual bool detectPotentialCollision(Dt3dBoundingVolume& collisionBv, 00145 const DtVector& localPosition, const DtDcm& bvOrientation, 00146 DtCollision*& potentialCollision); 00147 00150 virtual bool detectAllEntityCollisions(Dt3dBoundingVolume& collisionBv, 00151 const DtVector& localPosition, const DtDcm& bvOrientation, 00152 std::list<DtBoost::shared_ptr<DtEntityCollision> >& collisionList); 00153 00172 virtual bool getObjectObstructions(DtObjectObstructionContainer& objectObstructions) const; 00173 virtual bool getObjectObstructions(Dt3dBoundingVolume& boundingVolume, 00174 const DtVector& bvLocation, const DtDcm& bvOrientation, 00175 DtObjectObstructionContainer& objectObstructions) const; 00176 00187 virtual bool vrfObjectObstructionPredicate(const DtVrfObject& vrfObjectToTest) const; 00188 00189 00206 virtual bool getVectorObstructions(DtVectorObstructionContainer& vectorObstructions) const; 00207 virtual bool getVectorObstructions(Dt3dBoundingVolume& boundingVolume, 00208 const DtVector& bvLocation, const DtDcm& bvOrientation, 00209 DtVectorObstructionContainer& obstructionsToTest) const; 00210 00220 virtual bool checkForCollision(Dt3dBoundingVolume& collisionBV, 00221 DtCollision& potentialCollision, const DtVector& localPosition, 00222 const DtDcm& bvOrientation) const; 00223 00224 protected: 00233 bool detectNewClosestCollision(Dt3dBoundingVolume& collisionBV, DtCollision*& potentialCollision, 00234 const DtVector& localPosition, const DtDcm& bvOrientation) const; 00235 00245 bool detectObjectCollision(Dt3dBoundingVolume& collisionBV, 00246 DtCollisionProcessor<DtEntityCollision>& collisionProcessor, const DtVector& localPosition, 00247 const DtDcm& bvOrientation) const; 00248 bool detectVectorCollision(Dt3dBoundingVolume& collisionBV, 00249 DtCollisionProcessor<DtVectorObstructionCollision>&, const DtVector& localPosition, const DtDcm& bvOrientation) const; 00250 00252 DtCollision* primaryCollision(DtCollision* firstCollision, DtCollision* secondCollision) const; 00253 00255 bool testInvariant() const; 00256 00257 protected: 00259 DtObjectObstructionIDContainer myObjectObstructionIDs; 00260 DtVectorObstructionIDContainer myVectorObstructionIDs; 00261 00262 DtSimManager* mySimManager; 00263 00266 DtVrfObject* myObjectToIgnore; 00267 }; 00268 00270 bool DtSameOrAttached(const DtVrfObject* primaryEntity, const DtVrfObject& secondaryEntity); 00271 00276 bool DtWithinDistance(const DtVector& startLocation, 00277 const DtVector& endLocation, 00278 double offset, 00279 double distanceSquared, 00280 double& actualDistanceSquared); 00281 00282 00283 00286 template <typename T_Collision> 00287 class DtClosestCollisionProcessor : public DtCollisionProcessor<T_Collision> 00288 { 00289 public: 00290 DtClosestCollisionProcessor(T_Collision* initialCollision = 0); 00291 virtual ~DtClosestCollisionProcessor(); 00292 00293 virtual void processCollision(const T_Collision& collision); 00294 00295 virtual T_Collision* closestCollision(); 00296 00297 protected: 00298 T_Collision* myClosestCollision; 00299 double myClosestCollisionDistanceSquared; 00300 00301 }; 00302 00305 template <typename T_Collision> 00306 class DtAllCollisionProcessor : public DtCollisionProcessor<T_Collision> 00307 { 00308 public: 00309 typedef std::list<DtBoost::shared_ptr<T_Collision> > DtCollisionList; 00310 00311 DtAllCollisionProcessor(DtCollisionList& collisionList); 00312 virtual ~DtAllCollisionProcessor(); 00313 00314 virtual void processCollision(const T_Collision& collision); 00315 00316 protected: 00317 DtCollisionList& myCollisionList; 00318 }; 00319 00320 #define callbackList_inl_ 00321 #include "vrfmodel/collisionDetector.inl" 00322 #undef callbackList_inl_ 00323 00324 #endif