2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
16 #ifndef BT_CONVEX_INTERNAL_SHAPE_H
17 #define BT_CONVEX_INTERNAL_SHAPE_H
19 #include "btConvexShape.h"
20 #include "LinearMath/btAabbUtil2.h"
22 ///The btConvexInternalShape is an internal base class, shared by most convex shape implementations.
23 ///The btConvexInternalShape uses a default collision margin set to CONVEX_DISTANCE_MARGIN.
24 ///This collision margin used by Gjk and some other algorithms, see also btCollisionMargin.h
25 ///Note that when creating small shapes (derived from btConvexInternalShape),
26 ///you need to make sure to set a smaller collision margin, using the 'setMargin' API
27 ///There is a automatic mechanism 'setSafeMargin' used by btBoxShape and btCylinderShape
28 ATTRIBUTE_ALIGNED16(class)
29 btConvexInternalShape : public btConvexShape
32 //local scaling. collisionMargin is not scaled !
33 btVector3 m_localScaling;
35 btVector3 m_implicitShapeDimensions;
37 btScalar m_collisionMargin;
41 btConvexInternalShape();
44 BT_DECLARE_ALIGNED_ALLOCATOR();
46 virtual ~btConvexInternalShape()
50 virtual btVector3 localGetSupportingVertex(const btVector3& vec) const;
52 const btVector3& getImplicitShapeDimensions() const
54 return m_implicitShapeDimensions;
57 ///warning: use setImplicitShapeDimensions with care
58 ///changing a collision shape while the body is in the world is not recommended,
59 ///it is best to remove the body from the world, then make the change, and re-add it
60 ///alternatively flush the contact points, see documentation for 'cleanProxyFromPairs'
61 void setImplicitShapeDimensions(const btVector3& dimensions)
63 m_implicitShapeDimensions = dimensions;
66 void setSafeMargin(btScalar minDimension, btScalar defaultMarginMultiplier = 0.1f)
68 btScalar safeMargin = defaultMarginMultiplier * minDimension;
69 if (safeMargin < getMargin())
71 setMargin(safeMargin);
74 void setSafeMargin(const btVector3& halfExtents, btScalar defaultMarginMultiplier = 0.1f)
76 //see http://code.google.com/p/bullet/issues/detail?id=349
77 //this margin check could could be added to other collision shapes too,
78 //or add some assert/warning somewhere
79 btScalar minDimension = halfExtents[halfExtents.minAxis()];
80 setSafeMargin(minDimension, defaultMarginMultiplier);
83 ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
84 void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
86 getAabbSlow(t, aabbMin, aabbMax);
89 virtual void getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
91 virtual void setLocalScaling(const btVector3& scaling);
92 virtual const btVector3& getLocalScaling() const
94 return m_localScaling;
97 const btVector3& getLocalScalingNV() const
99 return m_localScaling;
102 virtual void setMargin(btScalar margin)
104 m_collisionMargin = margin;
106 virtual btScalar getMargin() const
108 return m_collisionMargin;
111 btScalar getMarginNV() const
113 return m_collisionMargin;
116 virtual int getNumPreferredPenetrationDirections() const
121 virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
123 (void)penetrationVector;
128 virtual int calculateSerializeBufferSize() const;
130 ///fills the dataBuffer and returns the struct name (and 0 on failure)
131 virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
134 ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
135 struct btConvexInternalShapeData
137 btCollisionShapeData m_collisionShapeData;
139 btVector3FloatData m_localScaling;
141 btVector3FloatData m_implicitShapeDimensions;
143 float m_collisionMargin;
148 SIMD_FORCE_INLINE int btConvexInternalShape::calculateSerializeBufferSize() const
150 return sizeof(btConvexInternalShapeData);
153 ///fills the dataBuffer and returns the struct name (and 0 on failure)
154 SIMD_FORCE_INLINE const char* btConvexInternalShape::serialize(void* dataBuffer, btSerializer* serializer) const
156 btConvexInternalShapeData* shapeData = (btConvexInternalShapeData*)dataBuffer;
157 btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer);
159 m_implicitShapeDimensions.serializeFloat(shapeData->m_implicitShapeDimensions);
160 m_localScaling.serializeFloat(shapeData->m_localScaling);
161 shapeData->m_collisionMargin = float(m_collisionMargin);
163 // Fill padding with zeros to appease msan.
164 shapeData->m_padding = 0;
166 return "btConvexInternalShapeData";
169 ///btConvexInternalAabbCachingShape adds local aabb caching for convex shapes, to avoid expensive bounding box calculations
170 class btConvexInternalAabbCachingShape : public btConvexInternalShape
172 btVector3 m_localAabbMin;
173 btVector3 m_localAabbMax;
174 bool m_isLocalAabbValid;
177 btConvexInternalAabbCachingShape();
179 void setCachedLocalAabb(const btVector3& aabbMin, const btVector3& aabbMax)
181 m_isLocalAabbValid = true;
182 m_localAabbMin = aabbMin;
183 m_localAabbMax = aabbMax;
186 inline void getCachedLocalAabb(btVector3& aabbMin, btVector3& aabbMax) const
188 btAssert(m_isLocalAabbValid);
189 aabbMin = m_localAabbMin;
190 aabbMax = m_localAabbMax;
193 inline void getNonvirtualAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax, btScalar margin) const
195 //lazy evaluation of local aabb
196 btAssert(m_isLocalAabbValid);
197 btTransformAabb(m_localAabbMin, m_localAabbMax, margin, trans, aabbMin, aabbMax);
201 virtual void setLocalScaling(const btVector3& scaling);
203 virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
205 void recalcLocalAabb();
208 #endif //BT_CONVEX_INTERNAL_SHAPE_H