@field/cascade 0.2.22
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.
- package/AGENTS.md +168 -0
- package/ARCHITECTURE.md +137 -0
- package/DESIGN.md +161 -0
- package/LICENSE +21 -0
- package/README.md +229 -0
- package/dist/assets/CodeEditor-DR7u0q7p.css +1 -0
- package/dist/assets/CodeEditor-DoaNEUaM.js +641 -0
- package/dist/assets/CodePanel-B0_2XJ-t.js +2 -0
- package/dist/assets/CodePanel-IT1secyI.css +1 -0
- package/dist/assets/CustomNodeDialog-026lzecD.js +1 -0
- package/dist/assets/CustomNodeDialog-JGYnWY6m.css +1 -0
- package/dist/assets/ExportDialog-DOq0flMV.css +1 -0
- package/dist/assets/ExportDialog-DWN4nhXI.js +358 -0
- package/dist/assets/ProjectSettings-BzT164Yx.js +2 -0
- package/dist/assets/ProjectSettings-DdO9xoQz.css +1 -0
- package/dist/assets/SettingsDialog-CeK7ytpY.css +1 -0
- package/dist/assets/SettingsDialog-DmHb1V0r.js +1 -0
- package/dist/assets/VersionHistoryDialog-CWNmHQ-P.css +1 -0
- package/dist/assets/VersionHistoryDialog-hH6VsXLX.js +3 -0
- package/dist/assets/abap-08VXUWAP.js +1 -0
- package/dist/assets/apex-BWPQTe0t.js +1 -0
- package/dist/assets/azcli-Bc_sGQ0U.js +1 -0
- package/dist/assets/bat-i0X4ZdIN.js +1 -0
- package/dist/assets/bicep-B5-_aFwp.js +2 -0
- package/dist/assets/cameligo-DMUM7wLl.js +1 -0
- package/dist/assets/cascade.jpg +0 -0
- package/dist/assets/clojure-Cm7r79vr.js +1 -0
- package/dist/assets/codicon-Brq4_Ui5.ttf +0 -0
- package/dist/assets/coffee-Ba7i2nA0.js +1 -0
- package/dist/assets/core-Bji4aZUU.js +965 -0
- package/dist/assets/cpp-C7h46wYY.js +1 -0
- package/dist/assets/csharp-BKxtCVv1.js +1 -0
- package/dist/assets/csp-bTuwJoIa.js +1 -0
- package/dist/assets/css-DIMkf-bt.js +3 -0
- package/dist/assets/css.worker-B3ciXF_0.js +93 -0
- package/dist/assets/cssMode-B6Z_Q1Kh.js +1 -0
- package/dist/assets/cypher-CVaqCwHa.js +1 -0
- package/dist/assets/dart-onAF5SnQ.js +1 -0
- package/dist/assets/dockerfile-DZFCIeNp.js +1 -0
- package/dist/assets/ecl-D05T4iGw.js +1 -0
- package/dist/assets/editor-1FQrmyyI.css +1 -0
- package/dist/assets/editor.api-jMoW_43X.js +847 -0
- package/dist/assets/editor.worker-q-txB4vs.js +30 -0
- package/dist/assets/elixir-6RTg0lbw.js +1 -0
- package/dist/assets/flow9-C5_-GSwl.js +1 -0
- package/dist/assets/freemarker2-DvvPV6m5.js +3 -0
- package/dist/assets/fsharp-C8Ef5oNN.js +1 -0
- package/dist/assets/geo-CXmCtzMM.js +2 -0
- package/dist/assets/go-C-y9NEjX.js +1 -0
- package/dist/assets/graphql-fmXr3nnJ.js +1 -0
- package/dist/assets/handlebars-B8rfuSIa.js +1 -0
- package/dist/assets/hcl-CpzslTdj.js +1 -0
- package/dist/assets/html-DyHm6JCp.js +1 -0
- package/dist/assets/html.worker-C93Ht9o9.js +506 -0
- package/dist/assets/htmlMode-E9XLWE5u.js +1 -0
- package/dist/assets/image-BUcQC7PG.js +2076 -0
- package/dist/assets/index-BXYXSdgh.js +224 -0
- package/dist/assets/index-CrNke7SW.css +1 -0
- package/dist/assets/index-client-DN_FvjN8.js +1 -0
- package/dist/assets/ini-sBoK_t0W.js +1 -0
- package/dist/assets/java-BEtHBSE6.js +1 -0
- package/dist/assets/javascript-C_bM5PCN.js +1 -0
- package/dist/assets/json.worker-B2V3pomh.js +62 -0
- package/dist/assets/jsonMode-BdyVS7G4.js +7 -0
- package/dist/assets/julia-Bri6UV-V.js +1 -0
- package/dist/assets/kotlin-BOotOW0E.js +1 -0
- package/dist/assets/legacy-DIu3XRwl.js +2 -0
- package/dist/assets/less-B9JPFI3C.js +2 -0
- package/dist/assets/lexon-CfSJPG6W.js +1 -0
- package/dist/assets/liquid-CDkn3spA.js +1 -0
- package/dist/assets/lspLanguageFeatures-AB5DMAsr.js +4 -0
- package/dist/assets/lua-CsQS60Ue.js +1 -0
- package/dist/assets/m3-D-oSqn_W.js +1 -0
- package/dist/assets/markdown-Cimd5fb3.js +1 -0
- package/dist/assets/mdx-BvH_NjDN.js +1 -0
- package/dist/assets/mips-CIPQ_RoX.js +1 -0
- package/dist/assets/msdax-DauUninz.js +1 -0
- package/dist/assets/mysql-SOo6toE5.js +1 -0
- package/dist/assets/nodeTypeUtils-CweA3NHd.js +1 -0
- package/dist/assets/objective-c-FvmIjYaQ.js +1 -0
- package/dist/assets/pascal-DrH0SRf2.js +1 -0
- package/dist/assets/pascaligo-D-ptJ9y-.js +1 -0
- package/dist/assets/perl-oz_6vUea.js +1 -0
- package/dist/assets/pgsql-DTj74zXo.js +1 -0
- package/dist/assets/php-nr791fC2.js +1 -0
- package/dist/assets/pla-CopQ2nXW.js +1 -0
- package/dist/assets/postiats-43DmfD33.js +1 -0
- package/dist/assets/powerquery-D3hlyOfw.js +1 -0
- package/dist/assets/powershell-DmHpPYUd.js +1 -0
- package/dist/assets/projectSettingsApi-C1WvIwfP.js +1 -0
- package/dist/assets/protobuf-C531GsRP.js +2 -0
- package/dist/assets/pug-Z5eAx3Zn.js +1 -0
- package/dist/assets/python-B7uii4fi.js +1 -0
- package/dist/assets/qsharp-DkqhCAOL.js +1 -0
- package/dist/assets/quill-DjZ69wL_.js +121 -0
- package/dist/assets/r-BwWrilGY.js +1 -0
- package/dist/assets/razor-Z48fWdJc.js +1 -0
- package/dist/assets/redis-ClamHrr6.js +1 -0
- package/dist/assets/redshift-DT7zqm-g.js +1 -0
- package/dist/assets/restructuredtext-BYgofb2h.js +1 -0
- package/dist/assets/ruby-DezsRK8O.js +1 -0
- package/dist/assets/rust-DdL9SqIa.js +1 -0
- package/dist/assets/sb-CcwsVR0C.js +1 -0
- package/dist/assets/scala-DHpiXF5c.js +1 -0
- package/dist/assets/scheme-BeGwcela.js +1 -0
- package/dist/assets/scss-gp-XZpBa.js +3 -0
- package/dist/assets/shell-CC2rA5mh.js +1 -0
- package/dist/assets/solidity-BEEn4gHE.js +1 -0
- package/dist/assets/sophia-CRfGWb83.js +1 -0
- package/dist/assets/sparql-D_Lu-MrJ.js +1 -0
- package/dist/assets/sql-NEE52Syq.js +1 -0
- package/dist/assets/st-DbInun42.js +1 -0
- package/dist/assets/swift-Bxkupp3x.js +1 -0
- package/dist/assets/systemverilog-Bz4Y3fRF.js +1 -0
- package/dist/assets/tcl-DISqw1ZD.js +1 -0
- package/dist/assets/ts.worker-D7T1-Ig5.js +67738 -0
- package/dist/assets/tsMode-BDgacVG4.js +11 -0
- package/dist/assets/twig-De2hgUGE.js +1 -0
- package/dist/assets/typescript-Derb6Oqa.js +1 -0
- package/dist/assets/typespec-B8J7ngcE.js +1 -0
- package/dist/assets/vb-DV3o63ZY.js +1 -0
- package/dist/assets/wgsl-DpFanUEy.js +298 -0
- package/dist/assets/workers-BtoMX_pm.js +1 -0
- package/dist/assets/xml-B1CaFSrG.js +1 -0
- package/dist/assets/yaml-HmIeA0KH.js +1 -0
- package/dist/cli/index.js +11377 -0
- package/dist/cli/index.js.map +7 -0
- package/dist/cli/runtime/io.ts +445 -0
- package/dist/cli/runtime/net.ts +19 -0
- package/dist/cli/runtime/shell.ts +46 -0
- package/dist/cli/runtime/stage.ts +132 -0
- package/dist/contracts/capabilities.d.ts +109 -0
- package/dist/contracts/capabilities.d.ts.map +1 -0
- package/dist/contracts/capabilities.js +11 -0
- package/dist/contracts/capabilities.js.map +1 -0
- package/dist/contracts/color.d.ts +67 -0
- package/dist/contracts/color.d.ts.map +1 -0
- package/dist/contracts/color.js +83 -0
- package/dist/contracts/color.js.map +1 -0
- package/dist/contracts/definition.d.ts +118 -0
- package/dist/contracts/definition.d.ts.map +1 -0
- package/dist/contracts/definition.js +2 -0
- package/dist/contracts/definition.js.map +1 -0
- package/dist/contracts/document.d.ts +50 -0
- package/dist/contracts/document.d.ts.map +1 -0
- package/dist/contracts/document.js +2 -0
- package/dist/contracts/document.js.map +1 -0
- package/dist/contracts/geometry.d.ts +301 -0
- package/dist/contracts/geometry.d.ts.map +1 -0
- package/dist/contracts/geometry.js +604 -0
- package/dist/contracts/geometry.js.map +1 -0
- package/dist/contracts/index.d.ts +8 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +8 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/schema.d.ts +6 -0
- package/dist/contracts/schema.d.ts.map +1 -0
- package/dist/contracts/schema.js +85 -0
- package/dist/contracts/schema.js.map +1 -0
- package/dist/contracts/validate.d.ts +13 -0
- package/dist/contracts/validate.d.ts.map +1 -0
- package/dist/contracts/validate.js +202 -0
- package/dist/contracts/validate.js.map +1 -0
- package/dist/contracts/values.d.ts +100 -0
- package/dist/contracts/values.d.ts.map +1 -0
- package/dist/contracts/values.js +59 -0
- package/dist/contracts/values.js.map +1 -0
- package/dist/graphs/default-orig.cascade +128 -0
- package/dist/graphs/default.cascade +21 -0
- package/dist/index.html +19 -0
- package/dist/runtime/browser.d.ts +3 -0
- package/dist/runtime/browser.d.ts.map +1 -0
- package/dist/runtime/browser.js +12 -0
- package/dist/runtime/browser.js.map +1 -0
- package/dist/runtime/builtins/core/index.d.ts +9 -0
- package/dist/runtime/builtins/core/index.d.ts.map +1 -0
- package/dist/runtime/builtins/core/index.js +21 -0
- package/dist/runtime/builtins/core/index.js.map +1 -0
- package/dist/runtime/builtins/core/random.d.ts +66 -0
- package/dist/runtime/builtins/core/random.d.ts.map +1 -0
- package/dist/runtime/builtins/core/random.js +46 -0
- package/dist/runtime/builtins/core/random.js.map +1 -0
- package/dist/runtime/builtins/core/remap.d.ts +105 -0
- package/dist/runtime/builtins/core/remap.d.ts.map +1 -0
- package/dist/runtime/builtins/core/remap.js +43 -0
- package/dist/runtime/builtins/core/remap.js.map +1 -0
- package/dist/runtime/builtins/core/routing.d.ts +117 -0
- package/dist/runtime/builtins/core/routing.d.ts.map +1 -0
- package/dist/runtime/builtins/core/routing.js +114 -0
- package/dist/runtime/builtins/core/routing.js.map +1 -0
- package/dist/runtime/builtins/core/structural.d.ts +86 -0
- package/dist/runtime/builtins/core/structural.d.ts.map +1 -0
- package/dist/runtime/builtins/core/structural.js +63 -0
- package/dist/runtime/builtins/core/structural.js.map +1 -0
- package/dist/runtime/builtins/geo/copyToPoints.d.ts +58 -0
- package/dist/runtime/builtins/geo/copyToPoints.d.ts.map +1 -0
- package/dist/runtime/builtins/geo/copyToPoints.js +35 -0
- package/dist/runtime/builtins/geo/copyToPoints.js.map +1 -0
- package/dist/runtime/builtins/geo/definitions.d.ts +526 -0
- package/dist/runtime/builtins/geo/definitions.d.ts.map +1 -0
- package/dist/runtime/builtins/geo/definitions.js +182 -0
- package/dist/runtime/builtins/geo/definitions.js.map +1 -0
- package/dist/runtime/builtins/geo/generators.d.ts +94 -0
- package/dist/runtime/builtins/geo/generators.d.ts.map +1 -0
- package/dist/runtime/builtins/geo/generators.js +41 -0
- package/dist/runtime/builtins/geo/generators.js.map +1 -0
- package/dist/runtime/builtins/geo/index.d.ts +23 -0
- package/dist/runtime/builtins/geo/index.d.ts.map +1 -0
- package/dist/runtime/builtins/geo/index.js +35 -0
- package/dist/runtime/builtins/geo/index.js.map +1 -0
- package/dist/runtime/builtins/geo/merge.d.ts +40 -0
- package/dist/runtime/builtins/geo/merge.d.ts.map +1 -0
- package/dist/runtime/builtins/geo/merge.js +24 -0
- package/dist/runtime/builtins/geo/merge.js.map +1 -0
- package/dist/runtime/builtins/geo/namespace.d.ts +15 -0
- package/dist/runtime/builtins/geo/namespace.d.ts.map +1 -0
- package/dist/runtime/builtins/geo/namespace.js +17 -0
- package/dist/runtime/builtins/geo/namespace.js.map +1 -0
- package/dist/runtime/builtins/geo/svgExport.d.ts +130 -0
- package/dist/runtime/builtins/geo/svgExport.d.ts.map +1 -0
- package/dist/runtime/builtins/geo/svgExport.js +50 -0
- package/dist/runtime/builtins/geo/svgExport.js.map +1 -0
- package/dist/runtime/builtins/geo/transform.d.ts +60 -0
- package/dist/runtime/builtins/geo/transform.d.ts.map +1 -0
- package/dist/runtime/builtins/geo/transform.js +32 -0
- package/dist/runtime/builtins/geo/transform.js.map +1 -0
- package/dist/runtime/builtins/index.d.ts +9 -0
- package/dist/runtime/builtins/index.d.ts.map +1 -0
- package/dist/runtime/builtins/index.js +16 -0
- package/dist/runtime/builtins/index.js.map +1 -0
- package/dist/runtime/definition/architecture.d.ts +8 -0
- package/dist/runtime/definition/architecture.d.ts.map +1 -0
- package/dist/runtime/definition/architecture.js +112 -0
- package/dist/runtime/definition/architecture.js.map +1 -0
- package/dist/runtime/definition/extract.d.ts +12 -0
- package/dist/runtime/definition/extract.d.ts.map +1 -0
- package/dist/runtime/definition/extract.js +151 -0
- package/dist/runtime/definition/extract.js.map +1 -0
- package/dist/runtime/error.d.ts +8 -0
- package/dist/runtime/error.d.ts.map +1 -0
- package/dist/runtime/error.js +11 -0
- package/dist/runtime/error.js.map +1 -0
- package/dist/runtime/geometry/attributes.d.ts +65 -0
- package/dist/runtime/geometry/attributes.d.ts.map +1 -0
- package/dist/runtime/geometry/attributes.js +201 -0
- package/dist/runtime/geometry/attributes.js.map +1 -0
- package/dist/runtime/geometry/builder.d.ts +57 -0
- package/dist/runtime/geometry/builder.d.ts.map +1 -0
- package/dist/runtime/geometry/builder.js +153 -0
- package/dist/runtime/geometry/builder.js.map +1 -0
- package/dist/runtime/geometry/copy.d.ts +36 -0
- package/dist/runtime/geometry/copy.d.ts.map +1 -0
- package/dist/runtime/geometry/copy.js +68 -0
- package/dist/runtime/geometry/copy.js.map +1 -0
- package/dist/runtime/geometry/generate.d.ts +43 -0
- package/dist/runtime/geometry/generate.d.ts.map +1 -0
- package/dist/runtime/geometry/generate.js +76 -0
- package/dist/runtime/geometry/generate.js.map +1 -0
- package/dist/runtime/geometry/groups.d.ts +18 -0
- package/dist/runtime/geometry/groups.d.ts.map +1 -0
- package/dist/runtime/geometry/groups.js +69 -0
- package/dist/runtime/geometry/groups.js.map +1 -0
- package/dist/runtime/geometry/index.d.ts +23 -0
- package/dist/runtime/geometry/index.d.ts.map +1 -0
- package/dist/runtime/geometry/index.js +23 -0
- package/dist/runtime/geometry/index.js.map +1 -0
- package/dist/runtime/geometry/matrix.d.ts +26 -0
- package/dist/runtime/geometry/matrix.d.ts.map +1 -0
- package/dist/runtime/geometry/matrix.js +27 -0
- package/dist/runtime/geometry/matrix.js.map +1 -0
- package/dist/runtime/geometry/merge.d.ts +33 -0
- package/dist/runtime/geometry/merge.d.ts.map +1 -0
- package/dist/runtime/geometry/merge.js +185 -0
- package/dist/runtime/geometry/merge.js.map +1 -0
- package/dist/runtime/geometry/primitives.d.ts +41 -0
- package/dist/runtime/geometry/primitives.d.ts.map +1 -0
- package/dist/runtime/geometry/primitives.js +131 -0
- package/dist/runtime/geometry/primitives.js.map +1 -0
- package/dist/runtime/geometry/promote.d.ts +44 -0
- package/dist/runtime/geometry/promote.d.ts.map +1 -0
- package/dist/runtime/geometry/promote.js +203 -0
- package/dist/runtime/geometry/promote.js.map +1 -0
- package/dist/runtime/geometry/resample.d.ts +29 -0
- package/dist/runtime/geometry/resample.d.ts.map +1 -0
- package/dist/runtime/geometry/resample.js +165 -0
- package/dist/runtime/geometry/resample.js.map +1 -0
- package/dist/runtime/geometry/svg.d.ts +91 -0
- package/dist/runtime/geometry/svg.d.ts.map +1 -0
- package/dist/runtime/geometry/svg.js +216 -0
- package/dist/runtime/geometry/svg.js.map +1 -0
- package/dist/runtime/geometry/transform.d.ts +18 -0
- package/dist/runtime/geometry/transform.d.ts.map +1 -0
- package/dist/runtime/geometry/transform.js +56 -0
- package/dist/runtime/geometry/transform.js.map +1 -0
- package/dist/runtime/index.d.ts +5 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/node.d.ts +4 -0
- package/dist/runtime/node.d.ts.map +1 -0
- package/dist/runtime/node.js +12 -0
- package/dist/runtime/node.js.map +1 -0
- package/dist/runtime/runtime.d.ts +3 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +1198 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/types.d.ts +241 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/shell.d.ts +8 -0
- package/dist/shell.js +54 -0
- package/dist/shell.js.map +7 -0
- package/dist/stage.d.ts +7 -0
- package/dist/stage.js +84 -0
- package/dist/stage.js.map +7 -0
- package/dist/studio/panel.d.ts +48 -0
- package/doc/PROJECT_AUTHORING.md +360 -0
- package/package.json +126 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { attributeArray, attributeArrayFrom, createGeometry, isStringAttribute, levelCount, POSITION_ATTRIBUTE, } from "cascade/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* Attribute reads and writes. Every write returns a new `Geometry` and shares
|
|
4
|
+
* the arrays it did not touch, which is the whole reason the format is
|
|
5
|
+
* struct-of-arrays: with array-of-structs there is no granularity to share at.
|
|
6
|
+
*
|
|
7
|
+
* Node code should stay on this surface rather than reaching into an
|
|
8
|
+
* attribute's `data`, because nothing in the language stops a write into a
|
|
9
|
+
* shared array and everything downstream would then see it. See the immutability
|
|
10
|
+
* note at the top of `packages/contracts/src/geometry.ts`.
|
|
11
|
+
*/
|
|
12
|
+
export function geometryError(code, message) {
|
|
13
|
+
throw new TypeError(`geometry/${code}: ${message}`);
|
|
14
|
+
}
|
|
15
|
+
/** The attribute set at an element level. */
|
|
16
|
+
export function attributeSet(geometry, level) {
|
|
17
|
+
return geometry[level];
|
|
18
|
+
}
|
|
19
|
+
export function getAttribute(geometry, level, name) {
|
|
20
|
+
return geometry[level][name];
|
|
21
|
+
}
|
|
22
|
+
export function hasAttribute(geometry, level, name) {
|
|
23
|
+
return Object.prototype.hasOwnProperty.call(geometry[level], name);
|
|
24
|
+
}
|
|
25
|
+
/** Names at a level, in insertion order. */
|
|
26
|
+
export function attributeNames(geometry, level) {
|
|
27
|
+
return Object.keys(geometry[level]);
|
|
28
|
+
}
|
|
29
|
+
export function requireAttribute(geometry, level, name) {
|
|
30
|
+
const attribute = geometry[level][name];
|
|
31
|
+
if (attribute === undefined)
|
|
32
|
+
geometryError("missing-attribute", `${level}.${name} is not present`);
|
|
33
|
+
return attribute;
|
|
34
|
+
}
|
|
35
|
+
/** A numeric attribute when present, with consumer-specific arity validation. */
|
|
36
|
+
export function numericAttribute(attribute, path, sizes) {
|
|
37
|
+
if (attribute === undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
if (isStringAttribute(attribute))
|
|
40
|
+
geometryError("attribute-storage", `${path} must be numeric`);
|
|
41
|
+
if (sizes !== undefined && !sizes.includes(attribute.size))
|
|
42
|
+
geometryError("attribute-size", `${path} has size ${attribute.size}; expected ${sizes.join(" or ")}`);
|
|
43
|
+
return attribute;
|
|
44
|
+
}
|
|
45
|
+
/** One component of one element. */
|
|
46
|
+
export function readComponent(attribute, index, component = 0) {
|
|
47
|
+
return attribute.data[index * attribute.size + component];
|
|
48
|
+
}
|
|
49
|
+
/** Every component of one element, as a plain array. */
|
|
50
|
+
export function readElement(attribute, index) {
|
|
51
|
+
const values = new Array(attribute.size);
|
|
52
|
+
for (let component = 0; component < attribute.size; component += 1)
|
|
53
|
+
values[component] = attribute.data[index * attribute.size + component];
|
|
54
|
+
return values;
|
|
55
|
+
}
|
|
56
|
+
/** One element of a string attribute. Out-of-table indices read as empty. */
|
|
57
|
+
export function readString(attribute, index) {
|
|
58
|
+
const slot = attribute.data[index];
|
|
59
|
+
return slot < 0 ? "" : (attribute.table[slot] ?? "");
|
|
60
|
+
}
|
|
61
|
+
/** A whole element without knowing which kind of attribute it is. */
|
|
62
|
+
export function readAttribute(attribute, index) {
|
|
63
|
+
if (isStringAttribute(attribute))
|
|
64
|
+
return readString(attribute, index);
|
|
65
|
+
return attribute.size === 1
|
|
66
|
+
? readComponent(attribute, index)
|
|
67
|
+
: readElement(attribute, index);
|
|
68
|
+
}
|
|
69
|
+
/** Declared position width: 2 or 3. */
|
|
70
|
+
export function positionSize(geometry) {
|
|
71
|
+
return geometry.point[POSITION_ATTRIBUTE].size;
|
|
72
|
+
}
|
|
73
|
+
export function positionAttribute(geometry) {
|
|
74
|
+
return geometry.point[POSITION_ATTRIBUTE];
|
|
75
|
+
}
|
|
76
|
+
export function getPosition(geometry, index) {
|
|
77
|
+
return readElement(positionAttribute(geometry), index);
|
|
78
|
+
}
|
|
79
|
+
/** A zeroed numeric attribute for `count` elements. */
|
|
80
|
+
export function createAttribute(count, size, storage = "f64", fill) {
|
|
81
|
+
const data = attributeArray(storage, size * count);
|
|
82
|
+
if (fill !== undefined) {
|
|
83
|
+
const values = typeof fill === "number" ? [fill] : fill;
|
|
84
|
+
for (let index = 0; index < count; index += 1)
|
|
85
|
+
for (let component = 0; component < size; component += 1)
|
|
86
|
+
data[index * size + component] =
|
|
87
|
+
values[component % Math.max(values.length, 1)] ?? 0;
|
|
88
|
+
}
|
|
89
|
+
return { storage, size, data };
|
|
90
|
+
}
|
|
91
|
+
/** A string attribute from per-element strings, tabled and deduplicated. */
|
|
92
|
+
export function createStringAttribute(values) {
|
|
93
|
+
const table = [];
|
|
94
|
+
const slots = new Map();
|
|
95
|
+
const data = new Int32Array(values.length);
|
|
96
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
97
|
+
const value = values[index];
|
|
98
|
+
let slot = slots.get(value);
|
|
99
|
+
if (slot === undefined) {
|
|
100
|
+
slot = table.length;
|
|
101
|
+
table.push(value);
|
|
102
|
+
slots.set(value, slot);
|
|
103
|
+
}
|
|
104
|
+
data[index] = slot;
|
|
105
|
+
}
|
|
106
|
+
return { storage: "string", size: 1, table, data };
|
|
107
|
+
}
|
|
108
|
+
/** Replace one level's attribute set, sharing every other array. */
|
|
109
|
+
export function withAttributeSet(geometry, level, set) {
|
|
110
|
+
return createGeometry({
|
|
111
|
+
pointCount: geometry.pointCount,
|
|
112
|
+
point: level === "point" ? set : geometry.point,
|
|
113
|
+
vertex: level === "vertex" ? set : geometry.vertex,
|
|
114
|
+
primitive: level === "primitive" ? set : geometry.primitive,
|
|
115
|
+
detail: geometry.detail,
|
|
116
|
+
topology: geometry.topology,
|
|
117
|
+
pointGroups: geometry.pointGroups,
|
|
118
|
+
primitiveGroups: geometry.primitiveGroups,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/** Add or replace one attribute. Copy-on-write at attribute granularity. */
|
|
122
|
+
export function setAttribute(geometry, level, name, attribute) {
|
|
123
|
+
return withAttributeSet(geometry, level, {
|
|
124
|
+
...geometry[level],
|
|
125
|
+
[name]: attribute,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
export function removeAttribute(geometry, level, name) {
|
|
129
|
+
if (level === "point" && name === POSITION_ATTRIBUTE)
|
|
130
|
+
geometryError("remove-position", "point.P cannot be removed");
|
|
131
|
+
if (!hasAttribute(geometry, level, name))
|
|
132
|
+
return geometry;
|
|
133
|
+
const set = { ...geometry[level] };
|
|
134
|
+
delete set[name];
|
|
135
|
+
return withAttributeSet(geometry, level, set);
|
|
136
|
+
}
|
|
137
|
+
/** Replace the detail record, sharing every array. */
|
|
138
|
+
export function setDetail(geometry, name, value) {
|
|
139
|
+
return createGeometry({
|
|
140
|
+
pointCount: geometry.pointCount,
|
|
141
|
+
point: geometry.point,
|
|
142
|
+
vertex: geometry.vertex,
|
|
143
|
+
primitive: geometry.primitive,
|
|
144
|
+
detail: { ...geometry.detail, [name]: value },
|
|
145
|
+
topology: geometry.topology,
|
|
146
|
+
pointGroups: geometry.pointGroups,
|
|
147
|
+
primitiveGroups: geometry.primitiveGroups,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/** Drop one detail value, sharing every array. */
|
|
151
|
+
export function removeDetail(geometry, name) {
|
|
152
|
+
if (!Object.prototype.hasOwnProperty.call(geometry.detail, name))
|
|
153
|
+
return geometry;
|
|
154
|
+
const detail = { ...geometry.detail };
|
|
155
|
+
delete detail[name];
|
|
156
|
+
return createGeometry({
|
|
157
|
+
pointCount: geometry.pointCount,
|
|
158
|
+
point: geometry.point,
|
|
159
|
+
vertex: geometry.vertex,
|
|
160
|
+
primitive: geometry.primitive,
|
|
161
|
+
detail,
|
|
162
|
+
topology: geometry.topology,
|
|
163
|
+
pointGroups: geometry.pointGroups,
|
|
164
|
+
primitiveGroups: geometry.primitiveGroups,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The Attribute Create operation: one named attribute at one level, filled with
|
|
169
|
+
* a constant. This is the operation that makes the four-level model visible
|
|
170
|
+
* rather than an implementation detail, and it is the one that stops the
|
|
171
|
+
* `cloud-plots` class of bug, where every hand-rolled per-primitive value had
|
|
172
|
+
* to be remembered by name in every operation that touched the geometry.
|
|
173
|
+
*/
|
|
174
|
+
export function attributeCreate(geometry, options) {
|
|
175
|
+
const { level, name, value } = options;
|
|
176
|
+
if (level === "detail")
|
|
177
|
+
return setDetail(geometry, name, typeof value === "number" || typeof value === "string"
|
|
178
|
+
? value
|
|
179
|
+
: [...value]);
|
|
180
|
+
const count = levelCount(geometry, level);
|
|
181
|
+
if (typeof value === "string")
|
|
182
|
+
return setAttribute(geometry, level, name, createStringAttribute(new Array(count).fill(value)));
|
|
183
|
+
const values = typeof value === "number" ? [value] : value;
|
|
184
|
+
if (values.length === 0)
|
|
185
|
+
geometryError("attribute-size", `${level}.${name} needs at least one component`);
|
|
186
|
+
const storage = options.storage ?? "f64";
|
|
187
|
+
const data = attributeArray(storage, values.length * count);
|
|
188
|
+
for (let index = 0; index < count; index += 1)
|
|
189
|
+
for (let component = 0; component < values.length; component += 1)
|
|
190
|
+
data[index * values.length + component] = values[component];
|
|
191
|
+
return setAttribute(geometry, level, name, {
|
|
192
|
+
storage,
|
|
193
|
+
size: values.length,
|
|
194
|
+
data,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
/** A same-storage copy of an attribute's array, for a write-in-place pass. */
|
|
198
|
+
export function copyAttributeArray(attribute) {
|
|
199
|
+
return attributeArrayFrom(attribute.storage, attribute.data);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=attributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../src/geometry/attributes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { emptyGeometry, type AnyAttribute, type AttributeStorage, type DetailValue, type ElementLevel, type Geometry, type PrimitiveKind } from "cascade/contracts";
|
|
2
|
+
export { emptyGeometry };
|
|
3
|
+
export interface GeometryBuilderOptions {
|
|
4
|
+
/** 2 by default: the reference workloads are two-component. */
|
|
5
|
+
readonly positionSize?: 2 | 3;
|
|
6
|
+
readonly positionStorage?: "f32" | "f64";
|
|
7
|
+
}
|
|
8
|
+
export interface AddPrimitiveOptions {
|
|
9
|
+
readonly closed?: boolean;
|
|
10
|
+
readonly kind?: PrimitiveKind;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The accumulating constructor. Points and primitives go in one at a time and
|
|
14
|
+
* `build` produces the frozen struct-of-arrays form once, so a generator does
|
|
15
|
+
* not have to know the final counts up front or touch a typed array.
|
|
16
|
+
*
|
|
17
|
+
* Attributes are set after the elements exist, by name and level, because the
|
|
18
|
+
* builder does not know which attributes a generator will invent and should not
|
|
19
|
+
* have to.
|
|
20
|
+
*/
|
|
21
|
+
export declare class GeometryBuilder {
|
|
22
|
+
private readonly positions;
|
|
23
|
+
private readonly size;
|
|
24
|
+
private readonly storage;
|
|
25
|
+
private readonly vertexPoints;
|
|
26
|
+
private readonly offsets;
|
|
27
|
+
private readonly kinds;
|
|
28
|
+
private readonly closed;
|
|
29
|
+
private readonly attributes;
|
|
30
|
+
private readonly detail;
|
|
31
|
+
private readonly pointGroups;
|
|
32
|
+
private readonly primitiveGroups;
|
|
33
|
+
constructor(options?: GeometryBuilderOptions);
|
|
34
|
+
get pointCount(): number;
|
|
35
|
+
get vertexCount(): number;
|
|
36
|
+
get primitiveCount(): number;
|
|
37
|
+
/** Append one point and return its index. */
|
|
38
|
+
addPoint(x: number, y: number, z?: number): number;
|
|
39
|
+
/** Append points from a flat array of `positionSize`-wide entries. */
|
|
40
|
+
addPoints(flat: ArrayLike<number>): number;
|
|
41
|
+
/**
|
|
42
|
+
* Append one primitive over existing point indices and return its index. A
|
|
43
|
+
* closed primitive does not repeat its first point: `closed` is topology, not
|
|
44
|
+
* a duplicated vertex.
|
|
45
|
+
*/
|
|
46
|
+
addPrimitive(points: readonly number[], options?: AddPrimitiveOptions): number;
|
|
47
|
+
/** Append points and one primitive over them, the common generator case. */
|
|
48
|
+
addPolygon(flat: ArrayLike<number>, options?: AddPrimitiveOptions): number;
|
|
49
|
+
setAttribute(level: ElementLevel, name: string, attribute: AnyAttribute): this;
|
|
50
|
+
setNumericAttribute(level: ElementLevel, name: string, values: ArrayLike<number>, size?: number, storage?: AttributeStorage): this;
|
|
51
|
+
setStringAttribute(level: ElementLevel, name: string, values: readonly string[]): this;
|
|
52
|
+
setDetail(name: string, value: DetailValue): this;
|
|
53
|
+
addToPointGroup(name: string, index: number): this;
|
|
54
|
+
addToPrimitiveGroup(name: string, index: number): this;
|
|
55
|
+
build(): Geometry;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/geometry/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,aAAa,EAGb,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,WAAW,sBAAsB;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CAC1C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkC;gBAEtD,OAAO,GAAE,sBAA2B;IAKhD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,6CAA6C;IAC7C,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,SAAI,GAAG,MAAM;IAO7C,sEAAsE;IACtE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM;IAY1C;;;;OAIG;IACH,YAAY,CACV,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,OAAO,GAAE,mBAAwB,GAChC,MAAM;IAgBT,4EAA4E;IAC5E,UAAU,CACR,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EACvB,OAAO,GAAE,mBAAwB,GAChC,MAAM;IAQT,YAAY,CACV,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,YAAY,GACtB,IAAI;IAUP,mBAAmB,CACjB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EACzB,IAAI,SAAI,EACR,OAAO,GAAE,gBAAwB,GAChC,IAAI;IAQP,kBAAkB,CAChB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,IAAI;IAIP,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAKjD,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOlD,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOtD,KAAK,IAAI,QAAQ;CA+BlB"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { attributeArrayFrom, createGeometry, emptyGeometry, POSITION_ATTRIBUTE, PRIMITIVE_KINDS, } from "cascade/contracts";
|
|
2
|
+
import { createStringAttribute, geometryError } from "./attributes.js";
|
|
3
|
+
export { emptyGeometry };
|
|
4
|
+
/**
|
|
5
|
+
* The accumulating constructor. Points and primitives go in one at a time and
|
|
6
|
+
* `build` produces the frozen struct-of-arrays form once, so a generator does
|
|
7
|
+
* not have to know the final counts up front or touch a typed array.
|
|
8
|
+
*
|
|
9
|
+
* Attributes are set after the elements exist, by name and level, because the
|
|
10
|
+
* builder does not know which attributes a generator will invent and should not
|
|
11
|
+
* have to.
|
|
12
|
+
*/
|
|
13
|
+
export class GeometryBuilder {
|
|
14
|
+
positions = [];
|
|
15
|
+
size;
|
|
16
|
+
storage;
|
|
17
|
+
vertexPoints = [];
|
|
18
|
+
offsets = [0];
|
|
19
|
+
kinds = [];
|
|
20
|
+
closed = [];
|
|
21
|
+
attributes = { point: {}, vertex: {}, primitive: {} };
|
|
22
|
+
detail = {};
|
|
23
|
+
pointGroups = new Map();
|
|
24
|
+
primitiveGroups = new Map();
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
this.size = options.positionSize ?? 2;
|
|
27
|
+
this.storage = options.positionStorage ?? "f64";
|
|
28
|
+
}
|
|
29
|
+
get pointCount() {
|
|
30
|
+
return this.positions.length / this.size;
|
|
31
|
+
}
|
|
32
|
+
get vertexCount() {
|
|
33
|
+
return this.vertexPoints.length;
|
|
34
|
+
}
|
|
35
|
+
get primitiveCount() {
|
|
36
|
+
return this.offsets.length - 1;
|
|
37
|
+
}
|
|
38
|
+
/** Append one point and return its index. */
|
|
39
|
+
addPoint(x, y, z = 0) {
|
|
40
|
+
const index = this.pointCount;
|
|
41
|
+
this.positions.push(x, y);
|
|
42
|
+
if (this.size === 3)
|
|
43
|
+
this.positions.push(z);
|
|
44
|
+
return index;
|
|
45
|
+
}
|
|
46
|
+
/** Append points from a flat array of `positionSize`-wide entries. */
|
|
47
|
+
addPoints(flat) {
|
|
48
|
+
if (flat.length % this.size !== 0)
|
|
49
|
+
geometryError("point-stride", `${flat.length} values is not a multiple of the position size ${this.size}`);
|
|
50
|
+
const first = this.pointCount;
|
|
51
|
+
for (let index = 0; index < flat.length; index += 1)
|
|
52
|
+
this.positions.push(flat[index]);
|
|
53
|
+
return first;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Append one primitive over existing point indices and return its index. A
|
|
57
|
+
* closed primitive does not repeat its first point: `closed` is topology, not
|
|
58
|
+
* a duplicated vertex.
|
|
59
|
+
*/
|
|
60
|
+
addPrimitive(points, options = {}) {
|
|
61
|
+
const index = this.primitiveCount;
|
|
62
|
+
for (const point of points) {
|
|
63
|
+
if (!Number.isInteger(point) || point < 0 || point >= this.pointCount)
|
|
64
|
+
geometryError("vertex-point", `primitive ${index} references point ${point} of ${this.pointCount}`);
|
|
65
|
+
this.vertexPoints.push(point);
|
|
66
|
+
}
|
|
67
|
+
this.offsets.push(this.vertexPoints.length);
|
|
68
|
+
this.kinds.push(PRIMITIVE_KINDS.indexOf(options.kind ?? "poly"));
|
|
69
|
+
this.closed.push(options.closed ? 1 : 0);
|
|
70
|
+
return index;
|
|
71
|
+
}
|
|
72
|
+
/** Append points and one primitive over them, the common generator case. */
|
|
73
|
+
addPolygon(flat, options = {}) {
|
|
74
|
+
const first = this.addPoints(flat);
|
|
75
|
+
const points = [];
|
|
76
|
+
for (let index = first; index < this.pointCount; index += 1)
|
|
77
|
+
points.push(index);
|
|
78
|
+
return this.addPrimitive(points, options);
|
|
79
|
+
}
|
|
80
|
+
setAttribute(level, name, attribute) {
|
|
81
|
+
if (level === "point" && name === POSITION_ATTRIBUTE)
|
|
82
|
+
geometryError("set-position", "point.P is owned by the builder; use addPoint");
|
|
83
|
+
this.attributes[level][name] = attribute;
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
setNumericAttribute(level, name, values, size = 1, storage = "f64") {
|
|
87
|
+
return this.setAttribute(level, name, {
|
|
88
|
+
storage,
|
|
89
|
+
size,
|
|
90
|
+
data: attributeArrayFrom(storage, values),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
setStringAttribute(level, name, values) {
|
|
94
|
+
return this.setAttribute(level, name, createStringAttribute(values));
|
|
95
|
+
}
|
|
96
|
+
setDetail(name, value) {
|
|
97
|
+
this.detail[name] = value;
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
addToPointGroup(name, index) {
|
|
101
|
+
const members = this.pointGroups.get(name) ?? new Set();
|
|
102
|
+
members.add(index);
|
|
103
|
+
this.pointGroups.set(name, members);
|
|
104
|
+
return this;
|
|
105
|
+
}
|
|
106
|
+
addToPrimitiveGroup(name, index) {
|
|
107
|
+
const members = this.primitiveGroups.get(name) ?? new Set();
|
|
108
|
+
members.add(index);
|
|
109
|
+
this.primitiveGroups.set(name, members);
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
build() {
|
|
113
|
+
const pointCount = this.pointCount;
|
|
114
|
+
const pointGroups = {};
|
|
115
|
+
for (const [name, members] of this.pointGroups)
|
|
116
|
+
pointGroups[name] = mask(members, pointCount);
|
|
117
|
+
const primitiveGroups = {};
|
|
118
|
+
for (const [name, members] of this.primitiveGroups)
|
|
119
|
+
primitiveGroups[name] = mask(members, this.primitiveCount);
|
|
120
|
+
return createGeometry({
|
|
121
|
+
pointCount,
|
|
122
|
+
point: {
|
|
123
|
+
...this.attributes.point,
|
|
124
|
+
[POSITION_ATTRIBUTE]: {
|
|
125
|
+
storage: this.storage,
|
|
126
|
+
size: this.size,
|
|
127
|
+
data: attributeArrayFrom(this.storage, this.positions),
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
vertex: this.attributes.vertex,
|
|
131
|
+
primitive: this.attributes.primitive,
|
|
132
|
+
detail: this.detail,
|
|
133
|
+
topology: {
|
|
134
|
+
vertexPoints: Int32Array.from(this.vertexPoints),
|
|
135
|
+
offsets: Int32Array.from(this.offsets),
|
|
136
|
+
kinds: Uint8Array.from(this.kinds),
|
|
137
|
+
closed: Uint8Array.from(this.closed),
|
|
138
|
+
},
|
|
139
|
+
pointGroups,
|
|
140
|
+
primitiveGroups,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function mask(members, count) {
|
|
145
|
+
const result = new Uint8Array(count);
|
|
146
|
+
for (const member of members) {
|
|
147
|
+
if (!Number.isInteger(member) || member < 0 || member >= count)
|
|
148
|
+
geometryError("group-indices", `group references element ${member}`);
|
|
149
|
+
result[member] = 1;
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/geometry/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,eAAe,GAOhB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,CAAC;AAazB;;;;;;;;GAQG;AACH,MAAM,OAAO,eAAe;IACT,SAAS,GAAa,EAAE,CAAC;IACzB,IAAI,CAAS;IACb,OAAO,CAAmB;IAC1B,YAAY,GAAa,EAAE,CAAC;IAC5B,OAAO,GAAa,CAAC,CAAC,CAAC,CAAC;IACxB,KAAK,GAAa,EAAE,CAAC;IACrB,MAAM,GAAa,EAAE,CAAC;IACtB,UAAU,GAGvB,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC5B,MAAM,GAAgC,EAAE,CAAC;IACzC,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,eAAe,GAAG,IAAI,GAAG,EAAuB,CAAC;IAElE,YAAY,UAAkC,EAAE;QAC9C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,eAAe,IAAI,KAAK,CAAC;IAClD,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;IAC3C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,6CAA6C;IAC7C,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAC,GAAG,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sEAAsE;IACtE,SAAS,CAAC,IAAuB;QAC/B,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC;YAC/B,aAAa,CACX,cAAc,EACd,GAAG,IAAI,CAAC,MAAM,kDAAkD,IAAI,CAAC,IAAI,EAAE,CAC5E,CAAC;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,YAAY,CACV,MAAyB,EACzB,UAA+B,EAAE;QAEjC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC;QAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,UAAU;gBACnE,aAAa,CACX,cAAc,EACd,aAAa,KAAK,qBAAqB,KAAK,OAAO,IAAI,CAAC,UAAU,EAAE,CACrE,CAAC;YACJ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4EAA4E;IAC5E,UAAU,CACR,IAAuB,EACvB,UAA+B,EAAE;QAEjC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,YAAY,CACV,KAAmB,EACnB,IAAY,EACZ,SAAuB;QAEvB,IAAI,KAAK,KAAK,OAAO,IAAI,IAAI,KAAK,kBAAkB;YAClD,aAAa,CACX,cAAc,EACd,+CAA+C,CAChD,CAAC;QACJ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB,CACjB,KAAmB,EACnB,IAAY,EACZ,MAAyB,EACzB,IAAI,GAAG,CAAC,EACR,UAA4B,KAAK;QAEjC,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;YACpC,OAAO;YACP,IAAI;YACJ,IAAI,EAAE,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAChB,KAAmB,EACnB,IAAY,EACZ,MAAyB;QAEzB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,KAAkB;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,KAAa;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB,CAAC,IAAY,EAAE,KAAa;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,WAAW,GAA+B,EAAE,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,WAAW;YAC5C,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAChD,MAAM,eAAe,GAA+B,EAAE,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,eAAe;YAChD,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7D,OAAO,cAAc,CAAC;YACpB,UAAU;YACV,KAAK,EAAE;gBACL,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK;gBACxB,CAAC,kBAAkB,CAAC,EAAE;oBACpB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;iBACvD;aACF;YACD,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;YAC9B,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS;YACpC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE;gBACR,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;gBAChD,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBAClC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;aACrC;YACD,WAAW;YACX,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,IAAI,CAAC,OAA4B,EAAE,KAAa;IACvD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,KAAK;YAC5D,aAAa,CAAC,eAAe,EAAE,4BAA4B,MAAM,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Geometry } from "cascade/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* Copy to Points: one geometry instanced onto every point of another.
|
|
4
|
+
*
|
|
5
|
+
* This is the node a generative composition actually comes from, and it is the
|
|
6
|
+
* second half of the argument for a generic attribute table. It is written
|
|
7
|
+
* entirely as transform-then-merge over the existing operations, which is the
|
|
8
|
+
* point: it invents no attribute handling of its own, so it composes with any
|
|
9
|
+
* attribute a later node invents and cannot drop one it has never heard of.
|
|
10
|
+
* Because a cubic Bézier is affine-invariant, it is also exactly right on a
|
|
11
|
+
* curve without knowing that a curve is what it is copying.
|
|
12
|
+
*
|
|
13
|
+
* Houdini's conventions, followed rather than reinvented: `pscale` scales each
|
|
14
|
+
* copy, `N` orients it, and the copies carry a `copynum` primitive attribute
|
|
15
|
+
* recording which target point they came from.
|
|
16
|
+
*/
|
|
17
|
+
export interface CopyToPointsOptions {
|
|
18
|
+
/** Restrict to a target point group. Houdini's "Target Group". */
|
|
19
|
+
readonly targetGroup?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Read `pscale` and `N` from the target points. Houdini's "Transform Using
|
|
22
|
+
* Target Point Orientations", and the reason `N` is a direction rather than
|
|
23
|
+
* an angle: it is the attribute a Scatter or a Resample already writes.
|
|
24
|
+
*/
|
|
25
|
+
readonly useTargetOrientations?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Carry the target's point attributes onto the points of each copy, where the
|
|
28
|
+
* source does not already carry a name of its own. Source wins on a
|
|
29
|
+
* collision, because the copy's own values describe the copy.
|
|
30
|
+
*/
|
|
31
|
+
readonly transferTargetAttributes?: boolean;
|
|
32
|
+
/** Primitive attribute recording the target point index; "" disables it. */
|
|
33
|
+
readonly copyNumberAttribute?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare function copyToPoints(source: Geometry, target: Geometry, options?: CopyToPointsOptions): Geometry;
|
|
36
|
+
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/geometry/copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAmB5B;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAC5C,4EAA4E;IAC5E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,QAAQ,EAChB,OAAO,GAAE,mBAAwB,GAChC,QAAQ,CAuEV"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { emptyGeometry, isStringAttribute, POSITION_ATTRIBUTE, } from "cascade/contracts";
|
|
2
|
+
import { createAttribute, createStringAttribute, geometryError, getPosition, numericAttribute, positionSize, readComponent, readElement, readString, setAttribute, } from "./attributes.js";
|
|
3
|
+
import { groupIndices, groupMask } from "./groups.js";
|
|
4
|
+
import { transformMatrix } from "./matrix.js";
|
|
5
|
+
import { mergeGeometries } from "./merge.js";
|
|
6
|
+
import { transformGeometry } from "./transform.js";
|
|
7
|
+
export function copyToPoints(source, target, options = {}) {
|
|
8
|
+
const width = positionSize(source) === 3 ? 3 : 2;
|
|
9
|
+
const selection = options.targetGroup === undefined || options.targetGroup === ""
|
|
10
|
+
? undefined
|
|
11
|
+
: (groupMask(target, "point", options.targetGroup) ??
|
|
12
|
+
geometryError("missing-group", `point group ${options.targetGroup} is not present on the target`));
|
|
13
|
+
const indices = selection === undefined
|
|
14
|
+
? range(target.pointCount)
|
|
15
|
+
: groupIndices(selection);
|
|
16
|
+
if (indices.length === 0 || source.pointCount === 0)
|
|
17
|
+
return emptyGeometry(width);
|
|
18
|
+
const orient = options.useTargetOrientations ?? true;
|
|
19
|
+
const pscale = orient
|
|
20
|
+
? numericAttribute(target.point.pscale, "point.pscale", [1])
|
|
21
|
+
: undefined;
|
|
22
|
+
const normal = orient
|
|
23
|
+
? numericAttribute(target.point.N, "point.N", [2, 3])
|
|
24
|
+
: undefined;
|
|
25
|
+
const copyNumber = options.copyNumberAttribute ?? "copynum";
|
|
26
|
+
const transfer = (options.transferTargetAttributes ?? true)
|
|
27
|
+
? Object.keys(target.point).filter((name) => name !== POSITION_ATTRIBUTE &&
|
|
28
|
+
!Object.prototype.hasOwnProperty.call(source.point, name))
|
|
29
|
+
: [];
|
|
30
|
+
const copies = [];
|
|
31
|
+
for (const index of indices) {
|
|
32
|
+
const position = getPosition(target, index);
|
|
33
|
+
const scale = pscale === undefined ? 1 : readComponent(pscale, index);
|
|
34
|
+
const rotate = normal === undefined
|
|
35
|
+
? 0
|
|
36
|
+
: (Math.atan2(readComponent(normal, index, 1), readComponent(normal, index, 0)) *
|
|
37
|
+
180) /
|
|
38
|
+
Math.PI;
|
|
39
|
+
let copy = transformGeometry(source, transformMatrix({
|
|
40
|
+
translate: [position[0], position[1]],
|
|
41
|
+
rotate,
|
|
42
|
+
scale: [scale, scale],
|
|
43
|
+
}));
|
|
44
|
+
if (copyNumber !== "")
|
|
45
|
+
copy = setAttribute(copy, "primitive", copyNumber, {
|
|
46
|
+
storage: "i32",
|
|
47
|
+
size: 1,
|
|
48
|
+
data: new Int32Array(copy.primitiveCount).fill(index),
|
|
49
|
+
});
|
|
50
|
+
for (const name of transfer)
|
|
51
|
+
copy = setAttribute(copy, "point", name, spread(target.point[name], index, copy.pointCount));
|
|
52
|
+
copies.push(copy);
|
|
53
|
+
}
|
|
54
|
+
return mergeGeometries(copies);
|
|
55
|
+
}
|
|
56
|
+
function range(count) {
|
|
57
|
+
const indices = new Array(count);
|
|
58
|
+
for (let index = 0; index < count; index += 1)
|
|
59
|
+
indices[index] = index;
|
|
60
|
+
return indices;
|
|
61
|
+
}
|
|
62
|
+
/** One element of a target attribute, repeated across a copy's points. */
|
|
63
|
+
function spread(attribute, index, count) {
|
|
64
|
+
if (isStringAttribute(attribute))
|
|
65
|
+
return createStringAttribute(new Array(count).fill(readString(attribute, index)));
|
|
66
|
+
return createAttribute(count, attribute.size, attribute.storage, readElement(attribute, index));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/geometry/copy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Geometry } from "cascade/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* The generators. Each returns one primitive in a geometry of its own, so a
|
|
4
|
+
* graph composes them with `Merge` rather than with a multi-shape node.
|
|
5
|
+
*
|
|
6
|
+
* Geometry is +Y up, so a circle of radius 1 has a point at `(0, 1)` above the
|
|
7
|
+
* origin and a rectangle's first corner is its bottom-left one. The flip into
|
|
8
|
+
* SVG's frame lives in `geometryToSvg` and nowhere else.
|
|
9
|
+
*/
|
|
10
|
+
export interface RectangleOptions {
|
|
11
|
+
/** Width and height, as Houdini's Grid states its size. */
|
|
12
|
+
readonly size?: readonly [number, number];
|
|
13
|
+
readonly center?: readonly [number, number];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A closed four-point polygon, counter-clockwise from the bottom-left corner.
|
|
17
|
+
* Houdini has no Rectangle: its Grid with two rows and two columns does the
|
|
18
|
+
* job, and `size` and `center` are that node's parameter names.
|
|
19
|
+
*/
|
|
20
|
+
export declare function rectangleGeometry(options?: RectangleOptions): Geometry;
|
|
21
|
+
export interface CircleOptions {
|
|
22
|
+
readonly center?: readonly [number, number];
|
|
23
|
+
/** X and Y radius, as Houdini's Circle states its radius. */
|
|
24
|
+
readonly radius?: readonly [number, number];
|
|
25
|
+
/**
|
|
26
|
+
* Houdini's Circle "Primitive Type". `bezier` is the default because a circle
|
|
27
|
+
* is a circle: four cubic segments hold it to within 0.02% of the true arc,
|
|
28
|
+
* where a polygon of any division count is visibly a polygon in print.
|
|
29
|
+
*/
|
|
30
|
+
readonly type?: "bezier" | "poly";
|
|
31
|
+
/** Houdini's Circle "Divisions". Used by `poly` only. */
|
|
32
|
+
readonly divisions?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A closed circle, either as one cubic Bézier chain or as one polygon.
|
|
36
|
+
*
|
|
37
|
+
* The Bézier form is four segments with the classic handle length
|
|
38
|
+
* `k = 4/3 · tan(π/8)`, which is the standard four-arc approximation and the
|
|
39
|
+
* one every vector tool uses. Twelve points: four anchors at the axes and two
|
|
40
|
+
* handles between each pair.
|
|
41
|
+
*/
|
|
42
|
+
export declare function circleGeometry(options?: CircleOptions): Geometry;
|
|
43
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/geometry/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAKnD;;;;;;;GAOG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAOD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,GAAG,QAAQ,CAc1E;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAClC,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,aAAkB,GAAG,QAAQ,CA2CpE"}
|