@field/cascade 0.10.0 → 0.12.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 (229) hide show
  1. package/AGENTS.md +25 -5
  2. package/ARCHITECTURE.md +5 -4
  3. package/CHANGELOG.md +382 -0
  4. package/README.md +1 -2
  5. package/dist/assets/AgentPanel-1JugFjE4.css +1 -0
  6. package/dist/assets/AgentPanel-BDL5MddA.js +5 -0
  7. package/dist/assets/{CodeEditor-DSZBpzdy.js → CodeEditor-C-xYG-Wn.js} +120 -120
  8. package/dist/assets/CodePanel-CtXd50m6.js +2 -0
  9. package/dist/assets/CookInfoPanel-B3NMhKJF.css +1 -0
  10. package/dist/assets/CookInfoPanel-DG4_TRsX.js +2 -0
  11. package/dist/assets/CustomNodeDialog-CHfZUs-r.js +1 -0
  12. package/dist/assets/DefinitionNode-CaRTXQ_b.js +1 -0
  13. package/dist/assets/DefinitionPanel-C3CxZY9r.js +1 -0
  14. package/dist/assets/DefinitionPanel-VNLnAiQD.css +1 -0
  15. package/dist/assets/OpenGraphDialog-BLdr6k_q.js +1 -0
  16. package/dist/assets/ProjectSettings-ZnvmIAir.js +2 -0
  17. package/dist/assets/{SettingsDialog-p25h3tj0.js → SettingsDialog-CBX3Wa87.js} +1 -1
  18. package/dist/assets/TimelinePanel-CDeR0arY.css +1 -0
  19. package/dist/assets/TimelinePanel-CWgnFH1e.js +1 -0
  20. package/dist/assets/{VersionHistoryDialog-DzFLUotB.js → VersionHistoryDialog-BOSoW1R-.js} +1 -1
  21. package/dist/assets/assert-BO2_erPD.js +1 -0
  22. package/dist/assets/assert-hvykGCnP.js +1 -0
  23. package/dist/assets/builder-BmBKcDix.js +1 -0
  24. package/dist/assets/camera-DFF7YA3F.js +1 -0
  25. package/dist/assets/checks-DAvyO9Gf.js +1 -0
  26. package/dist/assets/contactSheet-N1NcaWxw.js +2 -0
  27. package/dist/assets/{core-BICrEt0y.js → core-DB-MkGjj.js} +3 -4
  28. package/dist/assets/coreTypes-DtnDATZ7.js +1 -0
  29. package/dist/assets/{cssMode-D7TXw57I.js → cssMode-DPVckSOc.js} +1 -1
  30. package/dist/assets/definitions-B227e7f_.js +1 -0
  31. package/dist/assets/definitions-D0WOUJd7.js +1 -0
  32. package/dist/assets/{editor.api-DvkCO3ko.js → editor.api-Dkutg_Z1.js} +1 -1
  33. package/dist/assets/expressions-X-Z-GrgW.js +5 -0
  34. package/dist/assets/file-DAL6IfjV.js +1 -0
  35. package/dist/assets/filters-D3k1LRMa.js +1 -0
  36. package/dist/assets/{freemarker2-BA2lxsF1.js → freemarker2-CLiLKk3B.js} +1 -1
  37. package/dist/assets/generators-BhDxRAFC.js +1 -0
  38. package/dist/assets/geo-BsMImJIJ.js +1 -0
  39. package/dist/assets/geo-C4YngDob.js +2 -0
  40. package/dist/assets/{handlebars-BcDiyPd8.js → handlebars-CcD3aMeL.js} +1 -1
  41. package/dist/assets/{html-C7O4TyhX.js → html-DvZWGfqb.js} +1 -1
  42. package/dist/assets/{htmlMode-WaDGF3Mj.js → htmlMode-DUD3VaoN.js} +1 -1
  43. package/dist/assets/image-0SfH-snh.js +1 -0
  44. package/dist/assets/image-Ck-RdGU4.js +2 -0
  45. package/dist/assets/index-BWnrmIB9.js +137 -0
  46. package/dist/assets/index-DIaxEONI.css +1 -0
  47. package/dist/assets/io-BGmt2g0D.js +1 -0
  48. package/dist/assets/{javascript-CpIEK7tz.js → javascript-Cap2ahgh.js} +1 -1
  49. package/dist/assets/{jsonMode-B2FltW0f.js → jsonMode-B0uLjp9C.js} +1 -1
  50. package/dist/assets/{liquid-CN6FFHZE.js → liquid-CnxwhfLn.js} +1 -1
  51. package/dist/assets/{lspLanguageFeatures-QhV9XtLp.js → lspLanguageFeatures-Dn9hlKX6.js} +1 -1
  52. package/dist/assets/math-GeULS-sk.js +1 -0
  53. package/dist/assets/{mdx-DE89pafV.js → mdx-BV3jbrVa.js} +1 -1
  54. package/dist/assets/pop-KMF_qloi.js +1 -0
  55. package/dist/assets/preload-helper-Czpn1I53.js +1 -0
  56. package/dist/assets/{python-ByTllTB9.js → python-CGyFk4XK.js} +1 -1
  57. package/dist/assets/{razor-USYlRRCE.js → razor-CQfzX3-N.js} +1 -1
  58. package/dist/assets/remap-5SjXQU-q.js +1 -0
  59. package/dist/assets/renderMarkdown-ork0Oir7.js +67 -0
  60. package/dist/assets/studioImages-CAyH-0Pl.js +1 -0
  61. package/dist/assets/text-ZpX7qNkx.js +2 -0
  62. package/dist/assets/time-P_OiBhcf.js +1 -0
  63. package/dist/assets/{tsMode-BXpN8iUz.js → tsMode-BOeXzO9H.js} +1 -1
  64. package/dist/assets/{typescript-DInBjGQQ.js → typescript-J1SnE_Tu.js} +1 -1
  65. package/dist/assets/{workers-C7Ye5B7D.js → workers-CYwwTiVF.js} +1 -1
  66. package/dist/assets/{xml-U0Uocqyo.js → xml-DnPRNzK9.js} +1 -1
  67. package/dist/assets/{yaml-CBw_PVYf.js → yaml-BmmYBNa9.js} +1 -1
  68. package/dist/cli/DefinitionNode-P7AA4TAU.js +15 -0
  69. package/dist/cli/Graph-OB6EWSGL.js +2975 -0
  70. package/dist/cli/assert-GROGQNCQ.js +25 -0
  71. package/dist/cli/checks-3WB44XBL.js +189 -0
  72. package/dist/cli/chunk-2JEU3MGB.js +1125 -0
  73. package/dist/cli/chunk-2KXB47FP.js +115 -0
  74. package/dist/cli/chunk-3RXL5GHB.js +816 -0
  75. package/dist/cli/chunk-53LGFPWX.js +138 -0
  76. package/dist/cli/chunk-5ORUQ6ES.js +267 -0
  77. package/dist/cli/chunk-73S4JZXK.js +336 -0
  78. package/dist/cli/chunk-7QE2ZNSN.js +121 -0
  79. package/dist/cli/chunk-BP7UKF36.js +376 -0
  80. package/dist/cli/chunk-BPODRH52.js +201 -0
  81. package/dist/cli/chunk-BZ63XQ3I.js +1301 -0
  82. package/dist/cli/chunk-CKS2FQWR.js +89 -0
  83. package/dist/cli/chunk-CO22XHNG.js +593 -0
  84. package/dist/cli/chunk-CTPLRSWF.js +2197 -0
  85. package/dist/cli/chunk-DEQSEFFH.js +153 -0
  86. package/dist/cli/chunk-EU4ZFZ7Y.js +122 -0
  87. package/dist/cli/chunk-EZRWJ4G2.js +104 -0
  88. package/dist/cli/chunk-FWMSGKEH.js +71 -0
  89. package/dist/cli/chunk-G23A2BZZ.js +705 -0
  90. package/dist/cli/chunk-GRIN2DDP.js +1465 -0
  91. package/dist/cli/chunk-HFHWYL55.js +139 -0
  92. package/dist/cli/chunk-HSNOBIVT.js +263 -0
  93. package/dist/cli/chunk-ICH7N5PN.js +26 -0
  94. package/dist/cli/chunk-J7VK7MNF.js +418 -0
  95. package/dist/cli/chunk-JVOCK5W4.js +83 -0
  96. package/dist/cli/chunk-KBGUO27Q.js +15 -0
  97. package/dist/cli/chunk-KH4MUBKF.js +1551 -0
  98. package/dist/cli/chunk-L6B6FUQP.js +330 -0
  99. package/dist/cli/chunk-LTXWBXOM.js +438 -0
  100. package/dist/cli/chunk-MI5JLQYA.js +220 -0
  101. package/dist/cli/chunk-MP653A5O.js +3766 -0
  102. package/dist/cli/chunk-NJFMDXHR.js +320 -0
  103. package/dist/cli/chunk-OM6BEME6.js +267 -0
  104. package/dist/cli/chunk-OWWBYLHC.js +136 -0
  105. package/dist/cli/chunk-QQPA2ZHH.js +273 -0
  106. package/dist/cli/chunk-RUU3YWXU.js +99 -0
  107. package/dist/cli/chunk-RXDIMXN5.js +98 -0
  108. package/dist/cli/chunk-ST6LROUG.js +267 -0
  109. package/dist/cli/chunk-TJW67QSI.js +225 -0
  110. package/dist/cli/chunk-WD62JIP6.js +118 -0
  111. package/dist/cli/chunk-WGKPJZDY.js +364 -0
  112. package/dist/cli/chunk-X4WKAOQP.js +634 -0
  113. package/dist/cli/chunk-X566FWBV.js +156 -0
  114. package/dist/cli/chunk-YH637PDL.js +317 -0
  115. package/dist/cli/chunk-ZL4JTG5Y.js +37 -0
  116. package/dist/cli/chunk-ZSCUZE6I.js +112 -0
  117. package/dist/cli/cliCommands-JJN5Z3ZC.js +3470 -0
  118. package/dist/cli/commands-PHYFYA3F.js +1374 -0
  119. package/dist/cli/contactSheet-2PQVRUFW.js +11 -0
  120. package/dist/cli/definitions-BPOPW52L.js +32 -0
  121. package/dist/cli/doctorCommand-ORWQRNYP.js +106 -0
  122. package/dist/cli/edit-S5KEQ5RA.js +28 -0
  123. package/dist/cli/editorCommands-NFR32JOY.js +41 -0
  124. package/dist/cli/encode-ICPEPMH5.js +17 -0
  125. package/dist/cli/file-3HTQHPYQ.js +41 -0
  126. package/dist/cli/filters-6ODFWYK4.js +379 -0
  127. package/dist/cli/frames-LSAUBZ7P.js +16 -0
  128. package/dist/cli/generators-YU7GB4MD.js +210 -0
  129. package/dist/cli/geo-6ZPGKZRU.js +43 -0
  130. package/dist/cli/graphCommands-EOUOBOIJ.js +184 -0
  131. package/dist/cli/graphFile-YTGJB5F5.js +292 -0
  132. package/dist/cli/headlessCanvas-ENRHC7GS.js +16 -0
  133. package/dist/cli/helpCommand-PULH6ZYB.js +157 -0
  134. package/dist/cli/image-TXELZZK5.js +55 -0
  135. package/dist/cli/index.js +100 -30756
  136. package/dist/cli/math-RSYRQ3C6.js +16 -0
  137. package/dist/cli/mcp-JVZFQOEX.js +164 -0
  138. package/dist/cli/parity-X6DEH2DV.js +334 -0
  139. package/dist/cli/pop-B7SIIYKN.js +39 -0
  140. package/dist/cli/project-VYGIA7JX.js +12 -0
  141. package/dist/cli/projectDefinition-F3D7UIHJ.js +27 -0
  142. package/dist/cli/projectRuntime-2Q4JKEH3.js +55 -0
  143. package/dist/cli/registerStandardNodes-BXJCB6E4.js +744 -0
  144. package/dist/cli/render-PT4MWI6U.js +438 -0
  145. package/dist/cli/runCommand-HNPQVZMS.js +198 -0
  146. package/dist/cli/runner-5XPXVW7J.js +43 -0
  147. package/dist/cli/runtime/image.ts +302 -0
  148. package/dist/cli/runtime/io.ts +78 -0
  149. package/dist/cli/runtime/stage.ts +4 -1
  150. package/dist/cli/share-MHF6TNRK.js +166 -0
  151. package/dist/cli/stageCache-TY2BFZJR.js +15 -0
  152. package/dist/cli/stageRunner-KY2EJP7X.js +10 -0
  153. package/dist/cli/text-MB3EKR4H.js +126 -0
  154. package/dist/cli/verbs-PI2JH5FI.js +19 -0
  155. package/dist/cli/webBuild-WPPMGGW7.js +44 -0
  156. package/dist/contracts/capabilities.d.ts +18 -1
  157. package/dist/contracts/color.d.ts +8 -0
  158. package/dist/contracts/color.js +23 -0
  159. package/dist/contracts/definition.d.ts +10 -0
  160. package/dist/contracts/documentFormat.d.ts +18 -0
  161. package/dist/contracts/documentFormat.js +195 -0
  162. package/dist/contracts/editor.d.ts +17 -0
  163. package/dist/contracts/index.d.ts +1 -0
  164. package/dist/contracts/index.js +1 -0
  165. package/dist/contracts/schema.d.ts +1 -1
  166. package/dist/contracts/schema.js +1 -0
  167. package/dist/contracts/validate.js +11 -1
  168. package/dist/contracts/values.d.ts +24 -0
  169. package/dist/image.d.ts +156 -0
  170. package/dist/image.js +161 -0
  171. package/dist/index.html +8 -2
  172. package/dist/io.d.ts +29 -0
  173. package/dist/io.js +40 -0
  174. package/dist/player/app.js +3 -2
  175. package/dist/player/editor.js +35 -9
  176. package/dist/player/editorEngine.js +3 -2
  177. package/dist/runtime/builtins/assert/checks.d.ts +18 -0
  178. package/dist/runtime/builtins/assert/checks.js +207 -0
  179. package/dist/runtime/builtins/assert/definitions.d.ts +130 -0
  180. package/dist/runtime/builtins/assert/definitions.js +54 -0
  181. package/dist/runtime/builtins/assert/index.d.ts +152 -0
  182. package/dist/runtime/builtins/assert/index.js +36 -0
  183. package/dist/runtime/builtins/image/contactSheet.d.ts +64 -0
  184. package/dist/runtime/builtins/image/contactSheet.js +150 -0
  185. package/dist/runtime/builtins/image/definitions.d.ts +950 -0
  186. package/dist/runtime/builtins/image/definitions.js +343 -0
  187. package/dist/runtime/builtins/image/file.d.ts +8 -0
  188. package/dist/runtime/builtins/image/file.js +37 -0
  189. package/dist/runtime/builtins/image/filters.d.ts +8 -0
  190. package/dist/runtime/builtins/image/filters.js +394 -0
  191. package/dist/runtime/builtins/image/generators.d.ts +7 -0
  192. package/dist/runtime/builtins/image/generators.js +144 -0
  193. package/dist/runtime/builtins/image/index.d.ts +952 -0
  194. package/dist/runtime/builtins/image/index.js +44 -0
  195. package/dist/runtime/builtins/image/io.d.ts +100 -0
  196. package/dist/runtime/builtins/image/io.js +142 -0
  197. package/dist/runtime/builtins/image/planar.d.ts +55 -0
  198. package/dist/runtime/builtins/image/planar.js +274 -0
  199. package/dist/runtime/builtins/image/simplex.d.ts +22 -0
  200. package/dist/runtime/builtins/image/simplex.js +92 -0
  201. package/dist/runtime/builtins/image/text.d.ts +4 -0
  202. package/dist/runtime/builtins/image/text.js +141 -0
  203. package/dist/runtime/builtins/index.d.ts +3 -0
  204. package/dist/runtime/builtins/index.js +7 -0
  205. package/dist/runtime/gpu.d.ts +25 -0
  206. package/dist/runtime/gpu.js +40 -0
  207. package/dist/runtime/runtime.d.ts +2 -0
  208. package/dist/runtime/runtime.js +268 -44
  209. package/dist/runtime/types.d.ts +30 -0
  210. package/dist/stage.js +4 -1
  211. package/doc/CLI_REFERENCE.md +91 -2
  212. package/doc/EDITOR_EXPORT.md +37 -2
  213. package/doc/MCP.md +18 -1
  214. package/doc/NODE_REFERENCE.md +424 -10
  215. package/doc/PROJECT_AUTHORING.md +222 -7
  216. package/package.json +19 -4
  217. package/dist/assets/CodePanel-sY6sZa7B.js +0 -2
  218. package/dist/assets/CustomNodeDialog-BRKnqZhp.js +0 -1
  219. package/dist/assets/ExportDialog-C7dVGua4.js +0 -358
  220. package/dist/assets/ExportDialog-DOq0flMV.css +0 -1
  221. package/dist/assets/OpenGraphDialog-ZsgL-iwr.js +0 -1
  222. package/dist/assets/ProjectSettings-Cw17nNe3.js +0 -2
  223. package/dist/assets/definitions-DUww2Rt-.js +0 -1
  224. package/dist/assets/geo-C2RHOVHC.js +0 -1
  225. package/dist/assets/image-DR4oeyJB.js +0 -2062
  226. package/dist/assets/index-7vae6YFC.css +0 -1
  227. package/dist/assets/index-DyvDC6pS.js +0 -219
  228. package/dist/assets/math-DaDEgWKt.js +0 -1
  229. package/dist/assets/pop-pLH7L0PW.js +0 -1
