Differential D8762 Diff 28333 extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
Changeset View
Changeset View
Standalone View
Standalone View
extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
| Show All 23 Lines | |||||
| class btDispatcher; | class btDispatcher; | ||||
| #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" | #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" | ||||
| #include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" | #include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" | ||||
| class btSoftBody; | class btSoftBody; | ||||
| class btCollisionShape; | class btCollisionShape; | ||||
| #include "LinearMath/btHashMap.h" | #include "LinearMath/btHashMap.h" | ||||
| #include "BulletCollision/BroadphaseCollision/btQuantizedBvh.h" //for definition of MAX_NUM_PARTS_IN_BITS | #include "BulletCollision/BroadphaseCollision/btQuantizedBvh.h" //for definition of MAX_NUM_PARTS_IN_BITS | ||||
| struct btTriIndex | struct btTriIndex | ||||
| { | { | ||||
| int m_PartIdTriangleIndex; | int m_PartIdTriangleIndex; | ||||
| class btCollisionShape* m_childShape; | class btCollisionShape* m_childShape; | ||||
| btTriIndex(int partId,int triangleIndex,btCollisionShape* shape) | btTriIndex(int partId, int triangleIndex, btCollisionShape* shape) | ||||
| { | { | ||||
| m_PartIdTriangleIndex = (partId<<(31-MAX_NUM_PARTS_IN_BITS)) | triangleIndex; | m_PartIdTriangleIndex = (partId << (31 - MAX_NUM_PARTS_IN_BITS)) | triangleIndex; | ||||
| m_childShape = shape; | m_childShape = shape; | ||||
| } | } | ||||
| int getTriangleIndex() const | int getTriangleIndex() const | ||||
| { | { | ||||
| // Get only the lower bits where the triangle index is stored | // Get only the lower bits where the triangle index is stored | ||||
| unsigned int x = 0; | unsigned int x = 0; | ||||
| unsigned int y = (~(x&0))<<(31-MAX_NUM_PARTS_IN_BITS); | unsigned int y = (~(x & 0)) << (31 - MAX_NUM_PARTS_IN_BITS); | ||||
| return (m_PartIdTriangleIndex&~(y)); | return (m_PartIdTriangleIndex & ~(y)); | ||||
| } | } | ||||
| int getPartId() const | int getPartId() const | ||||
| { | { | ||||
| // Get only the highest bits where the part index is stored | // Get only the highest bits where the part index is stored | ||||
| return (m_PartIdTriangleIndex>>(31-MAX_NUM_PARTS_IN_BITS)); | return (m_PartIdTriangleIndex >> (31 - MAX_NUM_PARTS_IN_BITS)); | ||||
| } | } | ||||
| int getUid() const | int getUid() const | ||||
| { | { | ||||
| return m_PartIdTriangleIndex; | return m_PartIdTriangleIndex; | ||||
| } | } | ||||
| }; | }; | ||||
| ///For each triangle in the concave mesh that overlaps with the AABB of a soft body (m_softBody), processTriangle is called. | ///For each triangle in the concave mesh that overlaps with the AABB of a soft body (m_softBody), processTriangle is called. | ||||
| class btSoftBodyTriangleCallback : public btTriangleCallback | class btSoftBodyTriangleCallback : public btTriangleCallback | ||||
| { | { | ||||
| btSoftBody* m_softBody; | btSoftBody* m_softBody; | ||||
| const btCollisionObject* m_triBody; | const btCollisionObject* m_triBody; | ||||
| btVector3 m_aabbMin; | btVector3 m_aabbMin; | ||||
| btVector3 m_aabbMax ; | btVector3 m_aabbMax; | ||||
| btManifoldResult* m_resultOut; | btManifoldResult* m_resultOut; | ||||
| btDispatcher* m_dispatcher; | btDispatcher* m_dispatcher; | ||||
| const btDispatcherInfo* m_dispatchInfoPtr; | const btDispatcherInfo* m_dispatchInfoPtr; | ||||
| btScalar m_collisionMarginTriangle; | btScalar m_collisionMarginTriangle; | ||||
| btHashMap<btHashKey<btTriIndex>,btTriIndex> m_shapeCache; | btHashMap<btHashKey<btTriIndex>, btTriIndex> m_shapeCache; | ||||
| public: | public: | ||||
| int m_triangleCount; | int m_triangleCount; | ||||
| // btPersistentManifold* m_manifoldPtr; | // btPersistentManifold* m_manifoldPtr; | ||||
| btSoftBodyTriangleCallback(btDispatcher* dispatcher,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped); | btSoftBodyTriangleCallback(btDispatcher* dispatcher, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped); | ||||
| void setTimeStepAndCounters(btScalar collisionMarginTriangle,const btCollisionObjectWrapper* triObjWrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); | void setTimeStepAndCounters(btScalar collisionMarginTriangle, const btCollisionObjectWrapper* triObjWrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); | ||||
| virtual ~btSoftBodyTriangleCallback(); | virtual ~btSoftBodyTriangleCallback(); | ||||
| virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex); | virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex); | ||||
| void clearCache(); | void clearCache(); | ||||
| SIMD_FORCE_INLINE const btVector3& getAabbMin() const | SIMD_FORCE_INLINE const btVector3& getAabbMin() const | ||||
| { | { | ||||
| return m_aabbMin; | return m_aabbMin; | ||||
| } | } | ||||
| SIMD_FORCE_INLINE const btVector3& getAabbMax() const | SIMD_FORCE_INLINE const btVector3& getAabbMax() const | ||||
| { | { | ||||
| return m_aabbMax; | return m_aabbMax; | ||||
| } | } | ||||
| }; | }; | ||||
| /// btSoftBodyConcaveCollisionAlgorithm supports collision between soft body shapes and (concave) trianges meshes. | /// btSoftBodyConcaveCollisionAlgorithm supports collision between soft body shapes and (concave) trianges meshes. | ||||
| class btSoftBodyConcaveCollisionAlgorithm : public btCollisionAlgorithm | class btSoftBodyConcaveCollisionAlgorithm : public btCollisionAlgorithm | ||||
| { | { | ||||
| bool m_isSwapped; | bool m_isSwapped; | ||||
| btSoftBodyTriangleCallback m_btSoftBodyTriangleCallback; | btSoftBodyTriangleCallback m_btSoftBodyTriangleCallback; | ||||
| public: | public: | ||||
| btSoftBodyConcaveCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped); | btSoftBodyConcaveCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped); | ||||
| virtual ~btSoftBodyConcaveCollisionAlgorithm(); | virtual ~btSoftBodyConcaveCollisionAlgorithm(); | ||||
| virtual void processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); | virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); | ||||
| btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); | btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut); | ||||
| virtual void getAllContactManifolds(btManifoldArray& manifoldArray) | virtual void getAllContactManifolds(btManifoldArray& manifoldArray) | ||||
| { | { | ||||
| //we don't add any manifolds | //we don't add any manifolds | ||||
| } | } | ||||
| void clearCache(); | void clearCache(); | ||||
| struct CreateFunc :public btCollisionAlgorithmCreateFunc | struct CreateFunc : public btCollisionAlgorithmCreateFunc | ||||
| { | { | ||||
| virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap) | virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) | ||||
| { | { | ||||
| void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftBodyConcaveCollisionAlgorithm)); | void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftBodyConcaveCollisionAlgorithm)); | ||||
| return new(mem) btSoftBodyConcaveCollisionAlgorithm(ci,body0Wrap,body1Wrap,false); | return new (mem) btSoftBodyConcaveCollisionAlgorithm(ci, body0Wrap, body1Wrap, false); | ||||
| } | } | ||||
| }; | }; | ||||
| struct SwappedCreateFunc :public btCollisionAlgorithmCreateFunc | struct SwappedCreateFunc : public btCollisionAlgorithmCreateFunc | ||||
| { | { | ||||
| virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap) | virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap) | ||||
| { | { | ||||
| void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftBodyConcaveCollisionAlgorithm)); | void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftBodyConcaveCollisionAlgorithm)); | ||||
| return new(mem) btSoftBodyConcaveCollisionAlgorithm(ci,body0Wrap,body1Wrap,true); | return new (mem) btSoftBodyConcaveCollisionAlgorithm(ci, body0Wrap, body1Wrap, true); | ||||
| } | } | ||||
| }; | }; | ||||
| }; | }; | ||||
| #endif //BT_SOFT_BODY_CONCAVE_COLLISION_ALGORITHM_H | #endif //BT_SOFT_BODY_CONCAVE_COLLISION_ALGORITHM_H | ||||