b3ResizablePool: only remove a handle, if it is currently in-use

also remove user constraints, if removing a body
This commit is contained in:
Erwin Coumans
2017-05-04 13:14:24 -07:00
parent fac3d6e3ca
commit 61999ef789
5 changed files with 53 additions and 7 deletions

Binary file not shown.

View File

@@ -1097,6 +1097,11 @@ const SharedMemoryStatus* PhysicsClientSharedMemory::processServerStatus() {
int bodyUniqueId = serverCmd.m_removeObjectArgs.m_bodyUniqueIds[i]; int bodyUniqueId = serverCmd.m_removeObjectArgs.m_bodyUniqueIds[i];
removeCachedBody(bodyUniqueId); removeCachedBody(bodyUniqueId);
} }
for (int i=0;i<serverCmd.m_removeObjectArgs.m_numUserConstraints;i++)
{
int key = serverCmd.m_removeObjectArgs.m_userConstraintUniqueIds[i];
m_data->m_userConstraintInfoMap.remove(key);
}
} }
if (serverCmd.m_type == CMD_USER_CONSTRAINT_INFO_COMPLETED) if (serverCmd.m_type == CMD_USER_CONSTRAINT_INFO_COMPLETED)

View File

@@ -736,6 +736,12 @@ void PhysicsDirect::postProcessStatus(const struct SharedMemoryStatus& serverCmd
int bodyUniqueId = serverCmd.m_removeObjectArgs.m_bodyUniqueIds[i]; int bodyUniqueId = serverCmd.m_removeObjectArgs.m_bodyUniqueIds[i];
removeCachedBody(bodyUniqueId); removeCachedBody(bodyUniqueId);
} }
for (int i=0;i<serverCmd.m_removeObjectArgs.m_numUserConstraints;i++)
{
int key = serverCmd.m_removeObjectArgs.m_userConstraintUniqueIds[i];
m_data->m_userConstraintInfoMap.remove(key);
}
break; break;
} }
case CMD_CHANGE_USER_CONSTRAINT_COMPLETED: case CMD_CHANGE_USER_CONSTRAINT_COMPLETED:

View File

@@ -4941,19 +4941,48 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
if (bodyHandle->m_multiBody) if (bodyHandle->m_multiBody)
{ {
serverCmd.m_removeObjectArgs.m_bodyUniqueIds[serverCmd.m_removeObjectArgs.m_numBodies++] = bodyUniqueId; serverCmd.m_removeObjectArgs.m_bodyUniqueIds[serverCmd.m_removeObjectArgs.m_numBodies++] = bodyUniqueId;
//also remove user constraints...
for (int i=m_data->m_dynamicsWorld->getNumMultiBodyConstraints()-1;i>=0;i--)
{
btMultiBodyConstraint* mbc = m_data->m_dynamicsWorld->getMultiBodyConstraint(i);
if ((mbc->getMultiBodyA() == bodyHandle->m_multiBody)||(mbc->getMultiBodyB()==bodyHandle->m_multiBody))
{
m_data->m_dynamicsWorld->removeMultiBodyConstraint(mbc);
//also remove user constraint and submit it as removed
for (int c=m_data->m_userConstraints.size()-1;c>=0;c--)
{
InteralUserConstraintData* userConstraintPtr = m_data->m_userConstraints.getAtIndex(c);
int userConstraintKey = m_data->m_userConstraints.getKeyAtIndex(c).getUid1();
if (userConstraintPtr->m_mbConstraint == mbc)
{
m_data->m_userConstraints.remove(userConstraintKey);
serverCmd.m_removeObjectArgs.m_userConstraintUniqueIds[serverCmd.m_removeObjectArgs.m_numUserConstraints++]=userConstraintKey;
}
}
delete mbc;
}
}
if (bodyHandle->m_multiBody->getBaseCollider()) if (bodyHandle->m_multiBody->getBaseCollider())
{ {
m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getBaseCollider());
int graphicsIndex = bodyHandle->m_multiBody->getBaseCollider()->getUserIndex(); int graphicsIndex = bodyHandle->m_multiBody->getBaseCollider()->getUserIndex();
m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex); m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex);
m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getBaseCollider());
} }
for (int link=0;link<bodyHandle->m_multiBody->getNumLinks();link++) for (int link=0;link<bodyHandle->m_multiBody->getNumLinks();link++)
{ {
if (bodyHandle->m_multiBody->getLink(link).m_collider) if (bodyHandle->m_multiBody->getLink(link).m_collider)
{ {
m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getLink(link).m_collider);
int graphicsIndex = bodyHandle->m_multiBody->getLink(link).m_collider->getUserIndex(); int graphicsIndex = bodyHandle->m_multiBody->getLink(link).m_collider->getUserIndex();
m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex); m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex);
m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getLink(link).m_collider);
} }
} }
int numCollisionObjects = m_data->m_dynamicsWorld->getNumCollisionObjects(); int numCollisionObjects = m_data->m_dynamicsWorld->getNumCollisionObjects();
@@ -4961,6 +4990,8 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
numCollisionObjects = m_data->m_dynamicsWorld->getNumCollisionObjects(); numCollisionObjects = m_data->m_dynamicsWorld->getNumCollisionObjects();
//todo: clear all other remaining data, release memory etc //todo: clear all other remaining data, release memory etc
delete bodyHandle->m_multiBody;
bodyHandle->m_multiBody=0;
serverCmd.m_type = CMD_REMOVE_BODY_COMPLETED; serverCmd.m_type = CMD_REMOVE_BODY_COMPLETED;
} }
if (bodyHandle->m_rigidBody) if (bodyHandle->m_rigidBody)
@@ -4970,6 +5001,8 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
m_data->m_dynamicsWorld->removeRigidBody(bodyHandle->m_rigidBody); m_data->m_dynamicsWorld->removeRigidBody(bodyHandle->m_rigidBody);
int graphicsInstance = bodyHandle->m_rigidBody->getUserIndex2(); int graphicsInstance = bodyHandle->m_rigidBody->getUserIndex2();
m_data->m_guiHelper->removeGraphicsInstance(graphicsInstance); m_data->m_guiHelper->removeGraphicsInstance(graphicsInstance);
delete bodyHandle->m_rigidBody;
bodyHandle->m_rigidBody=0;
serverCmd.m_type = CMD_REMOVE_BODY_COMPLETED; serverCmd.m_type = CMD_REMOVE_BODY_COMPLETED;
} }
} }

View File

@@ -167,11 +167,13 @@ public:
{ {
b3Assert(handle >= 0); b3Assert(handle >= 0);
getHandleInternal(handle)->clear(); if (m_bodyHandles[handle].getNextFree()==B3_POOL_HANDLE_TERMINAL_USED)
getHandleInternal(handle)->setNextFree(m_firstFreeHandle); {
m_firstFreeHandle = handle; getHandleInternal(handle)->clear();
getHandleInternal(handle)->setNextFree(m_firstFreeHandle);
m_numUsedHandles--; m_firstFreeHandle = handle;
m_numUsedHandles--;
}
} }
}; };
///end handle management ///end handle management