more work towards removeBody for C-API/pybullet, work-in-progress.

This commit is contained in:
Erwin Coumans
2017-05-03 21:53:29 -07:00
parent 152e3da3e4
commit a86f584824
13 changed files with 278 additions and 23 deletions

View File

@@ -16,11 +16,11 @@ struct b3PoolBodyHandle : public U
B3_DECLARE_ALIGNED_ALLOCATOR();
int m_nextFreeHandle;
void SetNextFree(int next)
void setNextFree(int next)
{
m_nextFreeHandle = next;
}
int GetNextFree() const
int getNextFree() const
{
return m_nextFreeHandle;
}
@@ -35,6 +35,16 @@ protected:
int m_numUsedHandles; // number of active handles
int m_firstFreeHandle; // free handles list
T* getHandleInternal(int handle)
{
return &m_bodyHandles[handle];
}
const T* getHandleInternal(int handle) const
{
return &m_bodyHandles[handle];
}
public:
b3ResizablePool()
@@ -58,13 +68,15 @@ public:
for (int i=0;i<m_bodyHandles.size();i++)
{
if (m_bodyHandles[i].GetNextFree()==B3_POOL_HANDLE_TERMINAL_USED)
if (m_bodyHandles[i].getNextFree()==B3_POOL_HANDLE_TERMINAL_USED)
{
usedHandles.push_back(i);
}
}
}
T* getHandle(int handle)
{
b3Assert(handle>=0);
@@ -73,11 +85,28 @@ public:
{
return 0;
}
return &m_bodyHandles[handle];
if (m_bodyHandles[handle].getNextFree()==B3_POOL_HANDLE_TERMINAL_USED)
{
return &m_bodyHandles[handle];
}
return 0;
}
const T* getHandle(int handle) const
{
return &m_bodyHandles[handle];
b3Assert(handle>=0);
b3Assert(handle<m_bodyHandles.size());
if ((handle<0) || (handle>=m_bodyHandles.size()))
{
return 0;
}
if (m_bodyHandles[handle].getNextFree()==B3_POOL_HANDLE_TERMINAL_USED)
{
return &m_bodyHandles[handle];
}
return 0;
}
void increaseHandleCapacity(int extraCapacity)
@@ -89,10 +118,10 @@ public:
{
for (int i = curCapacity; i < newCapacity; i++)
m_bodyHandles[i].SetNextFree(i + 1);
m_bodyHandles[i].setNextFree(i + 1);
m_bodyHandles[newCapacity - 1].SetNextFree(-1);
m_bodyHandles[newCapacity - 1].setNextFree(-1);
}
m_firstFreeHandle = curCapacity;
}
@@ -116,7 +145,7 @@ public:
b3Assert(m_firstFreeHandle>=0);
int handle = m_firstFreeHandle;
m_firstFreeHandle = getHandle(handle)->GetNextFree();
m_firstFreeHandle = getHandleInternal(handle)->getNextFree();
m_numUsedHandles++;
if (m_firstFreeHandle<0)
@@ -126,10 +155,10 @@ public:
increaseHandleCapacity(additionalCapacity);
getHandle(handle)->SetNextFree(m_firstFreeHandle);
getHandleInternal(handle)->setNextFree(m_firstFreeHandle);
}
getHandle(handle)->SetNextFree(B3_POOL_HANDLE_TERMINAL_USED);
getHandleInternal(handle)->setNextFree(B3_POOL_HANDLE_TERMINAL_USED);
getHandleInternal(handle)->clear();
return handle;
}
@@ -138,7 +167,8 @@ public:
{
b3Assert(handle >= 0);
getHandle(handle)->SetNextFree(m_firstFreeHandle);
getHandleInternal(handle)->clear();
getHandleInternal(handle)->setNextFree(m_firstFreeHandle);
m_firstFreeHandle = handle;
m_numUsedHandles--;