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); }
public bool startCamera() { WaveVR_Utils.Event.Listen("StartCameraCompleted", OnStartCameraCompleted); WaveVR_Utils.Event.Listen("UpdateCameraCompleted", OnUpdateCameraCompleted); WaveVR_Utils.SendRenderEvent(WaveVR_Utils.RENDEREVENTID_StartCamera); return(true); }
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); }
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); }
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); } } } }
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(); } }
private void updateOverlayTexture() { WaveVR_Utils.SendRenderEvent(WaveVR_Utils.RENDEREVENTID_ExecuteCustomFunction); }
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); }