Allocate large arrays of btVector3s on the heap instead of the stack. Fixes Issue #193

This commit is contained in:
john.mccutchan
2009-02-10 16:24:12 +00:00
parent 2a10a61f50
commit 225772b12a
4 changed files with 31 additions and 5 deletions

View File

@@ -913,6 +913,8 @@ btHfFluidColumnRigidBodyCallback::btHfFluidColumnRigidBodyCallback (btRigidBody*
m_density = density;
m_floatyness = floatyness;
m_numVoxels = m_buoyantShape->getNumVoxels ();
m_voxelPositionsXformed = (btVector3*)btAlignedAlloc(sizeof(btVector3)*m_numVoxels, 16);
m_voxelSubmerged = (bool*)btAlignedAlloc(sizeof(bool)*m_numVoxels, 16);
for (int i = 0; i < m_numVoxels; i++)
{
btVector3 p = m_buoyantShape->getVoxelPositionsArray()[i];
@@ -923,6 +925,14 @@ btHfFluidColumnRigidBodyCallback::btHfFluidColumnRigidBodyCallback (btRigidBody*
}
}
btHfFluidColumnRigidBodyCallback::~btHfFluidColumnRigidBodyCallback ()
{
if (m_voxelPositionsXformed)
btAlignedFree (m_voxelPositionsXformed);
if (m_voxelSubmerged)
btAlignedFree (m_voxelSubmerged);
}
static bool sphereVsAABB (const btVector3& aabbMin, const btVector3& aabbMax, const btVector3& sphereCenter, const btScalar sphereRadius)
{
btScalar totalDistance = 0;

View File

@@ -207,8 +207,8 @@ protected:
btHfFluidBuoyantConvexShape* m_buoyantShape;
btIDebugDraw* m_debugDraw;
int m_numVoxels;
btVector3 m_voxelPositionsXformed[32*32*32];
bool m_voxelSubmerged[32*32*32];
btVector3* m_voxelPositionsXformed;
bool* m_voxelSubmerged;
btVector3 m_aabbMin;
btVector3 m_aabbMax;
btScalar m_volume;
@@ -216,6 +216,7 @@ protected:
btScalar m_floatyness;
public:
btHfFluidColumnRigidBodyCallback (btRigidBody* rigidBody, btIDebugDraw* debugDraw, btScalar density, btScalar floatyness);
~btHfFluidColumnRigidBodyCallback ();
bool processColumn (btHfFluid* fluid, int w, int l);
btScalar getVolume () const { return m_volume; }
};

View File

@@ -15,10 +15,18 @@ btHfFluidBuoyantConvexShape::btHfFluidBuoyantConvexShape (btConvexShape* convexS
m_convexShape = convexShape;
m_shapeType = HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE;
m_radius = btScalar(0.f);
m_numVoxels = 0;
m_voxelPositions = NULL;
m_totalVolume = btScalar(0.0f);
m_floatyness = btScalar(1.5f);
}
btHfFluidBuoyantConvexShape::~btHfFluidBuoyantConvexShape ()
{
if (m_voxelPositions)
btAlignedFree (m_voxelPositions);
}
void btHfFluidBuoyantConvexShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
{
return m_convexShape->getAabb (t, aabbMin, aabbMax);
@@ -128,6 +136,7 @@ void btHfFluidBuoyantConvexShape::generateShape (btScalar radius, btScalar gap)
btVoronoiSimplexSolver simplexSolver;
btSphereShape sphereShape(radius);
btVector3* voxelPositions = (btVector3*)btAlignedAlloc (sizeof(btVector3)*MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION,16);
for (int i = 0; i < MAX_VOXEL_DIMENSION; i++)
{
for (int j = 0; j < MAX_VOXEL_DIMENSION; j++)
@@ -150,13 +159,19 @@ void btHfFluidBuoyantConvexShape::generateShape (btScalar radius, btScalar gap)
if (intersect (&simplexSolver, T, sT, m_convexShape, &sphereShape))
{
m_voxelPositions[m_numVoxels] = point;
voxelPositions[m_numVoxels] = point;
m_numVoxels++;
}
}
}
}
}
m_voxelPositions = (btVector3*)btAlignedAlloc (sizeof(btVector3)*m_numVoxels, 16);
for (int i = 0; i < m_numVoxels;i++)
{
m_voxelPositions[i] = voxelPositions[i];
}
btAlignedFree (voxelPositions);
m_volumePerVoxel = btScalar(4.0f)/btScalar(3.0f)*SIMD_PI*radius*radius*radius;
m_totalVolume = m_numVoxels * m_volumePerVoxel;
m_radius = radius;

View File

@@ -12,7 +12,7 @@ class btHfFluidBuoyantConvexShape : public btCollisionShape
{
public:
btHfFluidBuoyantConvexShape (btConvexShape* convexShape);
~btHfFluidBuoyantConvexShape ();
void generateShape (btScalar radius, btScalar gap);
btConvexShape* getConvexShape () { return m_convexShape; }
@@ -39,7 +39,7 @@ protected:
btScalar m_totalVolume;
btScalar m_volumePerVoxel;
int m_numVoxels;
btVector3 m_voxelPositions[MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION];
btVector3* m_voxelPositions;
btConvexShape* m_convexShape;
};