fix issue ,don't iterate over [0..numBodyHandles], would fail once we allow 'removeBody'...

This commit is contained in:
Erwin Coumans
2017-05-03 11:23:01 -07:00
parent 2c8f65a2d0
commit 6f7601966d
2 changed files with 23 additions and 4 deletions

View File

@@ -2793,11 +2793,12 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
{
BT_PROFILE("CMD_SYNC_BODY_INFO");
int numHandles = m_data->m_bodyHandles.getNumHandles();
b3AlignedObjectArray<int> usedHandles;
m_data->m_bodyHandles.getUsedHandles(usedHandles);
int actualNumBodies = 0;
for (int i=0;i<numHandles;i++)
for (int i=0;i<usedHandles.size();i++)
{
InteralBodyData* body = m_data->m_bodyHandles.getHandle(i);
InteralBodyData* body = m_data->m_bodyHandles.getHandle(usedHandles[i]);
if (body && (body->m_multiBody || body->m_rigidBody))
{
serverStatusOut.m_sdfLoadedArgs.m_bodyUniqueIds[actualNumBodies++] = i;

View File

@@ -4,6 +4,12 @@
#include "Bullet3Common/b3AlignedObjectArray.h"
enum
{
B3_POOL_HANDLE_TERMINAL_FREE=-1,
B3_POOL_HANDLE_TERMINAL_USED =-2
};
template <typename U>
struct b3PoolBodyHandle : public U
{
@@ -45,6 +51,18 @@ public:
return m_bodyHandles.size();
}
void getUsedHandles(b3AlignedObjectArray<int>& usedHandles) const
{
for (int i=0;i<m_bodyHandles.size();i++)
{
if (m_bodyHandles[i].GetNextFree()==B3_POOL_HANDLE_TERMINAL_USED)
{
usedHandles.push_back(i);
}
}
}
T* getHandle(int handle)
{
btAssert(handle>=0);
@@ -108,7 +126,7 @@ public:
getHandle(handle)->SetNextFree(m_firstFreeHandle);
}
getHandle(handle)->SetNextFree(B3_POOL_HANDLE_TERMINAL_USED);
return handle;
}