Differential D8762 Diff 28333 extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.h
Changeset View
Changeset View
Standalone View
Standalone View
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.h
| Show All 13 Lines | |||||
| */ | */ | ||||
| #ifndef BT_CONVEX_INTERNAL_SHAPE_H | #ifndef BT_CONVEX_INTERNAL_SHAPE_H | ||||
| #define BT_CONVEX_INTERNAL_SHAPE_H | #define BT_CONVEX_INTERNAL_SHAPE_H | ||||
| #include "btConvexShape.h" | #include "btConvexShape.h" | ||||
| #include "LinearMath/btAabbUtil2.h" | #include "LinearMath/btAabbUtil2.h" | ||||
| ///The btConvexInternalShape is an internal base class, shared by most convex shape implementations. | ///The btConvexInternalShape is an internal base class, shared by most convex shape implementations. | ||||
| ///The btConvexInternalShape uses a default collision margin set to CONVEX_DISTANCE_MARGIN. | ///The btConvexInternalShape uses a default collision margin set to CONVEX_DISTANCE_MARGIN. | ||||
| ///This collision margin used by Gjk and some other algorithms, see also btCollisionMargin.h | ///This collision margin used by Gjk and some other algorithms, see also btCollisionMargin.h | ||||
| ///Note that when creating small shapes (derived from btConvexInternalShape), | ///Note that when creating small shapes (derived from btConvexInternalShape), | ||||
| ///you need to make sure to set a smaller collision margin, using the 'setMargin' API | ///you need to make sure to set a smaller collision margin, using the 'setMargin' API | ||||
| ///There is a automatic mechanism 'setSafeMargin' used by btBoxShape and btCylinderShape | ///There is a automatic mechanism 'setSafeMargin' used by btBoxShape and btCylinderShape | ||||
| ATTRIBUTE_ALIGNED16(class) btConvexInternalShape : public btConvexShape | ATTRIBUTE_ALIGNED16(class) | ||||
| btConvexInternalShape : public btConvexShape | |||||
| { | { | ||||
| protected: | protected: | ||||
| //local scaling. collisionMargin is not scaled ! | //local scaling. collisionMargin is not scaled ! | ||||
| btVector3 m_localScaling; | btVector3 m_localScaling; | ||||
| btVector3 m_implicitShapeDimensions; | btVector3 m_implicitShapeDimensions; | ||||
| btScalar m_collisionMargin; | btScalar m_collisionMargin; | ||||
| btScalar m_padding; | btScalar m_padding; | ||||
| btConvexInternalShape(); | btConvexInternalShape(); | ||||
| public: | public: | ||||
| BT_DECLARE_ALIGNED_ALLOCATOR(); | BT_DECLARE_ALIGNED_ALLOCATOR(); | ||||
| virtual ~btConvexInternalShape() | virtual ~btConvexInternalShape() | ||||
| { | { | ||||
| } | } | ||||
| virtual btVector3 localGetSupportingVertex(const btVector3& vec)const; | virtual btVector3 localGetSupportingVertex(const btVector3& vec) const; | ||||
| const btVector3& getImplicitShapeDimensions() const | const btVector3& getImplicitShapeDimensions() const | ||||
| { | { | ||||
| return m_implicitShapeDimensions; | return m_implicitShapeDimensions; | ||||
| } | } | ||||
| ///warning: use setImplicitShapeDimensions with care | ///warning: use setImplicitShapeDimensions with care | ||||
| ///changing a collision shape while the body is in the world is not recommended, | ///changing a collision shape while the body is in the world is not recommended, | ||||
| ///it is best to remove the body from the world, then make the change, and re-add it | ///it is best to remove the body from the world, then make the change, and re-add it | ||||
| ///alternatively flush the contact points, see documentation for 'cleanProxyFromPairs' | ///alternatively flush the contact points, see documentation for 'cleanProxyFromPairs' | ||||
| void setImplicitShapeDimensions(const btVector3& dimensions) | void setImplicitShapeDimensions(const btVector3& dimensions) | ||||
| { | { | ||||
| m_implicitShapeDimensions = dimensions; | m_implicitShapeDimensions = dimensions; | ||||
| } | } | ||||
| void setSafeMargin(btScalar minDimension, btScalar defaultMarginMultiplier = 0.1f) | void setSafeMargin(btScalar minDimension, btScalar defaultMarginMultiplier = 0.1f) | ||||
| { | { | ||||
| btScalar safeMargin = defaultMarginMultiplier*minDimension; | btScalar safeMargin = defaultMarginMultiplier * minDimension; | ||||
| if (safeMargin < getMargin()) | if (safeMargin < getMargin()) | ||||
| { | { | ||||
| setMargin(safeMargin); | setMargin(safeMargin); | ||||
| } | } | ||||
| } | } | ||||
| void setSafeMargin(const btVector3& halfExtents, btScalar defaultMarginMultiplier = 0.1f) | void setSafeMargin(const btVector3& halfExtents, btScalar defaultMarginMultiplier = 0.1f) | ||||
| { | { | ||||
| //see http://code.google.com/p/bullet/issues/detail?id=349 | //see http://code.google.com/p/bullet/issues/detail?id=349 | ||||
| //this margin check could could be added to other collision shapes too, | //this margin check could could be added to other collision shapes too, | ||||
| //or add some assert/warning somewhere | //or add some assert/warning somewhere | ||||
| btScalar minDimension=halfExtents[halfExtents.minAxis()]; | btScalar minDimension = halfExtents[halfExtents.minAxis()]; | ||||
| setSafeMargin(minDimension, defaultMarginMultiplier); | setSafeMargin(minDimension, defaultMarginMultiplier); | ||||
| } | } | ||||
| ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version | ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version | ||||
| void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const | void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const | ||||
| { | { | ||||
| getAabbSlow(t,aabbMin,aabbMax); | getAabbSlow(t, aabbMin, aabbMax); | ||||
| } | } | ||||
| virtual void getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const; | virtual void getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; | ||||
| virtual void setLocalScaling(const btVector3& scaling); | virtual void setLocalScaling(const btVector3& scaling); | ||||
| virtual const btVector3& getLocalScaling() const | virtual const btVector3& getLocalScaling() const | ||||
| { | { | ||||
| return m_localScaling; | return m_localScaling; | ||||
| } | } | ||||
| const btVector3& getLocalScalingNV() const | const btVector3& getLocalScalingNV() const | ||||
| { | { | ||||
| return m_localScaling; | return m_localScaling; | ||||
| } | } | ||||
| virtual void setMargin(btScalar margin) | virtual void setMargin(btScalar margin) | ||||
| { | { | ||||
| m_collisionMargin = margin; | m_collisionMargin = margin; | ||||
| } | } | ||||
| virtual btScalar getMargin() const | virtual btScalar getMargin() const | ||||
| { | { | ||||
| return m_collisionMargin; | return m_collisionMargin; | ||||
| } | } | ||||
| btScalar getMarginNV() const | btScalar getMarginNV() const | ||||
| { | { | ||||
| return m_collisionMargin; | return m_collisionMargin; | ||||
| } | } | ||||
| virtual int getNumPreferredPenetrationDirections() const | virtual int getNumPreferredPenetrationDirections() const | ||||
| { | { | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const | virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const | ||||
| { | { | ||||
| (void)penetrationVector; | (void)penetrationVector; | ||||
| (void)index; | (void)index; | ||||
| btAssert(0); | btAssert(0); | ||||
| } | } | ||||
| virtual int calculateSerializeBufferSize() const; | virtual int calculateSerializeBufferSize() const; | ||||
| ///fills the dataBuffer and returns the struct name (and 0 on failure) | ///fills the dataBuffer and returns the struct name (and 0 on failure) | ||||
| virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; | virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const; | ||||
| }; | }; | ||||
| ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 | ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 | ||||
| struct btConvexInternalShapeData | struct btConvexInternalShapeData | ||||
| { | { | ||||
| btCollisionShapeData m_collisionShapeData; | btCollisionShapeData m_collisionShapeData; | ||||
| btVector3FloatData m_localScaling; | btVector3FloatData m_localScaling; | ||||
| btVector3FloatData m_implicitShapeDimensions; | btVector3FloatData m_implicitShapeDimensions; | ||||
| float m_collisionMargin; | float m_collisionMargin; | ||||
| int m_padding; | int m_padding; | ||||
| }; | }; | ||||
| SIMD_FORCE_INLINE int btConvexInternalShape::calculateSerializeBufferSize() const | SIMD_FORCE_INLINE int btConvexInternalShape::calculateSerializeBufferSize() const | ||||
| { | { | ||||
| return sizeof(btConvexInternalShapeData); | return sizeof(btConvexInternalShapeData); | ||||
| } | } | ||||
| ///fills the dataBuffer and returns the struct name (and 0 on failure) | ///fills the dataBuffer and returns the struct name (and 0 on failure) | ||||
| SIMD_FORCE_INLINE const char* btConvexInternalShape::serialize(void* dataBuffer, btSerializer* serializer) const | SIMD_FORCE_INLINE const char* btConvexInternalShape::serialize(void* dataBuffer, btSerializer* serializer) const | ||||
| { | { | ||||
| btConvexInternalShapeData* shapeData = (btConvexInternalShapeData*) dataBuffer; | btConvexInternalShapeData* shapeData = (btConvexInternalShapeData*)dataBuffer; | ||||
| btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer); | btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer); | ||||
| m_implicitShapeDimensions.serializeFloat(shapeData->m_implicitShapeDimensions); | m_implicitShapeDimensions.serializeFloat(shapeData->m_implicitShapeDimensions); | ||||
| m_localScaling.serializeFloat(shapeData->m_localScaling); | m_localScaling.serializeFloat(shapeData->m_localScaling); | ||||
| shapeData->m_collisionMargin = float(m_collisionMargin); | shapeData->m_collisionMargin = float(m_collisionMargin); | ||||
| // Fill padding with zeros to appease msan. | |||||
| shapeData->m_padding = 0; | |||||
| return "btConvexInternalShapeData"; | return "btConvexInternalShapeData"; | ||||
| } | } | ||||
| ///btConvexInternalAabbCachingShape adds local aabb caching for convex shapes, to avoid expensive bounding box calculations | ///btConvexInternalAabbCachingShape adds local aabb caching for convex shapes, to avoid expensive bounding box calculations | ||||
| class btConvexInternalAabbCachingShape : public btConvexInternalShape | class btConvexInternalAabbCachingShape : public btConvexInternalShape | ||||
| { | { | ||||
| btVector3 m_localAabbMin; | btVector3 m_localAabbMin; | ||||
| btVector3 m_localAabbMax; | btVector3 m_localAabbMax; | ||||
| bool m_isLocalAabbValid; | bool m_isLocalAabbValid; | ||||
| protected: | protected: | ||||
| btConvexInternalAabbCachingShape(); | btConvexInternalAabbCachingShape(); | ||||
| void setCachedLocalAabb (const btVector3& aabbMin, const btVector3& aabbMax) | void setCachedLocalAabb(const btVector3& aabbMin, const btVector3& aabbMax) | ||||
| { | { | ||||
| m_isLocalAabbValid = true; | m_isLocalAabbValid = true; | ||||
| m_localAabbMin = aabbMin; | m_localAabbMin = aabbMin; | ||||
| m_localAabbMax = aabbMax; | m_localAabbMax = aabbMax; | ||||
| } | } | ||||
| inline void getCachedLocalAabb (btVector3& aabbMin, btVector3& aabbMax) const | inline void getCachedLocalAabb(btVector3& aabbMin, btVector3& aabbMax) const | ||||
| { | { | ||||
| btAssert(m_isLocalAabbValid); | btAssert(m_isLocalAabbValid); | ||||
| aabbMin = m_localAabbMin; | aabbMin = m_localAabbMin; | ||||
| aabbMax = m_localAabbMax; | aabbMax = m_localAabbMax; | ||||
| } | } | ||||
| inline void getNonvirtualAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax, btScalar margin) const | inline void getNonvirtualAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax, btScalar margin) const | ||||
| { | { | ||||
| //lazy evaluation of local aabb | //lazy evaluation of local aabb | ||||
| btAssert(m_isLocalAabbValid); | btAssert(m_isLocalAabbValid); | ||||
| btTransformAabb(m_localAabbMin,m_localAabbMax,margin,trans,aabbMin,aabbMax); | btTransformAabb(m_localAabbMin, m_localAabbMax, margin, trans, aabbMin, aabbMax); | ||||
| } | } | ||||
| public: | public: | ||||
| virtual void setLocalScaling(const btVector3& scaling); | virtual void setLocalScaling(const btVector3& scaling); | ||||
| virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const; | virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; | ||||
| void recalcLocalAabb(); | void recalcLocalAabb(); | ||||
| }; | }; | ||||
| #endif //BT_CONVEX_INTERNAL_SHAPE_H | #endif //BT_CONVEX_INTERNAL_SHAPE_H | ||||