diff --git a/jme3-vr/src/main/java/com/jme3/app/VREnvironment.java b/jme3-vr/src/main/java/com/jme3/app/VREnvironment.java index 5358ff42a..e0e9048dc 100644 --- a/jme3-vr/src/main/java/com/jme3/app/VREnvironment.java +++ b/jme3-vr/src/main/java/com/jme3/app/VREnvironment.java @@ -8,6 +8,7 @@ import com.jme3.app.state.AppState; import com.jme3.input.vr.OSVR; import com.jme3.input.vr.OpenVR; import com.jme3.input.vr.VRAPI; +import com.jme3.input.vr.VRBounds; import com.jme3.input.vr.VRInputAPI; import com.jme3.renderer.Camera; import com.jme3.scene.Spatial; @@ -28,6 +29,8 @@ public class VREnvironment { private VRMouseManager mouseManager = null; private VRViewManager viewmanager = null; + private VRBounds bounds = null; + /** * The underlying system VR API. By default set to {@link VRConstants#SETTING_VRAPI_OPENVR_VALUE}. */ @@ -65,7 +68,6 @@ public class VREnvironment { private boolean initialized = false; - private boolean attached = false; public VREnvironment(AppSettings settings){ @@ -73,7 +75,8 @@ public class VREnvironment { guiManager = new VRGuiManager(this); mouseManager = new VRMouseManager(this); -// dummyCam = new Camera(settings.getWidth(), settings.getHeight()); + + bounds = new VRBounds(); processSettings(); } @@ -86,6 +89,14 @@ public class VREnvironment { return hardware; } + /** + * Get the VR bounds. + * @return the VR bounds. + */ + public VRBounds getVRBounds(){ + return bounds; + } + /** * Get the VR dedicated input. * @return the VR dedicated input. @@ -347,7 +358,12 @@ public class VREnvironment { if (application.getCamera() != null){ dummyCam = application.getCamera().clone(); } else { - return new Camera(settings.getWidth(), settings.getHeight()); + + if ((settings != null) && (settings.getWidth() != 0) && (settings.getHeight() != 0)){ + dummyCam = new Camera(settings.getWidth(), settings.getHeight()); + } else { + dummyCam = new Camera(); + } } } else { throw new IllegalStateException("VR environment is not attached to any application."); diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/OpenVR.java b/jme3-vr/src/main/java/com/jme3/input/vr/OpenVR.java index cb2042885..a9f3fdcfb 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/OpenVR.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/OpenVR.java @@ -46,14 +46,14 @@ public class OpenVR implements VRAPI { private static boolean initSuccess = false; private static boolean flipEyes = false; - private static IntBuffer hmdDisplayFrequency; - private static TrackedDevicePose_t.ByReference hmdTrackedDevicePoseReference; - protected static TrackedDevicePose_t[] hmdTrackedDevicePoses; + private IntBuffer hmdDisplayFrequency; + private TrackedDevicePose_t.ByReference hmdTrackedDevicePoseReference; + protected TrackedDevicePose_t[] hmdTrackedDevicePoses; - protected static IntByReference hmdErrorStore; + protected IntByReference hmdErrorStore; - private static final Quaternion rotStore = new Quaternion(); - private static final Vector3f posStore = new Vector3f(); + private final Quaternion rotStore = new Quaternion(); + private final Vector3f posStore = new Vector3f(); private static FloatByReference tlastVsync; @@ -65,20 +65,21 @@ public class OpenVR implements VRAPI { // for debugging latency private int frames = 0; - protected static Matrix4f[] poseMatrices; + protected Matrix4f[] poseMatrices; - private static final Matrix4f hmdPose = Matrix4f.IDENTITY.clone(); - private static Matrix4f hmdProjectionLeftEye; - private static Matrix4f hmdProjectionRightEye; - private static Matrix4f hmdPoseLeftEye; - private static Matrix4f hmdPoseRightEye; + private final Matrix4f hmdPose = Matrix4f.IDENTITY.clone(); + private Matrix4f hmdProjectionLeftEye; + private Matrix4f hmdProjectionRightEye; + private Matrix4f hmdPoseLeftEye; + private Matrix4f hmdPoseRightEye; - private static Vector3f hmdPoseLeftEyeVec, hmdPoseRightEyeVec, hmdSeatToStand; + private Vector3f hmdPoseLeftEyeVec, hmdPoseRightEyeVec, hmdSeatToStand; + + private float vsyncToPhotons; + private double timePerFrame, frameCountRun; + private long frameCount; + private OpenVRInput VRinput; - private static float vsyncToPhotons; - private static double timePerFrame, frameCountRun; - private static long frameCount; - private static OpenVRInput VRinput; private VREnvironment environment = null; @@ -181,7 +182,7 @@ public class OpenVR implements VRAPI { VRinput.updateConnectedControllers(); // init bounds & chaperone info - VRBounds.init(); + environment.getVRBounds().init(this); logger.config("Initializing OpenVR system [SUCCESS]"); initSuccess = true; diff --git a/jme3-vr/src/main/java/com/jme3/input/vr/OpenVRInput.java b/jme3-vr/src/main/java/com/jme3/input/vr/OpenVRInput.java index b4b5cdce5..2f9b81e95 100644 --- a/jme3-vr/src/main/java/com/jme3/input/vr/OpenVRInput.java +++ b/jme3-vr/src/main/java/com/jme3/input/vr/OpenVRInput.java @@ -5,6 +5,7 @@ */ package com.jme3.input.vr; +import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -183,28 +184,50 @@ public class OpenVRInput implements VRInputAPI { @Override public Vector3f getVelocity(int controllerIndex) { - int index = OpenVRInput.controllerIndex[controllerIndex]; - if( needsNewVelocity[index] ) { - OpenVR.hmdTrackedDevicePoses[index].readField("vVelocity"); - needsNewVelocity[index] = false; - } - tempVel.x = OpenVR.hmdTrackedDevicePoses[index].vVelocity.v[0]; - tempVel.y = OpenVR.hmdTrackedDevicePoses[index].vVelocity.v[1]; - tempVel.z = OpenVR.hmdTrackedDevicePoses[index].vVelocity.v[2]; - return tempVel; + + if (environment != null){ + + if (environment.getVRHardware() instanceof OpenVR){ + int index = OpenVRInput.controllerIndex[controllerIndex]; + if( needsNewVelocity[index] ) { + ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[index].readField("vVelocity"); + needsNewVelocity[index] = false; + } + tempVel.x = ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[index].vVelocity.v[0]; + tempVel.y = ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[index].vVelocity.v[1]; + tempVel.z = ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[index].vVelocity.v[2]; + return tempVel; + } else { + throw new IllegalStateException("VR hardware "+environment.getVRHardware().getClass().getSimpleName()+" is not a subclass of "+OpenVR.class.getSimpleName()); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } } @Override public Vector3f getAngularVelocity(int controllerIndex) { - int index = OpenVRInput.controllerIndex[controllerIndex]; - if( needsNewAngVelocity[index] ) { - OpenVR.hmdTrackedDevicePoses[index].readField("vAngularVelocity"); - needsNewAngVelocity[index] = false; - } - tempVel.x = OpenVR.hmdTrackedDevicePoses[index].vAngularVelocity.v[0]; - tempVel.y = OpenVR.hmdTrackedDevicePoses[index].vAngularVelocity.v[1]; - tempVel.z = OpenVR.hmdTrackedDevicePoses[index].vAngularVelocity.v[2]; - return tempVel; + + if (environment != null){ + + if (environment.getVRHardware() instanceof OpenVR){ + + int index = OpenVRInput.controllerIndex[controllerIndex]; + if( needsNewAngVelocity[index] ) { + ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[index].readField("vAngularVelocity"); + needsNewAngVelocity[index] = false; + } + tempVel.x = ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[index].vAngularVelocity.v[0]; + tempVel.y = ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[index].vAngularVelocity.v[1]; + tempVel.z = ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[index].vAngularVelocity.v[2]; + return tempVel; + } else { + throw new IllegalStateException("VR hardware "+environment.getVRHardware().getClass().getSimpleName()+" is not a subclass of "+OpenVR.class.getSimpleName()); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + } @Override @@ -309,7 +332,16 @@ public class OpenVRInput implements VRInputAPI { return false; } - return OpenVR.hmdTrackedDevicePoses[controllerIndex[index]].bPoseIsValid != 0; + if (environment != null){ + + if (environment.getVRHardware() instanceof OpenVR){ + return ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[controllerIndex[index]].bPoseIsValid != 0; + } else { + throw new IllegalStateException("VR hardware "+environment.getVRHardware().getClass().getSimpleName()+" is not a subclass of "+OpenVR.class.getSimpleName()); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } } @Override @@ -317,9 +349,19 @@ public class OpenVRInput implements VRInputAPI { if( isInputDeviceTracking(index) == false ){ return null; } - index = controllerIndex[index]; - VRUtil.convertMatrix4toQuat(OpenVR.poseMatrices[index], rotStore[index]); - return rotStore[index]; + + if (environment != null){ + + if (environment.getVRHardware() instanceof OpenVR){ + index = controllerIndex[index]; + VRUtil.convertMatrix4toQuat(((OpenVR)environment.getVRHardware()).poseMatrices[index], rotStore[index]); + return rotStore[index]; + } else { + throw new IllegalStateException("VR hardware "+environment.getVRHardware().getClass().getSimpleName()+" is not a subclass of "+OpenVR.class.getSimpleName()); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } } @Override @@ -328,12 +370,23 @@ public class OpenVRInput implements VRInputAPI { return null; } - // the hmdPose comes in rotated funny, fix that here - index = controllerIndex[index]; - OpenVR.poseMatrices[index].toTranslationVector(posStore[index]); - posStore[index].x = -posStore[index].x; - posStore[index].z = -posStore[index].z; - return posStore[index]; + if (environment != null){ + + if (environment.getVRHardware() instanceof OpenVR){ + // the hmdPose comes in rotated funny, fix that here + index = controllerIndex[index]; + ((OpenVR)environment.getVRHardware()).poseMatrices[index].toTranslationVector(posStore[index]); + posStore[index].x = -posStore[index].x; + posStore[index].z = -posStore[index].z; + return posStore[index]; + } else { + throw new IllegalStateException("VR hardware "+environment.getVRHardware().getClass().getSimpleName()+" is not a subclass of "+OpenVR.class.getSimpleName()); + } + } else { + throw new IllegalStateException("VR input is not attached to a VR environment."); + } + + } @Override @@ -411,9 +464,9 @@ public class OpenVRInput implements VRInputAPI { if (environment != null){ controllerCount = 0; for(int i=0;i(JOpenVRLibrary.k_unMaxTrackedDeviceCount); + } + trackedControllers.add(new OpenVRTrackedController(i, this, controllerName, manufacturerName, environment)); + // Send an Haptic pulse to the controller triggerHapticPulse(controllerCount, 1.0f);