Changeset View
Changeset View
Standalone View
Standalone View
extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h
| Show All 11 Lines | |||||
| 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. | 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. | ||||
| 3. This notice may not be removed or altered from any source distribution. | 3. This notice may not be removed or altered from any source distribution. | ||||
| */ | */ | ||||
| #ifndef BT_CYLINDER_MINKOWSKI_H | #ifndef BT_CYLINDER_MINKOWSKI_H | ||||
| #define BT_CYLINDER_MINKOWSKI_H | #define BT_CYLINDER_MINKOWSKI_H | ||||
| #include "btBoxShape.h" | #include "btBoxShape.h" | ||||
| #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types | #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types | ||||
| #include "LinearMath/btVector3.h" | #include "LinearMath/btVector3.h" | ||||
| /// The btCylinderShape class implements a cylinder shape primitive, centered around the origin. Its central axis aligned with the Y axis. btCylinderShapeX is aligned with the X axis and btCylinderShapeZ around the Z axis. | /// The btCylinderShape class implements a cylinder shape primitive, centered around the origin. Its central axis aligned with the Y axis. btCylinderShapeX is aligned with the X axis and btCylinderShapeZ around the Z axis. | ||||
| ATTRIBUTE_ALIGNED16(class) btCylinderShape : public btConvexInternalShape | ATTRIBUTE_ALIGNED16(class) | ||||
| btCylinderShape : public btConvexInternalShape | |||||
| { | { | ||||
| protected: | protected: | ||||
| int m_upAxis; | int m_upAxis; | ||||
| public: | public: | ||||
| BT_DECLARE_ALIGNED_ALLOCATOR(); | BT_DECLARE_ALIGNED_ALLOCATOR(); | ||||
| btVector3 getHalfExtentsWithMargin() const | btVector3 getHalfExtentsWithMargin() const | ||||
| { | { | ||||
| btVector3 halfExtents = getHalfExtentsWithoutMargin(); | btVector3 halfExtents = getHalfExtentsWithoutMargin(); | ||||
| btVector3 margin(getMargin(),getMargin(),getMargin()); | btVector3 margin(getMargin(), getMargin(), getMargin()); | ||||
| halfExtents += margin; | halfExtents += margin; | ||||
| return halfExtents; | return halfExtents; | ||||
| } | } | ||||
| const btVector3& getHalfExtentsWithoutMargin() const | const btVector3& getHalfExtentsWithoutMargin() const | ||||
| { | { | ||||
| return m_implicitShapeDimensions;//changed in Bullet 2.63: assume the scaling and margin are included | return m_implicitShapeDimensions; //changed in Bullet 2.63: assume the scaling and margin are included | ||||
| } | } | ||||
| btCylinderShape (const btVector3& halfExtents); | btCylinderShape(const btVector3& halfExtents); | ||||
| void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const; | void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const; | ||||
| virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const; | virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const; | ||||
| virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const; | virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; | ||||
| virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const; | virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; | ||||
| virtual void setMargin(btScalar collisionMargin) | virtual void setMargin(btScalar collisionMargin) | ||||
| { | { | ||||
| //correct the m_implicitShapeDimensions for the margin | //correct the m_implicitShapeDimensions for the margin | ||||
| btVector3 oldMargin(getMargin(),getMargin(),getMargin()); | btVector3 oldMargin(getMargin(), getMargin(), getMargin()); | ||||
| btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin; | btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin; | ||||
| btConvexInternalShape::setMargin(collisionMargin); | btConvexInternalShape::setMargin(collisionMargin); | ||||
| btVector3 newMargin(getMargin(),getMargin(),getMargin()); | btVector3 newMargin(getMargin(), getMargin(), getMargin()); | ||||
| m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin; | m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin; | ||||
| } | } | ||||
| virtual btVector3 localGetSupportingVertex(const btVector3& vec) const | virtual btVector3 localGetSupportingVertex(const btVector3& vec) const | ||||
| { | { | ||||
| btVector3 supVertex; | btVector3 supVertex; | ||||
| supVertex = localGetSupportingVertexWithoutMargin(vec); | supVertex = localGetSupportingVertexWithoutMargin(vec); | ||||
| if ( getMargin()!=btScalar(0.) ) | if (getMargin() != btScalar(0.)) | ||||
| { | { | ||||
| btVector3 vecnorm = vec; | btVector3 vecnorm = vec; | ||||
| if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON)) | if (vecnorm.length2() < (SIMD_EPSILON * SIMD_EPSILON)) | ||||
| { | { | ||||
| vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.)); | vecnorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.)); | ||||
| } | } | ||||
| vecnorm.normalize(); | vecnorm.normalize(); | ||||
| supVertex+= getMargin() * vecnorm; | supVertex += getMargin() * vecnorm; | ||||
| } | } | ||||
| return supVertex; | return supVertex; | ||||
| } | } | ||||
| //use box inertia | //use box inertia | ||||
| // virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const; | // virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const; | ||||
| int getUpAxis() const | int getUpAxis() const | ||||
| { | { | ||||
| return m_upAxis; | return m_upAxis; | ||||
| } | } | ||||
| virtual btVector3 getAnisotropicRollingFrictionDirection() const | virtual btVector3 getAnisotropicRollingFrictionDirection() const | ||||
| { | { | ||||
| btVector3 aniDir(0,0,0); | btVector3 aniDir(0, 0, 0); | ||||
| aniDir[getUpAxis()]=1; | aniDir[getUpAxis()] = 1; | ||||
| return aniDir; | return aniDir; | ||||
| } | } | ||||
| virtual btScalar getRadius() const | virtual btScalar getRadius() const | ||||
| { | { | ||||
| return getHalfExtentsWithMargin().getX(); | return getHalfExtentsWithMargin().getX(); | ||||
| } | } | ||||
| virtual void setLocalScaling(const btVector3& scaling) | virtual void setLocalScaling(const btVector3& scaling) | ||||
| { | { | ||||
| btVector3 oldMargin(getMargin(),getMargin(),getMargin()); | btVector3 oldMargin(getMargin(), getMargin(), getMargin()); | ||||
| btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin; | btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin; | ||||
| btVector3 unScaledImplicitShapeDimensionsWithMargin = implicitShapeDimensionsWithMargin / m_localScaling; | btVector3 unScaledImplicitShapeDimensionsWithMargin = implicitShapeDimensionsWithMargin / m_localScaling; | ||||
| btConvexInternalShape::setLocalScaling(scaling); | btConvexInternalShape::setLocalScaling(scaling); | ||||
| m_implicitShapeDimensions = (unScaledImplicitShapeDimensionsWithMargin * m_localScaling) - oldMargin; | m_implicitShapeDimensions = (unScaledImplicitShapeDimensionsWithMargin * m_localScaling) - oldMargin; | ||||
| } | } | ||||
| //debugging | //debugging | ||||
| virtual const char* getName()const | virtual const char* getName() const | ||||
| { | { | ||||
| return "CylinderY"; | return "CylinderY"; | ||||
| } | } | ||||
| 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; | ||||
| }; | }; | ||||
| class btCylinderShapeX : public btCylinderShape | class btCylinderShapeX : public btCylinderShape | ||||
| { | { | ||||
| public: | public: | ||||
| BT_DECLARE_ALIGNED_ALLOCATOR(); | BT_DECLARE_ALIGNED_ALLOCATOR(); | ||||
| btCylinderShapeX (const btVector3& halfExtents); | btCylinderShapeX(const btVector3& halfExtents); | ||||
| virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const; | virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; | ||||
| virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const; | virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; | ||||
| //debugging | //debugging | ||||
| virtual const char* getName()const | virtual const char* getName() const | ||||
| { | { | ||||
| return "CylinderX"; | return "CylinderX"; | ||||
| } | } | ||||
| virtual btScalar getRadius() const | virtual btScalar getRadius() const | ||||
| { | { | ||||
| return getHalfExtentsWithMargin().getY(); | return getHalfExtentsWithMargin().getY(); | ||||
| } | } | ||||
| }; | }; | ||||
| class btCylinderShapeZ : public btCylinderShape | class btCylinderShapeZ : public btCylinderShape | ||||
| { | { | ||||
| public: | public: | ||||
| BT_DECLARE_ALIGNED_ALLOCATOR(); | BT_DECLARE_ALIGNED_ALLOCATOR(); | ||||
| btCylinderShapeZ (const btVector3& halfExtents); | btCylinderShapeZ(const btVector3& halfExtents); | ||||
| virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const; | virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const; | ||||
| virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const; | virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const; | ||||
| //debugging | //debugging | ||||
| virtual const char* getName()const | virtual const char* getName() const | ||||
| { | { | ||||
| return "CylinderZ"; | return "CylinderZ"; | ||||
| } | } | ||||
| virtual btScalar getRadius() const | virtual btScalar getRadius() const | ||||
| { | { | ||||
| return getHalfExtentsWithMargin().getX(); | return getHalfExtentsWithMargin().getX(); | ||||
| } | } | ||||
| }; | }; | ||||
| ///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 btCylinderShapeData | struct btCylinderShapeData | ||||
| { | { | ||||
| btConvexInternalShapeData m_convexInternalShapeData; | btConvexInternalShapeData m_convexInternalShapeData; | ||||
| int m_upAxis; | int m_upAxis; | ||||
| char m_padding[4]; | char m_padding[4]; | ||||
| }; | }; | ||||
| SIMD_FORCE_INLINE int btCylinderShape::calculateSerializeBufferSize() const | SIMD_FORCE_INLINE int btCylinderShape::calculateSerializeBufferSize() const | ||||
| { | { | ||||
| return sizeof(btCylinderShapeData); | return sizeof(btCylinderShapeData); | ||||
| } | } | ||||
| ///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* btCylinderShape::serialize(void* dataBuffer, btSerializer* serializer) const | SIMD_FORCE_INLINE const char* btCylinderShape::serialize(void* dataBuffer, btSerializer* serializer) const | ||||
| { | { | ||||
| btCylinderShapeData* shapeData = (btCylinderShapeData*) dataBuffer; | btCylinderShapeData* shapeData = (btCylinderShapeData*)dataBuffer; | ||||
| btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData,serializer); | btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer); | ||||
| shapeData->m_upAxis = m_upAxis; | shapeData->m_upAxis = m_upAxis; | ||||
| // Fill padding with zeros to appease msan. | |||||
| shapeData->m_padding[0] = 0; | |||||
| shapeData->m_padding[1] = 0; | |||||
| shapeData->m_padding[2] = 0; | |||||
| shapeData->m_padding[3] = 0; | |||||
| return "btCylinderShapeData"; | return "btCylinderShapeData"; | ||||
| } | } | ||||
| #endif //BT_CYLINDER_MINKOWSKI_H | #endif //BT_CYLINDER_MINKOWSKI_H | ||||