4141 * www.codercorner.com/SAP.pdf.
4242 */
4343public 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