From 67f402df75f2ffb680c865a5c50907ecce8a3cff Mon Sep 17 00:00:00 2001 From: shadowislord Date: Sat, 7 Jun 2014 15:26:04 -0400 Subject: [PATCH] * Remove use of instance variable in BIHTree, instead use TempVars --- .../java/com/jme3/collision/bih/BIHTree.java | 54 ++++++++++--------- .../src/main/java/com/jme3/util/TempVars.java | 2 + 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/collision/bih/BIHTree.java b/jme3-core/src/main/java/com/jme3/collision/bih/BIHTree.java index 6c43658fe..38a633e96 100644 --- a/jme3-core/src/main/java/com/jme3/collision/bih/BIHTree.java +++ b/jme3-core/src/main/java/com/jme3/collision/bih/BIHTree.java @@ -68,7 +68,7 @@ public class BIHTree implements CollisionData { private float[] pointData; private int[] triIndices; - private transient CollisionResults boundResults = new CollisionResults(); + // private transient CollisionResults boundResults = new CollisionResults(); private transient float[] bihSwapTmp; private static final TriangleAxisComparator[] comparators = new TriangleAxisComparator[] @@ -398,33 +398,39 @@ public class BIHTree implements CollisionData { BoundingVolume worldBound, CollisionResults results) { - boundResults.clear(); - worldBound.collideWith(r, boundResults); - if (boundResults.size() > 0) { - float tMin = boundResults.getClosestCollision().getDistance(); - float tMax = boundResults.getFarthestCollision().getDistance(); + TempVars vars = TempVars.get(); + try { + CollisionResults boundResults = vars.collisionResults; + boundResults.clear(); + worldBound.collideWith(r, boundResults); + if (boundResults.size() > 0) { + float tMin = boundResults.getClosestCollision().getDistance(); + float tMax = boundResults.getFarthestCollision().getDistance(); - if (tMax <= 0) { - tMax = Float.POSITIVE_INFINITY; - } else if (tMin == tMax) { - tMin = 0; - } - - if (tMin <= 0) { - tMin = 0; - } - - if (r.getLimit() < Float.POSITIVE_INFINITY) { - tMax = Math.min(tMax, r.getLimit()); - if (tMin > tMax){ - return 0; + if (tMax <= 0) { + tMax = Float.POSITIVE_INFINITY; + } else if (tMin == tMax) { + tMin = 0; } - } -// return root.intersectBrute(r, worldMatrix, this, tMin, tMax, results); - return root.intersectWhere(r, worldMatrix, this, tMin, tMax, results); + if (tMin <= 0) { + tMin = 0; + } + + if (r.getLimit() < Float.POSITIVE_INFINITY) { + tMax = Math.min(tMax, r.getLimit()); + if (tMin > tMax){ + return 0; + } + } + + // return root.intersectBrute(r, worldMatrix, this, tMin, tMax, results); + return root.intersectWhere(r, worldMatrix, this, tMin, tMax, results); + } + return 0; + } finally { + vars.release(); } - return 0; } private int collideWithBoundingVolume(BoundingVolume bv, diff --git a/jme3-core/src/main/java/com/jme3/util/TempVars.java b/jme3-core/src/main/java/com/jme3/util/TempVars.java index f41d617ba..54f56243b 100644 --- a/jme3-core/src/main/java/com/jme3/util/TempVars.java +++ b/jme3-core/src/main/java/com/jme3/util/TempVars.java @@ -33,6 +33,7 @@ package com.jme3.util; import com.jme3.bounding.BoundingBox; import com.jme3.bounding.BoundingVolume; +import com.jme3.collision.CollisionResults; import com.jme3.collision.bih.BIHNode.BIHStackData; import com.jme3.math.*; import com.jme3.scene.Spatial; @@ -222,6 +223,7 @@ public class TempVars { /** * BIHTree */ + public final CollisionResults collisionResults = new CollisionResults(); public final float[] bihSwapTmp = new float[9]; public final ArrayList bihStack = new ArrayList(); }