cozyclay 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +109 -0
  3. package/THIRD_PARTY_NOTICES.md +29 -0
  4. package/bin/cozyclay.mjs +194 -0
  5. package/dist/ardy/cskel27-rest.json +557 -0
  6. package/dist/assets/basis_transcoder-VXdx5NbI.wasm +0 -0
  7. package/dist/assets/basis_transcoder-o4Hde_L7.js +19 -0
  8. package/dist/assets/draco_decoder-C32yEggz.wasm +0 -0
  9. package/dist/assets/draco_decoder-Z1_iN-Ht.wasm +0 -0
  10. package/dist/assets/draco_decoder-fzg4nYZr.js +34 -0
  11. package/dist/assets/draco_wasm_wrapper-DxJM36Ib.js +117 -0
  12. package/dist/assets/draco_wasm_wrapper-fZCQGLGb.js +116 -0
  13. package/dist/assets/index-BW_S1YRy.js +4395 -0
  14. package/dist/assets/index-nRmmJgap.css +1 -0
  15. package/dist/demo/walk-then-stop.npz +0 -0
  16. package/dist/fonts/instrument-serif-italic-latin.woff2 +0 -0
  17. package/dist/fonts/instrument-serif-latin.woff2 +0 -0
  18. package/dist/fonts/inter-latin.woff2 +0 -0
  19. package/dist/index.html +13 -0
  20. package/dist/models/x-bot-tpose.fbx +0 -0
  21. package/dist/models/y-bot-tpose.fbx +0 -0
  22. package/package.json +80 -0
  23. package/src/App.jsx +3840 -0
  24. package/src/ardy/client.js +140 -0
  25. package/src/ardy/convert.js +313 -0
  26. package/src/ardy/cskel27-neutral.js +39 -0
  27. package/src/ardy/cskel27.js +68 -0
  28. package/src/ardy/export.js +157 -0
  29. package/src/ardy/ik.js +610 -0
  30. package/src/ardy/npz.js +520 -0
  31. package/src/ardy/playback.js +414 -0
  32. package/src/ardy/prompt-clips.js +16 -0
  33. package/src/ardy/timeline-coordinates.js +17 -0
  34. package/src/ardy/timeline-resize.js +11 -0
  35. package/src/ardy/timeline.jsx +723 -0
  36. package/src/ardy/to-cskel27.js +205 -0
  37. package/src/ardy/waypoints.js +364 -0
  38. package/src/camera-follow.js +366 -0
  39. package/src/camera-move.js +286 -0
  40. package/src/controls.jsx +245 -0
  41. package/src/dualview.jsx +305 -0
  42. package/src/hierarchy-model.js +77 -0
  43. package/src/hierarchy-panel.jsx +365 -0
  44. package/src/history.js +90 -0
  45. package/src/main.jsx +10 -0
  46. package/src/object-catalog.jsx +90 -0
  47. package/src/object-gizmo.jsx +755 -0
  48. package/src/planview.jsx +653 -0
  49. package/src/poses.js +424 -0
  50. package/src/posestudio.jsx +811 -0
  51. package/src/props.jsx +302 -0
  52. package/src/room.jsx +64 -0
  53. package/src/scene-history.js +125 -0
  54. package/src/scene-objects.js +420 -0
  55. package/src/shot-authoring.js +113 -0
  56. package/src/shot.js +239 -0
  57. package/src/styles.css +5639 -0
  58. package/src/ui.jsx +391 -0
  59. package/src/use-render-activity.js +96 -0
  60. package/tools/ardy/BRIDGE.md +255 -0
  61. package/tools/ardy/README.md +136 -0
  62. package/tools/ardy/__pycache__/cclay_sequence_generate.cpython-313.pyc +0 -0
  63. package/tools/ardy/bridge.mjs +1427 -0
  64. package/tools/ardy/cclay_motion_edit.py +445 -0
  65. package/tools/ardy/cclay_sequence_generate.py +595 -0
  66. package/tools/ardy/dump-npz.py +205 -0
  67. package/tools/ardy/extract-rest.mjs +299 -0
  68. package/tools/ardy/npz.mjs +335 -0
  69. package/tools/ardy/out/gen-1786443326924-c6019e-generated.npz +0 -0
  70. package/tools/ardy/out/gen-1786443609325-0053db-generated.npz +0 -0
  71. package/tools/ardy/out/gen-1786443835628-749ed1-generated.npz +0 -0
  72. package/tools/ardy/out/gen-1786462605247-03cb19-generated.npz +0 -0
  73. package/tools/ardy/pose-to-npz.mjs +106 -0
  74. package/tools/ardy/run-edit-on-box.sh +73 -0
  75. package/tools/ardy/run-on-box.sh +568 -0
  76. package/tools/ardy/run-sequence-on-box.sh +162 -0
  77. package/tools/ardy/visual-qa.mjs +188 -0
  78. package/tools/ardy/vq-car.mjs +52 -0
  79. package/tools/dev-full.mjs +29 -0
  80. package/tools/process-supervisor.mjs +63 -0
  81. package/tools/qa-browser.mjs +84 -0
  82. package/tools/qa-crop3.mjs +22 -0
  83. package/tools/qa-playview.mjs +49 -0
  84. package/tools/qa-screenshot.mjs +24 -0
  85. package/tools/qa-visual.mjs +51 -0
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ /* Capture the studio screenshot for docs/images. */
3
+ import { writeFileSync } from "node:fs";
4
+ const port = Number(process.env.CDP_PORT || 9222);
5
+ const targets = await (await fetch(`http://127.0.0.1:${port}/json`)).json();
6
+ const page = targets.find((t) => t.type === "page" && t.webSocketDebuggerUrl);
7
+ const ws = new WebSocket(page.webSocketDebuggerUrl);
8
+ await new Promise((res, rej) => { ws.onopen = res; ws.onerror = rej; });
9
+ let nextId = 1; const pending = new Map();
10
+ ws.onmessage = (e) => { const m = JSON.parse(e.data); if (!m.id || !pending.has(m.id)) return; const { resolve } = pending.get(m.id); pending.delete(m.id); resolve(m.result); };
11
+ const send = (method, params = {}) => new Promise((resolve) => { const id = nextId++; pending.set(id, { resolve }); ws.send(JSON.stringify({ id, method, params })); });
12
+ await send("Page.enable");
13
+ await new Promise((r) => setTimeout(r, 3500));
14
+ globalThis.evaluate = async (expression) => { const r = await send("Runtime.evaluate", { expression, returnByValue: true, awaitPromise: true }); return r.result?.value; };
15
+ await send("Runtime.enable");
16
+ for (let i = 0; i < 50 && !(await evaluate("!!window.__sceneHistory && document.querySelectorAll('.hierarchy-row').length > 0").catch(() => false)); i++) await new Promise((r) => setTimeout(r, 200));
17
+ await evaluate("document.querySelector('.add-object-trigger').click()");
18
+ await new Promise((r) => setTimeout(r, 400));
19
+ await evaluate("[...document.querySelectorAll('.add-object-item')].find(b => b.textContent.startsWith('Cube')).click()");
20
+ await new Promise((r) => setTimeout(r, 1500));
21
+ const shot = await send("Page.captureScreenshot", { format: "png" });
22
+ writeFileSync(new URL("../docs/images/cozyclay-studio.png", import.meta.url), Buffer.from(shot.data, "base64"));
23
+ console.log("saved docs/images/cozyclay-studio.png");
24
+ ws.close();
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ /* Multi-state visual QA capture: default, object selected, ARDY motion
3
+ inspector, PlayView. Review the PNGs to spot spacing issues. */
4
+ import { writeFileSync } from "node:fs";
5
+ const port = Number(process.env.CDP_PORT || 9222);
6
+ const targets = await (await fetch(`http://127.0.0.1:${port}/json`)).json();
7
+ const page = targets.find((t) => t.type === "page" && t.webSocketDebuggerUrl);
8
+ const ws = new WebSocket(page.webSocketDebuggerUrl);
9
+ await new Promise((res, rej) => { ws.onopen = res; ws.onerror = rej; });
10
+ let nextId = 1; const pending = new Map();
11
+ ws.onmessage = (e) => { const m = JSON.parse(e.data); if (!m.id || !pending.has(m.id)) return; const { resolve, reject } = pending.get(m.id); pending.delete(m.id); m.error ? reject(new Error(JSON.stringify(m.error))) : resolve(m.result); };
12
+ const send = (method, params = {}) => new Promise((resolve, reject) => { const id = nextId++; pending.set(id, { resolve, reject }); ws.send(JSON.stringify({ id, method, params })); });
13
+ const evaluate = async (expression) => { const r = await send("Runtime.evaluate", { expression, returnByValue: true, awaitPromise: true }); if (r.exceptionDetails) throw new Error(r.exceptionDetails.exception?.description); return r.result.value; };
14
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
15
+ const shot = async (name) => {
16
+ const s = await send("Page.captureScreenshot", { format: "png" });
17
+ writeFileSync(new URL(`../artifacts/vqa-${name}.png`, import.meta.url), Buffer.from(s.data, "base64"));
18
+ console.log("captured", name);
19
+ };
20
+
21
+ await send("Runtime.enable"); await send("Page.enable");
22
+ await sleep(3500);
23
+ for (let i = 0; i < 50 && !(await evaluate("!!window.__sceneHistory && document.querySelectorAll('.hierarchy-row').length > 0").catch(() => false)); i++) await sleep(200);
24
+ await shot("default");
25
+
26
+ // object selected -> Object Transform inspector
27
+ await evaluate("document.querySelector('.add-object-trigger').click()");
28
+ await sleep(400);
29
+ await evaluate("[...document.querySelectorAll('.add-object-item')].find(b => b.textContent.startsWith('Cube')).click()");
30
+ await sleep(1500);
31
+ await shot("transform");
32
+
33
+ // ARDY motion inspector
34
+ await evaluate("[...document.querySelectorAll('.hierarchy-row')].find(b => b.textContent.includes('Motion') && !b.textContent.includes('Base')).click()");
35
+ await sleep(600);
36
+ await shot("motion");
37
+
38
+ // camera inspector (slider rows)
39
+ await evaluate("[...document.querySelectorAll('.hierarchy-row')].find(b => b.textContent.trim() === 'Camera').click()");
40
+ await sleep(600);
41
+ await shot("camera");
42
+
43
+ // PlayView
44
+ await evaluate("[...document.querySelectorAll('.pane-tabs button')].find(b => b.textContent === 'PlayView').click()");
45
+ await sleep(800);
46
+ await shot("playview");
47
+ await evaluate("[...document.querySelectorAll('.pane-tabs button')].find(b => b.textContent === 'Scene').click()");
48
+ await sleep(500);
49
+
50
+ ws.close();
51
+ console.log("done");