fix(scenes): el gizmo de world SFX anclado usa la pose viva - #315
Merged
IAnMove merged 1 commit intoSep 10, 2026
Merged
Conversation
Un arrastre a mitad del demo de duelo invertía el offset con la pose de reposo del slot, así que el círculo quedaba a metros del actor. #311 se mergeó en feat/world-sfx-3d-20260910 después de integrar esa rama; este cambio aplica el mismo arreglo sobre development. Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
PR Review — Loreframe StudioRisk: low Automated review from Findings
Changed files
CONTRIBUTING checklist
Posted by the repo PR review workflow. Re-runs on each push to the PR. |
Code healthQuality score: 59.4/100Higher is better. The score is a trend dashboard; the independent ratchet below remains the CI gate.
Change vs PR base: +0.0 points.
Markdown, JSON catalogs and tests are out of this table. Only Most complex functions
Trend vs baseline
Warnings
Ratchet passed. |
IAnMove
marked this pull request as ready for review
September 10, 2026 15:38
Author
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_f10ec871-4102-4637-ae03-c4d234b007da) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resumen ejecutivo
Qué cambia
El gizmo de un world SFX anclado a un actor ya no escribe
anchor.offsetcon la pose de reposo del slot. Usa la pose viva del fotograma (y el root GPU si existe).Para qué sirve
En el demo de duelo, pausar a mitad de viaje y arrastrar el círculo mágico dejaba el efecto a ~2 m del actor. Ese offset se persistía en la escena. #311 arregló lo mismo, pero se mergeó en
feat/world-sfx-3d-20260910después de integrar esa rama endevelopment; el bug seguía en HEAD.Impacto para el usuario
Arrastrar un portal, círculo, aura u orbe anclado a un personaje en movimiento deja el efecto pegado al actor. Guardar o exportar ya no corrompe el offset.
Riesgo
Estado
Summary
onTransformfor anchored world SFX calledworldAnchorOffsetFromWorldPoint(slot, worldPoint)with the document rest pose. Playback/seek usesslotPoseAtTime. A mid-travel duel-demo drag (pause at t=5, nudge the circle) inverted ~2 m of travel into local Z. The circle jumped and the bad offset persisted.Fix:
applyWorldSfxTranslatewrites the offset from the live pose, or fromworldAnchorOffsetFromSlotRootwhen the GPU root is attached (handles scale). Same change as #311, retargeted todevelopment.Overview
[-2.2, 0, 0.2], so the circle teleports.slotPoseAtTime/ GPUworldToLocal, so the circle stays on the actor.Detailed changes
Backend
No backend changes.
UI and Wizard
applyWorldSfxTranslateinworld.tspersists live-pose or GPU-local offset.worldAnchorOffsetFromSlotRootinverts a scaled/rotated slot root.attachedAnchorSlotIdand fillspatch.anchorOffset.slotPoseAtTime(slot, seconds, duration)instead of the rest slot.Data, provenance and compatibility
Existing cues keep their stored offsets. Only new gizmo writes change. Unanchored cues still write
position.Files and ownership
ui/src/features/sceneFx/world.ts— live-pose persist helperui/src/features/sceneFx/worldRuntime.ts— GPU local inverseui/src/features/scene3d/transformGizmo.ts— attach +anchorOffsetpatchui/src/features/scene3d/Scene3DWorkspace.tsx— use live pose on translateui/tests/worldSfxRuntime.test.ts— duel mid-travel + scaled-root inverseDeliberately untouched: playback posing, MCP apply, showcase/replace (already fixed in #307/#309).
Validation
Date (UTC): 2026-09-10
Base SHA:
cde67d3983a7e1f2e79433be2ff90385e0576285(origin/development)Head SHA:
4492d7a1f7a229dc31ef367699d71103ceaa008eValidation scope: focused
python scripts/verify_clean_repo.pypython -m compileall -q app/services app/launch.py scriptsFocused Python tests: N/A (UI-only)
cd ui && npm run i18n:checkUI tests:
npx tsx --tsconfig tsconfig.app.json --import ./tests/setupI18n.ts --test tests/worldSfxRuntime.test.ts— 7 passedcd ui && npm run lint -- --max-warnings=0cd ui && npm run buildgit diff --check(clean on commit)E2E/smoke checks: N/A — unit tests lock the duel mid-travel trigger and GPU
worldToLocalinverse; full WebGL drag needs a GPU workstationCode quality
main: pending CICI and review
CI of this HEAD: pending
Independent agent review of this HEAD: pending
Human merge click (operational, not code review): pending
Reviewed at current HEAD
Earlier review; HEAD has changed since (stale)
Pending
Unavailable
Coste de la tarea
Notes and limitations
#311 is merged into the already-integrated feature branch, not
development. Do not retarget this PR to that branch.Editing is disabled while playing; the trigger is seek/pause then drag.
Follow-up work
open_3d_scenelate import after workspace switch.Checklist
Note
Low Risk
UI-only change to how gizmo drags persist anchor offsets; existing stored offsets are untouched and behavior is covered by focused unit tests.
Overview
Fixes anchored world SFX so moving them with the 3D gizmo no longer bakes in the slot’s rest pose when the actor is mid-animation (e.g. pause at t≈5 in the duel demo and nudge the magic circle).
applyWorldSfxTranslatecentralizes translate persistence: anchored cues getanchor.offsetfromslotPoseAtTimeat the current timeline, or from an optionalanchorOffsetcomputed in the gizmo viaworldAnchorOffsetFromSlotRoot(worldToLocalon the live GPU slot root, so scale/rotation match what’s on screen). Unanchored cues still updateposition.The transform gizmo tracks the anchor slot id and attaches
anchorOffseton translate drags;Scene3DWorkspacewires that into world SFX updates instead of inlining rest-slot math. Tests cover mid-travel duel offsets and round-trip through a scaled slot root.Reviewed by Cursor Bugbot for commit 4492d7a. Configure here.