OSDN Git Service

Uniforms : fixed clearValues to not assign references.
authorremy.bouquet@gmail.com <remy.bouquet@gmail.com@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Thu, 21 Jul 2011 15:22:45 +0000 (15:22 +0000)
committerremy.bouquet@gmail.com <remy.bouquet@gmail.com@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Thu, 21 Jul 2011 15:22:45 +0000 (15:22 +0000)
git-svn-id: http://jmonkeyengine.googlecode.com/svn/trunk@7890 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

engine/src/core/com/jme3/shader/Uniform.java

index 8797437..40b61e0 100644 (file)
@@ -1,35 +1,27 @@
 /*
- * Copyright (c) 2009-2010 jMonkeyEngine
- * All rights reserved.
- *
+ * Copyright (c) 2009-2010 jMonkeyEngine All rights reserved. <p/>
  * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * modification, are permitted provided that the following conditions are met:
+ * 
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer. <p/> * Redistributions
+ * in binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution. <p/> * Neither the name of
+ * 'jMonkeyEngine' nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior written
+ * permission. <p/> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
+ * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-
 package com.jme3.shader;
 
 import com.jme3.export.JmeExporter;
@@ -42,6 +34,7 @@ import com.jme3.math.Matrix4f;
 import com.jme3.math.Quaternion;
 import com.jme3.math.Vector2f;
 import com.jme3.math.Vector3f;
+import com.jme3.math.Vector4f;
 import com.jme3.util.BufferUtils;
 import java.io.IOException;
 import java.nio.FloatBuffer;
@@ -50,81 +43,77 @@ public class Uniform extends ShaderVariable {
 
     private static final Integer ZERO_INT = Integer.valueOf(0);
     private static final Float ZERO_FLT = Float.valueOf(0);
-    private static final FloatBuffer ZERO_BUF = BufferUtils.createFloatBuffer(4*4);
-
+    private static final FloatBuffer ZERO_BUF = BufferUtils.createFloatBuffer(4 * 4);
     /**
      * Currently set value of the uniform.
      */
     protected Object value = null;
     protected FloatBuffer multiData = null;
-
     /**
      * Type of uniform
      */
     protected VarType varType;
-
     /**
      * Binding to a renderer value, or null if user-defined uniform
      */
     protected UniformBinding binding;
-
     protected boolean setByCurrentMaterial = false;
 //    protected Object lastChanger = null;
 
     @Override
