Skip to content

Commit 9178ff5

Browse files
committed
Merge pull request #7 from kitskub/master
Fix two issues
2 parents f642e71 + 31c453f commit 9178ff5

File tree

3 files changed

+38
-27
lines changed

3 files changed

+38
-27
lines changed

src/main/java/org/spout/physics/collision/broadphase/SweepAndPruneAlgorithm.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ private void shrinkArrays() {
393393
newMapBodyToBoxIndex.put(body, boxIndex);
394394
}
395395
}
396+
mFreeBoxIndices.clear();
396397
if (newMapBodyToBoxIndex.size() != mMapBodyToBoxIndex.size()) {
397398
throw new IllegalStateException("The size of the new map from body to box index must be the same as the old one");
398399
}

src/main/java/org/spout/physics/engine/DynamicsWorld.java

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*

src/main/java/org/spout/physics/engine/linked/LinkedDynamicsWorld.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ public LinkedDynamicsWorld(Vector3 gravity, LinkedWorldInfo info) {
6565
}
6666

6767
@Override
68-
public void update() {
69-
super.update();
68+
public void tick() {
69+
super.tick();
7070
clearLinkedBodies();
7171
}
7272

@@ -94,7 +94,8 @@ public void addLinkedBodies(Collection<RigidBody> bodies) {
9494
// Clears all bodies tracked in the world.
9595
private void clearLinkedBodies() {
9696
for (RigidBody linkedBody : linkedBodies) {
97-
destroyRigidBody(linkedBody);
97+
// We're in a safe part of the tick so we can clear them immediately
98+
destroyRigidBodyImmediately(linkedBody);
9899
}
99100
linkedBodies.clear();
100101
}

0 commit comments

Comments
 (0)