From c6c6b48bda01d1327a0b412d67e01d576b714501 Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Tue, 8 Mar 2016 19:36:40 -0500 Subject: [PATCH] MPO: clone MPOs instead of sharing references Conflicts: jme3-core/src/main/java/com/jme3/scene/Spatial.java --- .../src/main/java/com/jme3/scene/Spatial.java | 15 +- .../jme3/scene/SceneMatParamOverrideTest.java | 3 +- .../java/jme3test/app/TestNativeLoader.java | 156 ------------------ 3 files changed, 15 insertions(+), 159 deletions(-) delete mode 100644 jme3-examples/src/main/java/jme3test/app/TestNativeLoader.java diff --git a/jme3-core/src/main/java/com/jme3/scene/Spatial.java b/jme3-core/src/main/java/com/jme3/scene/Spatial.java index f8600dfc8..6a57c4617 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Spatial.java +++ b/jme3-core/src/main/java/com/jme3/scene/Spatial.java @@ -137,6 +137,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab */ protected LightList localLights; protected transient LightList worldLights; + protected ArrayList localOverrides; protected ArrayList worldOverrides; @@ -208,6 +209,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab localOverrides = new ArrayList(); worldOverrides = new ArrayList(); + refreshFlags |= RF_BOUND; } @@ -303,6 +305,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab p = p.parent; } } + /** * Indicate that the bounding of this spatial has changed and that * a refresh is required. @@ -1361,6 +1364,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab // the transforms and stuff get refreshed. clone.setTransformRefresh(); clone.setLightListRefresh(); + clone.setMatParamOverrideRefresh(); return clone; } @@ -1381,8 +1385,13 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab clone.localLights.setOwner(clone); clone.worldLights.setOwner(clone); - clone.worldOverrides = new ArrayList(worldOverrides); - clone.localOverrides = new ArrayList(localOverrides); + clone.worldOverrides = new ArrayList(); + clone.localOverrides = new ArrayList(); + + for (MatParamOverride override : localOverrides) { + clone.localOverrides.add((MatParamOverride) override.clone()); + } + // No need to force cloned to update. // This node already has the refresh flags // set below so it will have to update anyway. @@ -1404,6 +1413,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab clone.setBoundRefresh(); clone.setTransformRefresh(); clone.setLightListRefresh(); + clone.setMatParamOverrideRefresh(); clone.controls = new SafeArrayList(Control.class); for (int i = 0; i < controls.size(); i++) { @@ -1615,6 +1625,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab localOverrides = new ArrayList(); } worldOverrides = new ArrayList(); + //changed for backward compatibility with j3o files generated before the AnimControl/SkeletonControl split //the AnimControl creates the SkeletonControl for old files and add it to the spatial. //The SkeletonControl must be the last in the stack so we add the list of all other control before it. diff --git a/jme3-core/src/test/java/com/jme3/scene/SceneMatParamOverrideTest.java b/jme3-core/src/test/java/com/jme3/scene/SceneMatParamOverrideTest.java index fdb6a35a4..a615d5c92 100644 --- a/jme3-core/src/test/java/com/jme3/scene/SceneMatParamOverrideTest.java +++ b/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)); } } diff --git a/jme3-examples/src/main/java/jme3test/app/TestNativeLoader.java b/jme3-examples/src/main/java/jme3test/app/TestNativeLoader.java deleted file mode 100644 index 2854fd217..000000000 --- a/jme3-examples/src/main/java/jme3test/app/TestNativeLoader.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2009-2012 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 - * 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. - */ -package jme3test.app; - -import com.jme3.system.NativeLibraryLoader; -import java.io.File; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Try to load some natives. - * - * @author Kirill Vainer - */ -public class TestNativeLoader { - - private static final File WORKING_FOLDER = new File(System.getProperty("user.dir")); - - private static void tryLoadLwjgl() { - NativeLibraryLoader.loadNativeLibrary("lwjgl", true); - System.out.println("Succeeded in loading LWJGL.\n\tVersion: " + - org.lwjgl.Sys.getVersion()); - } - - private static void tryLoadJinput() { - NativeLibraryLoader.loadNativeLibrary("jinput", true); - NativeLibraryLoader.loadNativeLibrary("jinput-dx8", true); - - net.java.games.input.ControllerEnvironment ce = - net.java.games.input.ControllerEnvironment.getDefaultEnvironment(); - if (ce.isSupported()) { - net.java.games.input.Controller[] c = - ce.getControllers(); - - System.out.println("Succeeded in loading JInput.\n\tVersion: " + - net.java.games.util.Version.getVersion()); - } - } - - private static void tryLoadOpenAL() { - NativeLibraryLoader.loadNativeLibrary("openal", true); - - try { - org.lwjgl.openal.AL.create(); - String renderer = org.lwjgl.openal.AL10.alGetString(org.lwjgl.openal.AL10.AL_RENDERER); - String vendor = org.lwjgl.openal.AL10.alGetString(org.lwjgl.openal.AL10.AL_VENDOR); - String version = org.lwjgl.openal.AL10.alGetString(org.lwjgl.openal.AL10.AL_VERSION); - System.out.println("Succeeded in loading OpenAL."); - System.out.println("\tVersion: " + version); - } catch (org.lwjgl.LWJGLException ex) { - throw new RuntimeException(ex); - } finally { - if (org.lwjgl.openal.AL.isCreated()) { - org.lwjgl.openal.AL.destroy(); - } - } - } - - private static void tryLoadOpenGL() { - org.lwjgl.opengl.Pbuffer pb = null; - try { - pb = new org.lwjgl.opengl.Pbuffer(1, 1, new org.lwjgl.opengl.PixelFormat(0, 0, 0), null); - pb.makeCurrent(); - String version = org.lwjgl.opengl.GL11.glGetString(org.lwjgl.opengl.GL11.GL_VERSION); - System.out.println("Succeeded in loading OpenGL.\n\tVersion: " + version); - } catch (org.lwjgl.LWJGLException ex) { - throw new RuntimeException(ex); - } finally { - if (pb != null) { - pb.destroy(); - } - } - } - - private static void tryLoadBulletJme() { - if (NativeLibraryLoader.isUsingNativeBullet()) { - NativeLibraryLoader.loadNativeLibrary("bulletjme", true); - - com.jme3.bullet.PhysicsSpace physSpace = new com.jme3.bullet.PhysicsSpace(); - - System.out.println("Succeeded in loading BulletJme."); - } else { - System.out.println("Native bullet not included. Cannot test loading."); - } - } - - private static void cleanupNativesFolder(File folder) { - for (File file : folder.listFiles()) { - String lowerCaseName = file.getName().toLowerCase(); - if (lowerCaseName.contains("lwjgl") || - lowerCaseName.contains("jinput") || - lowerCaseName.contains("openal") || - lowerCaseName.contains("bulletjme")) { - file.delete(); - } - } - } - - public static void main(String[] args) { - Logger.getLogger("").getHandlers()[0].setLevel(Level.WARNING); - Logger.getLogger(NativeLibraryLoader.class.getName()).setLevel(Level.ALL); - - // Get a bit more output from LWJGL about issues. - // System.setProperty("org.lwjgl.util.Debug", "true"); - - // Extracting to working folder is no brainer. - // Choose some random path, then load LWJGL. - File customNativesFolder = new File("CustomNativesFolder"); - customNativesFolder.mkdirs(); - - if (!customNativesFolder.isDirectory()) { - throw new IllegalStateException("Failed to make custom natives folder"); - } - - // Let's cleanup our folders first. - cleanupNativesFolder(WORKING_FOLDER); - cleanupNativesFolder(customNativesFolder); - - NativeLibraryLoader.setCustomExtractionFolder(customNativesFolder.getAbsolutePath()); - - tryLoadLwjgl(); - tryLoadOpenGL(); - tryLoadOpenAL(); - tryLoadJinput(); - tryLoadBulletJme(); - } -}