diff options
Diffstat (limited to 'src/oculusvr/classes/jogamp/opengl')
4 files changed, 62 insertions, 60 deletions
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())+"]"; } } |