fix issue ,don't iterate over [0..numBodyHandles], would fail once we allow 'removeBody'...
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user