Explorar o código

Merge branch 'nifty-batch-fix' into master

joliver82 %!s(int64=5) %!d(string=hai) anos
pai
achega
2a6ca82e8b

+ 107 - 0
jme3-examples/src/main/java/jme3test/niftygui/TestNiftyBatchMultipleAtlases.java

@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2009-2019 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.niftygui;
+
+import com.jme3.app.SimpleApplication;
+import com.jme3.niftygui.NiftyJmeDisplay;
+import de.lessvoid.nifty.Nifty;
+import de.lessvoid.nifty.render.batch.BatchRenderConfiguration;
+import de.lessvoid.nifty.screen.Screen;
+import de.lessvoid.nifty.screen.ScreenController;
+
+public class TestNiftyBatchMultipleAtlases extends SimpleApplication implements ScreenController {
+
+    private Nifty nifty;
+
+    public static void main(String[] args){
+        TestNiftyBatchMultipleAtlases app = new TestNiftyBatchMultipleAtlases();
+        app.setPauseOnLostFocus(false);
+        app.start();
+    }
+
+    @Override
+    public void simpleInitApp() {
+
+        BatchRenderConfiguration batchConfig = new BatchRenderConfiguration();
+        batchConfig.atlasWidth = 256;
+        batchConfig.atlasHeight = 256;
+        batchConfig.atlasPadding = 2;
+        batchConfig.atlasTolerance = 0.5f;
+        batchConfig.fillRemovedImagesInAtlas = false;
+        batchConfig.disposeImagesBetweenScreens = true;
+        batchConfig.initialAtlasCount = 3;
+
+        NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
+                assetManager,
+                inputManager,
+                audioRenderer,
+                guiViewPort,
+                batchConfig);
+        nifty = niftyDisplay.getNifty();
+        nifty.loadControlFile("nifty-default-controls.xml");
+        nifty.loadStyleFile("nifty-default-styles.xml");
+        nifty.fromXml("Interface/Nifty/NiftyBatchMultipleAtlases.xml", "screen1", this);
+
+        // attach the nifty display to the gui view port as a processor
+        guiViewPort.addProcessor(niftyDisplay);
+
+        // disable the fly cam
+        flyCam.setEnabled(false);
+        flyCam.setDragToRotate(true);
+        inputManager.setCursorVisible(true);
+    }
+
+    @Override
+    public void bind(Nifty nifty, Screen screen) {
+        System.out.println("bind(" + screen.getScreenId() + ")");
+    }
+
+    @Override
+    public void onStartScreen() {
+        System.out.println("onStartScreen");
+    }
+
+    @Override
+    public void onEndScreen() {
+        System.out.println("onEndScreen");
+    }
+
+    public void quit(){
+        nifty.gotoScreen("end");
+    }
+
+    public void gotoScreen(String screen) {
+        nifty.gotoScreen(screen);
+    }
+
+}

