From ed443bcfa2e3f7c88b82d515673b775c67420ddd Mon Sep 17 00:00:00 2001 From: pspeed42 Date: Tue, 12 Aug 2014 16:32:18 -0400 Subject: [PATCH] Modified Camera.setClipPlane() to avoid garbage creation using tempvars. Only a new matrix is created now and I think I can get rid of that, too. --- .../main/java/com/jme3/renderer/Camera.java | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/renderer/Camera.java b/jme3-core/src/main/java/com/jme3/renderer/Camera.java index 8d58c0649..add8acc84 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/Camera.java +++ b/jme3-core/src/main/java/com/jme3/renderer/Camera.java @@ -392,30 +392,36 @@ public class Camera implements Savable, Cloneable { if (clipPlane.whichSide(location) == side) { return; } - Matrix4f p = projectionMatrix.clone(); - - Matrix4f ivm = viewMatrix.clone(); - - Vector3f point = clipPlane.getNormal().mult(clipPlane.getConstant()); - Vector3f pp = ivm.mult(point); - Vector3f pn = ivm.multNormal(clipPlane.getNormal(), null); - Vector4f clipPlaneV = new Vector4f(pn.x * sideFactor, pn.y * sideFactor, pn.z * sideFactor, -(pp.dot(pn)) * sideFactor); - - Vector4f v = new Vector4f(0, 0, 0, 0); - - v.x = (Math.signum(clipPlaneV.x) + p.m02) / p.m00; - v.y = (Math.signum(clipPlaneV.y) + p.m12) / p.m11; - v.z = -1.0f; - v.w = (1.0f + p.m22) / p.m23; + + TempVars vars = TempVars.get(); + try { + Matrix4f p = projectionMatrix.clone(); - float dot = clipPlaneV.dot(v);//clipPlaneV.x * v.x + clipPlaneV.y * v.y + clipPlaneV.z * v.z + clipPlaneV.w * v.w; - Vector4f c = clipPlaneV.mult(2.0f / dot); + Matrix4f ivm = viewMatrix; - p.m20 = c.x - p.m30; - p.m21 = c.y - p.m31; - p.m22 = c.z - p.m32; - p.m23 = c.w - p.m33; - setProjectionMatrix(p); + Vector3f point = clipPlane.getNormal().mult(clipPlane.getConstant(), vars.vect1); + Vector3f pp = ivm.mult(point, vars.vect2); + Vector3f pn = ivm.multNormal(clipPlane.getNormal(), vars.vect3); + Vector4f clipPlaneV = vars.vect4f1.set(pn.x * sideFactor, pn.y * sideFactor, pn.z * sideFactor, -(pp.dot(pn)) * sideFactor); + + Vector4f v = vars.vect4f2.set(0, 0, 0, 0); + + v.x = (Math.signum(clipPlaneV.x) + p.m02) / p.m00; + v.y = (Math.signum(clipPlaneV.y) + p.m12) / p.m11; + v.z = -1.0f; + v.w = (1.0f + p.m22) / p.m23; + + float dot = clipPlaneV.dot(v);//clipPlaneV.x * v.x + clipPlaneV.y * v.y + clipPlaneV.z * v.z + clipPlaneV.w * v.w; + Vector4f c = clipPlaneV.multLocal(2.0f / dot); + + p.m20 = c.x - p.m30; + p.m21 = c.y - p.m31; + p.m22 = c.z - p.m32; + p.m23 = c.w - p.m33; + setProjectionMatrix(p); + } finally { + vars.release(); + } } /**