Skip to content

Commit f629be3

Browse files
authored
Optimize BoundingBox distanceToEdge scalar math (#2749)
Avoid TempVars and temporary Vector3f mutation in the point distance path by computing axis deltas directly. Adds direct edge-case coverage for inside, surface, single-axis outside, and multi-axis outside points. Measured locally with BoundingVolumeBenchmark: inside/outside points improved from about 23 ns/op to about 2.1/2.5 ns/op.
1 parent ebe10ba commit f629be3

2 files changed

Lines changed: 29 additions & 26 deletions

File tree

jme3-core/src/main/java/com/jme3/bounding/BoundingBox.java

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -960,47 +960,36 @@ public boolean intersects(Vector3f point) {
960960

961961
@Override
962962
public float distanceToEdge(Vector3f point) {
963-
// compute coordinates of point in box coordinate system
964-
TempVars vars = TempVars.get();
965-
Vector3f closest = vars.vect1;
966-
967-
point.subtract(center, closest);
968-
969-
// project test point onto box
970963
float sqrDistance = 0.0f;
971964
float delta;
965+
float closestX = point.x - center.x;
972966

973-
if (closest.x < -xExtent) {
974-
delta = closest.x + xExtent;
967+
if (closestX < -xExtent) {
968+
delta = closestX + xExtent;
975969
sqrDistance += delta * delta;
976-
closest.x = -xExtent;
977-
} else if (closest.x > xExtent) {
978-
delta = closest.x - xExtent;
970+
} else if (closestX > xExtent) {
971+
delta = closestX - xExtent;
979972
sqrDistance += delta * delta;
980-
closest.x = xExtent;
981973
}
982974

983-
if (closest.y < -yExtent) {
984-
delta = closest.y + yExtent;
975+
float closestY = point.y - center.y;
976+
if (closestY < -yExtent) {
977+
delta = closestY + yExtent;
985978
sqrDistance += delta * delta;
986-
closest.y = -yExtent;
987-
} else if (closest.y > yExtent) {
988-
delta = closest.y - yExtent;
979+
} else if (closestY > yExtent) {
980+
delta = closestY - yExtent;
989981
sqrDistance += delta * delta;
990-
closest.y = yExtent;
991982
}
992983

993-
if (closest.z < -zExtent) {
994-
delta = closest.z + zExtent;
984+
float closestZ = point.z - center.z;
985+
if (closestZ < -zExtent) {
986+
delta = closestZ + zExtent;
995987
sqrDistance += delta * delta;
996-
closest.z = -zExtent;
997-
} else if (closest.z > zExtent) {
998-
delta = closest.z - zExtent;
988+
} else if (closestZ > zExtent) {
989+
delta = closestZ - zExtent;
999990
sqrDistance += delta * delta;
1000-
closest.z = zExtent;
1001991
}
1002992

1003-
vars.release();
1004993
return FastMath.sqrt(sqrDistance);
1005994
}
1006995

jme3-core/src/test/java/com/jme3/bounding/TestBoundingBox.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
*/
3232
package com.jme3.bounding;
3333

34+
import com.jme3.math.FastMath;
3435
import com.jme3.math.Vector3f;
3536
import org.junit.jupiter.api.Assertions;
3637
import org.junit.jupiter.api.Test;
@@ -41,6 +42,19 @@
4142
* @author Stephen Gold
4243
*/
4344
public class TestBoundingBox {
45+
/**
46+
* Verify distanceToEdge() for points inside and outside a non-origin box.
47+
*/
48+
@Test
49+
public void testDistanceToEdge() {
50+
BoundingBox box = new BoundingBox(new Vector3f(3f, -2f, 7f), 5f, 9f, 13f);
51+
52+
Assertions.assertEquals(0f, box.distanceToEdge(new Vector3f(4f, 0f, 9f)), 0f);
53+
Assertions.assertEquals(0f, box.distanceToEdge(new Vector3f(8f, -2f, 7f)), 0f);
54+
Assertions.assertEquals(3f, box.distanceToEdge(new Vector3f(11f, -2f, 7f)), 0f);
55+
Assertions.assertEquals(6f, box.distanceToEdge(new Vector3f(10f, -15f, 24f)), FastMath.ZERO_TOLERANCE);
56+
}
57+
4458
/**
4559
* Verify that equals() behaves as expected.
4660
*/

0 commit comments

Comments
 (0)