@@ -364,27 +364,32 @@ public void update() {
364364 mTimer .update ();
365365 isTicking = true ;
366366 while (mTimer .isPossibleToTakeStep ()) {
367- mContactManifolds .clear ();
368- resetContactManifoldListsOfBodies ();
369- mCollisionDetection .computeCollisionDetection ();
370- computeIslands ();
371- integrateRigidBodiesVelocities ();
372- resetBodiesMovementVariable ();
373- mTimer .nextStep ();
374- solveContactsAndConstraints ();
375- integrateRigidBodiesPositions ();
376- solvePositionCorrection ();
377- if (mIsSleepingEnabled ) {
378- updateSleepingBodies ();
379- }
380- updateRigidBodiesAABB ();
367+ tick ();
381368 }
382369 isTicking = false ;
383370 resetBodiesForceAndTorque ();
384371 setInterpolationFactorToAllBodies ();
385372 disperseCache ();
386373 }
387374
375+ // LinkedDynamicsWorld needs to clearLinkedBodies at the end of a tick, not update
376+ protected void tick () {
377+ mContactManifolds .clear ();
378+ resetContactManifoldListsOfBodies ();
379+ mCollisionDetection .computeCollisionDetection ();
380+ computeIslands ();
381+ integrateRigidBodiesVelocities ();
382+ resetBodiesMovementVariable ();
383+ mTimer .nextStep ();
384+ solveContactsAndConstraints ();
385+ integrateRigidBodiesPositions ();
386+ solvePositionCorrection ();
387+ if (mIsSleepingEnabled ) {
388+ updateSleepingBodies ();
389+ }
390+ updateRigidBodiesAABB ();
391+ }
392+
388393 // Resets the boolean movement variable for each body.
389394 private void resetBodiesMovementVariable () {
390395 for (RigidBody rigidBody : mRigidBodies ) {
@@ -628,21 +633,25 @@ public void addRigidBody(RigidBody body) {
628633 */
629634 public void destroyRigidBody (RigidBody rigidBody ) {
630635 if (!isTicking ) {
631- mCollisionDetection .removeBody (rigidBody );
632- mFreeBodiesIDs .push (rigidBody .getID ());
633- mBodies .remove (rigidBody );
634- mRigidBodies .remove (rigidBody );
635- removeCollisionShape (rigidBody .getCollisionShape ());
636- JointListElement element ;
637- for (element = rigidBody .getJointsList (); element != null ; element = element .getNext ()) {
638- destroyJoint (element .getJoint ());
639- }
640- rigidBody .resetContactManifoldsList ();
636+ destroyRigidBodyImmediately (rigidBody );
641637 } else {
642638 mRigidBodiesToDeleteCache .add (rigidBody );
643639 }
644640 }
645641
642+ protected void destroyRigidBodyImmediately (RigidBody rigidBody ) {
643+ mCollisionDetection .removeBody (rigidBody );
644+ mFreeBodiesIDs .push (rigidBody .getID ());
645+ mBodies .remove (rigidBody );
646+ mRigidBodies .remove (rigidBody );
647+ removeCollisionShape (rigidBody .getCollisionShape ());
648+ JointListElement element ;
649+ for (element = rigidBody .getJointsList (); element != null ; element = element .getNext ()) {
650+ destroyJoint (element .getJoint ());
651+ }
652+ rigidBody .resetContactManifoldsList ();
653+ }
654+
646655 /**
647656 * Creates a joint between two bodies in the world and returns the new joint.
648657 *
0 commit comments