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);