feat: edit moving source trajectories

This commit is contained in:
Codex
2026-08-28 16:04:55 +09:00
parent acb36bf15d
commit a20b55e8e2
8 changed files with 499 additions and 15 deletions
+13
View File
@@ -100,6 +100,16 @@ test("Dataset Builder 전체 저장·재연결 흐름이 동일한 scene과 prev
assertNear(Number(documentObject.querySelector("#source-x").value), 0.3, 0.002, "canvas x");
assertNear(Number(documentObject.querySelector("#source-y").value), 0.225, 0.002, "canvas y");
dispatchChecked(windowObject, documentObject.querySelector("#source-motion"), true);
assertEqual(documentObject.querySelectorAll(".trajectory-row").length, 2, "default trajectory points");
assertEqual(documentObject.querySelector(".trajectory-row input").value, "0", "trajectory starts at zero");
documentObject.querySelector("#add-keyframe-button").click();
assertEqual(documentObject.querySelectorAll(".trajectory-row").length, 3, "keyframe added");
documentObject.querySelectorAll(".trajectory-row")[1].querySelector(".trajectory-row__remove").click();
assertEqual(documentObject.querySelectorAll(".trajectory-row").length, 2, "keyframe removed");
dispatchValue(windowObject, documentObject.querySelector("#preview-time"), "0.1");
assertEqual(documentObject.querySelector("#preview-time-value").textContent, "0.10 s", "preview time label");
dispatchValue(windowObject, documentObject.querySelector("#ambient-type"), "asset", "change");
dispatchChecked(windowObject, documentObject.querySelector("#ambient-loop"), true);
await waitFor(() => documentObject.documentElement.dataset.sceneValid === "true", "편집 scene 검증");
@@ -122,6 +132,9 @@ test("Dataset Builder 전체 저장·재연결 흐름이 동일한 scene과 prev
const firstScene = JSON.parse(firstJsonText);
assertEqual(firstScene.sources.length, 2, "exported source count");
assertEqual(firstScene.sources[1].signal.loop, true, "source loop exported");
assertEqual(firstScene.sources[1].trajectory.length, 2, "trajectory exported");
assertEqual(firstScene.sources[1].trajectory[0].position.join(","), firstScene.sources[1].position.join(","), "fallback position synced");
assertEqual(firstScene.sources[1].trajectory[1].time, firstScene.duration, "trajectory spans scene");
assertEqual(firstScene.ambient[0].signal.loop, true, "ambient loop exported");
assertEqual(firstScene.image.widthPixels, 640, "image width exported");
assert(firstScene.assets.every((asset) => /^[a-f0-9]{64}$/.test(asset.sha256)), "asset hashes exported");