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"); 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; 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)) if (body && (body->m_multiBody || body->m_rigidBody))
{ {
serverStatusOut.m_sdfLoadedArgs.m_bodyUniqueIds[actualNumBodies++] = i; serverStatusOut.m_sdfLoadedArgs.m_bodyUniqueIds[actualNumBodies++] = i;

View File

@@ -4,6 +4,12 @@
#include "Bullet3Common/b3AlignedObjectArray.h" #include "Bullet3Common/b3AlignedObjectArray.h"
enum
{
B3_POOL_HANDLE_TERMINAL_FREE=-1,
B3_POOL_HANDLE_TERMINAL_USED =-2
};
template <typename U> template <typename U>
struct b3PoolBodyHandle : public U struct b3PoolBodyHandle : public U
{ {
@@ -45,6 +51,18 @@ public:
return m_bodyHandles.size(); 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) T* getHandle(int handle)
{ {
btAssert(handle>=0); btAssert(handle>=0);
@@ -108,7 +126,7 @@ public:
getHandle(handle)->SetNextFree(m_firstFreeHandle); getHandle(handle)->SetNextFree(m_firstFreeHandle);
} }
getHandle(handle)->SetNextFree(B3_POOL_HANDLE_TERMINAL_USED);
return handle; return handle;
} }