From 57f1adb4021affe5384237c58769b1da264c8480 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 11 May 2026 15:45:16 +0900 Subject: [PATCH] wip --- packages/frontend/src/world/room/engine.ts | 19 +++++++++++++++++-- packages/frontend/src/world/utility.ts | 19 +++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/packages/frontend/src/world/room/engine.ts b/packages/frontend/src/world/room/engine.ts index 78e6aa76ae..4c92f10ab3 100644 --- a/packages/frontend/src/world/room/engine.ts +++ b/packages/frontend/src/world/room/engine.ts @@ -1202,6 +1202,7 @@ export class RoomEngine extends EventEmitter { const dir = this.camera.getDirection(BABYLON.Axis.Z).scale(this.scene.useRightHandedSystem ? -1 : 1); let sticky: string | null; + let grabbingEnded = false; this.grabbingCtx = { objectId: selectedObject.metadata.objectId, @@ -1218,6 +1219,7 @@ export class RoomEngine extends EventEmitter { sticky = info.sticky; }, onCancel: () => { + grabbingEnded = true; this.sr.disableSnapshotRendering(); selectedObject.position = initialPosition.clone(); selectedObject.rotation = initialRotation.clone(); @@ -1236,6 +1238,7 @@ export class RoomEngine extends EventEmitter { this.sr.enableSnapshotRendering(); }, onDone: () => { // todo: sticky状態などを引数でもらうようにしたい + grabbingEnded = true; this.putParticleSystem.emitter = selectedObject.position.clone(); this.putParticleSystem.start(); @@ -1304,7 +1307,11 @@ export class RoomEngine extends EventEmitter { this.sr.enableSnapshotRendering(); - this.timer.setInterval(() => { + const stopHandleGrabbing = this.timer.setInterval(() => { + if (grabbingEnded) { + stopHandleGrabbing(); + return; + } this.handleGrabbing(); }, 10); @@ -1437,6 +1444,7 @@ export class RoomEngine extends EventEmitter { const ghost = this.createGhost(root); let sticky: string | null; + let grabbingEnded = false; this.grabbingCtx = { objectId: id, @@ -1453,9 +1461,12 @@ export class RoomEngine extends EventEmitter { sticky = info.sticky; }, onCancel: () => { + grabbingEnded = true; // todo }, onDone: () => { // todo: sticky状態などを引数でもらうようにしたい + grabbingEnded = true; + if (def.hasCollisions) { enableObjectCollision(root.getChildMeshes()); } @@ -1511,7 +1522,11 @@ export class RoomEngine extends EventEmitter { this.gridPlane.isVisible = true; this.sr.enableSnapshotRendering(); - this.timer.setInterval(() => { + const stopHandleGrabbing = this.timer.setInterval(() => { + if (grabbingEnded) { + stopHandleGrabbing(); + return; + } this.handleGrabbing(); }, 10); diff --git a/packages/frontend/src/world/utility.ts b/packages/frontend/src/world/utility.ts index 01d077c8ef..6a22be41c5 100644 --- a/packages/frontend/src/world/utility.ts +++ b/packages/frontend/src/world/utility.ts @@ -569,6 +569,7 @@ export class Timer { callback(); }, ms); this.timeoutIds.push(id); + return () => this.clearTimeout(id); } public setInterval(callback: () => void, ms: number, signal?: AbortSignal) { @@ -578,10 +579,24 @@ export class Timer { this.intervalIds.push(id); if (signal != null) { signal.addEventListener('abort', () => { - clearInterval(id); - this.intervalIds = this.intervalIds.filter(i => i !== id); + this.clearInterval(id); }); } + return () => this.clearInterval(id); + } + + private clearTimeout(id: number) { + // workerで実行される可能性がある + // eslint-disable-next-line no-restricted-globals + clearTimeout(id); + this.timeoutIds = this.timeoutIds.filter(i => i !== id); + } + + private clearInterval(id: number) { + // workerで実行される可能性がある + // eslint-disable-next-line no-restricted-globals + clearInterval(id); + this.intervalIds = this.intervalIds.filter(i => i !== id); } public dispose() {