@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,76 @@
|
|
|
1
|
+
import { geometryError } from "./attributes.js";
|
|
2
|
+
import { GeometryBuilder } from "./builder.js";
|
|
3
|
+
function finitePair(value, code) {
|
|
4
|
+
if (!Number.isFinite(value[0]) || !Number.isFinite(value[1]))
|
|
5
|
+
geometryError(code, "both components must be finite");
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* A closed four-point polygon, counter-clockwise from the bottom-left corner.
|
|
9
|
+
* Houdini has no Rectangle: its Grid with two rows and two columns does the
|
|
10
|
+
* job, and `size` and `center` are that node's parameter names.
|
|
11
|
+
*/
|
|
12
|
+
export function rectangleGeometry(options = {}) {
|
|
13
|
+
const [width, height] = options.size ?? [1, 1];
|
|
14
|
+
const [cx, cy] = options.center ?? [0, 0];
|
|
15
|
+
finitePair([width, height], "rectangle-size");
|
|
16
|
+
finitePair([cx, cy], "rectangle-center");
|
|
17
|
+
if (width < 0 || height < 0)
|
|
18
|
+
geometryError("rectangle-size", "rectangle size must not be negative");
|
|
19
|
+
const x0 = cx - width / 2;
|
|
20
|
+
const x1 = cx + width / 2;
|
|
21
|
+
const y0 = cy - height / 2;
|
|
22
|
+
const y1 = cy + height / 2;
|
|
23
|
+
const builder = new GeometryBuilder();
|
|
24
|
+
builder.addPolygon([x0, y0, x1, y0, x1, y1, x0, y1], { closed: true });
|
|
25
|
+
return builder.build();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A closed circle, either as one cubic Bézier chain or as one polygon.
|
|
29
|
+
*
|
|
30
|
+
* The Bézier form is four segments with the classic handle length
|
|
31
|
+
* `k = 4/3 · tan(π/8)`, which is the standard four-arc approximation and the
|
|
32
|
+
* one every vector tool uses. Twelve points: four anchors at the axes and two
|
|
33
|
+
* handles between each pair.
|
|
34
|
+
*/
|
|
35
|
+
export function circleGeometry(options = {}) {
|
|
36
|
+
const [cx, cy] = options.center ?? [0, 0];
|
|
37
|
+
const [rx, ry] = options.radius ?? [1, 1];
|
|
38
|
+
finitePair([cx, cy], "circle-center");
|
|
39
|
+
finitePair([rx, ry], "circle-radius");
|
|
40
|
+
if (rx < 0 || ry < 0)
|
|
41
|
+
geometryError("circle-radius", "circle radius must not be negative");
|
|
42
|
+
const builder = new GeometryBuilder();
|
|
43
|
+
if ((options.type ?? "bezier") === "poly") {
|
|
44
|
+
const divisions = options.divisions ?? 32;
|
|
45
|
+
if (!Number.isSafeInteger(divisions) || divisions < 3)
|
|
46
|
+
geometryError("circle-divisions", "a polygonal circle needs an integer division count of at least 3");
|
|
47
|
+
const flat = [];
|
|
48
|
+
for (let index = 0; index < divisions; index += 1) {
|
|
49
|
+
const angle = (2 * Math.PI * index) / divisions;
|
|
50
|
+
flat.push(cx + rx * Math.cos(angle), cy + ry * Math.sin(angle));
|
|
51
|
+
}
|
|
52
|
+
builder.addPolygon(flat, { closed: true });
|
|
53
|
+
return builder.build();
|
|
54
|
+
}
|
|
55
|
+
const k = (4 / 3) * Math.tan(Math.PI / 8);
|
|
56
|
+
const kx = rx * k;
|
|
57
|
+
const ky = ry * k;
|
|
58
|
+
// Anchor, handle, handle, per quarter, counter-clockwise from +X.
|
|
59
|
+
const flat = [
|
|
60
|
+
cx + rx, cy,
|
|
61
|
+
cx + rx, cy + ky,
|
|
62
|
+
cx + kx, cy + ry,
|
|
63
|
+
cx, cy + ry,
|
|
64
|
+
cx - kx, cy + ry,
|
|
65
|
+
cx - rx, cy + ky,
|
|
66
|
+
cx - rx, cy,
|
|
67
|
+
cx - rx, cy - ky,
|
|
68
|
+
cx - kx, cy - ry,
|
|
69
|
+
cx, cy - ry,
|
|
70
|
+
cx + kx, cy - ry,
|
|
71
|
+
cx + rx, cy - ky,
|
|
72
|
+
];
|
|
73
|
+
builder.addPolygon(flat, { closed: true, kind: "bezier" });
|
|
74
|
+
return builder.build();
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/geometry/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Geometry } from "cascade/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* Groups are named subsets, stored as one byte per element. A mask is the right
|
|
4
|
+
* shape because membership is tested far more often than it is enumerated, and
|
|
5
|
+
* because it is what lets a subset be named without duplicating the geometry:
|
|
6
|
+
* `cloud-plots` copies 5.8 MB of geometry per cook to express what a 39 KB mask
|
|
7
|
+
* says, purely because there is no way to say "this subset of primitives".
|
|
8
|
+
*/
|
|
9
|
+
export type GroupLevel = "point" | "primitive";
|
|
10
|
+
export declare function groupMask(geometry: Geometry, level: GroupLevel, name: string): Uint8Array | undefined;
|
|
11
|
+
export declare function inGroup(mask: Uint8Array, index: number): boolean;
|
|
12
|
+
/** The members of a mask, ascending. Enumerate only when you must. */
|
|
13
|
+
export declare function groupIndices(mask: Uint8Array): number[];
|
|
14
|
+
export declare function groupNames(geometry: Geometry, level: GroupLevel): readonly string[];
|
|
15
|
+
/** Add or replace one named subset, from a mask or a list of indices. */
|
|
16
|
+
export declare function setGroup(geometry: Geometry, level: GroupLevel, name: string, members: Uint8Array | readonly number[]): Geometry;
|
|
17
|
+
export declare function removeGroup(geometry: Geometry, level: GroupLevel, name: string): Geometry;
|
|
18
|
+
//# sourceMappingURL=groups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/geometry/groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI/E;;;;;;GAMG;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,WAAW,CAAC;AAO/C,wBAAgB,SAAS,CACvB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,GACX,UAAU,GAAG,SAAS,CAExB;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,CAKvD;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,UAAU,GAChB,SAAS,MAAM,EAAE,CAEnB;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GACtC,QAAQ,CA6BV;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,GACX,QAAQ,CAcV"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createGeometry, levelCount } from "cascade/contracts";
|
|
2
|
+
import { geometryError } from "./attributes.js";
|
|
3
|
+
const KEYS = {
|
|
4
|
+
point: "pointGroups",
|
|
5
|
+
primitive: "primitiveGroups",
|
|
6
|
+
};
|
|
7
|
+
export function groupMask(geometry, level, name) {
|
|
8
|
+
return geometry[KEYS[level]][name];
|
|
9
|
+
}
|
|
10
|
+
export function inGroup(mask, index) {
|
|
11
|
+
return mask[index] === 1;
|
|
12
|
+
}
|
|
13
|
+
/** The members of a mask, ascending. Enumerate only when you must. */
|
|
14
|
+
export function groupIndices(mask) {
|
|
15
|
+
const indices = [];
|
|
16
|
+
for (let index = 0; index < mask.length; index += 1)
|
|
17
|
+
if (mask[index])
|
|
18
|
+
indices.push(index);
|
|
19
|
+
return indices;
|
|
20
|
+
}
|
|
21
|
+
export function groupNames(geometry, level) {
|
|
22
|
+
return Object.keys(geometry[KEYS[level]]);
|
|
23
|
+
}
|
|
24
|
+
/** Add or replace one named subset, from a mask or a list of indices. */
|
|
25
|
+
export function setGroup(geometry, level, name, members) {
|
|
26
|
+
const count = levelCount(geometry, level);
|
|
27
|
+
let mask;
|
|
28
|
+
if (members instanceof Uint8Array) {
|
|
29
|
+
if (members.length !== count)
|
|
30
|
+
geometryError("group-length", `${name} covers ${members.length} of ${count} elements`);
|
|
31
|
+
mask = members;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
mask = new Uint8Array(count);
|
|
35
|
+
for (const member of members) {
|
|
36
|
+
if (!Number.isInteger(member) || member < 0 || member >= count)
|
|
37
|
+
geometryError("group-indices", `${name} references element ${member}`);
|
|
38
|
+
mask[member] = 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const groups = { ...geometry[KEYS[level]], [name]: mask };
|
|
42
|
+
return createGeometry({
|
|
43
|
+
pointCount: geometry.pointCount,
|
|
44
|
+
point: geometry.point,
|
|
45
|
+
vertex: geometry.vertex,
|
|
46
|
+
primitive: geometry.primitive,
|
|
47
|
+
detail: geometry.detail,
|
|
48
|
+
topology: geometry.topology,
|
|
49
|
+
pointGroups: level === "point" ? groups : geometry.pointGroups,
|
|
50
|
+
primitiveGroups: level === "primitive" ? groups : geometry.primitiveGroups,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export function removeGroup(geometry, level, name) {
|
|
54
|
+
if (groupMask(geometry, level, name) === undefined)
|
|
55
|
+
return geometry;
|
|
56
|
+
const groups = { ...geometry[KEYS[level]] };
|
|
57
|
+
delete groups[name];
|
|
58
|
+
return createGeometry({
|
|
59
|
+
pointCount: geometry.pointCount,
|
|
60
|
+
point: geometry.point,
|
|
61
|
+
vertex: geometry.vertex,
|
|
62
|
+
primitive: geometry.primitive,
|
|
63
|
+
detail: geometry.detail,
|
|
64
|
+
topology: geometry.topology,
|
|
65
|
+
pointGroups: level === "point" ? groups : geometry.pointGroups,
|
|
66
|
+
primitiveGroups: level === "primitive" ? groups : geometry.primitiveGroups,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=groups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groups.js","sourceRoot":"","sources":["../../src/geometry/groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAYhD,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,aAAa;IACpB,SAAS,EAAE,iBAAiB;CACpB,CAAC;AAEX,MAAM,UAAU,SAAS,CACvB,QAAkB,EAClB,KAAiB,EACjB,IAAY;IAEZ,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAgB,EAAE,KAAa;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;QACjD,IAAI,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,QAAkB,EAClB,KAAiB;IAEjB,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,QAAQ,CACtB,QAAkB,EAClB,KAAiB,EACjB,IAAY,EACZ,OAAuC;IAEvC,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,IAAgB,CAAC;IACrB,IAAI,OAAO,YAAY,UAAU,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;YAC1B,aAAa,CACX,cAAc,EACd,GAAG,IAAI,WAAW,OAAO,CAAC,MAAM,OAAO,KAAK,WAAW,CACxD,CAAC;QACJ,IAAI,GAAG,OAAO,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,KAAK;gBAC5D,aAAa,CAAC,eAAe,EAAE,GAAG,IAAI,uBAAuB,MAAM,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1D,OAAO,cAAc,CAAC;QACpB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW;QAC9D,eAAe,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe;KAC3E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAAkB,EAClB,KAAiB,EACjB,IAAY;IAEZ,IAAI,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACpE,MAAM,MAAM,GAA+B,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,cAAc,CAAC;QACpB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW;QAC9D,eAAe,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe;KAC3E,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometry operations. Environment-neutral arithmetic over the `geometry`
|
|
3
|
+
* contract type: no DOM, no Node, no dependencies.
|
|
4
|
+
*
|
|
5
|
+
* The types, the interchange form and the codec live in
|
|
6
|
+
* `packages/contracts/src/geometry.ts`, and its header carries the
|
|
7
|
+
* copy-on-write rule and the one runtime interaction worth knowing about.
|
|
8
|
+
* Everything that computes lives here, so that a Studio preview or a
|
|
9
|
+
* compatibility node adapts these semantics rather than forking them.
|
|
10
|
+
*/
|
|
11
|
+
export * from "./attributes.js";
|
|
12
|
+
export * from "./builder.js";
|
|
13
|
+
export * from "./copy.js";
|
|
14
|
+
export * from "./generate.js";
|
|
15
|
+
export * from "./groups.js";
|
|
16
|
+
export * from "./matrix.js";
|
|
17
|
+
export * from "./merge.js";
|
|
18
|
+
export * from "./primitives.js";
|
|
19
|
+
export * from "./promote.js";
|
|
20
|
+
export * from "./resample.js";
|
|
21
|
+
export * from "./svg.js";
|
|
22
|
+
export * from "./transform.js";
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/geometry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometry operations. Environment-neutral arithmetic over the `geometry`
|
|
3
|
+
* contract type: no DOM, no Node, no dependencies.
|
|
4
|
+
*
|
|
5
|
+
* The types, the interchange form and the codec live in
|
|
6
|
+
* `packages/contracts/src/geometry.ts`, and its header carries the
|
|
7
|
+
* copy-on-write rule and the one runtime interaction worth knowing about.
|
|
8
|
+
* Everything that computes lives here, so that a Studio preview or a
|
|
9
|
+
* compatibility node adapts these semantics rather than forking them.
|
|
10
|
+
*/
|
|
11
|
+
export * from "./attributes.js";
|
|
12
|
+
export * from "./builder.js";
|
|
13
|
+
export * from "./copy.js";
|
|
14
|
+
export * from "./generate.js";
|
|
15
|
+
export * from "./groups.js";
|
|
16
|
+
export * from "./matrix.js";
|
|
17
|
+
export * from "./merge.js";
|
|
18
|
+
export * from "./primitives.js";
|
|
19
|
+
export * from "./promote.js";
|
|
20
|
+
export * from "./resample.js";
|
|
21
|
+
export * from "./svg.js";
|
|
22
|
+
export * from "./transform.js";
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/geometry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Mat3 } from "cascade/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* The `mat3` a transform node or an instancing operation needs, built from the
|
|
4
|
+
* four parameters a Houdini user already knows: translate, rotate, scale and
|
|
5
|
+
* pivot.
|
|
6
|
+
*
|
|
7
|
+
* Matrices are column-major, as the `mat3` type is documented to be, so the
|
|
8
|
+
* translation sits in the third column at indices 6 and 7 and `transformGeometry`
|
|
9
|
+
* reads it there.
|
|
10
|
+
*
|
|
11
|
+
* Rotation is in degrees and counter-clockwise, because geometry is +Y up and a
|
|
12
|
+
* positive angle turning clockwise would be the first of the small surprises
|
|
13
|
+
* that make a hand feel wrong.
|
|
14
|
+
*
|
|
15
|
+
* The order is Houdini's SRT with a pivot: scale, then rotate, then translate,
|
|
16
|
+
* all about the pivot. Written out, `M = T(t) · T(p) · R(r) · S(s) · T(-p)`.
|
|
17
|
+
*/
|
|
18
|
+
export interface TransformParameters {
|
|
19
|
+
readonly translate?: readonly [number, number];
|
|
20
|
+
/** Degrees, counter-clockwise. */
|
|
21
|
+
readonly rotate?: number;
|
|
22
|
+
readonly scale?: readonly [number, number];
|
|
23
|
+
readonly pivot?: readonly [number, number];
|
|
24
|
+
}
|
|
25
|
+
export declare function transformMatrix(parameters: TransformParameters): Mat3;
|
|
26
|
+
//# sourceMappingURL=matrix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../../src/geometry/matrix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,kCAAkC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAyBrE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function transformMatrix(parameters) {
|
|
2
|
+
const [tx, ty] = parameters.translate ?? [0, 0];
|
|
3
|
+
const [sx, sy] = parameters.scale ?? [1, 1];
|
|
4
|
+
const [px, py] = parameters.pivot ?? [0, 0];
|
|
5
|
+
const rotate = parameters.rotate ?? 0;
|
|
6
|
+
if (![tx, ty, sx, sy, px, py, rotate].every(Number.isFinite))
|
|
7
|
+
throw new TypeError("geometry/transform: transform parameters must be finite");
|
|
8
|
+
const radians = (rotate * Math.PI) / 180;
|
|
9
|
+
const cos = Math.cos(radians);
|
|
10
|
+
const sin = Math.sin(radians);
|
|
11
|
+
const a00 = cos * sx;
|
|
12
|
+
const a10 = sin * sx;
|
|
13
|
+
const a01 = -sin * sy;
|
|
14
|
+
const a11 = cos * sy;
|
|
15
|
+
return [
|
|
16
|
+
a00,
|
|
17
|
+
a10,
|
|
18
|
+
0,
|
|
19
|
+
a01,
|
|
20
|
+
a11,
|
|
21
|
+
0,
|
|
22
|
+
tx + px - (a00 * px + a01 * py),
|
|
23
|
+
ty + py - (a10 * px + a11 * py),
|
|
24
|
+
1,
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=matrix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix.js","sourceRoot":"","sources":["../../src/geometry/matrix.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,eAAe,CAAC,UAA+B;IAC7D,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC1D,MAAM,IAAI,SAAS,CAAC,yDAAyD,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;IACrB,OAAO;QACL,GAAG;QACH,GAAG;QACH,CAAC;QACD,GAAG;QACH,GAAG;QACH,CAAC;QACD,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;QAC/B,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type AttributeStorage, type Geometry } from "cascade/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* Merge concatenates geometries and renumbers points, vertices and primitives.
|
|
4
|
+
*
|
|
5
|
+
* It is the operation that proves the format composes, so the attribute rule is
|
|
6
|
+
* the interesting part: the result carries the *union* of the attribute names on
|
|
7
|
+
* its inputs, and an attribute present on one side and absent on the other is
|
|
8
|
+
* zero-filled over the range that lacked it rather than dropped. That is the
|
|
9
|
+
* whole argument for a generic attribute table. The two live bugs in
|
|
10
|
+
* `cloud-plots` are both an operation dropping an attribute it had never heard
|
|
11
|
+
* of, and an operation that copies the whole set cannot make that mistake.
|
|
12
|
+
*
|
|
13
|
+
* Three conflicts have to be resolved rather than avoided:
|
|
14
|
+
*
|
|
15
|
+
* A differing component count widens to the largest and zero-fills the missing
|
|
16
|
+
* components. This is how a 2-component `P` and a 3-component `P` merge into a
|
|
17
|
+
* 3-component one with z = 0, which is the case that actually occurs.
|
|
18
|
+
*
|
|
19
|
+
* A differing storage widens to whichever holds both exactly, so an `i32`
|
|
20
|
+
* meeting an `f32` becomes `f64` rather than silently losing large integers.
|
|
21
|
+
*
|
|
22
|
+
* A name that is a string attribute on one side and numeric on the other is an
|
|
23
|
+
* error, because either coercion would be a guess.
|
|
24
|
+
*
|
|
25
|
+
* Detail is first-wins, so merging into a geometry keeps the document facts of
|
|
26
|
+
* the first input. Houdini's Merge does the same and the alternative, last-wins,
|
|
27
|
+
* makes the result depend on wiring order in a way nobody can see.
|
|
28
|
+
*/
|
|
29
|
+
export declare function mergeGeometry(...inputs: readonly Geometry[]): Geometry;
|
|
30
|
+
export declare function mergeGeometries(inputs: readonly Geometry[]): Geometry;
|
|
31
|
+
/** The narrowest storage that holds both operands' values exactly. */
|
|
32
|
+
export declare function widerStorage(a: AttributeStorage, b: AttributeStorage): AttributeStorage;
|
|
33
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/geometry/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,gBAAgB,EAIrB,KAAK,QAAQ,EAEd,MAAM,oBAAoB,CAAC;AAI5B;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,aAAa,CAAC,GAAG,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ,CAEtE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ,CA+CrE;AAkBD,sEAAsE;AACtE,wBAAgB,YAAY,CAC1B,CAAC,EAAE,gBAAgB,EACnB,CAAC,EAAE,gBAAgB,GAClB,gBAAgB,CAMlB"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { attributeArray, createGeometry, emptyGeometry, isStringAttribute, levelCount, } from "cascade/contracts";
|
|
2
|
+
import { createStringAttribute, geometryError, readString } from "./attributes.js";
|
|
3
|
+
/**
|
|
4
|
+
* Merge concatenates geometries and renumbers points, vertices and primitives.
|
|
5
|
+
*
|
|
6
|
+
* It is the operation that proves the format composes, so the attribute rule is
|
|
7
|
+
* the interesting part: the result carries the *union* of the attribute names on
|
|
8
|
+
* its inputs, and an attribute present on one side and absent on the other is
|
|
9
|
+
* zero-filled over the range that lacked it rather than dropped. That is the
|
|
10
|
+
* whole argument for a generic attribute table. The two live bugs in
|
|
11
|
+
* `cloud-plots` are both an operation dropping an attribute it had never heard
|
|
12
|
+
* of, and an operation that copies the whole set cannot make that mistake.
|
|
13
|
+
*
|
|
14
|
+
* Three conflicts have to be resolved rather than avoided:
|
|
15
|
+
*
|
|
16
|
+
* A differing component count widens to the largest and zero-fills the missing
|
|
17
|
+
* components. This is how a 2-component `P` and a 3-component `P` merge into a
|
|
18
|
+
* 3-component one with z = 0, which is the case that actually occurs.
|
|
19
|
+
*
|
|
20
|
+
* A differing storage widens to whichever holds both exactly, so an `i32`
|
|
21
|
+
* meeting an `f32` becomes `f64` rather than silently losing large integers.
|
|
22
|
+
*
|
|
23
|
+
* A name that is a string attribute on one side and numeric on the other is an
|
|
24
|
+
* error, because either coercion would be a guess.
|
|
25
|
+
*
|
|
26
|
+
* Detail is first-wins, so merging into a geometry keeps the document facts of
|
|
27
|
+
* the first input. Houdini's Merge does the same and the alternative, last-wins,
|
|
28
|
+
* makes the result depend on wiring order in a way nobody can see.
|
|
29
|
+
*/
|
|
30
|
+
export function mergeGeometry(...inputs) {
|
|
31
|
+
return mergeGeometries(inputs);
|
|
32
|
+
}
|
|
33
|
+
export function mergeGeometries(inputs) {
|
|
34
|
+
if (inputs.length === 0)
|
|
35
|
+
return emptyGeometry(2);
|
|
36
|
+
if (inputs.length === 1)
|
|
37
|
+
return inputs[0];
|
|
38
|
+
const pointCount = sum(inputs, (input) => input.pointCount);
|
|
39
|
+
const vertexCount = sum(inputs, (input) => input.vertexCount);
|
|
40
|
+
const primitiveCount = sum(inputs, (input) => input.primitiveCount);
|
|
41
|
+
const vertexPoints = new Int32Array(vertexCount);
|
|
42
|
+
const offsets = new Int32Array(primitiveCount + 1);
|
|
43
|
+
const kinds = new Uint8Array(primitiveCount);
|
|
44
|
+
const closed = new Uint8Array(primitiveCount);
|
|
45
|
+
let pointBase = 0;
|
|
46
|
+
let vertexBase = 0;
|
|
47
|
+
let primitiveBase = 0;
|
|
48
|
+
for (const input of inputs) {
|
|
49
|
+
for (let vertex = 0; vertex < input.vertexCount; vertex += 1)
|
|
50
|
+
vertexPoints[vertexBase + vertex] =
|
|
51
|
+
input.topology.vertexPoints[vertex] + pointBase;
|
|
52
|
+
for (let primitive = 0; primitive < input.primitiveCount; primitive += 1) {
|
|
53
|
+
offsets[primitiveBase + primitive] =
|
|
54
|
+
input.topology.offsets[primitive] + vertexBase;
|
|
55
|
+
kinds[primitiveBase + primitive] = input.topology.kinds[primitive];
|
|
56
|
+
closed[primitiveBase + primitive] = input.topology.closed[primitive];
|
|
57
|
+
}
|
|
58
|
+
pointBase += input.pointCount;
|
|
59
|
+
vertexBase += input.vertexCount;
|
|
60
|
+
primitiveBase += input.primitiveCount;
|
|
61
|
+
}
|
|
62
|
+
offsets[primitiveCount] = vertexCount;
|
|
63
|
+
const detail = {};
|
|
64
|
+
for (const input of inputs)
|
|
65
|
+
for (const [name, value] of Object.entries(input.detail))
|
|
66
|
+
if (!Object.prototype.hasOwnProperty.call(detail, name))
|
|
67
|
+
detail[name] = value;
|
|
68
|
+
return createGeometry({
|
|
69
|
+
pointCount,
|
|
70
|
+
point: mergeLevel(inputs, "point"),
|
|
71
|
+
vertex: mergeLevel(inputs, "vertex"),
|
|
72
|
+
primitive: mergeLevel(inputs, "primitive"),
|
|
73
|
+
detail,
|
|
74
|
+
topology: { vertexPoints, offsets, kinds, closed },
|
|
75
|
+
pointGroups: mergeGroups(inputs, "point"),
|
|
76
|
+
primitiveGroups: mergeGroups(inputs, "primitive"),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function sum(inputs, read) {
|
|
80
|
+
let total = 0;
|
|
81
|
+
for (const input of inputs)
|
|
82
|
+
total += read(input);
|
|
83
|
+
return total;
|
|
84
|
+
}
|
|
85
|
+
const STORAGE_RANK = {
|
|
86
|
+
u8: 0,
|
|
87
|
+
i32: 1,
|
|
88
|
+
f32: 2,
|
|
89
|
+
f64: 3,
|
|
90
|
+
};
|
|
91
|
+
/** The narrowest storage that holds both operands' values exactly. */
|
|
92
|
+
export function widerStorage(a, b) {
|
|
93
|
+
if (a === b)
|
|
94
|
+
return a;
|
|
95
|
+
if (a === "f64" || b === "f64")
|
|
96
|
+
return "f64";
|
|
97
|
+
// f32 has 24 bits of mantissa, so it cannot hold every i32 exactly.
|
|
98
|
+
if ((a === "i32" && b === "f32") || (a === "f32" && b === "i32"))
|
|
99
|
+
return "f64";
|
|
100
|
+
return STORAGE_RANK[a] > STORAGE_RANK[b] ? a : b;
|
|
101
|
+
}
|
|
102
|
+
function mergeLevel(inputs, level) {
|
|
103
|
+
const names = [];
|
|
104
|
+
for (const input of inputs)
|
|
105
|
+
for (const name of Object.keys(input[level]))
|
|
106
|
+
if (!names.includes(name))
|
|
107
|
+
names.push(name);
|
|
108
|
+
const total = sum(inputs, (input) => levelCount(input, level));
|
|
109
|
+
const result = {};
|
|
110
|
+
for (const name of names) {
|
|
111
|
+
const present = inputs
|
|
112
|
+
.map((input) => input[level][name])
|
|
113
|
+
.filter((attribute) => attribute !== undefined);
|
|
114
|
+
const strings = present.filter(isStringAttribute).length;
|
|
115
|
+
if (strings !== 0 && strings !== present.length)
|
|
116
|
+
geometryError("attribute-conflict", `${level}.${name} is a string attribute on one input and numeric on another`);
|
|
117
|
+
result[name] =
|
|
118
|
+
strings === present.length
|
|
119
|
+
? mergeStringAttribute(inputs, level, name, total)
|
|
120
|
+
: mergeNumericAttribute(inputs, level, name, total);
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
function mergeNumericAttribute(inputs, level, name, total) {
|
|
125
|
+
let size = 1;
|
|
126
|
+
let storage;
|
|
127
|
+
for (const input of inputs) {
|
|
128
|
+
const attribute = input[level][name];
|
|
129
|
+
if (attribute === undefined || isStringAttribute(attribute))
|
|
130
|
+
continue;
|
|
131
|
+
size = Math.max(size, attribute.size);
|
|
132
|
+
storage = storage === undefined ? attribute.storage : widerStorage(storage, attribute.storage);
|
|
133
|
+
}
|
|
134
|
+
const data = attributeArray(storage ?? "f64", size * total);
|
|
135
|
+
let base = 0;
|
|
136
|
+
for (const input of inputs) {
|
|
137
|
+
const count = levelCount(input, level);
|
|
138
|
+
const attribute = input[level][name];
|
|
139
|
+
if (attribute !== undefined && !isStringAttribute(attribute))
|
|
140
|
+
for (let index = 0; index < count; index += 1)
|
|
141
|
+
for (let component = 0; component < attribute.size; component += 1)
|
|
142
|
+
data[(base + index) * size + component] =
|
|
143
|
+
attribute.data[index * attribute.size + component];
|
|
144
|
+
base += count;
|
|
145
|
+
}
|
|
146
|
+
return { storage: storage ?? "f64", size, data };
|
|
147
|
+
}
|
|
148
|
+
function mergeStringAttribute(inputs, level, name, total) {
|
|
149
|
+
const values = new Array(total).fill("");
|
|
150
|
+
let base = 0;
|
|
151
|
+
for (const input of inputs) {
|
|
152
|
+
const count = levelCount(input, level);
|
|
153
|
+
const attribute = input[level][name];
|
|
154
|
+
if (attribute !== undefined && isStringAttribute(attribute))
|
|
155
|
+
for (let index = 0; index < count; index += 1)
|
|
156
|
+
values[base + index] = readString(attribute, index);
|
|
157
|
+
base += count;
|
|
158
|
+
}
|
|
159
|
+
return createStringAttribute(values);
|
|
160
|
+
}
|
|
161
|
+
function mergeGroups(inputs, level) {
|
|
162
|
+
const key = level === "point" ? "pointGroups" : "primitiveGroups";
|
|
163
|
+
const names = [];
|
|
164
|
+
for (const input of inputs)
|
|
165
|
+
for (const name of Object.keys(input[key]))
|
|
166
|
+
if (!names.includes(name))
|
|
167
|
+
names.push(name);
|
|
168
|
+
const total = sum(inputs, (input) => levelCount(input, level));
|
|
169
|
+
const result = {};
|
|
170
|
+
for (const name of names) {
|
|
171
|
+
const mask = new Uint8Array(total);
|
|
172
|
+
let base = 0;
|
|
173
|
+
for (const input of inputs) {
|
|
174
|
+
const count = levelCount(input, level);
|
|
175
|
+
const source = input[key][name];
|
|
176
|
+
if (source !== undefined)
|
|
177
|
+
for (let index = 0; index < count; index += 1)
|
|
178
|
+
mask[base + index] = source[index];
|
|
179
|
+
base += count;
|
|
180
|
+
}
|
|
181
|
+
result[name] = mask;
|
|
182
|
+
}
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/geometry/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Geometry, PrimitiveKind } from "cascade/contracts";
|
|
2
|
+
/** Topology and measurement reads that the operations share. */
|
|
3
|
+
export declare function primitiveKind(geometry: Geometry, primitive: number): PrimitiveKind;
|
|
4
|
+
export declare function isClosed(geometry: Geometry, primitive: number): boolean;
|
|
5
|
+
/** True when the primitive's vertex run is a cubic Bézier chain. */
|
|
6
|
+
export declare function isBezier(geometry: Geometry, primitive: number): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* The cubic segments of a `bezier` primitive, each as the four point indices
|
|
9
|
+
* `[anchor, handle, handle, anchor]`. A closed primitive's last segment wraps
|
|
10
|
+
* to the first anchor. The arity is guaranteed by `createGeometry`, so this
|
|
11
|
+
* needs no defensive branch.
|
|
12
|
+
*/
|
|
13
|
+
export declare function bezierSegments(geometry: Geometry, primitive: number): number[][];
|
|
14
|
+
/** Half-open vertex range `[start, end)` of one primitive. */
|
|
15
|
+
export declare function vertexRange(geometry: Geometry, primitive: number): readonly [number, number];
|
|
16
|
+
export declare function vertexCountOf(geometry: Geometry, primitive: number): number;
|
|
17
|
+
/** The point indices a primitive's vertices reference, in vertex order. */
|
|
18
|
+
export declare function primitivePoints(geometry: Geometry, primitive: number): number[];
|
|
19
|
+
/** A mask of the points no primitive references: the loose points, the dots. */
|
|
20
|
+
export declare function loosePointMask(geometry: Geometry): Uint8Array;
|
|
21
|
+
export declare function distance(positions: ArrayLike<number>, size: number, a: number, b: number): number;
|
|
22
|
+
/**
|
|
23
|
+
* Cumulative arc lengths along one primitive, one entry per segment. A closed
|
|
24
|
+
* primitive has one more segment than an open one, the one that returns to its
|
|
25
|
+
* first point.
|
|
26
|
+
*
|
|
27
|
+
* Linear only. A `bezier` primitive is refused rather than measured along its
|
|
28
|
+
* control polygon, because a length that is quietly 10% short is worse than one
|
|
29
|
+
* that is missing: flatten the curve first, and see the note on the kind
|
|
30
|
+
* vocabulary in `packages/contracts/src/geometry.ts`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function arcLengths(geometry: Geometry, primitive: number): number[];
|
|
33
|
+
export declare function primitiveLength(geometry: Geometry, primitive: number): number;
|
|
34
|
+
export declare function geometryLength(geometry: Geometry): number;
|
|
35
|
+
export interface Bounds {
|
|
36
|
+
readonly min: readonly number[];
|
|
37
|
+
readonly max: readonly number[];
|
|
38
|
+
}
|
|
39
|
+
/** Axis-aligned bounds over every point, or undefined for an empty geometry. */
|
|
40
|
+
export declare function geometryBounds(geometry: Geometry): Bounds | undefined;
|
|
41
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/geometry/primitives.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASlE,gEAAgE;AAEhE,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAChB,aAAa,CAEf;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE,EAAE,CAiBZ;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CACzB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAChB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAK3B;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG3E;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE,CAMV;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAO7D;AAED,wBAAgB,QAAQ,CACtB,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,MAAM,CAOR;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAoB1E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG7E;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAKzD;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAarE"}
|