Преглед на файлове

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.

pspeed42 преди 11 години
родител
ревизия
ed443bcfa2
променени са 1 файла, в които са добавени 28 реда и са изтрити 22 реда
  1. 28 22
      jme3-core/src/main/java/com/jme3/renderer/Camera.java

+ 28 - 22
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();
+        }            
     }
 
     /**