int32_t VR_OVR_getOrientation(float euler[3]) { double time = 0.0; if (!hmd) return 0; if (vr_ovr_autoprediction->value > 0) time = (frameTime.EyeScanoutSeconds[ovrEye_Left] + frameTime.EyeScanoutSeconds[ovrEye_Right]) / 2.0; else time = ovr_GetTimeInSeconds() + prediction_time; trackingState = ovrHmd_GetTrackingState(hmd, time); if (trackingState.StatusFlags & (ovrStatus_OrientationTracked ) ) { VR_OVR_QuatToEuler(trackingState.HeadPose.ThePose.Orientation,euler); return 1; } return 0; }
void OVR_Present(qboolean loading) { int fade = vr_ovr_distortion_fade->value != 0.0f; float desaturate = 0.0; if (positionTracked && trackingState.StatusFlags & ovrStatus_PositionConnected && vr_ovr_trackingloss->value > 0) { if (hasPositionLock) { float yawDiff = (fabsf(cameraYaw) - 105.0f) * 0.04; float xBound,yBound,zBound; vec_t temp[4][4], fin[4][4]; int i = 0; vec3_t euler; vec4_t pos = {0.0,0.0,0.0,1.0}; vec4_t out = {0,0,0,0}; ovrPosef camera, head; vec4_t quat; camera = trackingState.CameraPose; head = trackingState.HeadPose.ThePose; pos[0] = -(head.Position.x - camera.Position.x); pos[1] = head.Position.y - camera.Position.y; pos[2] = -(head.Position.z - camera.Position.z); VR_OVR_QuatToEuler(camera.Orientation,euler); EulerToQuat(euler,quat); QuatToRotation(quat,temp); MatrixMultiply (cameraFrustum,temp,fin); for (i=0; i<4; i++) { out[i] = fin[i][0]*pos[0] + fin[i][1]*pos[1] + fin[i][2]*pos[2] + fin[i][3]*pos[3]; } xBound = (fabsf(out[0]) - 0.6f) * 6.25f; yBound = (fabsf(out[1]) - 0.45f) * 6.25f; zBound = (fabsf(out[2] - 0.5f) - 0.5f) * 10.0f; yawDiff = clamp(yawDiff,0.0,1.0); xBound = clamp(xBound,0.0,1.0); yBound = clamp(yBound,0.0,1.0); zBound = clamp(zBound,0.0,1.0); desaturate = max(max(max(xBound,yBound),zBound),yawDiff); } else { desaturate = 1.0; } } GL_ClearColor(0.0, 0.0, 0.0, 1.0); R_Clear(); GL_SetDefaultClearColor(); { int i = 0; r_ovr_shader_t *currentShader; qboolean warp =(qboolean) (!loading && withinFrame && vr_ovr_timewarp->value); if (warp) { currentShader = &ovr_timewarp_shaders[useChroma]; ovr_WaitTillTime(frameTime.TimewarpPointSeconds); } else { currentShader = &ovr_distortion_shaders[useChroma]; } glDisableClientState (GL_COLOR_ARRAY); glDisableClientState (GL_TEXTURE_COORD_ARRAY); glDisableClientState (GL_VERTEX_ARRAY); glEnableVertexAttribArray (0); glEnableVertexAttribArray (1); glEnableVertexAttribArray (2); glEnableVertexAttribArray (3); glEnableVertexAttribArray (4); glUseProgram(currentShader->shader->program); if (hmd->Type >= ovrHmd_DK2 && vr_ovr_lumoverdrive->value) { int lastFrame = (currentFrame ? 0 : 1); static float overdriveScaleRegularRise = 0.1f; static float overdriveScaleRegularFall = 0.05f; // falling issues are hardly visible GL_MBind(1,offscreen[lastFrame].texture); glUniform2f(currentShader->uniform.OverdriveScales,overdriveScaleRegularRise, overdriveScaleRegularFall); } else { glUniform2f(currentShader->uniform.OverdriveScales,0,0); } glUniform2f(currentShader->uniform.InverseResolution,1.0/glState.currentFBO->width,1.0/glState.currentFBO->height); glUniform1i(currentShader->uniform.VignetteFade,fade); glUniform1f(currentShader->uniform.Desaturate, desaturate); for (i = 0; i < 2; i++) { // hook for rendering in different order int eye = i; GL_MBind(0,renderInfo[eye].eyeFBO.texture); R_BindIVBO(&renderInfo[eye].eye,distortion_attribs,5); glUniform2f(currentShader->uniform.EyeToSourceUVScale, renderInfo[eye].UVScaleOffset[0].x, renderInfo[eye].UVScaleOffset[0].y); glUniform2f(currentShader->uniform.EyeToSourceUVOffset, renderInfo[eye].UVScaleOffset[1].x, renderInfo[eye].UVScaleOffset[1].y); if (warp) { ovrPosef framePose = trackingState.HeadPose.ThePose; ovrMatrix4f timeWarpMatrices[2]; ovrHmd_GetEyeTimewarpMatrices(hmd, (ovrEyeType)eye, framePose, timeWarpMatrices); glUniformMatrix4fv(currentShader->uniform.EyeRotationStart,1,GL_TRUE,(GLfloat *) timeWarpMatrices[0].M); glUniformMatrix4fv(currentShader->uniform.EyeRotationEnd,1,GL_TRUE,(GLfloat *) timeWarpMatrices[1].M); } R_DrawIVBO(&renderInfo[eye].eye); R_ReleaseIVBO(); } if (vr_ovr_lumoverdrive->value) { GL_MBind(1,0); currentFrame = (currentFrame ? 0 : 1); } GL_MBind(0,0); glUseProgram(0); glDisableVertexAttribArray (0); glDisableVertexAttribArray (1); glDisableVertexAttribArray (2); glDisableVertexAttribArray (3); glDisableVertexAttribArray (4); glEnableClientState (GL_COLOR_ARRAY); glEnableClientState (GL_TEXTURE_COORD_ARRAY); glEnableClientState (GL_VERTEX_ARRAY); // glTexCoordPointer (2, GL_FLOAT, sizeof(texCoordArray[0][0]), texCoordArray[0][0]); // glVertexPointer (3, GL_FLOAT, sizeof(vertexArray[0]), vertexArray[0]); } }