From 6c4a13dddeb6e60f9eb0ab7b02762e42176d2f73 Mon Sep 17 00:00:00 2001 From: "rem..om" Date: Thu, 21 Jul 2011 15:22:45 +0000 Subject: [PATCH] Uniforms : fixed clearValues to not assign references. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7890 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- engine/src/core/com/jme3/shader/Uniform.java | 235 ++++++++++--------- 1 file changed, 120 insertions(+), 115 deletions(-) diff --git a/engine/src/core/com/jme3/shader/Uniform.java b/engine/src/core/com/jme3/shader/Uniform.java index 8797437fc..40b61e0c2 100644 --- a/engine/src/core/com/jme3/shader/Uniform.java +++ b/engine/src/core/com/jme3/shader/Uniform.java @@ -1,35 +1,27 @@ /* - * Copyright (c) 2009-2010 jMonkeyEngine - * All rights reserved. - * + * Copyright (c) 2009-2010 jMonkeyEngine All rights reserved.

* 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.

* 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 * 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="); } } @@ -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; } - }