Browse Source

mol-canvas3d: tweak commit and camera reset

David Sehnal 5 years ago
parent
commit
3c4888e52b
2 changed files with 18 additions and 13 deletions
  1. 18 11
      src/mol-canvas3d/canvas3d.ts
  2. 0 2
      src/mol-gl/scene.ts

+ 18 - 11
src/mol-canvas3d/canvas3d.ts

@@ -62,7 +62,7 @@ interface Canvas3D {
     /**
      * This function must be called if animate() is not set up so that add/remove actions take place.
      */
-    commit(): void
+    commit(isSynchronous?: boolean): void
     update(repr?: Representation.Any, keepBoundingSphere?: boolean): void
     clear(): void
 
@@ -77,7 +77,7 @@ interface Canvas3D {
 
     handleResize(): void
     /** Focuses camera on scene's bounding sphere, centered and zoomed. */
-    requestCameraReset(): void
+    requestCameraReset(durationMs?: number): void
     readonly camera: Camera
     readonly boundingSphere: Readonly<Sphere3D>
     downloadScreenshot(): void
@@ -190,6 +190,7 @@ namespace Canvas3D {
 
         let drawPending = false
         let cameraResetRequested = false
+        let nextCameraResetDuration: number | undefined = void 0
 
         function getLoci(pickingId: PickingId) {
             let loci: Loci = EmptyLoci
@@ -282,25 +283,30 @@ namespace Canvas3D {
             return webgl.isContextLost ? undefined : pickPass.identify(x, y)
         }
 
-        function commit() {
-            commitScene();
-            resolveCameraReset();
+        function commit(isSynchronous: boolean = false) {
+            const allCommited = commitScene(isSynchronous);
+            // Only reset the camera after the full scene has been commited.
+            if (allCommited) resolveCameraReset();
         }
 
         function resolveCameraReset() {
             if (!cameraResetRequested) return;
             const { center, radius } = scene.boundingSphere;
-            camera.focus(center, radius, radius, p.cameraResetDurationMs);
+            camera.focus(center, radius, radius, 
+                typeof nextCameraResetDuration === 'undefined' ? p.cameraResetDurationMs : nextCameraResetDuration);
+            nextCameraResetDuration = void 0;
             cameraResetRequested = false;
         }
 
         const sceneCommitTimeoutMs = 250;
-        function commitScene() {
-            if (!scene.needsCommit) return;
+        function commitScene(isSynchronous: boolean) {
+            if (!scene.needsCommit) return true;
+
+            if (!scene.commit(isSynchronous ? void 0 : sceneCommitTimeoutMs)) return false;
 
-            const allCommited = scene.commit(sceneCommitTimeoutMs);
             if (debugHelper.isEnabled) debugHelper.update();
-            if (allCommited) reprCount.next(reprRenderObjects.size);
+            reprCount.next(reprRenderObjects.size);
+            return true;
         }
 
         function add(repr: Representation.Any) {
@@ -384,7 +390,8 @@ namespace Canvas3D {
             getLoci,
 
             handleResize,
-            requestCameraReset: () => {
+            requestCameraReset: (durationMs) => {
+                nextCameraResetDuration = durationMs;
                 cameraResetRequested = true;
             },
             camera,

+ 0 - 2
src/mol-gl/scene.ts

@@ -126,8 +126,6 @@ namespace Scene {
             return true;
         }
 
-        // const toAdd: GraphicsRenderObject[] = []
-        // const toRemove: GraphicsRenderObject[] = []
         const commitQueue = new CommitQueue();
 
         return {