Пример #1
0
    public void stopCamera()
    {
        if (!mStarted)
        {
            return;
        }

        if (syncPose)
        {
            WaveVR_Utils.Event.Remove("DrawCameraCompleted", OnUpdateCameraCompleted);
            Log.i(LOG_TAG, "Reset WaveVR_Render submit pose");
            WaveVR_Render.ResetPoseUsedOnSubmit();
            Interop.WVR_StopCamera();
            if (mframeBuffer != IntPtr.Zero)
            {
                Marshal.FreeHGlobal(mframeBuffer);
                mframeBuffer = IntPtr.Zero;
            }
            mStarted = false;
        }
        else
        {
            if (mthread != null && mthread.IsAlive)
            {
                toThreadStop = true;
                Log.i(LOG_TAG, "to thread stop");
            }
        }

        Log.i(LOG_TAG, "Release native texture resources");
        WaveVR_Utils.SendRenderEvent(WaveVR_Utils.RENDEREVENTID_ReleaseTexture);
    }
Пример #2
0
    public bool startCamera()
    {
        WaveVR_Utils.Event.Listen("StartCameraCompleted", OnStartCameraCompleted);
        WaveVR_Utils.Event.Listen("UpdateCameraCompleted", OnUpdateCameraCompleted);

        WaveVR_Utils.SendRenderEvent(WaveVR_Utils.RENDEREVENTID_StartCamera);
        return(true);
    }
Пример #3
0
 public void stopCamera()
 {
     if (!mStarted)
     {
         return;
     }
     WaveVR_Utils.Event.Remove("StartCameraCompleted", OnStartCameraCompleted);
     WaveVR_Utils.Event.Remove("UpdateCameraCompleted", OnUpdateCameraCompleted);
     WaveVR_Utils.SendRenderEvent(WaveVR_Utils.RENDEREVENTID_StopCamera);
 }
Пример #4
0
 public void updateTexture(uint textureId)
 {
     nativeTextureId = textureId;
     if (!mStarted)
     {
         Log.d(LOG_TAG, "camera not started yet");
         return;
     }
     spentTime = System.DateTime.Now.Millisecond;
     WaveVR_Utils.SendRenderEvent(WaveVR_Utils.RENDEREVENTID_UpdateCamera);
 }
Пример #5
0
    public void updateTexture(IntPtr textureId)
    {
        if (!mStarted)
        {
            Log.w(LOG_TAG, "Camera not start yet");
            return;
        }

        //PrintDebugLog("updateTexture start, syncPose = " + syncPose.ToString() + " updateFramebuffer = " + updateFramebuffer.ToString());

        nativeTextureId = textureId;
        if (WaveVR_Render.Instance != null)
        {
            origin = WaveVR_Render.Instance.origin;
        }

        if (syncPose)
        {
            if (mframeBuffer != IntPtr.Zero)
            {
                uint predictInMs = 0;
                PrintDebugLog("updateTexture frameBuffer and PoseState, predict time:" + predictInMs);

                Interop.WVR_GetFrameBufferWithPoseState(mframeBuffer, camerainfo.size, origin, predictInMs, ref mPoseState);

                PrintDebugLog("Sync camera frame buffer with poseState, timeStamp: " + mPoseState.PoseTimestamp_ns);
                WaveVR_Render.SetPoseUsedOnSubmit(mPoseState);

                PrintDebugLog("send event to draw OpenGL");
                WaveVR_Utils.SendRenderEvent(WaveVR_Utils.RENDEREVENTID_DrawTextureWithBuffer);
            }
        }
        else
        {
            if (updateFramebuffer && (threadframeBuffer != IntPtr.Zero))
            {
                PrintDebugLog("updateFramebuffer camera frame buffer");
                nativeTextureId = textureId;
                PrintDebugLog("send event to draw OpenGL");
                WaveVR_Utils.SendRenderEvent(WaveVR_Utils.RENDEREVENTID_DrawTextureWithBuffer);
                updateFramebuffer = false;
            }
            else
            {
                // thread frame buffer is not updated and native texture is not updated, send complete delegate back
                if (UpdateCameraCompletedDelegate != null)
                {
                    UpdateCameraCompletedDelegate(nativeTextureId);
                }
            }
        }
    }
