// Update is called once per frame private void Update() { if (!NodeLock.TryLockEdit(30)) // 30 msek allow latency of other pending editor { // We failed to refresh scene in reasonable time but we still need to issue updates; if (SceneManagerCamera == null) { return; } Performance.Enter("PreTraverse"); SceneManagerCamera.PreTraverse(); OnPreTraverse?.Invoke(); Performance.Leave(); Performance.Enter("PostTraverse"); SceneManagerCamera.PostTraverse(); OnPostTraverse?.Invoke(); Performance.Leave(); return; } try // We are now locked in edit { ProcessPendingUpdates(); } finally { NodeLock.UnLock(); } if (SceneManagerCamera == null) { return; } // Notify about we are starting to traverse ----------------------- Performance.Enter("PreTraverse"); SceneManagerCamera.PreTraverse(); OnPreTraverse?.Invoke(); Performance.Leave(); // ------------------------------------------------------------- var UnityCamera = SceneManagerCamera.Camera; if (UnityCamera == null) { return; } if (!NodeLock.TryLockRender(30)) // 30 millisek latency allowed { return; } try // We are now locked in read { // Transfer camera parameters PerspCamera perspCamera = _native_camera as PerspCamera; if (perspCamera != null) { perspCamera.VerticalFOV = UnityCamera.fieldOfView; perspCamera.HorizontalFOV = 2 * Mathf.Atan(Mathf.Tan(UnityCamera.fieldOfView * Mathf.Deg2Rad / 2) * UnityCamera.aspect) * Mathf.Rad2Deg;; perspCamera.NearClipPlane = UnityCamera.nearClipPlane; perspCamera.FarClipPlane = UnityCamera.farClipPlane; } Matrix4x4 unity_camera_transform = UnityCamera.transform.worldToLocalMatrix; Matrix4x4 gz_transform = _zflipMatrix * unity_camera_transform * _zflipMatrix; _native_camera.Transform = gz_transform.ToMatrix4(); var p = SceneManagerCamera.Position; _native_camera.Position = new Vec3D(p.x, p.y, -p.z); _native_camera.Render(_native_context, 1000, 1000, 1000, _native_traverse_action); #if DEBUG_CAMERA _native_camera.DebugRefresh(); #endif } finally { NodeLock.UnLock(); } UpdateNodeInternals(); // Notify about we are ready in traverse ----------------------- Performance.Enter("PostTraverse"); SceneManagerCamera.PostTraverse(); OnPostTraverse?.Invoke(); Performance.Leave(); // ------------------------------------------------------------- }
// Update is called once per frame private void Update() { try { Performance.Enter("SM.Update"); if (!NodeLock.TryLockEdit(30)) // 30 msek allow latency of other pending editor { Message.Send(ID, MessageLevel.DEBUG, "Lock contention detected! NodeLock::TryLockEdit() FRAME LOST"); // We failed to refresh scene in reasonable time but we still need to issue updates; Performance.Enter("SM.Update.PreTraverse"); if (SceneManagerCamera != null) { SceneManagerCamera.PreTraverse(); } OnPreTraverse?.Invoke(); Performance.Leave(); return; } try // We are now locked in edit { Performance.Enter("SM.ProcessPendingUpdates"); ProcessPendingUpdates(); } finally { Performance.Leave(); NodeLock.UnLock(); } // Notify about we are starting to traverse ----------------------- Performance.Enter("SM.Update.PreTraverse"); if (SceneManagerCamera != null) { SceneManagerCamera.PreTraverse(); } OnPreTraverse?.Invoke(); Performance.Leave(); // Check if camera present --------------------------------------- if (SceneManagerCamera == null) { return; } // --------------------------------------------------------------- var UnityCamera = SceneManagerCamera.Camera; if (UnityCamera == null) { return; } if (!NodeLock.TryLockRender(30)) // 30 millisek latency allowed { Message.Send(ID, MessageLevel.DEBUG, "Lock contention detected! NodeLock::TryLockRender() FRAME LOST"); return; } try // We are now locked in read { // Transfer camera parameters PerspCamera perspCamera = _native_camera as PerspCamera; if (perspCamera != null) { perspCamera.VerticalFOV = UnityCamera.fieldOfView; perspCamera.HorizontalFOV = 2 * Mathf.Atan(Mathf.Tan(UnityCamera.fieldOfView * Mathf.Deg2Rad / 2) * UnityCamera.aspect) * Mathf.Rad2Deg;; perspCamera.NearClipPlane = UnityCamera.nearClipPlane; perspCamera.FarClipPlane = UnityCamera.farClipPlane; } Matrix4x4 unity_camera_transform = UnityCamera.transform.worldToLocalMatrix; _native_camera.Transform = unity_camera_transform.ToZFlippedMatrix4(); _native_camera.Position = SceneManagerCamera.GlobalPosition; _native_camera.Render(_native_context, 1000, 1000, 1000, _native_traverse_action); #if DEBUG_CAMERA _native_camera.DebugRefresh(); #endif } finally { NodeLock.UnLock(); } UpdateNodeInternals(); // ------------------------------------------------------------- } finally { // Notify about we are ready in traverse ----------------------- Performance.Enter("SM.Update.PostTraverse"); if (SceneManagerCamera != null) { SceneManagerCamera.PostTraverse(); } OnPostTraverse?.Invoke(); Performance.Leave(); // Leave Scm update ------------------------------------------- Performance.Leave(); } }