Ver Fonte

Merge pull request #541 from tonihele/issue-537

Added a cursor cache for LWJGL 2, resolves #537
empirephoenix há 9 anos atrás
pai
commit
bbad454e43

+ 30 - 9
jme3-lwjgl/src/main/java/com/jme3/input/lwjgl/LwjglMouseInput.java

@@ -39,6 +39,8 @@ import com.jme3.input.event.MouseButtonEvent;
 import com.jme3.input.event.MouseMotionEvent;
 import com.jme3.system.lwjgl.LwjglAbstractDisplay;
 import com.jme3.system.lwjgl.LwjglTimer;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.lwjgl.LWJGLException;
@@ -57,6 +59,12 @@ public class LwjglMouseInput implements MouseInput {
     private boolean supportHardwareCursor = false;
     private boolean cursorVisible = true;
 
+    /**
+     * We need to cache the cursors
+     * (https://github.com/jMonkeyEngine/jmonkeyengine/issues/537)
+     */
+    private Map<JmeCursor, Cursor> cursorMap = new HashMap<JmeCursor, Cursor>();
+
     private int curX, curY, curWheel;
 
     public LwjglMouseInput(LwjglAbstractDisplay context){
@@ -120,7 +128,7 @@ public class LwjglMouseInput implements MouseInput {
             }
             if (btn != -1){
                 MouseButtonEvent evt = new MouseButtonEvent(btn,
-                                                            Mouse.getEventButtonState(), x, y);
+                        Mouse.getEventButtonState(), x, y);
                 evt.setTime(Mouse.getEventNanoseconds());
                 listener.onMouseButtonEvent(evt);
             }
@@ -132,6 +140,13 @@ public class LwjglMouseInput implements MouseInput {
             return;
 
         Mouse.destroy();
+
+        // Destroy the cursor cache
+        for (Cursor cursor : cursorMap.values()) {
+            cursor.destroy();
+        }
+        cursorMap.clear();
+
         logger.fine("Mouse destroyed.");
     }
 
@@ -155,14 +170,20 @@ public class LwjglMouseInput implements MouseInput {
         try {
             Cursor newCursor = null;
             if (jmeCursor != null) {
-                 newCursor = new Cursor(
-                        jmeCursor.getWidth(),
-                        jmeCursor.getHeight(),
-                        jmeCursor.getXHotSpot(),
-                        jmeCursor.getYHotSpot(),
-                        jmeCursor.getNumImages(),
-                        jmeCursor.getImagesData(),
-                        jmeCursor.getImagesDelay());
+                newCursor = cursorMap.get(jmeCursor);
+                if (newCursor == null) {
+                    newCursor = new Cursor(
+                            jmeCursor.getWidth(),
+                            jmeCursor.getHeight(),
+                            jmeCursor.getXHotSpot(),
+                            jmeCursor.getYHotSpot(),
+                            jmeCursor.getNumImages(),
+                            jmeCursor.getImagesData(),
+                            jmeCursor.getImagesDelay());
+
+                    // Add to cache
+                    cursorMap.put(jmeCursor, newCursor);
+                }
             }
             Mouse.setNativeCursor(newCursor);
         } catch (LWJGLException ex) {