소스 검색

mol-canvas3d: requestCameraReset options

David Sehnal 5 년 전
부모
커밋
2900836208
3개의 변경된 파일16개의 추가작업 그리고 8개의 파일을 삭제
  1. 13 5
      src/mol-canvas3d/canvas3d.ts
  2. 2 2
      src/mol-plugin/behavior/static/camera.ts
  3. 1 1
      src/mol-plugin/command.ts

+ 13 - 5
src/mol-canvas3d/canvas3d.ts

@@ -77,7 +77,7 @@ interface Canvas3D {
 
     handleResize(): void
     /** Focuses camera on scene's bounding sphere, centered and zoomed. */
-    requestCameraReset(durationMs?: number): void
+    requestCameraReset(options?: { durationMs?: number, snapshot?: Partial<Camera.Snapshot> }): void
     readonly camera: Camera
     readonly boundingSphere: Readonly<Sphere3D>
     downloadScreenshot(): void
@@ -191,6 +191,7 @@ namespace Canvas3D {
         let drawPending = false
         let cameraResetRequested = false
         let nextCameraResetDuration: number | undefined = void 0
+        let nextCameraResetSnapshot: Partial<Camera.Snapshot> | undefined = void 0
 
         function getLoci(pickingId: PickingId) {
             let loci: Loci = EmptyLoci
@@ -290,9 +291,15 @@ namespace Canvas3D {
         function resolveCameraReset() {
             if (!cameraResetRequested) return;
             const { center, radius } = scene.boundingSphere;
-            const duration = nextCameraResetDuration === undefined ? p.cameraResetDurationMs : nextCameraResetDuration
-            camera.focus(center, radius, radius, duration);
+            if (radius >= 0) {
+                const duration = nextCameraResetDuration === undefined ? p.cameraResetDurationMs : nextCameraResetDuration
+                const focus = camera.getFocus(center, radius, radius);
+                const snapshot = nextCameraResetSnapshot ? { ...focus, ...nextCameraResetSnapshot } : focus;
+                camera.setState(snapshot, duration);
+            }
+
             nextCameraResetDuration = void 0;
+            nextCameraResetSnapshot = void 0;
             cameraResetRequested = false;
         }
 
@@ -388,8 +395,9 @@ namespace Canvas3D {
             getLoci,
 
             handleResize,
-            requestCameraReset: (durationMs) => {
-                nextCameraResetDuration = durationMs;
+            requestCameraReset: options => {
+                nextCameraResetDuration = options?.durationMs;
+                nextCameraResetSnapshot = options?.snapshot;
                 cameraResetRequested = true;
             },
             camera,

+ 2 - 2
src/mol-plugin/behavior/static/camera.ts

@@ -15,8 +15,8 @@ export function registerDefault(ctx: PluginContext) {
 }
 
 export function Reset(ctx: PluginContext) {
-    PluginCommands.Camera.Reset.subscribe(ctx, () => {
-        ctx.canvas3d?.requestCameraReset();
+    PluginCommands.Camera.Reset.subscribe(ctx, options => {
+        ctx.canvas3d?.requestCameraReset(options);
     })
 }
 

+ 1 - 1
src/mol-plugin/command.ts

@@ -59,7 +59,7 @@ export const PluginCommands = {
         Hide: PluginCommand<{ key: string }>()
     },
     Camera: {
-        Reset: PluginCommand<{}>(),
+        Reset: PluginCommand<{ durationMs?: number, snapshot?: Partial<Camera.Snapshot> }>(),
         SetSnapshot: PluginCommand<{ snapshot: Partial<Camera.Snapshot>, durationMs?: number }>(),
         Snapshots: {
             Add: PluginCommand<{ name?: string, description?: string }>(),