Skip to content

Commit 7d8dab9

Browse files
committed
Update to "Fix issues in the Sweep-And-Prune algorithm (thanks Aleksi for reporting them) and handle the broad-phase world limits in a better way"
DanielChappuis/reactphysics3d@828af79bcf8dfa35 90a9ac709dd2cb672ac86e69
1 parent 6d39baf commit 7d8dab9

File tree

1 file changed

+38
-14
lines changed

1 file changed

+38
-14
lines changed

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

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
* www.codercorner.com/SAP.pdf.
4242
*/
4343
public class SweepAndPruneAlgorithm extends BroadPhaseAlgorithm {
44-
private static final int NB_SENTINELS = 2;
4544
private static final int INVALID_INDEX = Integer.MAX_VALUE;
45+
private static final int NB_SENTINELS = 2;
4646
private BoxAABB[] mBoxes = null;
4747
private final EndPoint[][] mEndPoints = {null, null, null};
4848
private int mNbBoxes = 0;
@@ -112,8 +112,8 @@ public void addObject(CollisionBody body, AABB aabb) {
112112
}
113113
final BoxAABB box = mBoxes[boxIndex];
114114
box.setBody(body);
115-
final long minEndPointValue = encodeFloatIntoInteger(Float.MAX_VALUE) - 2;
116115
final long maxEndPointValue = encodeFloatIntoInteger(Float.MAX_VALUE) - 1;
116+
final long minEndPointValue = encodeFloatIntoInteger(Float.MAX_VALUE) - 2;
117117
for (int axis = 0; axis < 3; axis++) {
118118
box.getMin()[axis] = indexLimitEndPoint;
119119
box.getMax()[axis] = indexLimitEndPoint + 1;
@@ -132,25 +132,38 @@ public void addObject(CollisionBody body, AABB aabb) {
132132

133133
@Override
134134
public void removeObject(CollisionBody body) {
135-
final float max = Float.MAX_VALUE;
136-
final Vector3 maxVector = new Vector3(max, max, max);
137-
final AABB aabb = new AABB(maxVector, maxVector);
138-
updateObject(body, aabb);
135+
final long maxEndPointValue = encodeFloatIntoInteger(Float.MAX_VALUE) - 1;
136+
final long minEndPointValue = encodeFloatIntoInteger(Float.MAX_VALUE) - 2;
137+
final AABBInt aabbInt = new AABBInt(minEndPointValue, maxEndPointValue);
138+
updateObjectIntegerAABB(body, aabbInt);
139+
final int boxIndex = mMapBodyToBoxIndex.get(body);
139140
final int indexLimitEndPoint = 2 * mNbBoxes + NB_SENTINELS - 1;
140141
for (int axis = 0; axis < 3; axis++) {
141-
mEndPoints[axis][indexLimitEndPoint - 2] = mEndPoints[axis][indexLimitEndPoint];
142-
mEndPoints[axis][indexLimitEndPoint - 1] = null;
143-
mEndPoints[axis][indexLimitEndPoint] = null;
142+
final EndPoint maxLimitEndPoint = mEndPoints[axis][indexLimitEndPoint];
143+
if (mEndPoints[axis][0].getBoxID() != INVALID_INDEX || !mEndPoints[axis][0].isMin()) {
144+
throw new IllegalStateException("The box ID for the first end point of the axis must" +
145+
" be equal to INVALID_INDEX and the end point must be a minimum");
146+
}
147+
if (maxLimitEndPoint.getBoxID() != INVALID_INDEX || maxLimitEndPoint.isMin()) {
148+
throw new IllegalStateException("The box ID for the limit end point of the axis must" +
149+
" be equal to INVALID_INDEX and the end point must be a maximum");
150+
}
151+
final EndPoint newMaxLimitEndPoint = mEndPoints[axis][indexLimitEndPoint - 2];
152+
newMaxLimitEndPoint.setValues(maxLimitEndPoint.getBoxID(), maxLimitEndPoint.isMin(), maxLimitEndPoint.getValue());
144153
}
145-
final int boxIndex = mMapBodyToBoxIndex.get(body);
146154
mFreeBoxIndices.push(boxIndex);
147155
mMapBodyToBoxIndex.remove(body);
148156
mNbBoxes--;
149157
}
150158

159+
151160
@Override
152161
public void updateObject(CollisionBody body, AABB aabb) {
153162
final AABBInt aabbInt = new AABBInt(aabb);
163+
updateObjectIntegerAABB(body, aabbInt);
164+
}
165+
166+
public void updateObjectIntegerAABB(CollisionBody body, AABBInt aabbInt) {
154167
final int boxIndex = mMapBodyToBoxIndex.get(body);
155168
final BoxAABB box = mBoxes[boxIndex];
156169
for (int axis = 0; axis < 3; axis++) {
@@ -450,10 +463,21 @@ private long[] getMax() {
450463
}
451464

452465
private AABBInt(AABB aabb) {
453-
for (int axis = 0; axis < 3; axis++) {
454-
min[axis] = encodeFloatIntoInteger(aabb.getMin().get(axis));
455-
max[axis] = encodeFloatIntoInteger(aabb.getMax().get(axis));
456-
}
466+
min[0] = encodeFloatIntoInteger(aabb.getMin().getX());
467+
min[1] = encodeFloatIntoInteger(aabb.getMin().getY());
468+
min[2] = encodeFloatIntoInteger(aabb.getMin().getZ());
469+
max[0] = encodeFloatIntoInteger(aabb.getMax().getX());
470+
max[1] = encodeFloatIntoInteger(aabb.getMax().getY());
471+
max[2] = encodeFloatIntoInteger(aabb.getMax().getZ());
472+
}
473+
474+
private AABBInt(long minValue, long maxValue) {
475+
min[0] = minValue;
476+
min[1] = minValue;
477+
min[2] = minValue;
478+
max[0] = maxValue;
479+
max[1] = maxValue;
480+
max[2] = maxValue;
457481
}
458482
}
459483
}

0 commit comments

Comments
 (0)