From 32d4e2ccfa3f39aa530e826f13ccc1081c11ed93 Mon Sep 17 00:00:00 2001 From: Sebastien DUMETZ Date: Mon, 15 Apr 2024 15:41:58 +0200 Subject: [PATCH] handle double-click pivot move --- source/client/components/CVOrbitNavigation.ts | 17 +++++++++++++++++ source/client/ui/SceneView.ts | 3 +++ 2 files changed, 20 insertions(+) diff --git a/source/client/components/CVOrbitNavigation.ts b/source/client/components/CVOrbitNavigation.ts index 892a3537..d6cb7558 100644 --- a/source/client/components/CVOrbitNavigation.ts +++ b/source/client/components/CVOrbitNavigation.ts @@ -30,6 +30,8 @@ import { ENavigationType, TNavigationType, INavigation } from "client/schema/set import CVScene from "./CVScene"; import CVAssetManager from "./CVAssetManager"; import CVARManager from "./CVARManager"; +import CVModel2 from "./CVModel2"; +import { getMeshTransform } from "client/utils/Helpers"; //////////////////////////////////////////////////////////////////////////////// @@ -129,6 +131,7 @@ export default class CVOrbitNavigation extends CObject3D return [ this.ins.orbit, this.ins.offset, + this.ins.pivot, ]; } @@ -147,6 +150,7 @@ export default class CVOrbitNavigation extends CObject3D super.create(); this.system.on(["pointer-down", "pointer-up", "pointer-move"], this.onPointer, this); + this.system.on("double-click", this.onDoubleClick, this); this.system.on("wheel", this.onTrigger, this); this.system.on("keydown", this.onKeyboard, this); @@ -426,6 +430,19 @@ export default class CVOrbitNavigation extends CObject3D this._hasChanged = true; } + protected onDoubleClick(event: ITriggerEvent){ + if(event.component.typeName != "CVModel2") return; + const model = event.component as CVModel2; + + const meshTransform = getMeshTransform(model.object3D, event.object3D); + const invMeshTransform = meshTransform.clone().invert(); + const bounds = model.localBoundingBox.clone().applyMatrix4(meshTransform); + // add mesh parent transforms in this branch + let localPosition = event.view.pickPosition(event as any, bounds).applyMatrix4(invMeshTransform); + this.ins.pivot.setValue(localPosition.toArray()); + this.ins.offset.setValue([0, 0, this.ins.offset.value[2]]); + } + protected onTrigger(event: ITriggerEvent) { const viewport = event.viewport; diff --git a/source/client/ui/SceneView.ts b/source/client/ui/SceneView.ts index d58d4ced..4d1db32b 100644 --- a/source/client/ui/SceneView.ts +++ b/source/client/ui/SceneView.ts @@ -70,6 +70,7 @@ export default class SceneView extends SystemView this.ownerDocument.addEventListener("pointermove", this.manipTarget.onPointerMove); // To catch out of frame drag releases this.ownerDocument.addEventListener("pointerup", this.onPointerUpOrCancel); // To catch out of frame drag releases this.ownerDocument.addEventListener("pointercancel", this.onPointerUpOrCancel); // To catch out of frame drag releases + this.addEventListener("dblclick", this.manipTarget.onDoubleClick); this.addEventListener("wheel", this.manipTarget.onWheel); this.addEventListener("contextmenu", this.manipTarget.onContextMenu); this.addEventListener("keydown", this.manipTarget.onKeyDown); @@ -166,6 +167,7 @@ export default class SceneView extends SystemView this.ownerDocument.addEventListener("pointermove", this.manipTarget.onPointerMove); // To catch out of frame drag releases this.ownerDocument.addEventListener("pointerup", this.onPointerUpOrCancel); // To catch out of frame drag releases this.ownerDocument.addEventListener("pointercancel", this.onPointerUpOrCancel); // To catch out of frame drag releases + this.addEventListener("dblclick", this.manipTarget.onDoubleClick); this.addEventListener("wheel", this.manipTarget.onWheel); this.addEventListener("contextmenu", this.manipTarget.onContextMenu); this.addEventListener("keydown", this.manipTarget.onKeyDown); @@ -184,6 +186,7 @@ export default class SceneView extends SystemView this.ownerDocument.removeEventListener("pointermove", this.manipTarget.onPointerMove); // To catch out of frame drag releases this.ownerDocument.removeEventListener("pointerup", this.onPointerUpOrCancel); // To catch out of frame drag releases this.ownerDocument.removeEventListener("pointercancel", this.onPointerUpOrCancel); // To catch out of frame drag releases + this.removeEventListener("dblclick", this.manipTarget.onDoubleClick); this.removeEventListener("wheel", this.manipTarget.onWheel); this.removeEventListener("contextmenu", this.manipTarget.onContextMenu); this.removeEventListener("keydown", this.manipTarget.onKeyDown);