From 16a677dc894ff31ee9ae8b14402589a2b4407a63 Mon Sep 17 00:00:00 2001 From: Hiren Kangad Date: Thu, 12 Mar 2026 18:56:08 +0530 Subject: [PATCH] fix: remove entrance animation so dropped items are instantly draggable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Items were fading in from alpha 0 via spring animation, preventing immediate interaction. Removed the entrance animation entirely — items now appear at full opacity and are movable on first frame. --- frontend/src/canvas/PixiCanvas.tsx | 4 ++-- frontend/src/canvas/SceneManager.ts | 23 ++++++----------------- frontend/src/canvas/history.ts | 2 +- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/frontend/src/canvas/PixiCanvas.tsx b/frontend/src/canvas/PixiCanvas.tsx index 526e983..6d447fb 100644 --- a/frontend/src/canvas/PixiCanvas.tsx +++ b/frontend/src/canvas/PixiCanvas.tsx @@ -357,7 +357,7 @@ const PixiCanvas = forwardRef( // Re-load scene data so textures get re-uploaded to GPU if (sceneRef.current && initialLoadDone.current) { const data = sceneRef.current.serialize(); - sceneRef.current.loadScene(data, false); + sceneRef.current.loadScene(data); } }; canvas.addEventListener('webglcontextlost', onContextLost); @@ -441,7 +441,7 @@ const PixiCanvas = forwardRef( } initialLoadDone.current = true; - sceneRef.current.loadScene(sceneData, false); + sceneRef.current.loadScene(sceneData); }, [canvasState, pixiReady]); // ── Space key for pan mode ──────────────────────────────────────── diff --git a/frontend/src/canvas/SceneManager.ts b/frontend/src/canvas/SceneManager.ts index e9358b6..a4c636c 100644 --- a/frontend/src/canvas/SceneManager.ts +++ b/frontend/src/canvas/SceneManager.ts @@ -215,7 +215,7 @@ export class SceneManager { * 3. Create new items * 4. Apply z-ordering */ - async loadScene(scene: SceneData, animate = false): Promise { + async loadScene(scene: SceneData, _animate?: boolean): Promise { const incomingById = new Map(); for (const obj of scene.objects) { incomingById.set(obj.id, obj); @@ -258,7 +258,7 @@ export class SceneManager { if (existing) { this._updateItem(existing, data); } else { - loadPromises.push(this._createItem(data, animate)); + loadPromises.push(this._createItem(data)); } // Track highest z for nextZ() @@ -282,7 +282,7 @@ export class SceneManager { // -- Item Creation ------------------------------------------------------- /** Create a PixiJS display object from scene data and add it to the viewport. */ - async _createItem(data: AnySceneObject, animate: boolean): Promise { + async _createItem(data: AnySceneObject, _animate?: boolean): Promise { let displayObject: Container; switch (data.type) { @@ -380,18 +380,7 @@ export class SceneManager { }; } - // Animate entrance: quick fade-in (no bounce — items are immediately interactive) - if (animate) { - displayObject.alpha = 0; - - const alphaSpring = new Spring(0, data.opacity, PRESETS.snappy); - alphaSpring.onUpdate = (v) => { - if (!displayObject.destroyed) { - displayObject.alpha = v; - } - }; - this.springs.add(alphaSpring); - } + // No entrance animation — items must be visible and draggable immediately. } // -- Item Update --------------------------------------------------------- @@ -596,7 +585,7 @@ export class SceneManager { }; // Fire-and-forget the async creation (animation handles visual feedback) - this._createItem(data, true); + this._createItem(data); this._applyZOrder(); this._onChange?.(); @@ -638,7 +627,7 @@ export class SceneManager { duration, }; - this._createItem(data, true); + this._createItem(data); this._applyZOrder(); this._onChange?.(); diff --git a/frontend/src/canvas/history.ts b/frontend/src/canvas/history.ts index beb6948..0a15a54 100644 --- a/frontend/src/canvas/history.ts +++ b/frontend/src/canvas/history.ts @@ -70,7 +70,7 @@ export class UndoManager { this.locked = true; const parsed = JSON.parse(state); - this.sceneManager.loadScene(parsed, false).then(() => { + this.sceneManager.loadScene(parsed).then(() => { this.locked = false; }); }