Jelajahi Sumber

MPO: clone MPOs instead of sharing references

Kirill Vainer 9 tahun lalu
induk
melakukan
87af1f30b0

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

@@ -1362,8 +1362,12 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
             clone.localLights.setOwner(clone);
             clone.worldLights.setOwner(clone);
 
-            clone.worldOverrides = new ArrayList<MatParamOverride>(worldOverrides);
-            clone.localOverrides = new ArrayList<MatParamOverride>(localOverrides);
+            clone.worldOverrides = new ArrayList<MatParamOverride>();
+            clone.localOverrides = new ArrayList<MatParamOverride>();
+
+            for (MatParamOverride override : localOverrides) {
+                clone.localOverrides.add((MatParamOverride) override.clone());
+            }
 
             // No need to force cloned to update.
             // This node already has the refresh flags
@@ -1386,6 +1390,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
             clone.setBoundRefresh();
             clone.setTransformRefresh();
             clone.setLightListRefresh();
+            clone.setMatParamOverrideRefresh();
 
             clone.controls = new SafeArrayList<Control>(Control.class);
             for (int i = 0; i < controls.size(); i++) {

+ 2 - 1
jme3-core/src/test/java/com/jme3/scene/SceneMatParamOverrideTest.java

@@ -244,7 +244,8 @@ public class SceneMatParamOverrideTest {
         assertEquals(clonedOverrides, originalOverrides);
 
         for (int i = 0; i < clonedOverrides.size(); i++) {
-            assertSame(clonedOverrides.get(i), originalOverrides.get(i));
+            assertNotSame(clonedOverrides.get(i), originalOverrides.get(i));
+            assertEquals(clonedOverrides.get(i), originalOverrides.get(i));
         }
     }