Przeglądaj źródła

implemented matrix serialization.

JavaSaBr 7 lat temu
rodzic
commit
2297441c13

+ 160 - 4
jme3-core/src/main/java/com/jme3/shader/BufferObject.java

@@ -177,14 +177,31 @@ public class BufferObject extends NativeObject {
                 return estimate((float[]) field.getValue());
             }
             case Vector2Array: {
-                return estimateVecArray(field.getValue(), 2);
+                return estimateArray(field.getValue(), 2);
             }
             case Vector3Array: {
                 final int multiplier = layout == Layout.std140? 4 : 3;
-                return estimateVecArray(field.getValue(), multiplier);
+                return estimateArray(field.getValue(), multiplier);
             }
             case Vector4Array: {
-                return estimateVecArray(field.getValue(), 4);
+                return estimateArray(field.getValue(), 4);
+            }
+            case Matrix3: {
+                final int multiplier = layout == Layout.std140? 4 : 3;
+                return 3 * multiplier;
+            }
+            case Matrix4: {
+                return 4 * 4;
+            }
+            case Matrix3Array: {
+                int multiplier = layout == Layout.std140? 4 : 3;
+                multiplier *= 3;
+                return estimateArray(field.getValue(), multiplier);
+            }
+            case Matrix4Array: {
+                int multiplier = layout == Layout.std140? 4 : 3;
+                multiplier *= 4;
+                return estimateArray(field.getValue(), multiplier);
             }
             default: {
                 throw new IllegalArgumentException("The type of BO field " + field.getType() + " doesn't support.");
@@ -199,7 +216,7 @@ public class BufferObject extends NativeObject {
      * @param multiplier the multiplier.
      * @return the estimated bytes cunt.
      */
-    protected int estimateVecArray(final Object value, final int multiplier) {
+    protected int estimateArray(final Object value, final int multiplier) {
 
         if (value instanceof Object[]) {
             return ((Object[]) value).length * multiplier;
@@ -279,12 +296,91 @@ public class BufferObject extends NativeObject {
                 writeVec4Array(data, value);
                 break;
             }
+            case Matrix3: {
+                write(data, (Matrix3f) value);
+                break;
+            }
+            case Matrix4: {
+                write(data, (Matrix4f) value);
+                break;
+            }
+            case Matrix3Array: {
+                writeMat3Array(data, value);
+                break;
+            }
+            case Matrix4Array: {
+                writeMat4Array(data, value);
+                break;
+            }
             default: {
                 throw new IllegalArgumentException("The type of BO field " + field.getType() + " doesn't support.");
             }
         }
     }
 
+    /**
+     * Writes the value to the data buffer.
+     *
+     * @param data  the data buffer.
+     * @param value the value.
+     */
+    protected void writeMat3Array(final ByteBuffer data, final Object value) {
+
+        if (value instanceof Matrix3f[]) {
+
+            final Matrix3f[] values = (Matrix3f[]) value;
+            for (final Matrix3f mat : values) {
+                write(data, mat);
+            }
+
+        } else if(value instanceof SafeArrayList) {
+
+            final SafeArrayList<Matrix3f> values = (SafeArrayList<Matrix3f>) value;
+            for (final Matrix3f mat : values.getArray()) {
+                write(data, mat);
+            }
+
+        } else if(value instanceof Collection) {
+
+            final Collection<Matrix3f> values = (Collection<Matrix3f>) value;
+            for (final Matrix3f mat : values) {
+                write(data, mat);
+            }
+        }
+    }
+
+    /**
+     * Writes the value to the data buffer.
+     *
+     * @param data  the data buffer.
+     * @param value the value.
+     */
+    protected void writeMat4Array(final ByteBuffer data, final Object value) {
+
+        if (value instanceof Matrix4f[]) {
+
+            final Matrix4f[] values = (Matrix4f[]) value;
+            for (final Matrix4f mat : values) {
+                write(data, mat);
+            }
+
+        } else if(value instanceof SafeArrayList) {
+
+            final SafeArrayList<Matrix4f> values = (SafeArrayList<Matrix4f>) value;
+            for (final Matrix4f mat : values.getArray()) {
+                write(data, mat);
+            }
+
+        } else if(value instanceof Collection) {
+
+            final Collection<Matrix4f> values = (Collection<Matrix4f>) value;
+            for (final Matrix4f mat : values) {
+                write(data, mat);
+            }
+        }
+    }
+
+
     /**
      * Writes the value to the data buffer.
      *
@@ -453,6 +549,41 @@ public class BufferObject extends NativeObject {
         }
     }
 
+    /**
+     * Writes the value to the data buffer.
+     *
+     * @param data  the data buffer.
+     * @param x the x value.
+     * @param y the y value.
+     * @param z the z value.
+     */
+    protected void write(final ByteBuffer data, final float x, final float y, final float z) {
+
+        data.putFloat(x)
+            .putFloat(y)
+            .putFloat(z);
+
+        if (layout == Layout.std140) {
+            data.putInt(0);
+        }
+    }
+
+    /**
+     * Writes the value to the data buffer.
+     *
+     * @param data  the data buffer.
+     * @param x the x value.
+     * @param y the y value.
+     * @param z the z value.
+     * @param w the w value.
+     */
+    protected void write(final ByteBuffer data, final float x, final float y, final float z, final float w) {
+        data.putFloat(x)
+            .putFloat(y)
+            .putFloat(z)
+            .putFloat(w);
+    }
+
     /**
      * Writes the value to the data buffer.
      *
@@ -464,6 +595,31 @@ public class BufferObject extends NativeObject {
             .putFloat(value.getY());
     }
 
+    /**
+     * Writes the value to the data buffer.
+     *
+     * @param data  the data buffer.
+     * @param value the value.
+     */
+    protected void write(final ByteBuffer data, final Matrix3f value) {
+        write(data, value.get(0, 0), value.get(0, 1), value.get(0, 2));
+        write(data, value.get(1, 0), value.get(1, 1), value.get(1, 2));
+        write(data, value.get(2, 0), value.get(2, 1), value.get(2, 2));
+    }
+
+    /**
+     * Writes the value to the data buffer.
+     *
+     * @param data  the data buffer.
+     * @param value the value.
+     */
+    protected void write(final ByteBuffer data, final Matrix4f value) {
+        write(data, value.get(0, 0), value.get(0, 1), value.get(0, 2), value.get(0, 3));
+        write(data, value.get(1, 0), value.get(1, 1), value.get(1, 2), value.get(1, 3));
+        write(data, value.get(2, 0), value.get(2, 1), value.get(2, 2), value.get(2, 3));
+        write(data, value.get(3, 0), value.get(3, 1), value.get(3, 2), value.get(3, 3));
+    }
+
     @Override
     public void deleteObject(final Object rendererObject) {