private void ThreadProc()
 {
     while (true)
     {
         updateParametersReadySemaphore.Wait();
         preparedFrame = framePreparer.PrepareFrame(updateParameters);
     }
 }
示例#2
0
    private Texture2D RenderView(IPreparedFrame preparedFrame, HiddenAreaMesh hiddenAreaMesh, Matrix viewTransform, Matrix projectionTransform)
    {
        var renderTexture = preparedFrame.RenderView(device.ImmediateContext, hiddenAreaMesh, viewTransform, projectionTransform);

        mostRecentProjectionTransform = projectionTransform;
        mostRecentRenderTexture       = renderTexture;

        return(renderTexture);
    }
示例#3
0
    private void Run()
    {
        //setup initial frame
        timeKeeper.Start();
        OpenVR.Compositor.GetLastPoses(poses, gamePoses);
        KickoffFramePreparation();
        preparedFrame = asyncFramePreparer.FinishPreparingFrame();

        RenderLoop.Run(companionWindow.Form, DoFrame);
    }
示例#4
0
    private void SubmitEye(EVREye eye, IPreparedFrame preparedFrame)
    {
        immediateContext.WithEvent($"VRApp::SubmitEye({eye})", () => {
            HiddenAreaMesh hiddenAreaMesh = hiddenAreaMeshes.GetMesh(eye);
            Matrix viewMatrix             = GetViewMatrix(eye);
            Matrix projectionMatrix       = GetProjectionMatrix(eye);
            var resultTexture             = RenderView(preparedFrame, hiddenAreaMesh, viewMatrix, projectionMatrix);

            VRTextureBounds_t bounds;
            bounds.uMin = 0;
            bounds.uMax = 1;
            bounds.vMin = 0;
            bounds.vMax = 1;

            Texture_t eyeTexture;
            eyeTexture.handle      = resultTexture.NativePointer;
            eyeTexture.eType       = ETextureType.DirectX;
            eyeTexture.eColorSpace = EColorSpace.Auto;

            OpenVR.Compositor.Submit(eye, ref eyeTexture, ref bounds, EVRSubmitFlags.Submit_Default);
        });
    }
示例#5
0
    private void DoFrame()
    {
        OpenVR.Compositor.WaitGetPoses(poses, gamePoses);
        timeKeeper.AdvanceFrame();

        PumpVREvents();

        KickoffFramePreparation();

        immediateContext.WithEvent("VRApp::Prework", () => {
            preparedFrame.DoPrework(device.ImmediateContext, poses);
        });

        SubmitEye(EVREye.Eye_Left, preparedFrame);
        SubmitEye(EVREye.Eye_Right, preparedFrame);

        if (companionWindow.HasIndependentCamera)
        {
            Matrix companionViewTransform          = companionWindow.GetViewTransform();
            Matrix companionWindowProjectionMatrix = companionWindow.GetDesiredProjectionMatrix();
            immediateContext.WithEvent("VRApp::RenderCompanionView", () => {
                RenderView(preparedFrame, null, companionViewTransform, companionWindowProjectionMatrix);
            });
        }

        companionWindow.Display(
            mostRecentRenderTexture,
            mostRecentProjectionTransform,
            () => preparedFrame.DrawCompanionWindowUi(device.ImmediateContext));

        preparedFrame.DoPostwork(device.ImmediateContext);

        OpenVR.Compositor.PostPresentHandoff();

        preparedFrame.Dispose();
        preparedFrame = asyncFramePreparer.FinishPreparingFrame();
    }
 public void StartPreparingFrame(FrameUpdateParameters updateParameters)
 {
     this.updateParameters = updateParameters;
     this.preparedFrame    = null;
     updateParametersReadySemaphore.Release();
 }