From 33ebcd1e65461bf2a5db57084436bc9c043e2b2e Mon Sep 17 00:00:00 2001 From: AlexandruPopovici Date: Fri, 20 Dec 2024 23:12:39 +0200 Subject: [PATCH 1/4] Handles new measurements reverting to meters even if a different unit was previously set. Handles units not changing properly when changing the unit value --- packages/viewer-sandbox/src/main.ts | 6 +-- .../extensions/measurements/Measurement.ts | 2 +- .../measurements/MeasurementPointGizmo.ts | 8 +++- .../measurements/MeasurementsExtension.ts | 37 +++++++++++++------ .../measurements/PerpendicularMeasurement.ts | 36 ++++++++++-------- .../measurements/PointToPointMeasurement.ts | 28 ++++++++------ 6 files changed, 72 insertions(+), 45 deletions(-) diff --git a/packages/viewer-sandbox/src/main.ts b/packages/viewer-sandbox/src/main.ts index 1e5cca01b9..2d282eea30 100644 --- a/packages/viewer-sandbox/src/main.ts +++ b/packages/viewer-sandbox/src/main.ts @@ -83,9 +83,9 @@ const createViewer = async (containerName: string, _stream: string) => { Object.assign(sandbox.sceneParams.worldSize, viewer.World.worldSize) Object.assign(sandbox.sceneParams.worldOrigin, viewer.World.worldOrigin) sandbox.refresh() - const snowPipeline = new SnowPipeline(viewer.getRenderer()) - viewer.getRenderer().pipeline = snowPipeline - void snowPipeline.start() + // const snowPipeline = new SnowPipeline(viewer.getRenderer()) + // viewer.getRenderer().pipeline = snowPipeline + // void snowPipeline.start() }) viewer.on(ViewerEvent.UnloadComplete, () => { diff --git a/packages/viewer/src/modules/extensions/measurements/Measurement.ts b/packages/viewer/src/modules/extensions/measurements/Measurement.ts index a4591561ea..25090de7d7 100644 --- a/packages/viewer/src/modules/extensions/measurements/Measurement.ts +++ b/packages/viewer/src/modules/extensions/measurements/Measurement.ts @@ -61,7 +61,7 @@ export abstract class Measurement extends Object3D { this.renderingSize.copy(size) } - public abstract update(): void + public abstract update(): Promise public abstract raycast(_raycaster: Raycaster, _intersects: Array): void public abstract highlight(_value: boolean): void public abstract updateClippingPlanes(_planes: Plane[]): void diff --git a/packages/viewer/src/modules/extensions/measurements/MeasurementPointGizmo.ts b/packages/viewer/src/modules/extensions/measurements/MeasurementPointGizmo.ts index 3b7667b8f7..a77d3902a1 100644 --- a/packages/viewer/src/modules/extensions/measurements/MeasurementPointGizmo.ts +++ b/packages/viewer/src/modules/extensions/measurements/MeasurementPointGizmo.ts @@ -27,6 +27,7 @@ import { SpeckleText } from '../../objects/SpeckleText.js' import SpeckleTextMaterial from '../../materials/SpeckleTextMaterial.js' import SpeckleBasicMaterial from '../../materials/SpeckleBasicMaterial.js' import { ObjectLayers } from '../../../IViewer.js' +import Logger from '../../utils/Logger.js' export interface MeasurementPointGizmoStyle { fixedSize?: number | boolean @@ -325,8 +326,8 @@ export class MeasurementPointGizmo extends Group { position?: Vector3, quaternion?: Quaternion, scale?: Vector3 - ) { - void this.text + ): Promise { + return this.text .update({ textValue: value, height: 1, @@ -343,6 +344,9 @@ export class MeasurementPointGizmo extends Group { if (this.text.backgroundMesh) this.text.backgroundMesh.renderOrder = 3 this.text.textMesh.renderOrder = 4 }) + .catch((reason) => { + Logger.log(`Could not update text: ${reason}`) + }) } public updateStyle() { diff --git a/packages/viewer/src/modules/extensions/measurements/MeasurementsExtension.ts b/packages/viewer/src/modules/extensions/measurements/MeasurementsExtension.ts index 36480f7ec9..efa527b09e 100644 --- a/packages/viewer/src/modules/extensions/measurements/MeasurementsExtension.ts +++ b/packages/viewer/src/modules/extensions/measurements/MeasurementsExtension.ts @@ -63,7 +63,7 @@ export class MeasurementsExtension extends Extension { this._enabled = value if (this._activeMeasurement) { this._activeMeasurement.isVisible = value - this._activeMeasurement.update() + void this._activeMeasurement.update() if (!value) this.cancelMeasurement() } this.viewer.requestRender() @@ -180,9 +180,10 @@ export class MeasurementsExtension extends Extension { this._activeMeasurement.endPoint.copy(this.pointBuff) this._activeMeasurement.endNormal.copy(this.normalBuff) } - this._activeMeasurement.update() + void this._activeMeasurement.update().then(() => { + this.viewer.requestRender() + }) - this.viewer.requestRender() this._frameLock = true this._sceneHit = true // console.log('Time -> ', performance.now() - start) @@ -282,8 +283,9 @@ export class MeasurementsExtension extends Extension { this._activeMeasurement.endPoint.copy(perpResult[0].point) this._activeMeasurement.endNormal.copy(perpResult[0].face.normal) this._activeMeasurement.state = MeasurementState.DANGLING_END - this._activeMeasurement.update() - this.finishMeasurement() + void this._activeMeasurement.update().then(() => { + this.finishMeasurement() + }) } protected startMeasurement(): Measurement { @@ -295,12 +297,21 @@ export class MeasurementsExtension extends Extension { else throw new Error('Unsupported measurement type!') measurement.state = MeasurementState.DANGLING_START + measurement.units = + this._options.units !== undefined + ? this._options.units + : DefaultMeasurementsOptions.units + measurement.precision = + this._options.precision !== undefined + ? this._options.precision + : DefaultMeasurementsOptions.precision measurement.frameUpdate( this.renderer.renderingCamera, this.screenBuff0, this.renderer.sceneBox ) this.renderer.scene.add(measurement) + return measurement } @@ -314,7 +325,7 @@ export class MeasurementsExtension extends Extension { if (!this._activeMeasurement) return this._activeMeasurement.state = MeasurementState.COMPLETE - this._activeMeasurement.update() + void this._activeMeasurement.update() if (this._activeMeasurement.value > 0) { this.measurements.push(this._activeMeasurement) } else { @@ -421,6 +432,7 @@ export class MeasurementsExtension extends Extension { protected applyOptions() { const all = [this._activeMeasurement, ...this.measurements] + const updatePromises: Promise[] = [] all.forEach((value) => { if (value) { value.units = @@ -431,7 +443,7 @@ export class MeasurementsExtension extends Extension { this._options.precision !== undefined ? this._options.precision : DefaultMeasurementsOptions.precision - value.update() + updatePromises.push(value.update()) } }) this.viewer @@ -440,18 +452,19 @@ export class MeasurementsExtension extends Extension { if (this._options.visible) this.raycaster.layers.enable(ObjectLayers.MEASUREMENTS) else this.raycaster.layers.disable(ObjectLayers.MEASUREMENTS) - - this.viewer.requestRender() + void Promise.all(updatePromises).then(() => { + this.viewer.requestRender() + }) } - public fromMeasurementData(startPoint: Vector3, endPoint: Vector3) { + public async fromMeasurementData(startPoint: Vector3, endPoint: Vector3) { const measurement = new PointToPointMeasurement() measurement.startPoint.copy(startPoint) measurement.endPoint.copy(endPoint) measurement.state = MeasurementState.DANGLING_END - measurement.update() + await measurement.update() measurement.state = MeasurementState.COMPLETE - measurement.update() + await measurement.update() this.measurements.push(measurement) } } diff --git a/packages/viewer/src/modules/extensions/measurements/PerpendicularMeasurement.ts b/packages/viewer/src/modules/extensions/measurements/PerpendicularMeasurement.ts index a5ba0ccfe5..e0894bef22 100644 --- a/packages/viewer/src/modules/extensions/measurements/PerpendicularMeasurement.ts +++ b/packages/viewer/src/modules/extensions/measurements/PerpendicularMeasurement.ts @@ -50,13 +50,15 @@ export class PerpendicularMeasurement extends Measurement { * won't look correct while zooming */ if (this._state === MeasurementState.DANGLING_START) { - this.update() + void this.update() } } - public update() { - if (isNaN(this.startPoint.length())) return - if (!this.renderingCamera) return + public update(): Promise { + let ret = Promise.resolve() + + if (isNaN(this.startPoint.length())) return ret + if (!this.renderingCamera) return ret this.startGizmo?.updateDisc(this.startPoint, this.startNormal) this.startGizmo?.updatePoint(this.startPoint) @@ -180,23 +182,27 @@ export class PerpendicularMeasurement extends Measurement { ) this.value = this.midPoint.distanceTo(this.startPoint) - this.startGizmo?.updateText( - `${(this.value * getConversionFactor('m', this.units)).toFixed( - this.precision - )} ${this.units}`, - textPos - ) + if (this.startGizmo) + ret = this.startGizmo.updateText( + `${(this.value * getConversionFactor('m', this.units)).toFixed( + this.precision + )} ${this.units}`, + textPos + ) this.endGizmo?.enable(true, true, true, true) } if (this._state === MeasurementState.COMPLETE) { - this.startGizmo?.updateText( - `${(this.value * getConversionFactor('m', this.units)).toFixed( - this.precision - )} ${this.units}` - ) + if (this.startGizmo) + ret = this.startGizmo.updateText( + `${(this.value * getConversionFactor('m', this.units)).toFixed( + this.precision + )} ${this.units}` + ) this.startGizmo?.enable(false, true, true, true) this.endGizmo?.enable(false, false, true, false) } + + return ret } public raycast(raycaster: Raycaster, intersects: Array) { diff --git a/packages/viewer/src/modules/extensions/measurements/PointToPointMeasurement.ts b/packages/viewer/src/modules/extensions/measurements/PointToPointMeasurement.ts index 25ead25838..f61066768f 100644 --- a/packages/viewer/src/modules/extensions/measurements/PointToPointMeasurement.ts +++ b/packages/viewer/src/modules/extensions/measurements/PointToPointMeasurement.ts @@ -30,7 +30,8 @@ export class PointToPointMeasurement extends Measurement { this.endGizmo?.frameUpdate(camera, bounds) } - public update() { + public update(): Promise { + let ret: Promise = Promise.resolve() this.startGizmo?.updateDisc(this.startPoint, this.startNormal) this.startGizmo?.updatePoint(this.startPoint) this.endGizmo?.updateDisc(this.endPoint, this.endNormal) @@ -71,23 +72,26 @@ export class PointToPointMeasurement extends Measurement { this.startGizmo?.updateLine([this.startPoint, lineEndPoint]) this.endGizmo?.updatePoint(lineEndPoint) - this.startGizmo?.updateText( - `${(this.value * getConversionFactor('m', this.units)).toFixed( - this.precision - )} ${this.units}`, - textPos - ) + if (this.startGizmo) + ret = this.startGizmo.updateText( + `${(this.value * getConversionFactor('m', this.units)).toFixed( + this.precision + )} ${this.units}`, + textPos + ) this.endGizmo?.enable(true, true, true, true) } if (this._state === MeasurementState.COMPLETE) { this.startGizmo?.enable(false, true, true, true) this.endGizmo?.enable(false, false, true, false) - this.startGizmo?.updateText( - `${(this.value * getConversionFactor('m', this.units)).toFixed( - this.precision - )} ${this.units}` - ) + if (this.startGizmo) + ret = this.startGizmo.updateText( + `${(this.value * getConversionFactor('m', this.units)).toFixed( + this.precision + )} ${this.units}` + ) } + return ret } public raycast(raycaster: Raycaster, intersects: Array) { From 30bbf174d63eb5856666691e694b32225ad7176a Mon Sep 17 00:00:00 2001 From: Mike Tasset Date: Fri, 20 Dec 2024 23:02:45 +0100 Subject: [PATCH 2/4] Remove transition to fix select --- packages/frontend-2/components/viewer/Controls.vue | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/frontend-2/components/viewer/Controls.vue b/packages/frontend-2/components/viewer/Controls.vue index 4e483ae3ee..924509d71d 100644 --- a/packages/frontend-2/components/viewer/Controls.vue +++ b/packages/frontend-2/components/viewer/Controls.vue @@ -183,10 +183,8 @@
From 91487c285ee31a64b384753f2fee814cab4a160d Mon Sep 17 00:00:00 2001 From: Mike Tasset Date: Fri, 20 Dec 2024 23:03:55 +0100 Subject: [PATCH 3/4] Remove unsused import --- packages/viewer-sandbox/src/main.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/viewer-sandbox/src/main.ts b/packages/viewer-sandbox/src/main.ts index 2d282eea30..41571add87 100644 --- a/packages/viewer-sandbox/src/main.ts +++ b/packages/viewer-sandbox/src/main.ts @@ -21,7 +21,6 @@ import { SectionTool } from '@speckle/viewer' import { SectionOutlines } from '@speckle/viewer' import { ViewModesKeys } from './Extensions/ViewModesKeys' import { BoxSelection } from './Extensions/BoxSelection' -import { SnowPipeline } from './Pipelines/Snow/SnowPipeline' const createViewer = async (containerName: string, _stream: string) => { const container = document.querySelector(containerName) From 24a7ad634d5299a90a4b35607738f1e8669d83f0 Mon Sep 17 00:00:00 2001 From: AlexandruPopovici Date: Sat, 21 Dec 2024 00:18:10 +0200 Subject: [PATCH 4/4] Added back snow --- packages/viewer-sandbox/src/main.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/viewer-sandbox/src/main.ts b/packages/viewer-sandbox/src/main.ts index 41571add87..1e5cca01b9 100644 --- a/packages/viewer-sandbox/src/main.ts +++ b/packages/viewer-sandbox/src/main.ts @@ -21,6 +21,7 @@ import { SectionTool } from '@speckle/viewer' import { SectionOutlines } from '@speckle/viewer' import { ViewModesKeys } from './Extensions/ViewModesKeys' import { BoxSelection } from './Extensions/BoxSelection' +import { SnowPipeline } from './Pipelines/Snow/SnowPipeline' const createViewer = async (containerName: string, _stream: string) => { const container = document.querySelector(containerName) @@ -82,9 +83,9 @@ const createViewer = async (containerName: string, _stream: string) => { Object.assign(sandbox.sceneParams.worldSize, viewer.World.worldSize) Object.assign(sandbox.sceneParams.worldOrigin, viewer.World.worldOrigin) sandbox.refresh() - // const snowPipeline = new SnowPipeline(viewer.getRenderer()) - // viewer.getRenderer().pipeline = snowPipeline - // void snowPipeline.start() + const snowPipeline = new SnowPipeline(viewer.getRenderer()) + viewer.getRenderer().pipeline = snowPipeline + void snowPipeline.start() }) viewer.on(ViewerEvent.UnloadComplete, () => {