21btCompoundShape::btCompoundShape(
bool enableDynamicAabbTree,
const int initialChildCapacity)
31 if (enableDynamicAabbTree)
38 m_children.reserve(initialChildCapacity);
41btCompoundShape::~btCompoundShape()
57 child.m_transform = localTransform;
58 child.m_childShape = shape;
59 child.m_childShapeType = shape->getShapeType();
60 child.m_childMargin = shape->getMargin();
63 btVector3 localAabbMin, localAabbMax;
64 shape->getAabb(localTransform, localAabbMin, localAabbMax);
65 for (
int i = 0; i < 3; i++)
79 size_t index = m_children.size();
83 m_children.push_back(child);
86void btCompoundShape::updateChildTransform(
int childIndex,
const btTransform& newChildTransform,
bool shouldRecalculateLocalAabb)
88 m_children[childIndex].m_transform = newChildTransform;
93 btVector3 localAabbMin, localAabbMax;
94 m_children[childIndex].m_childShape->getAabb(newChildTransform, localAabbMin, localAabbMax);
101 if (shouldRecalculateLocalAabb)
107void btCompoundShape::removeChildShapeByIndex(
int childShapeIndex)
110 btAssert(childShapeIndex >= 0 && childShapeIndex < m_children.size());
115 m_children.swap(childShapeIndex, m_children.size() - 1);
117 m_children[childShapeIndex].m_node->dataAsInt = childShapeIndex;
118 m_children.pop_back();
126 for (
int i = m_children.size() - 1; i >= 0; i--)
137void btCompoundShape::recalculateLocalAabb()
146 for (
int j = 0; j < m_children.size(); j++)
148 btVector3 localAabbMin, localAabbMax;
149 m_children[j].m_childShape->getAabb(m_children[j].
m_transform, localAabbMin, localAabbMax);
150 for (
int i = 0; i < 3; i++)
161void btCompoundShape::getAabb(
const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax)
const
167 if (!m_children.size())
169 localHalfExtents.setValue(0, 0, 0);
170 localCenter.setValue(0, 0, 0);
176 btVector3 center = trans(localCenter);
178 btVector3 extent = localHalfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
179 aabbMin = center - extent;
180 aabbMax = center + extent;
183void btCompoundShape::calculateLocalInertia(
btScalar mass, btVector3& inertia)
const
188 btVector3 aabbMin, aabbMax;
189 getAabb(ident, aabbMin, aabbMax);
191 btVector3 halfExtents = (aabbMax - aabbMin) *
btScalar(0.5);
197 inertia[0] = mass / (
btScalar(12.0)) * (ly * ly + lz * lz);
198 inertia[1] = mass / (
btScalar(12.0)) * (lx * lx + lz * lz);
199 inertia[2] = mass / (
btScalar(12.0)) * (lx * lx + ly * ly);
202void btCompoundShape::calculatePrincipalAxisTransform(
const btScalar* masses,
btTransform& principal, btVector3& inertia)
const
204 int n = m_children.size();
207 btVector3 center(0, 0, 0);
210 for (k = 0; k < n; k++)
213 center += m_children[k].m_transform.getOrigin() * masses[k];
214 totalMass += masses[k];
220 principal.setOrigin(center);
223 for (k = 0; k < n; k++)
226 m_children[k].m_childShape->calculateLocalInertia(masses[k], i);
229 btVector3 o = t.getOrigin() - center;
236 j = t.getBasis() * j;
245 j[0].setValue(o2, 0, 0);
246 j[1].setValue(0, o2, 0);
247 j[2].setValue(0, 0, o2);
253 tensor[0] += masses[k] * j[0];
254 tensor[1] += masses[k] * j[1];
255 tensor[2] += masses[k] * j[2];
258 tensor.diagonalize(principal.getBasis(),
btScalar(0.00001), 20);
259 inertia.setValue(tensor[0][0], tensor[1][1], tensor[2][2]);
262void btCompoundShape::setLocalScaling(
const btVector3& scaling)
264 for (
int i = 0; i < m_children.size(); i++)
267 btVector3 childScale = m_children[i].m_childShape->getLocalScaling();
270 m_children[i].m_childShape->setLocalScaling(childScale);
271 childTrans.setOrigin((childTrans.getOrigin()) * scaling /
m_localScaling);
279void btCompoundShape::createAabbTreeFromChildren()
287 for (
int index = 0; index < m_children.size(); index++)
292 btVector3 localAabbMin, localAabbMax;
293 child.m_childShape->getAabb(child.m_transform, localAabbMin, localAabbMax);
296 size_t index2 = index;
303const char* btCompoundShape::serialize(
void* dataBuffer,
btSerializer* serializer)
const
322 if (!serializer->
findPointer(m_children[i].m_childShape))
325 const char* structType = m_children[i].m_childShape->serialize(chunk->
m_oldPtr, serializer);
329 memPtr->m_childShapeType = m_children[i].m_childShapeType;
330 m_children[i].m_transform.serializeFloat(memPtr->m_transform);
334 return "btCompoundShapeData";
#define btAlignedFree(ptr)
#define btAlignedAlloc(size, alignment)
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...
@ COMPOUND_SHAPE_PROXYTYPE
int m_updateRevision
internal update revision number. It will be increased when the object changes. This allows some subsy...
btCollisionShape
The btCollisionShape class provides an interface for collision shapes that can be shared among btColl...
virtual btScalar getMargin() const =0
btTransform & getChildTransform(int index)
btCollisionShape * m_childShape
void updateChildTransform(int childIndex, const btTransform &newChildTransform, bool shouldRecalculateLocalAabb=true)
set a new transform for a child, and update internal data structures (local aabb and dynamic tree)
struct btDbvtNode * m_node
void removeChildShapeByIndex(int childShapeindex)
btScalar m_collisionMargin
btDbvt * m_dynamicAabbTree
virtual void recalculateLocalAabb()
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
btMatrix3x3
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
#define ATTRIBUTE_ALIGNED16(a)
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
virtual btChunk * allocate(size_t size, int numElements)=0
virtual void * getUniquePointer(void *oldPtr)=0
virtual void finalizeChunk(btChunk *chunk, const char *structType, int chunkCode, void *oldPtr)=0
virtual void * findPointer(void *oldPtr)=0
draw_view in_light_buf[] float
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
btCompoundShapeChildData * m_childShapePtr
btCollisionShapeData m_collisionShapeData
static btDbvtAabbMm FromMM(const btVector3 &mi, const btVector3 &mx)
btDbvtNode * insert(const btDbvtVolume &box, void *data)
void update(btDbvtNode *leaf, int lookahead=-1)
void remove(btDbvtNode *leaf)