Removing more static references.

fix-456
jseinturier 8 years ago
parent f7a852b755
commit 16b4dade2d
  1. 22
      jme3-vr/src/main/java/com/jme3/app/VREnvironment.java
  2. 37
      jme3-vr/src/main/java/com/jme3/input/vr/OpenVR.java
  3. 117
      jme3-vr/src/main/java/com/jme3/input/vr/OpenVRInput.java

@ -8,6 +8,7 @@ import com.jme3.app.state.AppState;
import com.jme3.input.vr.OSVR; import com.jme3.input.vr.OSVR;
import com.jme3.input.vr.OpenVR; import com.jme3.input.vr.OpenVR;
import com.jme3.input.vr.VRAPI; import com.jme3.input.vr.VRAPI;
import com.jme3.input.vr.VRBounds;
import com.jme3.input.vr.VRInputAPI; import com.jme3.input.vr.VRInputAPI;
import com.jme3.renderer.Camera; import com.jme3.renderer.Camera;
import com.jme3.scene.Spatial; import com.jme3.scene.Spatial;
@ -28,6 +29,8 @@ public class VREnvironment {
private VRMouseManager mouseManager = null; private VRMouseManager mouseManager = null;
private VRViewManager viewmanager = null; private VRViewManager viewmanager = null;
private VRBounds bounds = null;
/** /**
* The underlying system VR API. By default set to {@link VRConstants#SETTING_VRAPI_OPENVR_VALUE}. * 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 initialized = false;
private boolean attached = false;
public VREnvironment(AppSettings settings){ public VREnvironment(AppSettings settings){
@ -73,7 +75,8 @@ public class VREnvironment {
guiManager = new VRGuiManager(this); guiManager = new VRGuiManager(this);
mouseManager = new VRMouseManager(this); mouseManager = new VRMouseManager(this);
// dummyCam = new Camera(settings.getWidth(), settings.getHeight());
bounds = new VRBounds();
processSettings(); processSettings();
} }
@ -86,6 +89,14 @@ public class VREnvironment {
return hardware; return hardware;
} }
/**
* Get the VR bounds.
* @return the VR bounds.
*/
public VRBounds getVRBounds(){
return bounds;
}
/** /**
* Get the VR dedicated input. * Get the VR dedicated input.
* @return the VR dedicated input. * @return the VR dedicated input.
@ -347,7 +358,12 @@ public class VREnvironment {
if (application.getCamera() != null){ if (application.getCamera() != null){
dummyCam = application.getCamera().clone(); dummyCam = application.getCamera().clone();
} else { } 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 { } else {
throw new IllegalStateException("VR environment is not attached to any application."); throw new IllegalStateException("VR environment is not attached to any application.");

@ -46,14 +46,14 @@ public class OpenVR implements VRAPI {
private static boolean initSuccess = false; private static boolean initSuccess = false;
private static boolean flipEyes = false; private static boolean flipEyes = false;
private static IntBuffer hmdDisplayFrequency; private IntBuffer hmdDisplayFrequency;
private static TrackedDevicePose_t.ByReference hmdTrackedDevicePoseReference; private TrackedDevicePose_t.ByReference hmdTrackedDevicePoseReference;
protected static TrackedDevicePose_t[] hmdTrackedDevicePoses; protected TrackedDevicePose_t[] hmdTrackedDevicePoses;
protected static IntByReference hmdErrorStore; protected IntByReference hmdErrorStore;
private static final Quaternion rotStore = new Quaternion(); private final Quaternion rotStore = new Quaternion();
private static final Vector3f posStore = new Vector3f(); private final Vector3f posStore = new Vector3f();
private static FloatByReference tlastVsync; private static FloatByReference tlastVsync;
@ -65,20 +65,21 @@ public class OpenVR implements VRAPI {
// for debugging latency // for debugging latency
private int frames = 0; private int frames = 0;
protected static Matrix4f[] poseMatrices; protected Matrix4f[] poseMatrices;
private static final Matrix4f hmdPose = Matrix4f.IDENTITY.clone(); private final Matrix4f hmdPose = Matrix4f.IDENTITY.clone();
private static Matrix4f hmdProjectionLeftEye; private Matrix4f hmdProjectionLeftEye;
private static Matrix4f hmdProjectionRightEye; private Matrix4f hmdProjectionRightEye;
private static Matrix4f hmdPoseLeftEye; private Matrix4f hmdPoseLeftEye;
private static Matrix4f hmdPoseRightEye; 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; private VREnvironment environment = null;
@ -181,7 +182,7 @@ public class OpenVR implements VRAPI {
VRinput.updateConnectedControllers(); VRinput.updateConnectedControllers();
// init bounds & chaperone info // init bounds & chaperone info
VRBounds.init(); environment.getVRBounds().init(this);
logger.config("Initializing OpenVR system [SUCCESS]"); logger.config("Initializing OpenVR system [SUCCESS]");
initSuccess = true; initSuccess = true;

@ -5,6 +5,7 @@
*/ */
package com.jme3.input.vr; package com.jme3.input.vr;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -183,28 +184,50 @@ public class OpenVRInput implements VRInputAPI {
@Override @Override
public Vector3f getVelocity(int controllerIndex) { public Vector3f getVelocity(int controllerIndex) {
int index = OpenVRInput.controllerIndex[controllerIndex];
if( needsNewVelocity[index] ) { if (environment != null){
OpenVR.hmdTrackedDevicePoses[index].readField("vVelocity");
needsNewVelocity[index] = false; if (environment.getVRHardware() instanceof OpenVR){
} int index = OpenVRInput.controllerIndex[controllerIndex];
tempVel.x = OpenVR.hmdTrackedDevicePoses[index].vVelocity.v[0]; if( needsNewVelocity[index] ) {
tempVel.y = OpenVR.hmdTrackedDevicePoses[index].vVelocity.v[1]; ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[index].readField("vVelocity");
tempVel.z = OpenVR.hmdTrackedDevicePoses[index].vVelocity.v[2]; needsNewVelocity[index] = false;
return tempVel; }
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 @Override
public Vector3f getAngularVelocity(int controllerIndex) { public Vector3f getAngularVelocity(int controllerIndex) {
int index = OpenVRInput.controllerIndex[controllerIndex];
if( needsNewAngVelocity[index] ) { if (environment != null){
OpenVR.hmdTrackedDevicePoses[index].readField("vAngularVelocity");
needsNewAngVelocity[index] = false; if (environment.getVRHardware() instanceof OpenVR){
}
tempVel.x = OpenVR.hmdTrackedDevicePoses[index].vAngularVelocity.v[0]; int index = OpenVRInput.controllerIndex[controllerIndex];
tempVel.y = OpenVR.hmdTrackedDevicePoses[index].vAngularVelocity.v[1]; if( needsNewAngVelocity[index] ) {
tempVel.z = OpenVR.hmdTrackedDevicePoses[index].vAngularVelocity.v[2]; ((OpenVR)environment.getVRHardware()).hmdTrackedDevicePoses[index].readField("vAngularVelocity");
return tempVel; 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 @Override
@ -309,7 +332,16 @@ public class OpenVRInput implements VRInputAPI {
return false; 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 @Override
@ -317,9 +349,19 @@ public class OpenVRInput implements VRInputAPI {
if( isInputDeviceTracking(index) == false ){ if( isInputDeviceTracking(index) == false ){
return null; return null;
} }
index = controllerIndex[index];
VRUtil.convertMatrix4toQuat(OpenVR.poseMatrices[index], rotStore[index]); if (environment != null){
return rotStore[index];
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 @Override
@ -328,12 +370,23 @@ public class OpenVRInput implements VRInputAPI {
return null; return null;
} }
// the hmdPose comes in rotated funny, fix that here if (environment != null){
index = controllerIndex[index];
OpenVR.poseMatrices[index].toTranslationVector(posStore[index]); if (environment.getVRHardware() instanceof OpenVR){
posStore[index].x = -posStore[index].x; // the hmdPose comes in rotated funny, fix that here
posStore[index].z = -posStore[index].z; index = controllerIndex[index];
return posStore[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 @Override
@ -411,7 +464,7 @@ public class OpenVRInput implements VRInputAPI {
if (environment != null){ if (environment != null){
controllerCount = 0; controllerCount = 0;
for(int i=0;i<JOpenVRLibrary.k_unMaxTrackedDeviceCount;i++) { for(int i=0;i<JOpenVRLibrary.k_unMaxTrackedDeviceCount;i++) {
int classCallback = ((OpenVR)environment.getVRHardware()).getVRSystem().GetTrackedDeviceClass.apply(i); int classCallback = ((OpenVR)environment.getVRHardware()).getVRSystem().GetTrackedDeviceClass.apply(i);
if( classCallback == JOpenVRLibrary.ETrackedDeviceClass.ETrackedDeviceClass_TrackedDeviceClass_Controller || classCallback == JOpenVRLibrary.ETrackedDeviceClass.ETrackedDeviceClass_TrackedDeviceClass_GenericTracker) { if( classCallback == JOpenVRLibrary.ETrackedDeviceClass.ETrackedDeviceClass_TrackedDeviceClass_Controller || classCallback == JOpenVRLibrary.ETrackedDeviceClass.ETrackedDeviceClass_TrackedDeviceClass_GenericTracker) {
String controllerName = "Unknown"; String controllerName = "Unknown";
@ -425,6 +478,12 @@ public class OpenVRInput implements VRInputAPI {
controllerIndex[controllerCount] = i; controllerIndex[controllerCount] = i;
// Adding tracked controller to control.
if (trackedControllers == null){
trackedControllers = new ArrayList<VRTrackedController>(JOpenVRLibrary.k_unMaxTrackedDeviceCount);
}
trackedControllers.add(new OpenVRTrackedController(i, this, controllerName, manufacturerName, environment));
// Send an Haptic pulse to the controller // Send an Haptic pulse to the controller
triggerHapticPulse(controllerCount, 1.0f); triggerHapticPulse(controllerCount, 1.0f);

Loading…
Cancel
Save