Explorar o código

Merge pull request #458 from JavaSaBr/fix_lwjgl3

Fixes in lwjgl3
Kirill Vainer %!s(int64=9) %!d(string=hai) anos
pai
achega
099ebeaec9

+ 3 - 1
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);
+        }
     }
 
     /**

+ 39 - 5
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<KeyInputEvent> keyInputEvents = new LinkedList<KeyInputEvent>();
 
     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.");
     }
 

+ 4 - 2
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);
+                onWheelScroll(window, xOffset, yOffset * WHEEL_SCALE);
             }
         });
 
@@ -213,7 +215,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);