From 61999ef78978607449748c23b1b85f98b8f6b506 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Thu, 4 May 2017 13:14:24 -0700 Subject: [PATCH] b3ResizablePool: only remove a handle, if it is currently in-use also remove user constraints, if removing a body --- data/multibody.bullet | Bin 14712 -> 16660 bytes .../PhysicsClientSharedMemory.cpp | 5 +++ examples/SharedMemory/PhysicsDirect.cpp | 6 +++ .../PhysicsServerCommandProcessor.cpp | 37 +++++++++++++++++- src/Bullet3Common/b3ResizablePool.h | 12 +++--- 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/data/multibody.bullet b/data/multibody.bullet index 4cb146f2f271443a0a269fc243ee2c4cd8ad23ee..f71d00473ae14b544e4cabd209769298abea4307 100644 GIT binary patch delta 3797 zcmeHJZ)j6j6hAkn&FdeBwm~!4Mzyt5CS}%u8UA@MU92)vEmfy=ai!WyJL=k%Fg13I z>+(Ucpz{1+6{NDM2%h9v90Cv+R(Dd=4j*!5qW^`00nTV1%K*T0y4Vff6-@K zaKzr1Qlg+CR~h~IAj1z?sx&~2@x-?yphJU$SLbCNNXLKMe6zud&8rsGA8DI!_K4Ez zsx)>iXsC-cr?DyoHUT+J2^rmN71bU|l9{Y;ND=I}5vipak~+V)Zv1|6Vc9vo%sSL( z`l$ykClWuNb=yN(`YXWdCmZ-h@iN>LZXSbxWsN}IC$n9=S?1($Va<5Lf8qKFG7M-g zW{ylZkW@}z5}iCgAIc5t5Nhw)5}!Q&v-yYhgk?^uW1!BD0nBn|Io;*deX5x#ms8OX zveMHSus)h8q|Jbp&AjDmIQs@#4VP4m3ZN+4O#@6raVI>*s~rE)xjR2MY(K2$Q&l2K zt&!xqteR3+l<4-r(0ly#;b~nVFV9u^IXLjWp<+sEMfRJG1pzM~*c|tq z$!4z{Dyl3M?@*YfSMKxkOpWW3rv5=?BDZ8B_Vra<{lRN1TLpj<^IK%7LnSTunA7+K*%uVsA9M3jAY*%(LG6>+3!k zgK;VB-gfyZ!dgMBBC+%2&`o{i=F|dSj3|Mk5LgOI5w)p)ijO?!@!VlL2a9|UPRlSK zRewvEQBBKh2gdAnA(}!T2h8)D|6P7fs$~3iahI&v@ocYhuHL^C#A<54$H+H)?!{n- z|NVmSWOWyW?`AGcR*-A=7RC-;dz9@9W&M9arg}q)`Bg>Mg_jJ~m^CGHL~3|-$=$j2 zyIMZ!?))?!?cUwq8|~cH87F&ZQ%_IcPDAUS`tIHx?MeguhwWY6J38Zg&1IGS!{1dJ zT0tpQk!Fg;uO~NB3d1vq$4>@%@o2ybdV^L_2vZ+mlo6L^ zXqGKO!k*$36E|o;^od{TA&rWdh32y=Ok5IV72R$G3e9-f`^lELr zZB&GaN%0!(ho7%t+b=$%t?=`;<;P2{pbO|@@}XP%;diU3g{&MlGhyR{4eLAsBq`fp delta 2049 zcmbtUO-xf+6h0Ro()IyXT836p>ko;eqZ!dg5(<3}tAis-1t%l^g-ML_5=N~q{D&5G zQH={{LXvt(w~W$1kcOYd+)jD=icw0 z)7w|XmovxOf9vervH$qSvrWy>#P6L6gNVvp{De^eqa)!sQ6@e*GSYTEn~gyQxvR5o zCfC`U87@YxlG#dQ%t|x#+>j8KhKT!dMB+ zK{$il%a7mIA^Q}Orb*jh%#PL@*=)s2l`Vzj`u@+QhOaiRB z$%uM7^kg%l+FW1^0EHZJLN8!lQzJ{%*|8WKNGGo~uGTZN#3g0r)JPa6Ev%3xKFk>b z^Y5_rTwTF2iVRdsuL|_Ciyeq3^E^1ba#QgUILzE!6kIq>w!N$U*AUKH1wCUOP^YxTv|Wd8{BG zca$Tk6WfJ6A&=Z=Y*c#Vg4eeX`JdNM)~x-J-6REe8)02afzAHHDtva#uWMhpcdfz2m*D$4?sN->cUSLSPCoy8i3`%3ScF$5CR(6O%fnmzmx#g z8uHhf)5-!`{8I44e1-gJ+?jgacq*O_Yi*qN|JFB8?vB^a1RlQ)IrcZZN);vR1rw0i zt8b2Na-M^qg#Qz`w0f|ySKqTEGci#6Z@u+!{Sb<6V%rAYQ{ktd$!`s838(w$7T&HI zUywRT!RG;*DMCrC`|ukf&HnsYC+VXIiD5cG|B!*=oi6v-dxRa1lp#aBr(uy5Z^$EF z2}5McZk0_dujsrmXc(Cc3ZX;|SR3?|j4F|$_u@@iR=l9p#Hy|DR1vf)H60~%4tF>& zHq!-+7sX);TK$@SKWDx-2|20NX)vhz`OpZTl(o2gXJ^YX7|rBF;h4 PguMWKs^L=!AGY}lKm_userConstraintInfoMap.remove(key); + } } if (serverCmd.m_type == CMD_USER_CONSTRAINT_INFO_COMPLETED) diff --git a/examples/SharedMemory/PhysicsDirect.cpp b/examples/SharedMemory/PhysicsDirect.cpp index e3384d871..8a5ec6c8d 100644 --- a/examples/SharedMemory/PhysicsDirect.cpp +++ b/examples/SharedMemory/PhysicsDirect.cpp @@ -736,6 +736,12 @@ void PhysicsDirect::postProcessStatus(const struct SharedMemoryStatus& serverCmd int bodyUniqueId = serverCmd.m_removeObjectArgs.m_bodyUniqueIds[i]; removeCachedBody(bodyUniqueId); } + for (int i=0;im_userConstraintInfoMap.remove(key); + } + break; } case CMD_CHANGE_USER_CONSTRAINT_COMPLETED: diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index 6f43c99ec..96ab8fd29 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -4941,19 +4941,48 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm if (bodyHandle->m_multiBody) { 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()) { + m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getBaseCollider()); int graphicsIndex = bodyHandle->m_multiBody->getBaseCollider()->getUserIndex(); m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex); - m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getBaseCollider()); } for (int link=0;linkm_multiBody->getNumLinks();link++) { + 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(); 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(); @@ -4961,6 +4990,8 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm numCollisionObjects = m_data->m_dynamicsWorld->getNumCollisionObjects(); //todo: clear all other remaining data, release memory etc + delete bodyHandle->m_multiBody; + bodyHandle->m_multiBody=0; serverCmd.m_type = CMD_REMOVE_BODY_COMPLETED; } if (bodyHandle->m_rigidBody) @@ -4970,6 +5001,8 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm m_data->m_dynamicsWorld->removeRigidBody(bodyHandle->m_rigidBody); int graphicsInstance = bodyHandle->m_rigidBody->getUserIndex2(); m_data->m_guiHelper->removeGraphicsInstance(graphicsInstance); + delete bodyHandle->m_rigidBody; + bodyHandle->m_rigidBody=0; serverCmd.m_type = CMD_REMOVE_BODY_COMPLETED; } } diff --git a/src/Bullet3Common/b3ResizablePool.h b/src/Bullet3Common/b3ResizablePool.h index ff28c2218..06ad8a778 100644 --- a/src/Bullet3Common/b3ResizablePool.h +++ b/src/Bullet3Common/b3ResizablePool.h @@ -167,11 +167,13 @@ public: { b3Assert(handle >= 0); - getHandleInternal(handle)->clear(); - getHandleInternal(handle)->setNextFree(m_firstFreeHandle); - m_firstFreeHandle = handle; - - m_numUsedHandles--; + if (m_bodyHandles[handle].getNextFree()==B3_POOL_HANDLE_TERMINAL_USED) + { + getHandleInternal(handle)->clear(); + getHandleInternal(handle)->setNextFree(m_firstFreeHandle); + m_firstFreeHandle = handle; + m_numUsedHandles--; + } } }; ///end handle management