From 88a9069662f44294258e9843c11370a1b9519151 Mon Sep 17 00:00:00 2001 From: FennelFetish Date: Mon, 8 Apr 2019 15:17:19 +0200 Subject: [PATCH] Adds option to disable VR mouse cursor and thus enable the cursor on the desktop. Fixes repeated attachment of mouseImage as scene to gui viewport (because its parent was always null). --- .../jme3/input/vr/AbstractVRMouseManager.java | 31 ++++++++++--------- .../com/jme3/input/vr/VRMouseManager.java | 8 ++++- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/AbstractVRMouseManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/AbstractVRMouseManager.java index 8d73e7c04..97c0c2a3a 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/AbstractVRMouseManager.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/AbstractVRMouseManager.java @@ -9,7 +9,6 @@ import com.jme3.input.MouseInput; import com.jme3.input.lwjgl.GlfwMouseInputVR; import com.jme3.material.RenderState.BlendMode; import com.jme3.math.Vector2f; -import com.jme3.scene.Node; import com.jme3.system.AppSettings; import com.jme3.system.lwjgl.LwjglWindow; import com.jme3.texture.Texture; @@ -27,8 +26,8 @@ public abstract class AbstractVRMouseManager implements VRMouseManager { private VREnvironment environment = null; - - + private boolean vrMouseEnabled = true; + private boolean mouseAttached = false; private Picture mouseImage; private int recentCenterCount = 0; @@ -70,6 +69,11 @@ public abstract class AbstractVRMouseManager implements VRMouseManager { public VREnvironment getVREnvironment() { return environment; } + + @Override + public void setVRMouseEnabled(boolean enabled) { + vrMouseEnabled = enabled; + } @Override public void setThumbstickMode(boolean set) { @@ -185,10 +189,9 @@ public abstract class AbstractVRMouseManager implements VRMouseManager { @Override public void update(float tpf) { // if we are showing the cursor, add our picture as it - - if( environment.getApplication().getInputManager().isCursorVisible() ) { - if( mouseImage.getParent() == null ) { - + if( vrMouseEnabled && environment.getApplication().getInputManager().isCursorVisible() ) { + if(!mouseAttached) { + mouseAttached = true; environment.getApplication().getGuiViewPort().attachScene(mouseImage); centerMouse(); // the "real" mouse pointer should stay hidden @@ -216,13 +219,13 @@ public abstract class AbstractVRMouseManager implements VRMouseManager { mouseImage.updateGeometricState(); - } else if( mouseImage.getParent() != null ) { - Node n = mouseImage.getParent(); - mouseImage.removeFromParent(); - - if (n != null){ - n.updateGeometricState(); - } + } else if(mouseAttached) { + mouseAttached = false; + environment.getApplication().getGuiViewPort().detachScene(mouseImage); + + // Use the setCursorVisible implementation to show the cursor again, depending on the state of cursorVisible + boolean cursorVisible = environment.getApplication().getInputManager().isCursorVisible(); + environment.getApplication().getContext().getMouseInput().setCursorVisible(cursorVisible); } } } diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/VRMouseManager.java b/jme3-vr/src/main/java/com/jme3/input/vr/VRMouseManager.java index 5257cd05c..aa6b10056 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/VRMouseManager.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/VRMouseManager.java @@ -21,6 +21,12 @@ public interface VRMouseManager { * @return the {@link VREnvironment VR Environment} to which this manager is attached. */ public VREnvironment getVREnvironment(); + + /** + * Set if the mouse cursor should be used in the VR view. + * @param enabled true if the mouse cursor should be displayed in VR and false otherwise. + */ + public void setVRMouseEnabled(boolean enabled); /** * Set if the VR device controller is used within thumb stick mode. @@ -29,7 +35,7 @@ public interface VRMouseManager { public void setThumbstickMode(boolean set); /** - * Get if the VR device controller is used within thumb stick mode. + * Get if the VR device controller is used within thumb stick mode. * @return true if the VR device controller is used within thumb stick mode and false otherwise. */ public boolean isThumbstickMode();