Пример #6
0
    public static void InitializeGraphic(RenderThreadSynchronizer synchronizer = null)
    {
#if UNITY_EDITOR
        if (Application.isEditor)
        {
            return;
        }
#endif
        WaveVR_Utils.SendRenderEvent(WaveVR_Utils.RENDEREVENTID_INIT_GRAPHIC);
        if (synchronizer != null)
        {
            synchronizer.sync();
        }
    }
Пример #7
0
 private void updateOverlayTexture()
 {
     WaveVR_Utils.SendRenderEvent(WaveVR_Utils.RENDEREVENTID_ExecuteCustomFunction);
 }
Пример #8
0
    void PrepareCommandBuffers()
    {
        // Make sure all command buffer can run in editor mode
        if (cmdBufBeforeForwardOpaque == null)
        {
            cmdBufBeforeForwardOpaque = new CommandBuffer();
#if UNITY_EDITOR
            if (Application.isEditor)
            {
                WaveVR_Utils.SendRenderEvent(cmdBufBeforeForwardOpaque, WaveVR_Utils.RENDEREVENTID_EditorEmptyOperation);
            }
            else
#endif
            WaveVR_Utils.SendRenderEvent(cmdBufBeforeForwardOpaque, WaveVR_Utils.RENDEREVENTID_SinglePassBeforeForwardOpaque);
            cmdBufBeforeForwardOpaque.ClearRenderTarget(true, true, cam.backgroundColor);
            cmdBufBeforeForwardOpaque.name = "SinglePassPrepare";
        }
        cam.RemoveCommandBuffer(CameraEvent.BeforeForwardOpaque, cmdBufBeforeForwardOpaque);
        cam.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, cmdBufBeforeForwardOpaque);

        //The workaround for Skybox rendering
        //Since Unity5, skybox rendering after forward opaque
        //As skybox need a particular MatrixVP, two CommandBuffer used to handle this.
        //The MatrixVP must be changed back after skybox rendering.
        if (cmdBufAfterSkybox == null)
        {
            cmdBufAfterSkybox = new CommandBuffer();
        }

        cam.RemoveCommandBuffer(CameraEvent.AfterSkybox, cmdBufAfterSkybox);

        cmdBufAfterSkybox.Clear();
        cmdBufAfterSkybox.SetGlobalMatrixArray("unity_StereoMatrixVP", unity_StereoMatrixVP);
        cmdBufAfterSkybox.name = "SinglePassAfterSkyBox";
        cam.AddCommandBuffer(CameraEvent.AfterSkybox, cmdBufAfterSkybox);

        //Skybox View Matrix should be at world zero point.
        //As in OpenGL, camera's forward is the negative Z axis
        if (cmdBufBeforeSkybox == null)
        {
            cmdBufBeforeSkybox = new CommandBuffer();
        }

        Matrix4x4 viewMatrix1 = Matrix4x4.LookAt(Vector3.zero, cam.transform.forward, cam.transform.up) * Matrix4x4.Scale(new Vector3(1, 1, -1));
        //Change it from column major to row major.
        viewMatrix1 = viewMatrix1.transpose;
        Matrix4x4 proj0 = unity_StereoMatrixP[0];
        Matrix4x4 proj1 = unity_StereoMatrixP[1];
        //Trick here. I supporse skybox doesn't need clip in Projection Matrix
        //And m22 and m23 is calculated by clip near/far, -1 is the default value of m22.
        proj0.m22 = -1.0f;
        proj1.m22 = -1.0f;
        Matrix4x4[] skybox_MatrixVP = new Matrix4x4[2];
        skybox_MatrixVP[0] = proj0 * viewMatrix1;
        skybox_MatrixVP[1] = proj1 * viewMatrix1;

        cam.RemoveCommandBuffer(CameraEvent.BeforeSkybox, cmdBufBeforeSkybox);

        //The MatrixVP should be set before skybox rendering.
        cmdBufBeforeSkybox.Clear();
        cmdBufBeforeSkybox.SetGlobalMatrixArray("unity_StereoMatrixVP", skybox_MatrixVP);
        cmdBufBeforeSkybox.name = "SinglePassAfterSkybox";

        cam.AddCommandBuffer(CameraEvent.BeforeSkybox, cmdBufBeforeSkybox);
    }