From 5dbbefcd196a1999eb774c3fb27b5c889f415fd4 Mon Sep 17 00:00:00 2001 From: AlexandruPopovici Date: Thu, 25 Aug 2022 17:04:09 +0300 Subject: [PATCH] Added PolarView, which allows us to rotate the camera using polar coordinates. This is used by the preview service currently --- packages/viewer-sandbox/src/Sandbox.ts | 14 +++++++++++ packages/viewer/src/IViewer.ts | 13 ++++++++-- .../viewer/src/modules/SpeckleRenderer.ts | 25 ++++++++++++++++--- packages/viewer/src/modules/Viewer.ts | 4 ++- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/packages/viewer-sandbox/src/Sandbox.ts b/packages/viewer-sandbox/src/Sandbox.ts index 7017e6f46..f8d0d39f9 100644 --- a/packages/viewer-sandbox/src/Sandbox.ts +++ b/packages/viewer-sandbox/src/Sandbox.ts @@ -214,6 +214,20 @@ export default class Sandbox { console.warn(await this.viewer.screenshot()) }) + const rotate = this.tabs.pages[0].addButton({ + title: '360' + }) + rotate.on('click', async () => { + const waitForAnimation = async (ms = 70) => + await new Promise((resolve) => { + setTimeout(resolve, ms) + }) + for (let i = 0; i < 24; i++) { + this.viewer.setView({ azimuth: Math.PI / 12, polar: 0 }, false) + await waitForAnimation(1000) + } + }) + const canonicalViewsFolder = this.tabs.pages[0].addFolder({ title: 'Canonical Views', expanded: true diff --git a/packages/viewer/src/IViewer.ts b/packages/viewer/src/IViewer.ts index ead4876a8..7ab0d536e 100644 --- a/packages/viewer/src/IViewer.ts +++ b/packages/viewer/src/IViewer.ts @@ -105,7 +105,13 @@ export type SpeckleView = { export type InlineView = { position: Vector3 target: Vector3 - zoom: number +} + +export type PolarView = { + azimuth: number + polar: number + radius?: number + origin?: Vector3 } /** @@ -130,7 +136,10 @@ export interface IViewer { setLightConfiguration(config: LightConfiguration): void getViews(): SpeckleView[] - setView(view: CanonicalView | SpeckleView | InlineView, transition?: boolean) + setView( + view: CanonicalView | SpeckleView | InlineView | PolarView, + transition?: boolean + ) loadObject(url: string, token?: string, enableCaching?: boolean): Promise cancelLoad(url: string, unload?: boolean): Promise diff --git a/packages/viewer/src/modules/SpeckleRenderer.ts b/packages/viewer/src/modules/SpeckleRenderer.ts index e326a4e1d..97acb4332 100644 --- a/packages/viewer/src/modules/SpeckleRenderer.ts +++ b/packages/viewer/src/modules/SpeckleRenderer.ts @@ -39,6 +39,7 @@ import { CanonicalView, DefaultLightConfiguration, InlineView, + PolarView, SelectionEvent, SpeckleView, SunLightConfiguration, @@ -595,19 +596,19 @@ export default class SpeckleRenderer { } private isSpeckleView( - view: CanonicalView | SpeckleView | InlineView + view: CanonicalView | SpeckleView | InlineView | PolarView ): view is SpeckleView { return (view as SpeckleView).name !== undefined } private isCanonicalView( - view: CanonicalView | SpeckleView | InlineView + view: CanonicalView | SpeckleView | InlineView | PolarView ): view is CanonicalView { return typeof (view as CanonicalView) === 'string' } private isInlineView( - view: CanonicalView | SpeckleView | InlineView + view: CanonicalView | SpeckleView | InlineView | PolarView ): view is InlineView { return ( (view as InlineView).position !== undefined && @@ -615,8 +616,17 @@ export default class SpeckleRenderer { ) } + private isPolarView( + view: CanonicalView | SpeckleView | InlineView | PolarView + ): view is PolarView { + return ( + (view as PolarView).azimuth !== undefined && + (view as PolarView).polar !== undefined + ) + } + public setView( - view: CanonicalView | SpeckleView | InlineView, + view: CanonicalView | SpeckleView | InlineView | PolarView, transition = true ): void { if (this.isSpeckleView(view)) { @@ -628,6 +638,9 @@ export default class SpeckleRenderer { if (this.isInlineView(view)) { this.setViewInline(view, transition) } + if (this.isPolarView(view)) { + this.setViewPolar(view, transition) + } } private setViewSpeckle(view: SpeckleView, transition = true) { @@ -727,6 +740,10 @@ export default class SpeckleRenderer { ) } + private setViewPolar(view: PolarView, transition = true) { + this.viewer.cameraHandler.controls.rotate(view.azimuth, view.polar, transition) + } + /** DEBUG */ public onObjectClickDebug(e) { const result: Intersection = this.intersections.intersect( diff --git a/packages/viewer/src/modules/Viewer.ts b/packages/viewer/src/modules/Viewer.ts index adcb752ae..1ed78ce88 100644 --- a/packages/viewer/src/modules/Viewer.ts +++ b/packages/viewer/src/modules/Viewer.ts @@ -14,6 +14,7 @@ import { DefaultViewerParams, InlineView, IViewer, + PolarView, SpeckleView, SunLightConfiguration, ViewerEvent, @@ -310,10 +311,11 @@ export class Viewer extends EventEmitter implements IViewer { } public setView( - view: CanonicalView | SpeckleView | InlineView, + view: CanonicalView | SpeckleView | InlineView | PolarView, transition = true ): void { this.speckleRenderer.setView(view, transition) + this.needsRender = true } public screenshot(): Promise {