Browse Source

* Since number of tangent components in a tangent buffer can vary, GeometryBatchFactory now takes # of components into account preventing IndexOutOfBoundsException

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9205 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
Sha..rd 13 years ago
parent
commit
c9046fa21c
1 changed files with 7 additions and 6 deletions
  1. 7 6
      engine/src/tools/jme3tools/optimize/GeometryBatchFactory.java

+ 7 - 6
engine/src/tools/jme3tools/optimize/GeometryBatchFactory.java

@@ -62,14 +62,15 @@ public class GeometryBatchFactory {
         }
         }
     }
     }
     
     
-    private static void doTransformTangents(FloatBuffer inBuf, int offset, FloatBuffer outBuf, Matrix4f transform) {
+    private static void doTransformTangents(FloatBuffer inBuf, int offset, int components, FloatBuffer outBuf, Matrix4f transform) {
         Vector3f tan = new Vector3f();
         Vector3f tan = new Vector3f();
-        float handedness = 0;
+        float handedness;
+        
         // offset is given in element units
         // offset is given in element units
         // convert to be in component units
         // convert to be in component units
-        offset *= 4;
+        offset *= components;
 
 
-        for (int i = 0; i < inBuf.capacity() / 4; i++) {
+        for (int i = 0; i < inBuf.capacity() / components; i++) {
             tan.x = inBuf.get(i * 4 + 0);
             tan.x = inBuf.get(i * 4 + 0);
             tan.y = inBuf.get(i * 4 + 1);
             tan.y = inBuf.get(i * 4 + 1);
             tan.z = inBuf.get(i * 4 + 2);
             tan.z = inBuf.get(i * 4 + 2);
@@ -81,7 +82,6 @@ public class GeometryBatchFactory {
             outBuf.put(offset + i * 4 + 1, tan.y);
             outBuf.put(offset + i * 4 + 1, tan.y);
             outBuf.put(offset + i * 4 + 2, tan.z);
             outBuf.put(offset + i * 4 + 2, tan.z);
             outBuf.put(offset + i * 4 + 3, handedness);
             outBuf.put(offset + i * 4 + 3, handedness);
-             
         }
         }
     }
     }
 
 
@@ -211,7 +211,8 @@ public class GeometryBatchFactory {
                 }else if(Type.Tangent.ordinal() == bufType){                    
                 }else if(Type.Tangent.ordinal() == bufType){                    
                     FloatBuffer inPos = (FloatBuffer) inBuf.getDataReadOnly();
                     FloatBuffer inPos = (FloatBuffer) inBuf.getDataReadOnly();
                     FloatBuffer outPos = (FloatBuffer) outBuf.getData();
                     FloatBuffer outPos = (FloatBuffer) outBuf.getData();
-                    doTransformTangents(inPos, globalVertIndex, outPos, worldMatrix);
+                    int components = inBuf.getNumComponents();
+                    doTransformTangents(inPos, globalVertIndex, components, outPos, worldMatrix);
                 } else {
                 } else {
                     inBuf.copyElements(0, outBuf, globalVertIndex, geomVertCount);
                     inBuf.copyElements(0, outBuf, globalVertIndex, geomVertCount);
                 }
                 }