+ 58 - 0
jme3-examples/src/main/resources/Interface/Nifty/NiftyBatchMultipleAtlases.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nifty xmlns="http://nifty-gui.sourceforge.net/nifty-1.3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd http://nifty-gui.sourceforge.net/nifty-1.3.xsd">
+  <screen id="screen1" controller="jme3test.niftygui.TestNiftyBatchMultipleAtlases">
+    <layer childLayout="vertical">
+      <panel childLayout="center" backgroundColor="#cccf" height="*" width="*">
+        <control name="label" color="#f00f" text="You're in screen1." width="*"/>
+      </panel>
+      <panel childLayout="center" backgroundColor="#888f" height="*" width="*">
+        <control name="label" color="#ffff" text="goto screen2" width="*"/>
+        <interact onClick="gotoScreen(screen2)" />
+      </panel>
+      <panel childLayout="center" backgroundColor="#444f" height="*" width="*">
+        <control name="label" color="#ffff" text="goto screen3" width="*"/>
+        <interact onClick="gotoScreen(screen3)" />
+      </panel>
+      <panel childLayout="horizontal" backgroundColor="#000f" height="*" width="*">
+        <!-- 3 images to make use of more altases -->
+      </panel>
+    </layer>
+  </screen>
+  <screen id="screen2" controller="jme3test.niftygui.TestNiftyBatchMultipleAtlases">
+    <layer childLayout="vertical">
+      <panel childLayout="center" backgroundColor="#cccf" height="*" width="*">
+        <control name="label" color="#f00f" text="You're in screen2." width="*"/>
+      </panel>
+      <panel childLayout="center" backgroundColor="#888f" height="*" width="*">
+        <control name="label" color="#ffff" text="goto screen1" width="*"/>
+        <interact onClick="gotoScreen(screen1)" />
+      </panel>
+      <panel childLayout="center" backgroundColor="#444f" height="*" width="*">
+        <control name="label" color="#ffff" text="goto screen3" width="*"/>
+        <interact onClick="gotoScreen(screen3)" />
+      </panel>
+      <panel childLayout="horizontal" backgroundColor="#000f" height="*" width="*">
+        <!-- 3 images to make use of more altases -->
+      </panel>
+    </layer>
+  </screen>
+  <screen id="screen3" controller="jme3test.niftygui.TestNiftyBatchMultipleAtlases">
+    <layer childLayout="vertical">
+      <panel childLayout="center" backgroundColor="#cccf" height="*" width="*">
+        <control name="label" color="#f00f" text="You're in screen3." width="*"/>
+      </panel>
+      <panel childLayout="center" backgroundColor="#888f" height="*" width="*">
+        <control name="label" color="#ffff" text="goto screen1" width="*"/>
+        <interact onClick="gotoScreen(screen1)" />
+      </panel>
+      <panel childLayout="center" backgroundColor="#444f" height="*" width="*">
+        <control name="label" color="#ffff" text="goto screen2" width="*"/>
+        <interact onClick="gotoScreen(screen2)" />
+      </panel>
+      <panel childLayout="horizontal" backgroundColor="#000f" height="*" width="*">
+        <!-- 3 images to make use of more altases -->
+      </panel>
+    </layer>
+  </screen>
+</nifty>
+

+ 12 - 13
jme3-niftygui/src/main/java/com/jme3/niftygui/JmeBatchRenderBackend.java

@@ -92,7 +92,6 @@ public class JmeBatchRenderBackend implements BatchRenderBackend {
     private int textureAtlasId = 1;
     private Batch currentBatch;
     private Matrix4f tempMat = new Matrix4f();
-    private ByteBuffer initialData;
 
     // this is only used for debugging purpose and will make the removed textures filled with a color
     // please note: the old way to init this via a system property has been
@@ -187,15 +186,6 @@ public class JmeBatchRenderBackend implements BatchRenderBackend {
     public int createTextureAtlas(final int width, final int height) {
         try {
             int atlasId = addTexture(createAtlasTextureInternal(width, height));
-
-            // we just initialize a second buffer here that will replace the texture atlas image
-            initialData = BufferUtils.createByteBuffer(width * height * 4);
-            for (int i = 0; i < width * height; i++) {
-                initialData.put((byte) 0x00);
-                initialData.put((byte) 0xff);
-                initialData.put((byte) 0x00);
-                initialData.put((byte) 0xff);
-            }
             return atlasId;
         } catch (Exception e) {
             log.log(Level.WARNING, e.getMessage(), e);
@@ -206,8 +196,17 @@ public class JmeBatchRenderBackend implements BatchRenderBackend {
 
     @Override
     public void clearTextureAtlas(final int atlasId) {
-        initialData.rewind();
-        getTextureAtlas(atlasId).getImage().setData(initialData);
+        com.jme3.texture.Image atlasImage=getTextureAtlas(atlasId).getImage();
+        ByteBuffer atlasBuffer=atlasImage.getData(0);
+        atlasBuffer.rewind();
+        for (int i=0; i<atlasImage.getWidth()*atlasImage.getHeight(); i++) {
+            atlasBuffer.put((byte) 0x00);
+            atlasBuffer.put((byte) 0xff);
+            atlasBuffer.put((byte) 0x00);
+            atlasBuffer.put((byte) 0xff);
+        }
+        atlasBuffer.rewind();
+        atlasImage.setUpdateNeeded();
     }
 
     @Override
@@ -637,4 +636,4 @@ public class JmeBatchRenderBackend implements BatchRenderBackend {
             vertexColorBuffer.put(c.getAlpha());
         }
     }
-}
+}