From 7628b0f9e34447d81ab9f21f2467762b3675350f Mon Sep 17 00:00:00 2001 From: Fadorico <> Date: Wed, 9 Mar 2016 15:08:56 -0500 Subject: [PATCH 01/15] Fixed collision group listeners not being notified --- .../src/main/java/com/jme3/bullet/PhysicsSpace.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java b/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java index edea485ef..51fa0fcea 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java @@ -334,6 +334,19 @@ public class PhysicsSpace { private void addCollisionEvent_native(PhysicsCollisionObject node, PhysicsCollisionObject node1, long manifoldPointObjectId) { // System.out.println("addCollisionEvent:"+node.getObjectId()+" "+ node1.getObjectId()); collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, manifoldPointObjectId)); + + // Notify group listeners + if((node.getCollideWithGroups() & node1.getCollisionGroup()) > 0 + || (node1.getCollideWithGroups() & node.getCollisionGroup()) > 0){ + PhysicsCollisionGroupListener listener = collisionGroupListeners.get(node.getCollisionGroup()); + PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(node1.getCollisionGroup()); + if(listener != null){ + listener.collide(node, node1); + } + if(listener1 != null && node.getCollisionGroup() != node1.getCollisionGroup()){ + listener1.collide(node, node1); + } + } } /** From ef626b095958f1ca4dc536d0eda3f7c4a06270c1 Mon Sep 17 00:00:00 2001 From: Fadorico Date: Wed, 23 Mar 2016 02:37:03 -0400 Subject: [PATCH 02/15] Fixed group collision check in native broadphase --- .../src/native/cpp/jmeClasses.cpp | 2 ++ .../src/native/cpp/jmeClasses.h | 1 + .../src/native/cpp/jmePhysicsSpace.cpp | 24 +++++++++++++++++-- .../java/com/jme3/bullet/PhysicsSpace.java | 23 +++++++++--------- 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/jme3-bullet-native/src/native/cpp/jmeClasses.cpp b/jme3-bullet-native/src/native/cpp/jmeClasses.cpp index 6b7caa0e9..ae7784c82 100644 --- a/jme3-bullet-native/src/native/cpp/jmeClasses.cpp +++ b/jme3-bullet-native/src/native/cpp/jmeClasses.cpp @@ -40,6 +40,7 @@ jclass jmeClasses::PhysicsSpace; jmethodID jmeClasses::PhysicsSpace_preTick; jmethodID jmeClasses::PhysicsSpace_postTick; jmethodID jmeClasses::PhysicsSpace_addCollisionEvent; +jmethodID jmeClasses::PhysicsSpace_notifyCollisionGroupListeners; jclass jmeClasses::PhysicsGhostObject; jmethodID jmeClasses::PhysicsGhostObject_addOverlappingObject; @@ -137,6 +138,7 @@ void jmeClasses::initJavaClasses(JNIEnv* env) { PhysicsSpace_preTick = env->GetMethodID(PhysicsSpace, "preTick_native", "(F)V"); PhysicsSpace_postTick = env->GetMethodID(PhysicsSpace, "postTick_native", "(F)V"); PhysicsSpace_addCollisionEvent = env->GetMethodID(PhysicsSpace, "addCollisionEvent_native","(Lcom/jme3/bullet/collision/PhysicsCollisionObject;Lcom/jme3/bullet/collision/PhysicsCollisionObject;J)V"); + PhysicsSpace_notifyCollisionGroupListeners = env->GetMethodID(PhysicsSpace, "notifyCollisionGroupListeners_native","(Lcom/jme3/bullet/collision/PhysicsCollisionObject;Lcom/jme3/bullet/collision/PhysicsCollisionObject;)Z"); if (env->ExceptionCheck()) { env->Throw(env->ExceptionOccurred()); return; diff --git a/jme3-bullet-native/src/native/cpp/jmeClasses.h b/jme3-bullet-native/src/native/cpp/jmeClasses.h index bb1b0e99a..bdead6b70 100644 --- a/jme3-bullet-native/src/native/cpp/jmeClasses.h +++ b/jme3-bullet-native/src/native/cpp/jmeClasses.h @@ -46,6 +46,7 @@ public: static jmethodID PhysicsSpace_addCollisionEvent; static jclass PhysicsGhostObject; static jmethodID PhysicsGhostObject_addOverlappingObject; + static jmethodID PhysicsSpace_notifyCollisionGroupListeners; static jclass Vector3f; static jmethodID Vector3f_set; diff --git a/jme3-bullet-native/src/native/cpp/jmePhysicsSpace.cpp b/jme3-bullet-native/src/native/cpp/jmePhysicsSpace.cpp index 34c77c407..8cb80bc87 100644 --- a/jme3-bullet-native/src/native/cpp/jmePhysicsSpace.cpp +++ b/jme3-bullet-native/src/native/cpp/jmePhysicsSpace.cpp @@ -187,8 +187,28 @@ void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ, jmeUserPointer *up0 = (jmeUserPointer*) co0 -> getUserPointer(); jmeUserPointer *up1 = (jmeUserPointer*) co1 -> getUserPointer(); if (up0 != NULL && up1 != NULL) { - collides = (up0->group & up1->groups) != 0; - collides = collides && (up1->group & up0->groups); + collides = (up0->group & up1->groups) != 0 || (up1->group & up0->groups) != 0; + + if(collides){ + jmePhysicsSpace *dynamicsWorld = (jmePhysicsSpace *)up0->space; + JNIEnv* env = dynamicsWorld->getEnv(); + jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace()); + jobject javaCollisionObject0 = env->NewLocalRef(up0->javaCollisionObject); + jobject javaCollisionObject1 = env->NewLocalRef(up1->javaCollisionObject); + + jboolean notifyResult = env->CallBooleanMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_notifyCollisionGroupListeners, javaCollisionObject0, javaCollisionObject1); + + env->DeleteLocalRef(javaPhysicsSpace); + env->DeleteLocalRef(javaCollisionObject0); + env->DeleteLocalRef(javaCollisionObject1); + + if (env->ExceptionCheck()) { + env->Throw(env->ExceptionOccurred()); + return collides; + } + + collides = (bool) notifyResult; + } //add some additional logic here that modified 'collides' return collides; diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java b/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java index 51fa0fcea..9122e1bc6 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java @@ -334,19 +334,20 @@ public class PhysicsSpace { private void addCollisionEvent_native(PhysicsCollisionObject node, PhysicsCollisionObject node1, long manifoldPointObjectId) { // System.out.println("addCollisionEvent:"+node.getObjectId()+" "+ node1.getObjectId()); collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, manifoldPointObjectId)); - - // Notify group listeners - if((node.getCollideWithGroups() & node1.getCollisionGroup()) > 0 - || (node1.getCollideWithGroups() & node.getCollisionGroup()) > 0){ - PhysicsCollisionGroupListener listener = collisionGroupListeners.get(node.getCollisionGroup()); - PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(node1.getCollisionGroup()); - if(listener != null){ - listener.collide(node, node1); - } - if(listener1 != null && node.getCollisionGroup() != node1.getCollisionGroup()){ - listener1.collide(node, node1); + } + + private boolean notifyCollisionGroupListeners_native(PhysicsCollisionObject node, PhysicsCollisionObject node1){ + PhysicsCollisionGroupListener listener = collisionGroupListeners.get(node.getCollisionGroup()); + PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(node1.getCollisionGroup()); + if(listener != null){ + if(!listener.collide(node, node1)){ + return false; } } + if(listener1 != null && node.getCollisionGroup() != node1.getCollisionGroup()){ + return listener1.collide(node, node1); + } + return true; } /** From 78a5a25fc1c2177db9440d8f40ebd8c6f172e2ac Mon Sep 17 00:00:00 2001 From: Paul Speed Date: Mon, 28 Mar 2016 11:03:58 -0400 Subject: [PATCH 03/15] Added the app state varargs constructor to LegacyApplication and modified SimpleApplication to use it. --- .../java/com/jme3/app/LegacyApplication.java | 19 ++++++++++++++++++- .../java/com/jme3/app/SimpleApplication.java | 10 +--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/app/LegacyApplication.java b/jme3-core/src/main/java/com/jme3/app/LegacyApplication.java index 89a81be5b..e861ef66b 100644 --- a/jme3-core/src/main/java/com/jme3/app/LegacyApplication.java +++ b/jme3-core/src/main/java/com/jme3/app/LegacyApplication.java @@ -31,6 +31,7 @@ */ package com.jme3.app; +import com.jme3.app.state.AppState; import com.jme3.app.state.AppStateManager; import com.jme3.asset.AssetManager; import com.jme3.audio.AudioContext; @@ -100,8 +101,24 @@ public class LegacyApplication implements Application, SystemListener { /** * Create a new instance of LegacyApplication. */ - public LegacyApplication(){ + public LegacyApplication() { + this((AppState[])null); + } + + /** + * Create a new instance of LegacyApplication, preinitialized + * with the specified set of app states. + */ + public LegacyApplication( AppState... initialStates ) { initStateManager(); + + if (initialStates != null) { + for (AppState a : initialStates) { + if (a != null) { + stateManager.attach(a); + } + } + } } /** diff --git a/jme3-core/src/main/java/com/jme3/app/SimpleApplication.java b/jme3-core/src/main/java/com/jme3/app/SimpleApplication.java index 310191007..2ab008c5c 100644 --- a/jme3-core/src/main/java/com/jme3/app/SimpleApplication.java +++ b/jme3-core/src/main/java/com/jme3/app/SimpleApplication.java @@ -100,15 +100,7 @@ public abstract class SimpleApplication extends LegacyApplication { } public SimpleApplication( AppState... initialStates ) { - super(); - - if (initialStates != null) { - for (AppState a : initialStates) { - if (a != null) { - stateManager.attach(a); - } - } - } + super(initialStates); } @Override From 68ace33dbd9e0e9630d5aa54cc11296fa82270a2 Mon Sep 17 00:00:00 2001 From: Paul Speed Date: Mon, 28 Mar 2016 11:06:29 -0400 Subject: [PATCH 04/15] Fixed an NPE when jmeClone() was asked to clone a null. --- jme3-core/src/main/java/com/jme3/util/clone/Cloner.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/jme3-core/src/main/java/com/jme3/util/clone/Cloner.java b/jme3-core/src/main/java/com/jme3/util/clone/Cloner.java index ba202e463..4b812006f 100644 --- a/jme3-core/src/main/java/com/jme3/util/clone/Cloner.java +++ b/jme3-core/src/main/java/com/jme3/util/clone/Cloner.java @@ -354,6 +354,9 @@ public class Cloner { * clone() and objects without necessarily knowing their real type.

*/ public T javaClone( T object ) throws CloneNotSupportedException { + if( object == null ) { + return null; + } Method m = methodCache.get(object.getClass()); if( m == null ) { try { From b5b6ebd97cfb72f13a18db92ae0282a5f4a8910d Mon Sep 17 00:00:00 2001 From: javasabr Date: Tue, 29 Mar 2016 06:47:36 +0300 Subject: [PATCH 05/15] fixed the input of chars for UI. --- .../com/jme3/input/lwjgl/GlfwKeyInput.java | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyInput.java b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyInput.java index cd87cc70a..e0fa70b92 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyInput.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwKeyInput.java @@ -36,13 +36,21 @@ import com.jme3.input.KeyInput; import com.jme3.input.RawInputListener; import com.jme3.input.event.KeyInputEvent; import com.jme3.system.lwjgl.LwjglWindow; + +import org.lwjgl.glfw.GLFWCharCallback; import org.lwjgl.glfw.GLFWKeyCallback; import java.util.LinkedList; import java.util.Queue; import java.util.logging.Logger; -import static org.lwjgl.glfw.GLFW.*; +import static org.lwjgl.glfw.GLFW.GLFW_KEY_LAST; +import static org.lwjgl.glfw.GLFW.GLFW_KEY_SPACE; +import static org.lwjgl.glfw.GLFW.GLFW_PRESS; +import static org.lwjgl.glfw.GLFW.GLFW_REPEAT; +import static org.lwjgl.glfw.GLFW.glfwGetTime; +import static org.lwjgl.glfw.GLFW.glfwSetCharCallback; +import static org.lwjgl.glfw.GLFW.glfwSetKeyCallback; public class GlfwKeyInput implements KeyInput { @@ -52,6 +60,7 @@ public class GlfwKeyInput implements KeyInput { private RawInputListener listener; private boolean initialized; private GLFWKeyCallback keyCallback; + private GLFWCharCallback charCallback; private Queue keyInputEvents = new LinkedList(); public GlfwKeyInput(LwjglWindow context) { @@ -66,14 +75,38 @@ public class GlfwKeyInput implements KeyInput { glfwSetKeyCallback(context.getWindowHandle(), keyCallback = new GLFWKeyCallback() { @Override public void invoke(long window, int key, int scancode, int action, int mods) { + + if (key < 0 || key > GLFW_KEY_LAST) { + return; + } + int jmeKey = GlfwKeyMap.toJmeKeyCode(key); - final KeyInputEvent evt = new KeyInputEvent(jmeKey, (char) key, GLFW_PRESS == action, GLFW_REPEAT == action); - evt.setTime(getInputTimeNanos()); - keyInputEvents.add(evt); + + final KeyInputEvent event = new KeyInputEvent(jmeKey, '\0', GLFW_PRESS == action, GLFW_REPEAT == action); + event.setTime(getInputTimeNanos()); + + keyInputEvents.add(event); } }); - glfwSetInputMode(context.getWindowHandle(), GLFW_STICKY_KEYS, 1); + glfwSetCharCallback(context.getWindowHandle(), charCallback = new GLFWCharCallback() { + + @Override + public void invoke(long window, int codepoint) { + + final char keyChar = (char) codepoint; + + final KeyInputEvent pressed = new KeyInputEvent(KeyInput.KEY_UNKNOWN, keyChar, true, false); + pressed.setTime(getInputTimeNanos()); + + keyInputEvents.add(pressed); + + final KeyInputEvent released = new KeyInputEvent(KeyInput.KEY_UNKNOWN, keyChar, false, false); + released.setTime(getInputTimeNanos()); + + keyInputEvents.add(released); + } + }); initialized = true; logger.fine("Keyboard created."); @@ -100,6 +133,7 @@ public class GlfwKeyInput implements KeyInput { } keyCallback.release(); + charCallback.release(); logger.fine("Keyboard destroyed."); } From 7a3a0627c2b0c46e929ec98255457ca5ff5fc812 Mon Sep 17 00:00:00 2001 From: javasabr Date: Tue, 29 Mar 2016 06:48:40 +0300 Subject: [PATCH 06/15] fixed the scroll of mouse and the buffer overflow. --- .../src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java index bf5478cba..89f60fb7f 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java @@ -136,7 +136,7 @@ public class GlfwMouseInput implements MouseInput { glfwSetScrollCallback(context.getWindowHandle(), scrollCallback = new GLFWScrollCallback() { @Override public void invoke(final long window, final double xOffset, final double yOffset) { - onWheelScroll(window, xOffset, yOffset); + onWheelScroll(window, xOffset, yOffset * 120); } }); @@ -213,7 +213,7 @@ public class GlfwMouseInput implements MouseInput { // TODO: currently animated cursors are not supported IntBuffer imageData = jmeCursor.getImagesData(); - ByteBuffer buf = BufferUtils.createByteBuffer(imageData.capacity()); + ByteBuffer buf = BufferUtils.createByteBuffer(imageData.capacity() * 4); buf.asIntBuffer().put(imageData); glfwImage.set(jmeCursor.getWidth(), jmeCursor.getHeight(), buf); From 98f1bfc0c15fef8e8653d420fbc7a60d75e15bad Mon Sep 17 00:00:00 2001 From: javasabr Date: Tue, 29 Mar 2016 06:48:47 +0300 Subject: [PATCH 07/15] fixed NPE --- jme3-core/src/main/java/com/jme3/app/LegacyApplication.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jme3-core/src/main/java/com/jme3/app/LegacyApplication.java b/jme3-core/src/main/java/com/jme3/app/LegacyApplication.java index e861ef66b..d796ba309 100644 --- a/jme3-core/src/main/java/com/jme3/app/LegacyApplication.java +++ b/jme3-core/src/main/java/com/jme3/app/LegacyApplication.java @@ -540,7 +540,9 @@ public class LegacyApplication implements Application, SystemListener { * Internal use only. */ public void reshape(int w, int h){ - renderManager.notifyReshape(w, h); + if (renderManager != null) { + renderManager.notifyReshape(w, h); + } } /** From 85e284a7b00afef820e962445dffd54f37c6edc8 Mon Sep 17 00:00:00 2001 From: javasabr Date: Tue, 29 Mar 2016 19:13:00 +0300 Subject: [PATCH 08/15] moved the magic number to constant --- .../src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java index 89f60fb7f..17c91aa33 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java @@ -67,6 +67,8 @@ public class GlfwMouseInput implements MouseInput { private static final Logger logger = Logger.getLogger(GlfwMouseInput.class.getName()); + private static final int WHEEL_SCALE = 120; + private LwjglWindow context; private RawInputListener listener; private boolean cursorVisible = true; @@ -136,7 +138,7 @@ public class GlfwMouseInput implements MouseInput { glfwSetScrollCallback(context.getWindowHandle(), scrollCallback = new GLFWScrollCallback() { @Override public void invoke(final long window, final double xOffset, final double yOffset) { - onWheelScroll(window, xOffset, yOffset * 120); + onWheelScroll(window, xOffset, yOffset * WHEEL_SCALE); } }); From 4162fb9447f642ef64149431aeb673e60737d566 Mon Sep 17 00:00:00 2001 From: Jan Ivenz Date: Thu, 21 Jan 2016 14:13:18 +0100 Subject: [PATCH 09/15] Texture arrays are now allowed as color buffer render targets. --- .../java/com/jme3/texture/FrameBuffer.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java index bc21fd82b..7237c1e0a 100644 --- a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java +++ b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java @@ -324,6 +324,19 @@ public class FrameBuffer extends NativeObject { addColorTexture(tex); } + /** + * Set the color texture array to use for this framebuffer. + * This automatically clears all existing textures added previously + * with {@link FrameBuffer#addColorTexture } and adds this texture as the + * only target. + * + * @param tex The color texture array to set. + */ + public void setColorTexture(TextureArray tex){ + clearColorTargets(); + addColorTexture(tex); + } + /** * Set the color texture to use for this framebuffer. * This automatically clears all existing textures added previously @@ -369,6 +382,30 @@ public class FrameBuffer extends NativeObject { colorBufs.add(colorBuf); } + /** + * Add a color texture array to use for this framebuffer. + * If MRT is enabled, then each subsequently added texture can be + * rendered to through a shader that writes to the array gl_FragData. + * If MRT is not enabled, then the index set with {@link FrameBuffer#setTargetIndex(int) } + * is rendered to by the shader. + * + * @param tex The texture array to add. + */ + public void addColorTexture(TextureArray tex) { + if (id != -1) + throw new UnsupportedOperationException("FrameBuffer already initialized."); + + Image img = tex.getImage(); + checkSetTexture(tex, false); + + RenderBuffer colorBuf = new RenderBuffer(); + colorBuf.slot = colorBufs.size(); + colorBuf.tex = tex; + colorBuf.format = img.getFormat(); + + colorBufs.add(colorBuf); + } + /** * Add a color texture to use for this framebuffer. * If MRT is enabled, then each subsequently added texture can be From c6143ae6409b59b863eb23170c40b0e57515532c Mon Sep 17 00:00:00 2001 From: Jan Ivenz Date: Fri, 29 Jan 2016 13:04:31 +0100 Subject: [PATCH 10/15] Rendering depth to texture arrays. --- .../java/com/jme3/renderer/opengl/GL3.java | 1 + .../jme3/renderer/opengl/GLDebugDesktop.java | 6 +++++ .../com/jme3/renderer/opengl/GLRenderer.java | 18 +++++++++---- .../main/java/com/jme3/shader/VarType.java | 2 +- .../java/com/jme3/texture/FrameBuffer.java | 25 ++++++++++++++++--- .../java/com/jme3/renderer/jogl/JoglGL.java | 5 ++++ .../java/com/jme3/renderer/lwjgl/LwjglGL.java | 5 ++++ .../java/com/jme3/renderer/lwjgl/LwjglGL.java | 5 ++++ 8 files changed, 58 insertions(+), 9 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java index 2a7c38bb9..1fbad5c2d 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java @@ -58,6 +58,7 @@ public interface GL3 extends GL2 { public void glBindFragDataLocation(int param1, int param2, String param3); /// GL3+ public void glBindVertexArray(int param1); /// GL3+ public void glDeleteVertexArrays(IntBuffer arrays); /// GL3+ + public void glFramebufferTextureLayer(int param1, int param2, int param3, int param4, int param5); /// GL3+ public void glGenVertexArrays(IntBuffer param1); /// GL3+ public String glGetString(int param1, int param2); /// GL3+ } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java index a0511f6ad..fd18cc7ff 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java @@ -94,4 +94,10 @@ public class GLDebugDesktop extends GLDebugES implements GL2, GL3, GL4 { gl4.glPatchParameter(count); checkError(); } + + @Override + public void glFramebufferTextureLayer(int param1, int param2, int param3, int param4, int param5) { + gl3.glFramebufferTextureLayer(param1, param2, param3, param4, param5); + checkError(); + } } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index 1ad42eac9..636733583 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -1442,11 +1442,19 @@ public final class GLRenderer implements Renderer { setupTextureParams(0, tex); } - glfbo.glFramebufferTexture2DEXT(GLFbo.GL_FRAMEBUFFER_EXT, - convertAttachmentSlot(rb.getSlot()), - convertTextureType(tex.getType(), image.getMultiSamples(), rb.getFace()), - image.getId(), - 0); + if (rb.getLayer() < 0){ + glfbo.glFramebufferTexture2DEXT(GLFbo.GL_FRAMEBUFFER_EXT, + convertAttachmentSlot(rb.getSlot()), + convertTextureType(tex.getType(), image.getMultiSamples(), rb.getFace()), + image.getId(), + 0); + } else { + gl3.glFramebufferTextureLayer(GLFbo.GL_FRAMEBUFFER_EXT, + convertAttachmentSlot(rb.getSlot()), + image.getId(), + 0, + rb.getLayer()); + } } public void updateFrameBufferAttachment(FrameBuffer fb, RenderBuffer rb) { diff --git a/jme3-core/src/main/java/com/jme3/shader/VarType.java b/jme3-core/src/main/java/com/jme3/shader/VarType.java index b494daf57..7300294d4 100644 --- a/jme3-core/src/main/java/com/jme3/shader/VarType.java +++ b/jme3-core/src/main/java/com/jme3/shader/VarType.java @@ -55,7 +55,7 @@ public enum VarType { TextureBuffer(false,true,"sampler1D|sampler1DShadow"), Texture2D(false,true,"sampler2D|sampler2DShadow"), Texture3D(false,true,"sampler3D"), - TextureArray(false,true,"sampler2DArray"), + TextureArray(false,true,"sampler2DArray|sampler2DArrayShadow"), TextureCubeMap(false,true,"samplerCube"), Int("int"); diff --git a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java index 7237c1e0a..a3f825d26 100644 --- a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java +++ b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java @@ -97,6 +97,7 @@ public class FrameBuffer extends NativeObject { int id = -1; int slot = SLOT_UNDEF; int face = -1; + int layer = -1; /** * @return The image format of the render buffer. @@ -160,6 +161,10 @@ public class FrameBuffer extends NativeObject { return "BufferTarget[format=" + format + "]"; } } + + public int getLayer() { + return this.layer; + } } /** @@ -332,9 +337,9 @@ public class FrameBuffer extends NativeObject { * * @param tex The color texture array to set. */ - public void setColorTexture(TextureArray tex){ + public void setColorTexture(TextureArray tex, int layer){ clearColorTargets(); - addColorTexture(tex); + addColorTexture(tex, layer); } /** @@ -391,7 +396,7 @@ public class FrameBuffer extends NativeObject { * * @param tex The texture array to add. */ - public void addColorTexture(TextureArray tex) { + public void addColorTexture(TextureArray tex, int layer) { if (id != -1) throw new UnsupportedOperationException("FrameBuffer already initialized."); @@ -402,6 +407,7 @@ public class FrameBuffer extends NativeObject { colorBuf.slot = colorBufs.size(); colorBuf.tex = tex; colorBuf.format = img.getFormat(); + colorBuf.layer = layer; colorBufs.add(colorBuf); } @@ -449,7 +455,20 @@ public class FrameBuffer extends NativeObject { depthBuf.tex = tex; depthBuf.format = img.getFormat(); } + public void setDepthTexture(TextureArray tex, int layer){ + if (id != -1) + throw new UnsupportedOperationException("FrameBuffer already initialized."); + Image img = tex.getImage(); + checkSetTexture(tex, true); + + depthBuf = new RenderBuffer(); + depthBuf.slot = img.getFormat().isDepthStencilFormat() ? SLOT_DEPTH_STENCIL : SLOT_DEPTH; + depthBuf.tex = tex; + depthBuf.format = img.getFormat(); + depthBuf.layer = layer; + } + /** * @return The number of color buffers attached to this texture. */ diff --git a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java index 3da2ed49e..2ca2fb266 100644 --- a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java +++ b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java @@ -600,4 +600,9 @@ public class JoglGL implements GL, GL2, GL3, GL4 { checkLimit(arrays); GLContext.getCurrentGL().getGL2ES3().glDeleteVertexArrays(arrays.limit(), arrays); } + + @Override + public void glFramebufferTextureLayer(int param1, int param2, int param3, int param4, int param5) { + GLContext.getCurrentGL().getGL3().glFramebufferTextureLayer(param1, param2, param3, param4, param5); + } } diff --git a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java index 2b7df131a..6f640042f 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java +++ b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java @@ -457,4 +457,9 @@ public final class LwjglGL implements GL, GL2, GL3, GL4 { checkLimit(arrays); ARBVertexArrayObject.glDeleteVertexArrays(arrays); } + + @Override + public void glFramebufferTextureLayer(int param1, int param2, int param3, int param4, int param5) { + GL30.glFramebufferTextureLayer(param1, param2, param3, param4, param5); + } } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java index 187b232f2..25de6b148 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java @@ -486,4 +486,9 @@ public class LwjglGL implements GL, GL2, GL3, GL4 { checkLimit(arrays); ARBVertexArrayObject.glDeleteVertexArrays(arrays); } + + @Override + public void glFramebufferTextureLayer(int param1, int param2, int param3, int param4, int param5) { + GL30.glFramebufferTextureLayer(param1, param2, param3, param4, param5); + } } From 98a9f5c628ba3644289b2e23ada3924492a10424 Mon Sep 17 00:00:00 2001 From: Jan Ivenz Date: Wed, 16 Mar 2016 11:25:43 +0100 Subject: [PATCH 11/15] Fixed shader generation bug for array variables. --- .../main/java/com/jme3/shader/Glsl100ShaderGenerator.java | 7 ++++++- .../jme3/material/plugins/ShaderNodeLoaderDelegate.java | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java b/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java index a7a53b915..ffe96d0f0 100644 --- a/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java +++ b/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java @@ -258,7 +258,7 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { } for (ShaderNodeVariable var : shaderNode.getDefinition().getOutputs()) { - ShaderNodeVariable v = new ShaderNodeVariable(var.getType(), shaderNode.getName(), var.getName()); + ShaderNodeVariable v = new ShaderNodeVariable(var.getType(), shaderNode.getName(), var.getName(), var.getMultiplicity()); if (!declaredInputs.contains(shaderNode.getName() + "_" + var.getName())) { if (!isVarying(info, v)) { declareVariable(source, v); @@ -397,6 +397,11 @@ public class Glsl100ShaderGenerator extends ShaderGenerator { source.append(mapping.getLeftVariable().getNameSpace()); source.append("_"); source.append(mapping.getLeftVariable().getName()); + if (mapping.getLeftVariable().getMultiplicity() != null){ + source.append("["); + source.append(mapping.getLeftVariable().getMultiplicity()); + source.append("]"); + } //left swizzle, the variable can't be declared and assigned on the same line. if (mapping.getLeftSwizzling().length() > 0) { diff --git a/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java b/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java index 4437293f3..7cc902f95 100644 --- a/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java +++ b/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java @@ -752,6 +752,7 @@ public class ShaderNodeLoaderDelegate { } right.setNameSpace(node.getName()); right.setType(var.getType()); + right.setMultiplicity(var.getMultiplicity()); mapping.setRightVariable(right); storeVaryings(node, mapping.getRightVariable()); From 75791883ec5ac9818a435256e8d90bbeddac8cf4 Mon Sep 17 00:00:00 2001 From: Jan Ivenz Date: Wed, 16 Mar 2016 18:53:03 +0100 Subject: [PATCH 12/15] For LightFilter to be implementable frustumCheckNeeded and intersectsFrustum need to be accesible. --- .../src/main/java/com/jme3/light/Light.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/jme3-core/src/main/java/com/jme3/light/Light.java b/jme3-core/src/main/java/com/jme3/light/Light.java index f6ea68045..9836c7db0 100644 --- a/jme3-core/src/main/java/com/jme3/light/Light.java +++ b/jme3-core/src/main/java/com/jme3/light/Light.java @@ -184,6 +184,22 @@ public abstract class Light implements Savable, Cloneable { this.enabled = enabled; } + public boolean isFrustumCheckNeeded() { + return frustumCheckNeeded; + } + + public void setFrustumCheckNeeded(boolean frustumCheckNeeded) { + this.frustumCheckNeeded = frustumCheckNeeded; + } + + public boolean isIntersectsFrustum() { + return intersectsFrustum; + } + + public void setIntersectsFrustum(boolean intersectsFrustum) { + this.intersectsFrustum = intersectsFrustum; + } + /** * Determines if the light intersects with the given bounding box. *

From 83b26be45afdf7699fc48d2783b88b55bdcf4514 Mon Sep 17 00:00:00 2001 From: Fadorico Date: Thu, 31 Mar 2016 01:39:54 -0400 Subject: [PATCH 13/15] Combine result of both listeners to determine if the collision should occur --- .../src/main/java/com/jme3/bullet/PhysicsSpace.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java b/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java index 9122e1bc6..f3575bcdf 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java @@ -339,15 +339,16 @@ public class PhysicsSpace { private boolean notifyCollisionGroupListeners_native(PhysicsCollisionObject node, PhysicsCollisionObject node1){ PhysicsCollisionGroupListener listener = collisionGroupListeners.get(node.getCollisionGroup()); PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(node1.getCollisionGroup()); + boolean result = true; + if(listener != null){ - if(!listener.collide(node, node1)){ - return false; - } + result = listener.collide(node, node1); } if(listener1 != null && node.getCollisionGroup() != node1.getCollisionGroup()){ - return listener1.collide(node, node1); + result = listener1.collide(node, node1) && result; } - return true; + + return result; } /** From f61b1439cc1ea63e456ea1ac6fca9c722dea2745 Mon Sep 17 00:00:00 2001 From: Fadorico Date: Thu, 31 Mar 2016 22:42:53 -0400 Subject: [PATCH 14/15] Combine result of both listeners to determine if the collision should occur (jbullet) --- .../src/main/java/com/jme3/bullet/PhysicsSpace.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java b/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java index 016440bf0..483343f72 100644 --- a/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java +++ b/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java @@ -237,12 +237,12 @@ public class PhysicsSpace { || (collisionObject1.getCollideWithGroups() & collisionObject.getCollisionGroup()) > 0) { PhysicsCollisionGroupListener listener = collisionGroupListeners.get(collisionObject.getCollisionGroup()); PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(collisionObject1.getCollisionGroup()); - if (listener != null) { - return listener.collide(collisionObject, collisionObject1); - } else if (listener1 != null) { - return listener1.collide(collisionObject, collisionObject1); + if(listener != null){ + collides = listener.collide(collisionObject, collisionObject1); + } + if(listener1 != null && collisionObject.getCollisionGroup() != collisionObject1.getCollisionGroup()){ + collides = listener1.collide(collisionObject, collisionObject1) && collides; } - return true; } else { return false; } From b39c46a82a975256b54c3e7e6128075d3e62d391 Mon Sep 17 00:00:00 2001 From: Georgeto Date: Fri, 1 Apr 2016 09:19:50 +0200 Subject: [PATCH 15/15] Let lwjgl respect the AlphaBits setting. --- .../src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java | 4 ++-- .../src/main/java/com/jme3/system/lwjgl/LwjglDisplay.java | 3 ++- .../main/java/com/jme3/system/lwjgl/LwjglOffscreenBuffer.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java index 2452e470b..0c5392b19 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java +++ b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java @@ -301,7 +301,7 @@ public class LwjglCanvas extends LwjglAbstractDisplay implements JmeCanvasContex // crashes on bad drivers if (pbufferFormat == null){ pbufferFormat = new PixelFormat(settings.getBitsPerPixel(), - 0, + settings.getAlphaBits(), settings.getDepthBits(), settings.getStencilBits(), 0, // samples @@ -315,7 +315,7 @@ public class LwjglCanvas extends LwjglAbstractDisplay implements JmeCanvasContex if (canvasFormat == null){ int samples = getNumSamplesToUse(); canvasFormat = new PixelFormat(settings.getBitsPerPixel(), - 0, + settings.getAlphaBits(), settings.getDepthBits(), settings.getStencilBits(), samples, diff --git a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglDisplay.java b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglDisplay.java index 853e02933..71ba74388 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglDisplay.java +++ b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglDisplay.java @@ -84,7 +84,7 @@ public class LwjglDisplay extends LwjglAbstractDisplay { int samples = getNumSamplesToUse(); PixelFormat pf = new PixelFormat(settings.getBitsPerPixel(), - 0, + settings.getAlphaBits(), settings.getDepthBits(), settings.getStencilBits(), samples, @@ -99,6 +99,7 @@ public class LwjglDisplay extends LwjglAbstractDisplay { boolean pixelFormatChanged = false; if (created.get() && (pixelFormat.getBitsPerPixel() != pf.getBitsPerPixel() + ||pixelFormat.getAlphaBits() != pf.getAlphaBits() ||pixelFormat.getDepthBits() != pf.getDepthBits() ||pixelFormat.getStencilBits() != pf.getStencilBits() ||pixelFormat.getSamples() != pf.getSamples())){ diff --git a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglOffscreenBuffer.java b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglOffscreenBuffer.java index ddfb8b62b..afd2c7508 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglOffscreenBuffer.java +++ b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglOffscreenBuffer.java @@ -62,7 +62,7 @@ public class LwjglOffscreenBuffer extends LwjglContext implements Runnable { int samples = getNumSamplesToUse(); pixelFormat = new PixelFormat(settings.getBitsPerPixel(), - 0, + settings.getAlphaBits(), settings.getDepthBits(), settings.getStencilBits(), samples);