From 64ead641777030627151c88c0db381aff3b19d95 Mon Sep 17 00:00:00 2001 From: Davis Rollman Date: Fri, 8 May 2026 16:04:26 -0700 Subject: [PATCH] Optimize BoundingBox distanceToEdge scalar math 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. --- .../java/com/jme3/bounding/BoundingBox.java | 41 +++++++------------ .../com/jme3/bounding/TestBoundingBox.java | 14 +++++++ 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/bounding/BoundingBox.java b/jme3-core/src/main/java/com/jme3/bounding/BoundingBox.java index 079d96bfe3..0d9a37a6c7 100644 --- a/jme3-core/src/main/java/com/jme3/bounding/BoundingBox.java +++ b/jme3-core/src/main/java/com/jme3/bounding/BoundingBox.java @@ -960,47 +960,36 @@ public boolean intersects(Vector3f point) { @Override public float distanceToEdge(Vector3f point) { - // compute coordinates of point in box coordinate system - TempVars vars = TempVars.get(); - Vector3f closest = vars.vect1; - - point.subtract(center, closest); - - // project test point onto box float sqrDistance = 0.0f; float delta; + float closestX = point.x - center.x; - if (closest.x < -xExtent) { - delta = closest.x + xExtent; + if (closestX < -xExtent) { + delta = closestX + xExtent; sqrDistance += delta * delta; - closest.x = -xExtent; - } else if (closest.x > xExtent) { - delta = closest.x - xExtent; + } else if (closestX > xExtent) { + delta = closestX - xExtent; sqrDistance += delta * delta; - closest.x = xExtent; } - if (closest.y < -yExtent) { - delta = closest.y + yExtent; + float closestY = point.y - center.y; + if (closestY < -yExtent) { + delta = closestY + yExtent; sqrDistance += delta * delta; - closest.y = -yExtent; - } else if (closest.y > yExtent) { - delta = closest.y - yExtent; + } else if (closestY > yExtent) { + delta = closestY - yExtent; sqrDistance += delta * delta; - closest.y = yExtent; } - if (closest.z < -zExtent) { - delta = closest.z + zExtent; + float closestZ = point.z - center.z; + if (closestZ < -zExtent) { + delta = closestZ + zExtent; sqrDistance += delta * delta; - closest.z = -zExtent; - } else if (closest.z > zExtent) { - delta = closest.z - zExtent; + } else if (closestZ > zExtent) { + delta = closestZ - zExtent; sqrDistance += delta * delta; - closest.z = zExtent; } - vars.release(); return FastMath.sqrt(sqrDistance); } diff --git a/jme3-core/src/test/java/com/jme3/bounding/TestBoundingBox.java b/jme3-core/src/test/java/com/jme3/bounding/TestBoundingBox.java index 199eaab7dd..74c56a6be9 100644 --- a/jme3-core/src/test/java/com/jme3/bounding/TestBoundingBox.java +++ b/jme3-core/src/test/java/com/jme3/bounding/TestBoundingBox.java @@ -31,6 +31,7 @@ */ package com.jme3.bounding; +import com.jme3.math.FastMath; import com.jme3.math.Vector3f; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -41,6 +42,19 @@ * @author Stephen Gold */ public class TestBoundingBox { + /** + * Verify distanceToEdge() for points inside and outside a non-origin box. + */ + @Test + public void testDistanceToEdge() { + BoundingBox box = new BoundingBox(new Vector3f(3f, -2f, 7f), 5f, 9f, 13f); + + Assertions.assertEquals(0f, box.distanceToEdge(new Vector3f(4f, 0f, 9f)), 0f); + Assertions.assertEquals(0f, box.distanceToEdge(new Vector3f(8f, -2f, 7f)), 0f); + Assertions.assertEquals(3f, box.distanceToEdge(new Vector3f(11f, -2f, 7f)), 0f); + Assertions.assertEquals(6f, box.distanceToEdge(new Vector3f(10f, -15f, 24f)), FastMath.ZERO_TOLERANCE); + } + /** * Verify that equals() behaves as expected. */