@@ -0,0 +1,139 @@
1
+ import {
2
+ ExpressionEvaluator,
3
+ isEmptyChannel,
4
+ parseBundleFieldPath,
5
+ sampleChannel
6
+ } from "./chunk-CO22XHNG.js";
7
+
8
+ // packages/runtime/src/params/resolve.ts
9
+ function isBoundProp(binding) {
10
+ if (!binding) return false;
11
+ return !!binding.expression || !isEmptyChannel(binding.channel);
12
+ }
13
+ function resolvePropBinding(binding, context) {
14
+ if (!isEmptyChannel(binding.channel)) {
15
+ const sampled = sampleChannel(binding.channel, context.frame);
16
+ if (sampled !== void 0) return { value: sampled, source: "channel" };
17
+ }
18
+ if (binding.expression && context.evaluateExpression) {
19
+ const result = context.evaluateExpression(binding.expression);
20
+ if (result?.error) {
21
+ return { value: binding.value, source: "value", error: result.error };
22
+ }
23
+ if (result) return { value: result.value, source: "expression" };
24
+ }
25
+ return { value: binding.value, source: "value" };
26
+ }
27
+
28
+ // packages/runtime/src/params/animator.ts
29
+ var PropAnimator = class {
30
+ constructor(topology) {
31
+ this.topology = topology;
32
+ this.resolving = /* @__PURE__ */ new Set();
33
+ this.evaluator = new ExpressionEvaluator(this.scope());
34
+ }
35
+ /** True when any parameter in the graph is bound at all — so a host can skip
36
+ * the whole pass, and a graph with no animation costs nothing. */
37
+ get animated() {
38
+ return this.topology.nodes.some(
39
+ (node) => Object.values(node.bindings).some((binding) => isBoundProp(binding))
40
+ );
41
+ }
42
+ setFrame(frame) {
43
+ this.evaluator.setFrame(frame);
44
+ }
45
+ setFps(fps) {
46
+ this.evaluator.setFps(fps);
47
+ }
48
+ /** Write every bound parameter's value at the current frame into `props`. */
49
+ resolveAll() {
50
+ for (const node of this.topology.nodes)
51
+ for (const name of Object.keys(node.bindings)) this.resolve(node, name);
52
+ }
53
+ /** Re-resolve one node's bound parameters, e.g. once its inputs exist. */
54
+ resolveNode(node) {
55
+ for (const name of Object.keys(node.bindings)) this.resolve(node, name);
56
+ }
57
+ /**
58
+ * One parameter, at the current frame.
59
+ *
60
+ * Re-entry returns the stored value rather than throwing: a parameter whose
61
+ * expression refers back to itself is an author's mistake, and the render
62
+ * that names it is more use than the one that dies.
63
+ */
64
+ resolve(node, name) {
65
+ const binding = node.bindings[name];
66
+ if (!binding) return node.props[name];
67
+ const key = `${node.id}.${name}`;
68
+ if (this.resolving.has(key)) return binding.value;
69
+ this.resolving.add(key);
70
+ try {
71
+ const resolved = resolvePropBinding(binding, {
72
+ frame: this.evaluator.fframe,
73
+ evaluateExpression: (expression) => this.evaluator.evaluate(expression, node)
74
+ });
75
+ if (resolved.error) this.topology.report?.(node.id, name, resolved.error);
76
+ node.props[name] = resolved.value;
77
+ return resolved.value;
78
+ } finally {
79
+ this.resolving.delete(key);
80
+ }
81
+ }
82
+ /**
83
+ * The host binding the expression engine reads through.
84
+ *
85
+ * A path names a parameter — `./radius`, `../blur1/amount`,
86
+ * `/root/blur1/amount` — and the last segment is always the parameter, the
87
+ * one before it the node. Anything a graph does not have resolves to null,
88
+ * which the engine turns into 0 / '' / [] per accessor rather than an
89
+ * exception: one broken reference must not take a render down.
90
+ */
91
+ scope() {
92
+ return {
93
+ resolveParam: (from, path) => {
94
+ const segments = split(path);
95
+ if (!segments.length) return null;
96
+ const name = segments[segments.length - 1];
97
+ const owner = this.owner(from, segments.slice(0, -1));
98
+ if (!owner) return null;
99
+ if (owner.bindings[name]) return { value: this.resolve(owner, name) };
100
+ const field = parseBundleFieldPath(name);
101
+ if (field && this.topology.inputValue) {
102
+ const bundle = this.topology.inputValue(owner, field.port);
103
+ if (bundle === null || typeof bundle !== "object") return null;
104
+ if (!Object.prototype.hasOwnProperty.call(bundle, field.field)) return null;
105
+ return { value: bundle[field.field] };
106
+ }
107
+ if (name in owner.props) return { value: owner.props[name] };
108
+ if (name in owner.inputs) return { value: owner.inputs[name] };
109
+ return null;
110
+ },
111
+ nodeExists: (from, path) => {
112
+ const segments = split(path);
113
+ if (!segments.length) return false;
114
+ const last = segments[segments.length - 1];
115
+ if (last === "..") return true;
116
+ return last === from.id || !!this.topology.node(last);
117
+ },
118
+ inputNode: (from, index) => this.topology.inputNode(from, index)
119
+ };
120
+ }
121
+ /** The node a path's leading segments name, or `from` when they name none. */
122
+ owner(from, segments) {
123
+ for (let i = segments.length - 1; i >= 0; i--) {
124
+ if (segments[i] === "..") continue;
125
+ return this.topology.node(segments[i]);
126
+ }
127
+ return from;
128
+ }
129
+ };
130
+ function split(path) {
131
+ return String(path ?? "").split("/").filter((segment) => segment.length > 0 && segment !== ".");
132
+ }
133
+
134
+ export {
135
+ isBoundProp,
136
+ resolvePropBinding,
137
+ PropAnimator
138
+ };
139
+ //# sourceMappingURL=chunk-HFHWYL55.js.map
@@ -0,0 +1,263 @@
1
+ import {
2
+ POSITION_ATTRIBUTE,
3
+ PRIMITIVE_KINDS,
4
+ attributeArray,
5
+ attributeArrayFrom,
6
+ createGeometry,
7
+ isStringAttribute
8
+ } from "./chunk-J7VK7MNF.js";
9
+
10
+ // packages/runtime/src/geometry/attributes.ts
11
+ function geometryError(code, message) {
12
+ throw new TypeError(`geometry/${code}: ${message}`);
13
+ }
14
+ function attributeSet(geometry, level) {
15
+ return geometry[level];
16
+ }
17
+ function numericAttribute(attribute, path, sizes) {
18
+ if (attribute === void 0) return void 0;
19
+ if (isStringAttribute(attribute))
20
+ geometryError("attribute-storage", `${path} must be numeric`);
21
+ if (sizes !== void 0 && !sizes.includes(attribute.size))
22
+ geometryError(
23
+ "attribute-size",
24
+ `${path} has size ${attribute.size}; expected ${sizes.join(" or ")}`
25
+ );
26
+ return attribute;
27
+ }
28
+ function readComponent(attribute, index, component = 0) {
29
+ return attribute.data[index * attribute.size + component];
30
+ }
31
+ function readElement(attribute, index) {
32
+ const values = new Array(attribute.size);
33
+ for (let component = 0; component < attribute.size; component += 1)
34
+ values[component] = attribute.data[index * attribute.size + component];
35
+ return values;
36
+ }
37
+ function readString(attribute, index) {
38
+ const slot = attribute.data[index];
39
+ return slot < 0 ? "" : attribute.table[slot] ?? "";
40
+ }
41
+ function positionSize(geometry) {
42
+ return geometry.point[POSITION_ATTRIBUTE].size;
43
+ }
44
+ function positionAttribute(geometry) {
45
+ return geometry.point[POSITION_ATTRIBUTE];
46
+ }
47
+ function getPosition(geometry, index) {
48
+ return readElement(positionAttribute(geometry), index);
49
+ }
50
+ function createAttribute(count, size, storage = "f64", fill) {
51
+ const data = attributeArray(storage, size * count);
52
+ if (fill !== void 0) {
53
+ const values = typeof fill === "number" ? [fill] : fill;
54
+ for (let index = 0; index < count; index += 1)
55
+ for (let component = 0; component < size; component += 1)
56
+ data[index * size + component] = values[component % Math.max(values.length, 1)] ?? 0;
57
+ }
58
+ return { storage, size, data };
59
+ }
60
+ function createStringAttribute(values) {
61
+ const table = [];
62
+ const slots = /* @__PURE__ */ new Map();
63
+ const data = new Int32Array(values.length);
64
+ for (let index = 0; index < values.length; index += 1) {
65
+ const value = values[index];
66
+ let slot = slots.get(value);
67
+ if (slot === void 0) {
68
+ slot = table.length;
69
+ table.push(value);
70
+ slots.set(value, slot);
71
+ }
72
+ data[index] = slot;
73
+ }
74
+ return { storage: "string", size: 1, table, data };
75
+ }
76
+ function withAttributeSet(geometry, level, set) {
77
+ return createGeometry({
78
+ pointCount: geometry.pointCount,
79
+ point: level === "point" ? set : geometry.point,
80
+ vertex: level === "vertex" ? set : geometry.vertex,
81
+ primitive: level === "primitive" ? set : geometry.primitive,
82
+ detail: geometry.detail,
83
+ topology: geometry.topology,
84
+ pointGroups: geometry.pointGroups,
85
+ primitiveGroups: geometry.primitiveGroups
86
+ });
87
+ }
88
+ function setAttribute(geometry, level, name, attribute) {
89
+ return withAttributeSet(geometry, level, {
90
+ ...geometry[level],
91
+ [name]: attribute
92
+ });
93
+ }
94
+ function copyAttributeArray(attribute) {
95
+ return attributeArrayFrom(attribute.storage, attribute.data);
96
+ }
97
+
98
+ // packages/runtime/src/geometry/builder.ts
99
+ var GeometryBuilder = class {
100
+ constructor(options = {}) {
101
+ this.positions = [];
102
+ this.vertexPoints = [];
103
+ this.offsets = [0];
104
+ this.kinds = [];
105
+ this.closed = [];
106
+ this.attributes = { point: {}, vertex: {}, primitive: {} };
107
+ this.detail = {};
108
+ this.pointGroups = /* @__PURE__ */ new Map();
109
+ this.primitiveGroups = /* @__PURE__ */ new Map();
110
+ this.size = options.positionSize ?? 2;
111
+ this.storage = options.positionStorage ?? "f64";
112
+ }
113
+ get pointCount() {
114
+ return this.positions.length / this.size;
115
+ }
116
+ get vertexCount() {
117
+ return this.vertexPoints.length;
118
+ }
119
+ get primitiveCount() {
120
+ return this.offsets.length - 1;
121
+ }
122
+ /** Append one point and return its index. */
123
+ addPoint(x, y, z = 0) {
124
+ const index = this.pointCount;
125
+ this.positions.push(x, y);
126
+ if (this.size === 3) this.positions.push(z);
127
+ return index;
128
+ }
129
+ /** Append points from a flat array of `positionSize`-wide entries. */
130
+ addPoints(flat) {
131
+ if (flat.length % this.size !== 0)
132
+ geometryError(
133
+ "point-stride",
134
+ `${flat.length} values is not a multiple of the position size ${this.size}`
135
+ );
136
+ const first = this.pointCount;
137
+ for (let index = 0; index < flat.length; index += 1)
138
+ this.positions.push(flat[index]);
139
+ return first;
140
+ }
141
+ /**
142
+ * Append one primitive over existing point indices and return its index. A
143
+ * closed primitive does not repeat its first point: `closed` is topology, not
144
+ * a duplicated vertex.
145
+ */
146
+ addPrimitive(points, options = {}) {
147
+ const index = this.primitiveCount;
148
+ for (const point of points) {
149
+ if (!Number.isInteger(point) || point < 0 || point >= this.pointCount)
150
+ geometryError(
151
+ "vertex-point",
152
+ `primitive ${index} references point ${point} of ${this.pointCount}`
153
+ );
154
+ this.vertexPoints.push(point);
155
+ }
156
+ this.offsets.push(this.vertexPoints.length);
157
+ this.kinds.push(PRIMITIVE_KINDS.indexOf(options.kind ?? "poly"));
158
+ this.closed.push(options.closed ? 1 : 0);
159
+ return index;
160
+ }
161
+ /** Append points and one primitive over them, the common generator case. */
162
+ addPolygon(flat, options = {}) {
163
+ const first = this.addPoints(flat);
164
+ const points = [];
165
+ for (let index = first; index < this.pointCount; index += 1)
166
+ points.push(index);
167
+ return this.addPrimitive(points, options);
168
+ }
169
+ setAttribute(level, name, attribute) {
170
+ if (level === "point" && name === POSITION_ATTRIBUTE)
171
+ geometryError(
172
+ "set-position",
173
+ "point.P is owned by the builder; use addPoint"
174
+ );
175
+ this.attributes[level][name] = attribute;
176
+ return this;
177
+ }
178
+ setNumericAttribute(level, name, values, size = 1, storage = "f64") {
179
+ return this.setAttribute(level, name, {
180
+ storage,
181
+ size,
182
+ data: attributeArrayFrom(storage, values)
183
+ });
184
+ }
185
+ setStringAttribute(level, name, values) {
186
+ return this.setAttribute(level, name, createStringAttribute(values));
187
+ }
188
+ setDetail(name, value) {
189
+ this.detail[name] = value;
190
+ return this;
191
+ }
192
+ addToPointGroup(name, index) {
193
+ const members = this.pointGroups.get(name) ?? /* @__PURE__ */ new Set();
194
+ members.add(index);
195
+ this.pointGroups.set(name, members);
196
+ return this;
197
+ }
198
+ addToPrimitiveGroup(name, index) {
199
+ const members = this.primitiveGroups.get(name) ?? /* @__PURE__ */ new Set();
200
+ members.add(index);
201
+ this.primitiveGroups.set(name, members);
202
+ return this;
203
+ }
204
+ build() {
205
+ const pointCount = this.pointCount;
206
+ const pointGroups = {};
207
+ for (const [name, members] of this.pointGroups)
208
+ pointGroups[name] = mask(members, pointCount);
209
+ const primitiveGroups = {};
210
+ for (const [name, members] of this.primitiveGroups)
211
+ primitiveGroups[name] = mask(members, this.primitiveCount);
212
+ return createGeometry({
213
+ pointCount,
214
+ point: {
215
+ ...this.attributes.point,
216
+ [POSITION_ATTRIBUTE]: {
217
+ storage: this.storage,
218
+ size: this.size,
219
+ data: attributeArrayFrom(this.storage, this.positions)
220
+ }
221
+ },
222
+ vertex: this.attributes.vertex,
223
+ primitive: this.attributes.primitive,
224
+ detail: this.detail,
225
+ topology: {
226
+ vertexPoints: Int32Array.from(this.vertexPoints),
227
+ offsets: Int32Array.from(this.offsets),
228
+ kinds: Uint8Array.from(this.kinds),
229
+ closed: Uint8Array.from(this.closed)
230
+ },
231
+ pointGroups,
232
+ primitiveGroups
233
+ });
234
+ }
235
+ };
236
+ function mask(members, count) {
237
+ const result = new Uint8Array(count);
238
+ for (const member of members) {
239
+ if (!Number.isInteger(member) || member < 0 || member >= count)
240
+ geometryError("group-indices", `group references element ${member}`);
241
+ result[member] = 1;
242
+ }
243
+ return result;
244
+ }
245
+
246
+ export {
247
+ geometryError,
248
+ attributeSet,
249
+ numericAttribute,
250
+ readComponent,
251
+ readElement,
252
+ readString,
253
+ positionSize,
254
+ positionAttribute,
255
+ getPosition,
256
+ createAttribute,
257
+ createStringAttribute,
258
+ withAttributeSet,
259
+ setAttribute,
260
+ copyAttributeArray,
261
+ GeometryBuilder
262
+ };
263
+ //# sourceMappingURL=chunk-HSNOBIVT.js.map
@@ -0,0 +1,26 @@
1
+ // src/cli/sequence.ts
2
+ import path from "node:path";
3
+ function sequenceWidth(end) {
4
+ return Math.max(4, String(Math.floor(end)).length);
5
+ }
6
+ function sequenceFileName(nodeId, frame, source, width, port) {
7
+ const extension = path.extname(source) || ".png";
8
+ const safe = (text) => text.replace(/[^a-zA-Z0-9_-]/g, "_");
9
+ const stem = port ? `${safe(nodeId)}.${safe(port)}` : safe(nodeId);
10
+ return `${stem}.${String(Math.floor(frame)).padStart(width, "0")}${extension}`;
11
+ }
12
+ function imagePath(value) {
13
+ if (typeof value === "string") return value || null;
14
+ if (value && typeof value === "object") {
15
+ const candidate = value.path;
16
+ if (typeof candidate === "string" && candidate) return candidate;
17
+ }
18
+ return null;
19
+ }
20
+
21
+ export {
22
+ sequenceWidth,
23
+ sequenceFileName,
24
+ imagePath
25
+ };
26
+ //# sourceMappingURL=chunk-ICH7N5PN.js.map