public static extern Result ovr_SubmitFrame(ovrSession session, Int64 frameIndex, ref ViewScaleDesc viewScaleDesc, IntPtr layerPtrList, UInt32 layerCount);
protected override void OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); Vector3 camPos = new Vector3(0, 2, 5); Quaternion camOri = Quaternion.Identity; #if RENDER_OCULUS for (int i = 0; i < 2; i++) { //zoom field of view var fov = new FovPort { DownTan = eyes[i].desc.Fov.DownTan / zoomFactor, UpTan = eyes[i].desc.Fov.UpTan / zoomFactor, LeftTan = eyes[i].desc.Fov.LeftTan / zoomFactor, RightTan = eyes[i].desc.Fov.RightTan / zoomFactor }; eyes[i].proj = OvrDLL.ovrMatrix4f_Projection(fov, 0.1f, 1000.0f, ProjectionModifier.ClipRangeOpenGL); //bind eye fbo bindFbo(eyes[i]); //combine the "camera" position/rotation with the position/rotation of the eye Vector3 finalPos = camPos + (camOri * eyes[i].pose.Position); Matrix4 finalRot = Matrix4.CreateFromQuaternion(camOri * eyes[i].pose.Orientation); //create the view matrix with a lookat basis vectors Vector3 up = eyes[i].pose.Orientation * Vector3.UnitY; Vector3 fwd = eyes[i].pose.Orientation * -Vector3.UnitZ; Matrix4 view = Matrix4.LookAt(finalPos, finalPos + fwd, up); //draw the scene drawScene(view, eyes[i].proj); //commit the swapchain OvrDLL.ovr_CommitTextureSwapChain(session, eyes[i].swapChain); } //send to Oculus LayerEyeFov eyeFov = layers[0] as LayerEyeFov; eyeFov.Header.Flags = LayerFlags.TextureOriginAtBottomLeft; eyeFov.ColorTexture[0] = eyes[0].swapChain; eyeFov.ColorTexture[1] = eyes[1].swapChain; eyeFov.Fov[0] = eyes[0].desc.Fov; eyeFov.Fov[1] = eyes[1].desc.Fov; eyeFov.Viewport[0] = new Recti(new Vector2i(0,0), eyes[0].renderTargetSize); eyeFov.Viewport[1] = new Recti(new Vector2i(0, 0), eyes[1].renderTargetSize); eyeFov.RenderPose[0] = eyes[0].pose; eyeFov.RenderPose[1] = eyes[1].pose; ViewScaleDesc viewScale = new ViewScaleDesc(); result = OvrDLL.ovr_SubmitFrame(session, 0, ref viewScale, layers.GetUnmanagedLayers(), 1); if (result < 0) { Console.WriteLine("Error submitting frame"); OvrDLL.ovr_GetLastErrorInfo(ref error); Console.WriteLine("Last Error Info: {0}-{1}", error.result, error.ErrorString); } //blit mirror to fbo OvrDLL.ovr_GetMirrorTextureBufferGL(session, mirror, ref myMirrorTexture); blitMirror((int)myMirrorTexture); #else Matrix4 view = Matrix4.CreateTranslation(-camPos); Matrix4 proj = Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(60.0f), 1.0f, 0.1f, 1000.0f); drawScene(view, proj); #endif SwapBuffers(); }
public void Session_SubmitFrame() { IntPtr sessionPtr = CreateSession(); Assert.AreNotEqual(IntPtr.Zero, sessionPtr); // Define field of view (This is used for both left and right eye). FovPort fieldOfView = new FovPort(); fieldOfView.DownTan = (float)Math.Tan(0.523598776); // 0.523598776 radians = 30 degrees. fieldOfView.UpTan = (float)Math.Tan(0.523598776); // 0.523598776 radians = 30 degrees. fieldOfView.LeftTan = (float)Math.Tan(0.785398163); // 0.785398163 radians = 45 degrees. fieldOfView.RightTan = (float)Math.Tan(0.785398163); // 0.785398163 radians = 45 degrees. EyeRenderDesc renderDescLeft = OVR.GetRenderDesc(sessionPtr, EyeType.Left, fieldOfView); EyeRenderDesc renderDescRight = OVR.GetRenderDesc(sessionPtr, EyeType.Left, fieldOfView); var viewScaleDesc = new ViewScaleDesc(); viewScaleDesc.HmdToEyePose0 = renderDescLeft.HmdToEyePose; viewScaleDesc.HmdToEyePose1 = renderDescRight.HmdToEyePose; viewScaleDesc.HmdSpaceToWorldScaleInMeters = 1; // Determine texture size matching the field of view. Sizei sizeLeft = OVR.GetFovTextureSize(sessionPtr, EyeType.Left, fieldOfView, 1.0f); Sizei sizeRight = OVR.GetFovTextureSize(sessionPtr, EyeType.Right, fieldOfView, 1.0f); var hmdToEyeViewOffset = new Vector3f[2]; var poses = new Posef[2]; double sensorSampleTime; hmdToEyeViewOffset[0].X = -0.1f; hmdToEyeViewOffset[1].X = 0.1f; OVR.GetEyePoses(sessionPtr, 0, true, hmdToEyeViewOffset, ref poses, out sensorSampleTime); // Create a set of layers to submit. LayerEyeFov layer = new LayerEyeFov(); layer.Header.Type = LayerType.EyeFov; Result result; using (TestEngine testEngine = CreateTestEngine(sessionPtr)) { try { // Create a texture for the left eye. layer.ColorTextureLeft = CreateTextureSwapChain(sessionPtr, testEngine); layer.ViewportLeft.Position = new Vector2i(0, 0); layer.ViewportLeft.Size = sizeLeft; layer.FovLeft = fieldOfView; layer.RenderPoseLeft = poses[0]; // Create a texture for the right eye. layer.ColorTextureRight = CreateTextureSwapChain(sessionPtr, testEngine); layer.ViewportRight.Position = new Vector2i(0, 0); layer.ViewportRight.Size = sizeLeft; layer.FovRight = fieldOfView; layer.RenderPoseRight = poses[1]; // The created texture swap chain must be committed to the Oculus SDK, before using it in the // call to ovr_SubmitFrame, otherwise ovr_SubmitFrame will fail. result = OVR.CommitTextureSwapChain(sessionPtr, layer.ColorTextureLeft); Assert.IsTrue(result >= Result.Success); result = OVR.CommitTextureSwapChain(sessionPtr, layer.ColorTextureRight); Assert.IsTrue(result >= Result.Success); // SubmitFrame requires pointer to an array of pointers to Layer objects var layerPointers = new IntPtr[1]; GCHandle layerHandle = GCHandle.Alloc(layer, GCHandleType.Pinned); GCHandle layerPointersHandle = GCHandle.Alloc(layerPointers, GCHandleType.Pinned); layerPointers[0] = layerHandle.AddrOfPinnedObject(); result = OVR.SubmitFrame(sessionPtr, 0L, IntPtr.Zero, layerPointersHandle.AddrOfPinnedObject(), 1); Assert.IsTrue(result >= Result.Success); layerPointersHandle.Free(); layerHandle.Free(); } finally { if (layer.ColorTextureLeft != IntPtr.Zero) { OVR.DestroyTextureSwapChain(sessionPtr, layer.ColorTextureLeft); } if (layer.ColorTextureRight != IntPtr.Zero) { OVR.DestroyTextureSwapChain(sessionPtr, layer.ColorTextureRight); } } } }