浏览代码

spatial: fix bug in remove/clear MPO

add unit test for those methods
Kirill Vainer 9 年之前
父节点
当前提交
5d2f2b19e6

+ 3 - 3
jme3-core/src/main/java/com/jme3/scene/Spatial.java

@@ -608,16 +608,16 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
     }
 
     public void removeMatParamOverride(MatParamOverride override) {
-        if (worldOverrides.remove(override)) {
+        if (localOverrides.remove(override)) {
             setMatParamOverrideRefresh();
         }
     }
 
     public void clearMatParamOverrides() {
-        if (!worldOverrides.isEmpty()) {
+        if (!localOverrides.isEmpty()) {
             setMatParamOverrideRefresh();
         }
-        worldOverrides.clear();
+        localOverrides.clear();
     }
 
     /**

+ 4 - 0
jme3-core/src/test/java/com/jme3/material/TechniqueDefMatParamOverrideTest.java

@@ -196,6 +196,7 @@ public class TechniqueDefMatParamOverrideTest {
 
         reset();
         geometry.clearMatParamOverrides();
+        geometry.updateGeometricState();
         outDefines(def("NUM_BONES", VarType.Int, 1234));
         outUniforms(uniform("NumberOfBones", VarType.Int, 1234));
 
@@ -245,6 +246,7 @@ public class TechniqueDefMatParamOverrideTest {
 
         reset();
         geometry.clearMatParamOverrides();
+        geometry.updateGeometricState();
         outDefines();
         outUniforms();
     }
@@ -287,6 +289,7 @@ public class TechniqueDefMatParamOverrideTest {
 
         reset();
         geometry.clearMatParamOverrides();
+        geometry.updateGeometricState();
         outDefines();
         outUniforms();
         outTextures();
@@ -312,6 +315,7 @@ public class TechniqueDefMatParamOverrideTest {
 
         reset();
         geometry.clearMatParamOverrides();
+        geometry.updateGeometricState();
         outDefines(def("DIFFUSEMAP", VarType.Texture2D, tex1));
         outUniforms(uniform("DiffuseMap", VarType.Int, 0));
         outTextures(tex1);

+ 69 - 0
jme3-core/src/test/java/com/jme3/scene/SceneMatParamOverrideTest.java

@@ -78,6 +78,75 @@ public class SceneMatParamOverrideTest {
         return scene;
     }
 
+    @Test
+    public void testOverrides_Empty() {
+        Node n = new Node("Node");
+        assertTrue(n.getLocalOverrides().isEmpty());
+        assertTrue(n.getWorldOverrides().isEmpty());
+
+        n.updateGeometricState();
+        assertTrue(n.getLocalOverrides().isEmpty());
+        assertTrue(n.getWorldOverrides().isEmpty());
+    }
+
+    @Test
+    public void testOverrides_AddRemove() {
+        MatParamOverride override = mpoBool("Test", true);
+        Node n = new Node("Node");
+
+        n.removeMatParamOverride(override);
+        assertTrue(n.getLocalOverrides().isEmpty());
+        assertTrue(n.getWorldOverrides().isEmpty());
+
+        n.addMatParamOverride(override);
+
+        assertSame(n.getLocalOverrides().get(0), override);
+        assertTrue(n.getWorldOverrides().isEmpty());
+        n.updateGeometricState();
+
+        assertSame(n.getLocalOverrides().get(0), override);
+        assertSame(n.getWorldOverrides().get(0), override);
+
+        n.removeMatParamOverride(override);
+        assertTrue(n.getLocalOverrides().isEmpty());
+        assertSame(n.getWorldOverrides().get(0), override);
+
+        n.updateGeometricState();
+        assertTrue(n.getLocalOverrides().isEmpty());
+        assertTrue(n.getWorldOverrides().isEmpty());
+    }
+
+    @Test
+    public void testOverrides_Clear() {
+        MatParamOverride override = mpoBool("Test", true);
+        Node n = new Node("Node");
+
+        n.clearMatParamOverrides();
+        assertTrue(n.getLocalOverrides().isEmpty());
+        assertTrue(n.getWorldOverrides().isEmpty());
+
+        n.addMatParamOverride(override);
+        n.clearMatParamOverrides();
+        assertTrue(n.getLocalOverrides().isEmpty());
+        assertTrue(n.getWorldOverrides().isEmpty());
+
+        n.addMatParamOverride(override);
+        n.updateGeometricState();
+        n.clearMatParamOverrides();
+        assertTrue(n.getLocalOverrides().isEmpty());
+        assertSame(n.getWorldOverrides().get(0), override);
+
+        n.updateGeometricState();
+        assertTrue(n.getLocalOverrides().isEmpty());
+        assertTrue(n.getWorldOverrides().isEmpty());
+
+        n.addMatParamOverride(override);
+        n.clearMatParamOverrides();
+        n.updateGeometricState();
+        assertTrue(n.getLocalOverrides().isEmpty());
+        assertTrue(n.getWorldOverrides().isEmpty());
+    }
+
     @Test
     public void testOverrides_AddAfterAttach() {
         Node scene = createDummyScene();