Bullet Collision Detection & Physics Library
btConvexInternalShape.h
Go to the documentation of this file.
1/*
2Bullet Continuous Collision Detection and Physics Library
3Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
4
5This software is provided 'as-is', without any express or implied warranty.
6In no event will the authors be held liable for any damages arising from the use of this software.
7Permission is granted to anyone to use this software for any purpose,
8including commercial applications, and to alter it and redistribute it freely,
9subject to the following restrictions:
10
111. 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.
122. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
133. This notice may not be removed or altered from any source distribution.
14*/
15
16#ifndef BT_CONVEX_INTERNAL_SHAPE_H
17#define BT_CONVEX_INTERNAL_SHAPE_H
18
19#include "btConvexShape.h"
21
22
30{
31
32 protected:
33
34 //local scaling. collisionMargin is not scaled !
36
38
40
42
44
45public:
46
48
50 {
51
52 }
53
54 virtual btVector3 localGetSupportingVertex(const btVector3& vec)const;
55
57 {
58 return m_implicitShapeDimensions;
59 }
60
65 void setImplicitShapeDimensions(const btVector3& dimensions)
66 {
67 m_implicitShapeDimensions = dimensions;
68 }
69
70 void setSafeMargin(btScalar minDimension, btScalar defaultMarginMultiplier = 0.1f)
71 {
72 btScalar safeMargin = defaultMarginMultiplier*minDimension;
73 if (safeMargin < getMargin())
74 {
75 setMargin(safeMargin);
76 }
77 }
78 void setSafeMargin(const btVector3& halfExtents, btScalar defaultMarginMultiplier = 0.1f)
79 {
80 //see http://code.google.com/p/bullet/issues/detail?id=349
81 //this margin check could could be added to other collision shapes too,
82 //or add some assert/warning somewhere
83 btScalar minDimension=halfExtents[halfExtents.minAxis()];
84 setSafeMargin(minDimension, defaultMarginMultiplier);
85 }
86
88 void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
89 {
90 getAabbSlow(t,aabbMin,aabbMax);
91 }
92
93
94
95 virtual void getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
96
97
98 virtual void setLocalScaling(const btVector3& scaling);
99 virtual const btVector3& getLocalScaling() const
100 {
101 return m_localScaling;
102 }
103
105 {
106 return m_localScaling;
107 }
108
109 virtual void setMargin(btScalar margin)
110 {
111 m_collisionMargin = margin;
112 }
113 virtual btScalar getMargin() const
114 {
115 return m_collisionMargin;
116 }
117
119 {
120 return m_collisionMargin;
121 }
122
124 {
125 return 0;
126 }
127
128 virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
129 {
130 (void)penetrationVector;
131 (void)index;
132 btAssert(0);
133 }
134
135 virtual int calculateSerializeBufferSize() const;
136
138 virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
139
140
141};
142
145{
147
149
151
153
155
156};
157
158
159
161{
162 return sizeof(btConvexInternalShapeData);
163}
164
166SIMD_FORCE_INLINE const char* btConvexInternalShape::serialize(void* dataBuffer, btSerializer* serializer) const
167{
168 btConvexInternalShapeData* shapeData = (btConvexInternalShapeData*) dataBuffer;
169 btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer);
170
173 shapeData->m_collisionMargin = float(m_collisionMargin);
174
175 // Fill padding with zeros to appease msan.
176 shapeData->m_padding = 0;
177
178 return "btConvexInternalShapeData";
179}
180
181
182
183
186{
190
191protected:
192
194
195 void setCachedLocalAabb (const btVector3& aabbMin, const btVector3& aabbMax)
196 {
197 m_isLocalAabbValid = true;
198 m_localAabbMin = aabbMin;
199 m_localAabbMax = aabbMax;
200 }
201
202 inline void getCachedLocalAabb (btVector3& aabbMin, btVector3& aabbMax) const
203 {
205 aabbMin = m_localAabbMin;
206 aabbMax = m_localAabbMax;
207 }
208
209 inline void getNonvirtualAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax, btScalar margin) const
210 {
211
212 //lazy evaluation of local aabb
214 btTransformAabb(m_localAabbMin,m_localAabbMax,margin,trans,aabbMin,aabbMax);
215 }
216
217public:
218
219 virtual void setLocalScaling(const btVector3& scaling);
220
221 virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
222
223 void recalcLocalAabb();
224
225};
226
227#endif //BT_CONVEX_INTERNAL_SHAPE_H
void btTransformAabb(const btVector3 &halfExtents, btScalar margin, const btTransform &t, btVector3 &aabbMinOut, btVector3 &aabbMaxOut)
Definition: btAabbUtil2.h:182
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:292
#define ATTRIBUTE_ALIGNED16(a)
Definition: btScalar.h:82
#define SIMD_FORCE_INLINE
Definition: btScalar.h:81
#define btAssert(x)
Definition: btScalar.h:131
virtual const char * serialize(void *dataBuffer, btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
btConvexInternalAabbCachingShape adds local aabb caching for convex shapes, to avoid expensive boundi...
void getNonvirtualAabb(const btTransform &trans, btVector3 &aabbMin, btVector3 &aabbMax, btScalar margin) const
void getCachedLocalAabb(btVector3 &aabbMin, btVector3 &aabbMax) const
virtual void setLocalScaling(const btVector3 &scaling)
virtual void getAabb(const btTransform &t, btVector3 &aabbMin, btVector3 &aabbMax) const
getAabb's default implementation is brute force, expected derived classes to implement a fast dedicat...
void setCachedLocalAabb(const btVector3 &aabbMin, const btVector3 &aabbMax)
The btConvexInternalShape is an internal base class, shared by most convex shape implementations.
virtual void setMargin(btScalar margin)
virtual const char * serialize(void *dataBuffer, btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
const btVector3 & getLocalScalingNV() const
virtual int calculateSerializeBufferSize() const
const btVector3 & getImplicitShapeDimensions() const
void setSafeMargin(const btVector3 &halfExtents, btScalar defaultMarginMultiplier=0.1f)
virtual const btVector3 & getLocalScaling() const
void setImplicitShapeDimensions(const btVector3 &dimensions)
warning: use setImplicitShapeDimensions with care changing a collision shape while the body is in the...
void setSafeMargin(btScalar minDimension, btScalar defaultMarginMultiplier=0.1f)
virtual void getPreferredPenetrationDirection(int index, btVector3 &penetrationVector) const
void getAabb(const btTransform &t, btVector3 &aabbMin, btVector3 &aabbMax) const
getAabb's default implementation is brute force, expected derived classes to implement a fast dedicat...
virtual btScalar getMargin() const
virtual int getNumPreferredPenetrationDirections() const
The btConvexShape is an abstract shape interface, implemented by all convex shapes such as btBoxShape...
Definition: btConvexShape.h:32
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition: btTransform.h:34
btVector3 can be used to represent 3D points and vectors.
Definition: btVector3.h:84
int minAxis() const
Return the axis with the smallest value Note return values are 0,1,2 for x, y, or z.
Definition: btVector3.h:480
void serializeFloat(struct btVector3FloatData &dataOut) const
Definition: btVector3.h:1323
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
btVector3FloatData m_implicitShapeDimensions
btCollisionShapeData m_collisionShapeData