From bb6a8fdc8decdbec64bbab0fe2175e76211d0e77 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Thu, 26 Mar 2015 23:36:50 +0100
Subject: Bug 1116 - Add OculusVR DK2 Support - Part-2 (DK1 and DK2 on DK2 SDK
 w/ Eye Tracker if available)

---
 .../jogamp/opengl/oculusvr/OVRStereoDevice.java    | 72 +++++++++++-----------
 .../opengl/oculusvr/OVRStereoDeviceFactory.java    |  8 +--
 .../opengl/oculusvr/OVRStereoDeviceRenderer.java   | 40 ++++++------
 .../classes/jogamp/opengl/oculusvr/OVRUtil.java    |  2 +-
 4 files changed, 62 insertions(+), 60 deletions(-)

(limited to 'src/oculusvr/classes/jogamp')

diff --git a/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDevice.java b/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDevice.java
index 3dadb94b0..89f7797ae 100644
--- a/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDevice.java
+++ b/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDevice.java
@@ -64,15 +64,18 @@ public class OVRStereoDevice implements StereoDevice {
     private final PointImmutable position;
     private final int dkVersion;
 
-    public OVRStereoDevice(final StereoDeviceFactory factory, final OvrHmdContext nativeContext, final int deviceIndex) {
+    public OVRStereoDevice(final StereoDeviceFactory factory, final ovrHmdDesc hmdDesc, final int deviceIndex) {
+        if( null == hmdDesc ) {
+            throw new IllegalArgumentException("Passed null hmdDesc");
+        }
+        final OvrHmdContext nativeContext = hmdDesc.getHandle();
         if( null == nativeContext ) {
-            throw new IllegalArgumentException("Passed null nativeContext");
+            throw new IllegalArgumentException("hmdDesc has null OvrHmdContext");
         }
         this.factory = factory;
         this.handle = nativeContext;
         this.deviceIndex = deviceIndex;
-        this.hmdDesc = ovrHmdDesc.create();
-        OVR.ovrHmd_GetDesc(handle, hmdDesc);
+        this.hmdDesc = hmdDesc;
         final ovrFovPort[] defaultOVREyeFov = hmdDesc.getDefaultEyeFov(0, new ovrFovPort[ovrHmdDesc.getEyeRenderOrderArrayLength()]);
         defaultEyeFov = new FovHVHalves[defaultOVREyeFov.length];
         for(int i=0; i<defaultEyeFov.length; i++) {
@@ -89,12 +92,18 @@ public class OVRStereoDevice implements StereoDevice {
         deviceName = hmdDesc.getDisplayDeviceNameAsString();
         final ovrSizei res = hmdDesc.getResolution();
         resolution = new Dimension(res.getW(), res.getH());
-        if( "OVR0002".equals(deviceName) || "OVR0003".equals(deviceName) ) {
-            dkVersion = 2;
-            requiredRotation = 90;
-        } else {
-            dkVersion = 1;
-            requiredRotation = 0;
+        final int hmdType = hmdDesc.getType();
+        switch( hmdType ) {
+            case OVR.ovrHmd_DKHD:             // 4
+            case 5:                           // OVR.ovrHmd_CrystalCoveProto:
+            case OVR.ovrHmd_DK2:              // 6
+                dkVersion = 2;
+                requiredRotation = 90;
+                break;
+            default:
+                dkVersion = 1;
+                requiredRotation = 0;
+                break;
         }
         position = OVRUtil.getVec2iAsPoint(hmdDesc.getWindowsPos());
     }
@@ -144,9 +153,12 @@ public class OVRStereoDevice implements StereoDevice {
     public final boolean startSensors(final boolean start) {
         if( start && !sensorsStarted ) {
             // Start the sensor which provides the Rift’s pose and motion.
-            final int requiredSensorCaps = 0;
-            final int supportedSensorCaps = requiredSensorCaps | OVR.ovrSensorCap_Orientation | OVR.ovrSensorCap_YawCorrection | OVR.ovrSensorCap_Position;
-            if( OVR.ovrHmd_StartSensor(handle, supportedSensorCaps, requiredSensorCaps) ) {
+            final int requiredTrackingCaps = 0;
+            final int supportedTrackingCaps = requiredTrackingCaps |
+                                            OVR.ovrTrackingCap_Orientation |
+                                            OVR.ovrTrackingCap_MagYawCorrection |
+                                            OVR.ovrTrackingCap_Position;
+            if( OVR.ovrHmd_ConfigureTracking(hmdDesc, supportedTrackingCaps, requiredTrackingCaps) ) {
                 sensorsStarted = true;
                 return true;
             } else {
@@ -154,7 +166,7 @@ public class OVRStereoDevice implements StereoDevice {
                 return false;
             }
         } else if( sensorsStarted ) {
-            OVR.ovrHmd_StopSensor(handle);
+            OVR.ovrHmd_ConfigureTracking(hmdDesc, 0, 0); // STOP
             sensorsStarted = false;
             return true;
         } else {
@@ -193,20 +205,20 @@ public class OVRStereoDevice implements StereoDevice {
         final ovrFovPort ovrEyeFov1 = OVRUtil.getOVRFovPort(eyeFov[1]);
 
         final ovrEyeRenderDesc[] eyeRenderDesc = new ovrEyeRenderDesc[2];
-        eyeRenderDesc[0] = OVR.ovrHmd_GetRenderDesc(handle, OVR.ovrEye_Left, ovrEyeFov0);
-        eyeRenderDesc[1] = OVR.ovrHmd_GetRenderDesc(handle, OVR.ovrEye_Right, ovrEyeFov1);
+        eyeRenderDesc[0] = OVR.ovrHmd_GetRenderDesc(hmdDesc, OVR.ovrEye_Left, ovrEyeFov0);
+        eyeRenderDesc[1] = OVR.ovrHmd_GetRenderDesc(hmdDesc, OVR.ovrEye_Right, ovrEyeFov1);
         if( StereoDevice.DEBUG ) {
             System.err.println("XXX: eyeRenderDesc[0] "+OVRUtil.toString(eyeRenderDesc[0]));
             System.err.println("XXX: eyeRenderDesc[1] "+OVRUtil.toString(eyeRenderDesc[1]));
         }
 
-        final DimensionImmutable eye0TextureSize = OVRUtil.getOVRSizei(OVR.ovrHmd_GetFovTextureSize(handle, OVR.ovrEye_Left,  eyeRenderDesc[0].getFov(), pixelsPerDisplayPixel));
-        final DimensionImmutable eye1TextureSize = OVRUtil.getOVRSizei(OVR.ovrHmd_GetFovTextureSize(handle, OVR.ovrEye_Right, eyeRenderDesc[1].getFov(), pixelsPerDisplayPixel));
+        final DimensionImmutable eye0TextureSize = OVRUtil.getOVRSizei(OVR.ovrHmd_GetFovTextureSize(hmdDesc, OVR.ovrEye_Left,  eyeRenderDesc[0].getFov(), pixelsPerDisplayPixel));
+        final DimensionImmutable eye1TextureSize = OVRUtil.getOVRSizei(OVR.ovrHmd_GetFovTextureSize(hmdDesc, OVR.ovrEye_Right, eyeRenderDesc[1].getFov(), pixelsPerDisplayPixel));
         if( StereoDevice.DEBUG ) {
             System.err.println("XXX: recommenedTex0Size "+eye0TextureSize);
             System.err.println("XXX: recommenedTex1Size "+eye1TextureSize);
         }
-        final int maxWidth = Math.max(eye0TextureSize.getWidth(), eye1TextureSize.getWidth());
+        // final int maxWidth = Math.max(eye0TextureSize.getWidth(), eye1TextureSize.getWidth());
         final int maxHeight = Math.max(eye0TextureSize.getHeight(), eye1TextureSize.getHeight());
 
         final DimensionImmutable[] eyeTextureSizes = new DimensionImmutable[] { eye0TextureSize, eye1TextureSize };
@@ -219,24 +231,14 @@ public class OVRStereoDevice implements StereoDevice {
         final RectangleImmutable[] eyeViewports = new RectangleImmutable[2];
         if( 1 == textureCount ) { // validated in ctor below!
             // one big texture/FBO, viewport to target space
-            if( false && 2 == dkVersion ) {
-                eyeViewports[0] = new Rectangle(0, 0,
-                                                maxWidth,
-                                                eye0TextureSize.getHeight());
-                eyeViewports[1] = new Rectangle(0, eye0TextureSize.getHeight(),
-                                                maxWidth,
-                                                eye1TextureSize.getHeight());
-            } else {
-                eyeViewports[0] = new Rectangle(0, 0,
-                                                eye0TextureSize.getWidth(),
-                                                maxHeight);
-                eyeViewports[1] = new Rectangle(eye0TextureSize.getWidth(), 0,
-                                                eye1TextureSize.getWidth(),
-                                                maxHeight);
-            }
+            eyeViewports[0] = new Rectangle(0, 0,
+                                            eye0TextureSize.getWidth(),
+                                            maxHeight);
+            eyeViewports[1] = new Rectangle(eye0TextureSize.getWidth(), 0,
+                                            eye1TextureSize.getWidth(),
+                                            maxHeight);
         } else {
             // two textures/FBOs w/ postprocessing, which renders textures/FBOs into target space
-            // FIXME: DK2
             eyeViewports[0] = new Rectangle(0, 0,
                                             eye0TextureSize.getWidth(),
                                             eye0TextureSize.getHeight());
diff --git a/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDeviceFactory.java b/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDeviceFactory.java
index dfaead1ea..ffe1371a4 100644
--- a/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDeviceFactory.java
+++ b/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDeviceFactory.java
@@ -29,7 +29,7 @@ package jogamp.opengl.oculusvr;
 
 import com.jogamp.oculusvr.OVR;
 import com.jogamp.oculusvr.OVRVersion;
-import com.jogamp.oculusvr.OvrHmdContext;
+import com.jogamp.oculusvr.ovrHmdDesc;
 import com.jogamp.opengl.util.stereo.StereoDeviceConfig;
 import com.jogamp.opengl.util.stereo.StereoDevice;
 import com.jogamp.opengl.util.stereo.StereoDeviceFactory;
@@ -45,15 +45,15 @@ public class OVRStereoDeviceFactory extends StereoDeviceFactory {
 
     @Override
     public final StereoDevice createDevice(final int deviceIndex, final StereoDeviceConfig config, final boolean verbose) {
-        final OvrHmdContext hmdCtx = OVR.ovrHmd_Create(deviceIndex);
-        if( null == hmdCtx ) {
+        final ovrHmdDesc hmdDesc = OVR.ovrHmd_Create(deviceIndex);
+        if( null == hmdDesc ) {
             if( verbose ) {
                 System.err.println("Failed to create hmdCtx for device index "+deviceIndex+" on thread "+Thread.currentThread().getName());
                 Thread.dumpStack();
             }
             return null;
         }
-        final OVRStereoDevice ctx = new OVRStereoDevice(this, hmdCtx, deviceIndex);
+        final OVRStereoDevice ctx = new OVRStereoDevice(this, hmdDesc, deviceIndex);
         if( verbose ) {
             System.err.println(OVRVersion.getAvailableCapabilitiesInfo(ctx.hmdDesc, deviceIndex, null).toString());
         }
diff --git a/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDeviceRenderer.java b/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDeviceRenderer.java
index 5da5cbeca..ff15d38d1 100644
--- a/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDeviceRenderer.java
+++ b/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRStereoDeviceRenderer.java
@@ -44,12 +44,12 @@ import jogamp.common.os.PlatformPropsImpl;
 import com.jogamp.common.nio.Buffers;
 import com.jogamp.oculusvr.OVR;
 import com.jogamp.oculusvr.OVRException;
-import com.jogamp.oculusvr.OvrHmdContext;
 import com.jogamp.oculusvr.ovrDistortionMesh;
 import com.jogamp.oculusvr.ovrDistortionVertex;
 import com.jogamp.oculusvr.ovrEyeRenderDesc;
 import com.jogamp.oculusvr.ovrFovPort;
 import com.jogamp.oculusvr.ovrFrameTiming;
+import com.jogamp.oculusvr.ovrHmdDesc;
 import com.jogamp.oculusvr.ovrMatrix4f;
 import com.jogamp.oculusvr.ovrPosef;
 import com.jogamp.oculusvr.ovrRecti;
@@ -109,7 +109,7 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
         @Override
         public final EyePose getLastEyePose() { return eyePose; }
 
-        private OVREye(final OvrHmdContext hmdCtx, final int distortionBits,
+        private OVREye(final ovrHmdDesc hmdDesc, final int distortionBits,
                        final float[] eyePositionOffset, final ovrEyeRenderDesc eyeDesc,
                        final ovrSizei ovrTextureSize, final RectangleImmutable eyeViewport) {
             this.eyeName = eyeDesc.getEye();
@@ -133,13 +133,13 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
             this.ovrEyeDesc = eyeDesc;
             this.ovrEyeFov = eyeDesc.getFov();
 
-            final ovrVector3f eyeViewAdjust = eyeDesc.getViewAdjust();
+            final ovrVector3f eyeViewAdjust = eyeDesc.getHmdToEyeViewOffset();
             this.eyeParameter = new EyeParameter(eyeName, eyePositionOffset, OVRUtil.getFovHV(ovrEyeFov),
                                                  eyeViewAdjust.getX(), eyeViewAdjust.getY(), eyeViewAdjust.getZ());
 
             this.eyePose = new EyePose(eyeName);
 
-            updateEyePose(hmdCtx); // 1st init
+            updateEyePose(hmdDesc); // 1st init
 
             // Setup: eyeToSourceUVScale, eyeToSourceUVOffset
             {
@@ -167,7 +167,7 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
             final ovrDistortionMesh meshData = ovrDistortionMesh.create();
 
             final int ovrDistortionCaps = distBits2OVRDistCaps(distortionBits);
-            if( !OVR.ovrHmd_CreateDistortionMesh(hmdCtx, eyeName, ovrEyeFov, ovrDistortionCaps, meshData) ) {
+            if( !OVR.ovrHmd_CreateDistortionMesh(hmdDesc, eyeName, ovrEyeFov, ovrDistortionCaps, meshData) ) {
                 throw new OVRException("Failed to create meshData for eye "+eyeName+", "+OVRUtil.toString(ovrEyeFov)+" and "+StereoUtil.distortionBitsToString(distortionBits));
             }
             vertexCount = meshData.getVertexCount();
@@ -204,7 +204,7 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
                     System.err.println("XXX."+eyeName+": START VERTEX "+vertNum+" / "+vertexCount);
                 }
                 // pos
-                v = ov.getPos();
+                v = ov.getScreenPosNDC();
                 if( StereoDevice.DUMP_DATA ) {
                     System.err.println("XXX."+eyeName+": pos "+OVRUtil.toString(v));
                 }
@@ -226,7 +226,7 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
                 iVBOFB.put(ov.getTimeWarpFactor());
 
                 // texCoordR
-                v = ov.getTexR();
+                v = ov.getTanEyeAnglesR();
                 if( StereoDevice.DUMP_DATA ) {
                     System.err.println("XXX."+eyeName+": texR "+OVRUtil.toString(v));
                 }
@@ -235,7 +235,7 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
 
                 if( useChromatic ) {
                     // texCoordG
-                    v = ov.getTexG();
+                    v = ov.getTanEyeAnglesG();
                     if( StereoDevice.DUMP_DATA ) {
                         System.err.println("XXX."+eyeName+": texG "+OVRUtil.toString(v));
                     }
@@ -243,7 +243,7 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
                     iVBOFB.put(v.getY());
 
                     // texCoordB
-                    v = ov.getTexB();
+                    v = ov.getTanEyeAnglesB();
                     if( StereoDevice.DUMP_DATA ) {
                         System.err.println("XXX."+eyeName+": texB "+OVRUtil.toString(v));
                     }
@@ -331,11 +331,11 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
             }
         }
 
-        private void updateTimewarp(final OvrHmdContext hmdCtx, final ovrPosef eyeRenderPose, final float[] mat4Tmp1, final float[] mat4Tmp2) {
+        private void updateTimewarp(final ovrHmdDesc hmdDesc, final ovrPosef eyeRenderPose, final float[] mat4Tmp1, final float[] mat4Tmp2) {
             final ovrMatrix4f[] timeWarpMatrices = new ovrMatrix4f[2];
             timeWarpMatrices[0] = ovrMatrix4f.create(); // FIXME: remove ctor / double check
             timeWarpMatrices[1] = ovrMatrix4f.create();
-            OVR.ovrHmd_GetEyeTimewarpMatrices(hmdCtx, eyeName, eyeRenderPose, timeWarpMatrices);
+            OVR.ovrHmd_GetEyeTimewarpMatrices(hmdDesc, eyeName, eyeRenderPose, timeWarpMatrices);
 
             final float[] eyeRotationStartM = FloatUtil.transposeMatrix(timeWarpMatrices[0].getM(0, mat4Tmp1), mat4Tmp2);
             final FloatBuffer eyeRotationStartU = eyeRotationStart.floatBufferValue();
@@ -351,10 +351,10 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
         /**
          * Updates {@link #ovrEyePose} and it's extracted
          * {@link #eyeRenderPoseOrientation} and {@link #eyeRenderPosePosition}.
-         * @param hmdCtx used get the {@link #ovrEyePose} via {@link OVR#ovrHmd_GetEyePose(OvrHmdContext, int)}
+         * @param hmdCtx used get the {@link #ovrEyePose} via {@link OVR#ovrHmd_GetHmdPosePerEye(ovrHmdDesc, int)}
          */
-        private EyePose updateEyePose(final OvrHmdContext hmdCtx) {
-            ovrEyePose = OVR.ovrHmd_GetEyePose(hmdCtx, eyeName);
+        private EyePose updateEyePose(final ovrHmdDesc hmdDesc) {
+            ovrEyePose = OVR.ovrHmd_GetHmdPosePerEye(hmdDesc, eyeName);
             final ovrVector3f pos = ovrEyePose.getPosition();
             eyePose.setPosition(pos.getX(), pos.getY(), pos.getZ());
             OVRUtil.copyToQuaternion(ovrEyePose.getOrientation(), eyePose.orientation);
@@ -436,8 +436,8 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
             ovrTexture0Size = OVRUtil.createOVRSizei(eyeTextureSizes[0]);
             ovrTexture1Size = OVRUtil.createOVRSizei(eyeTextureSizes[1]);
         }
-        eyes[0] = new OVREye(context.handle, this.distortionBits, eyePositionOffset, eyeRenderDescs[0], ovrTexture0Size, eyeViewports[0]);
-        eyes[1] = new OVREye(context.handle, this.distortionBits, eyePositionOffset, eyeRenderDescs[1], ovrTexture1Size, eyeViewports[1]);
+        eyes[0] = new OVREye(context.hmdDesc, this.distortionBits, eyePositionOffset, eyeRenderDescs[0], ovrTexture0Size, eyeViewports[0]);
+        eyes[1] = new OVREye(context.hmdDesc, this.distortionBits, eyePositionOffset, eyeRenderDescs[1], ovrTexture1Size, eyeViewports[1]);
         sp = null;
         frameTiming = null;
     }
@@ -545,12 +545,12 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
 
     @Override
     public final EyePose updateEyePose(final int eyeNum) {
-        return eyes[eyeNum].updateEyePose(context.handle);
+        return eyes[eyeNum].updateEyePose(context.hmdDesc);
     }
 
     @Override
     public final void beginFrame(final GL gl) {
-        frameTiming = OVR.ovrHmd_BeginFrameTiming(context.handle, 0);
+        frameTiming = OVR.ovrHmd_BeginFrameTiming(context.hmdDesc, 0);
     }
 
     @Override
@@ -558,7 +558,7 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
         if( null == frameTiming ) {
             throw new IllegalStateException("beginFrame not called");
         }
-        OVR.ovrHmd_EndFrameTiming(context.handle);
+        OVR.ovrHmd_EndFrameTiming(context.hmdDesc);
         frameTiming = null;
     }
 
@@ -596,7 +596,7 @@ public class OVRStereoDeviceRenderer implements StereoDeviceRenderer {
     public final void ppOneEye(final GL gl, final int eyeNum) {
         final OVREye eye = eyes[eyeNum];
         if( StereoUtil.usesTimewarpDistortion(distortionBits) ) {
-            eye.updateTimewarp(context.handle, eye.ovrEyePose, mat4Tmp1, mat4Tmp2);
+            eye.updateTimewarp(context.hmdDesc, eye.ovrEyePose, mat4Tmp1, mat4Tmp2);
         }
         final GL2ES2 gl2es2 = gl.getGL2ES2();
 
diff --git a/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRUtil.java b/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRUtil.java
index 16aeac4b1..c1d01fea2 100644
--- a/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRUtil.java
+++ b/src/oculusvr/classes/jogamp/opengl/oculusvr/OVRUtil.java
@@ -168,6 +168,6 @@ public class OVRUtil {
         return "["+desc.getEye()+", fov"+toString(desc.getFov())+
                  ", viewport"+toString(desc.getDistortedViewport())+
                  ", pptCtr"+toString(desc.getPixelsPerTanAngleAtCenter())+
-                 ", view-adjust"+toString(desc.getViewAdjust())+"]";
+                 ", view-adjust"+toString(desc.getHmdToEyeViewOffset())+"]";
     }
 }
-- 
cgit v1.2.3