-    public void write(JmeExporter ex) throws IOException{
+    public void write(JmeExporter ex) throws IOException {
         super.write(ex);
         OutputCapsule oc = ex.getCapsule(this);
         oc.write(varType, "varType", null);
         oc.write(binding, "binding", null);
-        switch (varType){
+        switch (varType) {
             case Boolean:
-                oc.write( ((Boolean)value).booleanValue(), "valueBoolean", false );
+                oc.write(((Boolean) value).booleanValue(), "valueBoolean", false);
                 break;
             case Float:
-                oc.write( ((Float)value).floatValue(), "valueFloat", 0);
+                oc.write(((Float) value).floatValue(), "valueFloat", 0);
                 break;
             case FloatArray:
-                oc.write( (FloatBuffer)value, "valueFloatArray", null);
+                oc.write((FloatBuffer) value, "valueFloatArray", null);
                 break;
             case Int:
-                oc.write( ((Integer)value).intValue(), "valueInt", 0);
+                oc.write(((Integer) value).intValue(), "valueInt", 0);
                 break;
             case Matrix3:
-                oc.write( (Matrix3f)value, "valueMatrix3", null);
+                oc.write((Matrix3f) value, "valueMatrix3", null);
                 break;
             case Matrix3Array:
             case Matrix4Array:
             case Vector2Array:
                 throw new UnsupportedOperationException("Come again?");
             case Matrix4:
-                oc.write( (Matrix4f)value, "valueMatrix4", null);
+                oc.write((Matrix4f) value, "valueMatrix4", null);
                 break;
             case Vector2:
-                oc.write( (Vector2f)value, "valueVector2", null);
+                oc.write((Vector2f) value, "valueVector2", null);
                 break;
             case Vector3:
-                oc.write( (Vector3f)value, "valueVector3", null);
+                oc.write((Vector3f) value, "valueVector3", null);
                 break;
             case Vector3Array:
-                oc.write( (FloatBuffer)value, "valueVector3Array", null);
+                oc.write((FloatBuffer) value, "valueVector3Array", null);
                 break;
             case Vector4:
-                oc.write( (ColorRGBA)value, "valueVector4", null);
+                oc.write((ColorRGBA) value, "valueVector4", null);
                 break;
             case Vector4Array:
-                oc.write( (FloatBuffer)value, "valueVector4Array", null);
+                oc.write((FloatBuffer) value, "valueVector4Array", null);
                 break;
         }
     }
 
     @Override
-    public void read(JmeImporter im) throws IOException{
+    public void read(JmeImporter im) throws IOException {
         super.read(im);
         InputCapsule ic = im.getCapsule(this);
         varType = ic.readEnum("varType", VarType.class, null);
         binding = ic.readEnum("binding", UniformBinding.class, null);
-        switch (varType){
+        switch (varType) {
             case Boolean:
                 value = ic.readBoolean("valueBoolean", false);
                 break;
@@ -164,17 +153,17 @@ public class Uniform extends ShaderVariable {
     }
 
     @Override
-    public String toString(){
+    public String toString() {
         StringBuilder sb = new StringBuilder();
-        if (name != null){
+        if (name != null) {
             sb.append("Uniform[name=");
             sb.append(name);
-            if (varType != null){
+            if (varType != null) {
                 sb.append(", type=");
                 sb.append(varType);
                 sb.append(", value=");
                 sb.append(value);
-            }else{
+            } else {
                 sb.append(", value=<not set>");
             }
         }
@@ -182,11 +171,11 @@ public class Uniform extends ShaderVariable {
         return sb.toString();
     }
 
-    public void setBinding(UniformBinding binding){
+    public void setBinding(UniformBinding binding) {
         this.binding = binding;
     }
 
-    public UniformBinding getBinding(){
+    public UniformBinding getBinding() {
         return binding;
     }
 
@@ -194,7 +183,7 @@ public class Uniform extends ShaderVariable {
         return varType;
     }
 
-    public Object getValue(){
+    public Object getValue() {
         return value;
     }
 
@@ -202,7 +191,7 @@ public class Uniform extends ShaderVariable {
         return setByCurrentMaterial;
     }
 
-    public void clearSetByCurrentMaterial(){
+    public void clearSetByCurrentMaterial() {
         setByCurrentMaterial = false;
     }
 
@@ -213,16 +202,15 @@ public class Uniform extends ShaderVariable {
 //    public Object getLastChanger(){
 //        return lastChanger;
 //    }
-
-    public void clearValue(){
+    public void clearValue() {
         updateNeeded = true;
 
-        if (multiData != null){
+        if (multiData != null) {
             ZERO_BUF.clear();
             multiData.clear();
 
-            while (multiData.remaining() > 0){
-                ZERO_BUF.limit( Math.min(multiData.remaining(), 16) );
+            while (multiData.remaining() > 0) {
+                ZERO_BUF.limit(Math.min(multiData.remaining(), 16));
                 multiData.put(ZERO_BUF);
             }
 
@@ -231,10 +219,11 @@ public class Uniform extends ShaderVariable {
             return;
         }
 
-        if (varType == null)
+        if (varType == null) {
             return;
+        }
 
-        switch (varType){
+        switch (varType) {
             case Int:
                 this.value = ZERO_INT;
                 break;
@@ -245,137 +234,150 @@ public class Uniform extends ShaderVariable {
                 this.value = ZERO_FLT;
                 break;
             case Vector2:
-                this.value = Vector2f.ZERO;
+                ((Vector2f) this.value).set(Vector2f.ZERO);
                 break;
             case Vector3:
-                this.value = Vector3f.ZERO;
+                ((Vector3f) this.value).set(Vector3f.ZERO);
                 break;
             case Vector4:
-                if (this.value instanceof ColorRGBA){
-                    this.value = ColorRGBA.BlackNoAlpha;
-                }else{
-                    this.value = Quaternion.ZERO;
+                if (this.value instanceof ColorRGBA) {
+                    ((ColorRGBA) this.value).set(ColorRGBA.BlackNoAlpha);
+                } else if (this.value instanceof Quaternion) {
+                    ((Quaternion) this.value).set(Quaternion.ZERO);
+                } else {
+                    ((Vector4f) this.value).set(Vector4f.ZERO);
                 }
                 break;
             default:
                 break; // won't happen because those are either textures
-                       // or multidata types
+            // or multidata types
         }
     }
 
-    public void setValue(VarType type, Object value){
-        if (location == -1)
+    public void setValue(VarType type, Object value) {
+        if (location == -1) {
             return;
+        }
 
-        if (varType != null && varType != type)
-            throw new IllegalArgumentException("Expected a "+varType.name()+" value!");
+        if (varType != null && varType != type) {
+            throw new IllegalArgumentException("Expected a " + varType.name() + " value!");
+        }
 
-        if (value == null)
+        if (value == null) {
             throw new NullPointerException();
+        }
 
         setByCurrentMaterial = true;
 
-        switch (type){
+        switch (type) {
             case Matrix3:
                 Matrix3f m3 = (Matrix3f) value;
-                if (multiData == null)
+                if (multiData == null) {
                     multiData = BufferUtils.createFloatBuffer(9);
-                
+                }
+
                 m3.fillFloatBuffer(multiData, true);
                 multiData.clear();
                 break;
             case Matrix4:
                 Matrix4f m4 = (Matrix4f) value;
-                if (multiData == null)
+                if (multiData == null) {
                     multiData = BufferUtils.createFloatBuffer(16);
-                
+                }
+
                 m4.fillFloatBuffer(multiData, true);
                 multiData.clear();
                 break;
             case FloatArray:
                 float[] fa = (float[]) value;
-                if (multiData == null){
+                if (multiData == null) {
                     multiData = BufferUtils.createFloatBuffer(fa);
-                }else{
+                } else {
                     multiData = BufferUtils.ensureLargeEnough(multiData, fa.length);
                 }
-                
+
                 multiData.put(fa);
                 multiData.clear();
                 break;
             case Vector2Array:
                 Vector2f[] v2a = (Vector2f[]) value;
-                if (multiData == null){
+                if (multiData == null) {
                     multiData = BufferUtils.createFloatBuffer(v2a);
                 } else {
                     multiData = BufferUtils.ensureLargeEnough(multiData, v2a.length * 2);
                 }
 
-                for (int i = 0; i < v2a.length; i++)
+                for (int i = 0; i < v2a.length; i++) {
                     BufferUtils.setInBuffer(v2a[i], multiData, i);
-                
+                }
+
                 multiData.clear();
                 break;
             case Vector3Array:
                 Vector3f[] v3a = (Vector3f[]) value;
-                if (multiData == null){
+                if (multiData == null) {
                     multiData = BufferUtils.createFloatBuffer(v3a);
-                } else{
+                } else {
                     multiData = BufferUtils.ensureLargeEnough(multiData, v3a.length * 3);
                 }
-                
-                for (int i = 0; i < v3a.length; i++)
+
+                for (int i = 0; i < v3a.length; i++) {
                     BufferUtils.setInBuffer(v3a[i], multiData, i);
+                }
 
                 multiData.clear();
                 break;
             case Vector4Array:
                 Quaternion[] v4a = (Quaternion[]) value;
-                if (multiData == null){
+                if (multiData == null) {
                     multiData = BufferUtils.createFloatBuffer(v4a);
                 } else {
                     multiData = BufferUtils.ensureLargeEnough(multiData, v4a.length * 4);
                 }
-                
-                for (int i = 0; i < v4a.length; i++)
+
+                for (int i = 0; i < v4a.length; i++) {
                     BufferUtils.setInBuffer(v4a[i], multiData, i);
+                }
 
                 multiData.clear();
                 break;
             case Matrix3Array:
                 Matrix3f[] m3a = (Matrix3f[]) value;
 
-                if (multiData == null)
+                if (multiData == null) {
                     multiData = BufferUtils.createFloatBuffer(m3a.length * 9);
-                else{
+                } else {
                     multiData = BufferUtils.ensureLargeEnough(multiData, m3a.length * 9);
                 }
 
-                for (int i = 0; i < m3a.length; i++)
+                for (int i = 0; i < m3a.length; i++) {
                     m3a[i].fillFloatBuffer(multiData, true);
-                
+                }
+
                 multiData.clear();
                 break;
             case Matrix4Array:
                 Matrix4f[] m4a = (Matrix4f[]) value;
 
-                if (multiData == null)
+                if (multiData == null) {
                     multiData = BufferUtils.createFloatBuffer(m4a.length * 16);
-                else{
+                } else {
                     multiData = BufferUtils.ensureLargeEnough(multiData, m4a.length * 16);
                 }
 
-                for (int i = 0; i < m4a.length; i++)
+                for (int i = 0; i < m4a.length; i++) {
                     m4a[i].fillFloatBuffer(multiData, true);
-                
+                }
+
                 multiData.clear();
                 break;
             // Only use check if equals optimization for primitive values
             case Int:
             case Float:
             case Boolean:
-                if (this.value != null && this.value.equals(value))
+                if (this.value != null && this.value.equals(value)) {
                     return;
+                }
 
                 this.value = value;
                 break;
@@ -384,19 +386,21 @@ public class Uniform extends ShaderVariable {
                 break;
         }
 
-        if (multiData != null)
+        if (multiData != null) {
             this.value = multiData;
-        
+        }
+
         varType = type;
         updateNeeded = true;
     }
 
-    public void setVector4Length(int length){
-        if (location == -1)
+    public void setVector4Length(int length) {
+        if (location == -1) {
             return;
+        }
 
         FloatBuffer fb = (FloatBuffer) value;
-        if (fb == null || fb.capacity() < length){
+        if (fb == null || fb.capacity() < length) {
             value = BufferUtils.createFloatBuffer(length * 4);
         }
 
@@ -405,12 +409,14 @@ public class Uniform extends ShaderVariable {
         setByCurrentMaterial = true;
     }
 
-    public void setVector4InArray(float x, float y, float z, float w, int index){
-        if (location == -1)
+    public void setVector4InArray(float x, float y, float z, float w, int index) {
+        if (location == -1) {
             return;
+        }
 
-        if (varType != null && varType != VarType.Vector4Array)
-            throw new IllegalArgumentException("Expected a "+varType.name()+" value!");
+        if (varType != null && varType != VarType.Vector4Array) {
+            throw new IllegalArgumentException("Expected a " + varType.name() + " value!");
+        }
 
         FloatBuffer fb = (FloatBuffer) value;
         fb.position(index * 4);
@@ -419,19 +425,18 @@ public class Uniform extends ShaderVariable {
         updateNeeded = true;
         setByCurrentMaterial = true;
     }
-    
-    public boolean isUpdateNeeded(){
+
+    public boolean isUpdateNeeded() {
         return updateNeeded;
     }
 
-    public void clearUpdateNeeded(){
+    public void clearUpdateNeeded() {
         updateNeeded = false;
     }
 
-    public void reset(){
+    public void reset() {
         setByCurrentMaterial = false;
         location = -2;
         updateNeeded = true;
     }
-
 }