@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,131 @@
|
|
|
1
|
+
import { BEZIER_STRIDE, PRIMITIVE_KINDS } from "cascade/contracts";
|
|
2
|
+
import { geometryError, positionAttribute, positionSize, } from "./attributes.js";
|
|
3
|
+
/** Topology and measurement reads that the operations share. */
|
|
4
|
+
export function primitiveKind(geometry, primitive) {
|
|
5
|
+
return PRIMITIVE_KINDS[geometry.topology.kinds[primitive]] ?? "poly";
|
|
6
|
+
}
|
|
7
|
+
export function isClosed(geometry, primitive) {
|
|
8
|
+
return geometry.topology.closed[primitive] === 1;
|
|
9
|
+
}
|
|
10
|
+
/** True when the primitive's vertex run is a cubic Bézier chain. */
|
|
11
|
+
export function isBezier(geometry, primitive) {
|
|
12
|
+
return primitiveKind(geometry, primitive) === "bezier";
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The cubic segments of a `bezier` primitive, each as the four point indices
|
|
16
|
+
* `[anchor, handle, handle, anchor]`. A closed primitive's last segment wraps
|
|
17
|
+
* to the first anchor. The arity is guaranteed by `createGeometry`, so this
|
|
18
|
+
* needs no defensive branch.
|
|
19
|
+
*/
|
|
20
|
+
export function bezierSegments(geometry, primitive) {
|
|
21
|
+
const points = primitivePoints(geometry, primitive);
|
|
22
|
+
const closed = isClosed(geometry, primitive);
|
|
23
|
+
const count = closed
|
|
24
|
+
? points.length / BEZIER_STRIDE
|
|
25
|
+
: (points.length - 1) / BEZIER_STRIDE;
|
|
26
|
+
const segments = [];
|
|
27
|
+
for (let index = 0; index < count; index += 1) {
|
|
28
|
+
const base = index * BEZIER_STRIDE;
|
|
29
|
+
segments.push([
|
|
30
|
+
points[base],
|
|
31
|
+
points[base + 1],
|
|
32
|
+
points[base + 2],
|
|
33
|
+
points[(base + BEZIER_STRIDE) % points.length],
|
|
34
|
+
]);
|
|
35
|
+
}
|
|
36
|
+
return segments;
|
|
37
|
+
}
|
|
38
|
+
/** Half-open vertex range `[start, end)` of one primitive. */
|
|
39
|
+
export function vertexRange(geometry, primitive) {
|
|
40
|
+
return [
|
|
41
|
+
geometry.topology.offsets[primitive],
|
|
42
|
+
geometry.topology.offsets[primitive + 1],
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
export function vertexCountOf(geometry, primitive) {
|
|
46
|
+
const [start, end] = vertexRange(geometry, primitive);
|
|
47
|
+
return end - start;
|
|
48
|
+
}
|
|
49
|
+
/** The point indices a primitive's vertices reference, in vertex order. */
|
|
50
|
+
export function primitivePoints(geometry, primitive) {
|
|
51
|
+
const [start, end] = vertexRange(geometry, primitive);
|
|
52
|
+
const points = new Array(end - start);
|
|
53
|
+
for (let vertex = start; vertex < end; vertex += 1)
|
|
54
|
+
points[vertex - start] = geometry.topology.vertexPoints[vertex];
|
|
55
|
+
return points;
|
|
56
|
+
}
|
|
57
|
+
/** A mask of the points no primitive references: the loose points, the dots. */
|
|
58
|
+
export function loosePointMask(geometry) {
|
|
59
|
+
const used = new Uint8Array(geometry.pointCount);
|
|
60
|
+
for (const point of geometry.topology.vertexPoints)
|
|
61
|
+
used[point] = 1;
|
|
62
|
+
const loose = new Uint8Array(geometry.pointCount);
|
|
63
|
+
for (let index = 0; index < loose.length; index += 1)
|
|
64
|
+
loose[index] = used[index] ? 0 : 1;
|
|
65
|
+
return loose;
|
|
66
|
+
}
|
|
67
|
+
export function distance(positions, size, a, b) {
|
|
68
|
+
let total = 0;
|
|
69
|
+
for (let component = 0; component < size; component += 1) {
|
|
70
|
+
const delta = positions[b * size + component] - positions[a * size + component];
|
|
71
|
+
total += delta * delta;
|
|
72
|
+
}
|
|
73
|
+
return Math.sqrt(total);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Cumulative arc lengths along one primitive, one entry per segment. A closed
|
|
77
|
+
* primitive has one more segment than an open one, the one that returns to its
|
|
78
|
+
* first point.
|
|
79
|
+
*
|
|
80
|
+
* Linear only. A `bezier` primitive is refused rather than measured along its
|
|
81
|
+
* control polygon, because a length that is quietly 10% short is worse than one
|
|
82
|
+
* that is missing: flatten the curve first, and see the note on the kind
|
|
83
|
+
* vocabulary in `packages/contracts/src/geometry.ts`.
|
|
84
|
+
*/
|
|
85
|
+
export function arcLengths(geometry, primitive) {
|
|
86
|
+
if (isBezier(geometry, primitive))
|
|
87
|
+
geometryError("curve-measure", `primitive ${primitive} is a bezier; arc length along a curve is not implemented`);
|
|
88
|
+
const position = positionAttribute(geometry);
|
|
89
|
+
const size = position.size;
|
|
90
|
+
const points = primitivePoints(geometry, primitive);
|
|
91
|
+
const closed = isClosed(geometry, primitive);
|
|
92
|
+
const segments = points.length < 2 ? 0 : closed ? points.length : points.length - 1;
|
|
93
|
+
const cumulative = new Array(segments);
|
|
94
|
+
let total = 0;
|
|
95
|
+
for (let segment = 0; segment < segments; segment += 1) {
|
|
96
|
+
const from = points[segment];
|
|
97
|
+
const to = points[(segment + 1) % points.length];
|
|
98
|
+
total += distance(position.data, size, from, to);
|
|
99
|
+
cumulative[segment] = total;
|
|
100
|
+
}
|
|
101
|
+
return cumulative;
|
|
102
|
+
}
|
|
103
|
+
export function primitiveLength(geometry, primitive) {
|
|
104
|
+
const cumulative = arcLengths(geometry, primitive);
|
|
105
|
+
return cumulative.length === 0 ? 0 : cumulative[cumulative.length - 1];
|
|
106
|
+
}
|
|
107
|
+
export function geometryLength(geometry) {
|
|
108
|
+
let total = 0;
|
|
109
|
+
for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
|
|
110
|
+
total += primitiveLength(geometry, primitive);
|
|
111
|
+
return total;
|
|
112
|
+
}
|
|
113
|
+
/** Axis-aligned bounds over every point, or undefined for an empty geometry. */
|
|
114
|
+
export function geometryBounds(geometry) {
|
|
115
|
+
if (geometry.pointCount === 0)
|
|
116
|
+
return undefined;
|
|
117
|
+
const position = positionAttribute(geometry);
|
|
118
|
+
const size = positionSize(geometry);
|
|
119
|
+
const min = new Array(size).fill(Number.POSITIVE_INFINITY);
|
|
120
|
+
const max = new Array(size).fill(Number.NEGATIVE_INFINITY);
|
|
121
|
+
for (let point = 0; point < geometry.pointCount; point += 1)
|
|
122
|
+
for (let component = 0; component < size; component += 1) {
|
|
123
|
+
const value = position.data[point * size + component];
|
|
124
|
+
if (value < min[component])
|
|
125
|
+
min[component] = value;
|
|
126
|
+
if (value > max[component])
|
|
127
|
+
max[component] = value;
|
|
128
|
+
}
|
|
129
|
+
return { min, max };
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/geometry/primitives.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type AttributeLevel, type ElementLevel, type Geometry } from "cascade/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* Moving an attribute between levels, and copying one between geometries.
|
|
4
|
+
*
|
|
5
|
+
* The reduction is always explicit. Houdini has per-node defaults here and I do
|
|
6
|
+
* not trust anyone's memory of what they are; a silent one would be the wrong
|
|
7
|
+
* thing to inherit anyway, because "the mean of the tag" and "the first tag"
|
|
8
|
+
* are different answers and only the author knows which was meant.
|
|
9
|
+
*/
|
|
10
|
+
export type AttributeReduction = "first" | "last" | "mean" | "min" | "max" | "sum";
|
|
11
|
+
export interface PromoteOptions {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly from: AttributeLevel;
|
|
14
|
+
readonly to: AttributeLevel;
|
|
15
|
+
/** Required, including for one-to-one moves, so a change of mind is visible. */
|
|
16
|
+
readonly reduction: AttributeReduction;
|
|
17
|
+
/** Rename on the way, when the source name should survive. */
|
|
18
|
+
readonly as?: string;
|
|
19
|
+
/** Keep the source attribute in place. Off by default, as Houdini has it. */
|
|
20
|
+
readonly keepSource?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Move an attribute from one level to another. Fan-in reduces with the stated
|
|
24
|
+
* reduction; fan-out copies. A string attribute only accepts `first` or `last`,
|
|
25
|
+
* because the mean of a tag is not a tag.
|
|
26
|
+
*/
|
|
27
|
+
export declare function promoteAttribute(geometry: Geometry, options: PromoteOptions): Geometry;
|
|
28
|
+
export interface CopyAttributeOptions {
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly level: ElementLevel;
|
|
31
|
+
/** Name on the target, when it differs. */
|
|
32
|
+
readonly as?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Copy one attribute from another geometry, by element index. Index copying is
|
|
36
|
+
* the honest v1: nearest-point copying needs a spatial hash and is a different
|
|
37
|
+
* operation with a different failure mode.
|
|
38
|
+
*
|
|
39
|
+
* When the target has more elements than the source, the surplus is zero-filled
|
|
40
|
+
* rather than wrapped or clamped, because both of those invent values that look
|
|
41
|
+
* like data.
|
|
42
|
+
*/
|
|
43
|
+
export declare function copyAttribute(target: Geometry, source: Geometry, options: CopyAttributeOptions): Geometry;
|
|
44
|
+
//# sourceMappingURL=promote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/geometry/promote.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,cAAc,EAEnB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAY5B;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP,MAAM,GACN,MAAM,GACN,KAAK,GACL,KAAK,GACL,KAAK,CAAC;AAEV,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AA6FD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,cAAc,GACtB,QAAQ,CA8BV;AAuED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,oBAAoB,GAC5B,QAAQ,CAuBV"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { attributeArray, isStringAttribute, levelCount, POSITION_ATTRIBUTE, } from "cascade/contracts";
|
|
2
|
+
import { createStringAttribute, geometryError, readString, removeAttribute, removeDetail, setAttribute, setDetail, } from "./attributes.js";
|
|
3
|
+
/**
|
|
4
|
+
* Which source elements feed each target element. This one table is the whole
|
|
5
|
+
* operation: every level pair is a fan-in or a fan-out over the CSR topology,
|
|
6
|
+
* and once the table exists the reduction is the same three lines for all of
|
|
7
|
+
* them.
|
|
8
|
+
*/
|
|
9
|
+
function sourceIndices(geometry, from, to) {
|
|
10
|
+
const { vertexPoints, offsets } = geometry.topology;
|
|
11
|
+
const targets = levelCount(geometry, to);
|
|
12
|
+
const table = Array.from({ length: targets }, () => []);
|
|
13
|
+
if (from === to) {
|
|
14
|
+
for (let index = 0; index < targets; index += 1)
|
|
15
|
+
table[index].push(index);
|
|
16
|
+
return table;
|
|
17
|
+
}
|
|
18
|
+
if (from === "detail") {
|
|
19
|
+
for (let index = 0; index < targets; index += 1)
|
|
20
|
+
table[index].push(0);
|
|
21
|
+
return table;
|
|
22
|
+
}
|
|
23
|
+
if (to === "detail") {
|
|
24
|
+
const sources = levelCount(geometry, from);
|
|
25
|
+
for (let index = 0; index < sources; index += 1)
|
|
26
|
+
table[0].push(index);
|
|
27
|
+
return table;
|
|
28
|
+
}
|
|
29
|
+
if (from === "point" && to === "vertex") {
|
|
30
|
+
for (let vertex = 0; vertex < targets; vertex += 1)
|
|
31
|
+
table[vertex].push(vertexPoints[vertex]);
|
|
32
|
+
return table;
|
|
33
|
+
}
|
|
34
|
+
if (from === "vertex" && to === "point") {
|
|
35
|
+
for (let vertex = 0; vertex < geometry.vertexCount; vertex += 1)
|
|
36
|
+
table[vertexPoints[vertex]].push(vertex);
|
|
37
|
+
return table;
|
|
38
|
+
}
|
|
39
|
+
if (from === "vertex" && to === "primitive") {
|
|
40
|
+
for (let primitive = 0; primitive < targets; primitive += 1)
|
|
41
|
+
for (let vertex = offsets[primitive]; vertex < offsets[primitive + 1]; vertex += 1)
|
|
42
|
+
table[primitive].push(vertex);
|
|
43
|
+
return table;
|
|
44
|
+
}
|
|
45
|
+
if (from === "primitive" && to === "vertex") {
|
|
46
|
+
for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
|
|
47
|
+
for (let vertex = offsets[primitive]; vertex < offsets[primitive + 1]; vertex += 1)
|
|
48
|
+
table[vertex].push(primitive);
|
|
49
|
+
return table;
|
|
50
|
+
}
|
|
51
|
+
if (from === "point" && to === "primitive") {
|
|
52
|
+
for (let primitive = 0; primitive < targets; primitive += 1)
|
|
53
|
+
for (let vertex = offsets[primitive]; vertex < offsets[primitive + 1]; vertex += 1)
|
|
54
|
+
table[primitive].push(vertexPoints[vertex]);
|
|
55
|
+
return table;
|
|
56
|
+
}
|
|
57
|
+
// primitive to point: a point may belong to several primitives, or to none.
|
|
58
|
+
for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
|
|
59
|
+
for (let vertex = offsets[primitive]; vertex < offsets[primitive + 1]; vertex += 1)
|
|
60
|
+
table[vertexPoints[vertex]].push(primitive);
|
|
61
|
+
return table;
|
|
62
|
+
}
|
|
63
|
+
function reduce(values, reduction) {
|
|
64
|
+
if (values.length === 0)
|
|
65
|
+
return 0;
|
|
66
|
+
if (reduction === "first")
|
|
67
|
+
return values[0];
|
|
68
|
+
if (reduction === "last")
|
|
69
|
+
return values[values.length - 1];
|
|
70
|
+
if (reduction === "min")
|
|
71
|
+
return Math.min(...values);
|
|
72
|
+
if (reduction === "max")
|
|
73
|
+
return Math.max(...values);
|
|
74
|
+
let total = 0;
|
|
75
|
+
for (const value of values)
|
|
76
|
+
total += value;
|
|
77
|
+
return reduction === "sum" ? total : total / values.length;
|
|
78
|
+
}
|
|
79
|
+
function detailAsAttribute(value, count) {
|
|
80
|
+
if (typeof value === "string")
|
|
81
|
+
return createStringAttribute(new Array(count).fill(value));
|
|
82
|
+
const values = typeof value === "number" ? [value] : value;
|
|
83
|
+
const size = Math.max(values.length, 1);
|
|
84
|
+
const data = attributeArray("f64", size * count);
|
|
85
|
+
for (let index = 0; index < count; index += 1)
|
|
86
|
+
for (let component = 0; component < size; component += 1)
|
|
87
|
+
data[index * size + component] = values[component] ?? 0;
|
|
88
|
+
return { storage: "f64", size, data };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Move an attribute from one level to another. Fan-in reduces with the stated
|
|
92
|
+
* reduction; fan-out copies. A string attribute only accepts `first` or `last`,
|
|
93
|
+
* because the mean of a tag is not a tag.
|
|
94
|
+
*/
|
|
95
|
+
export function promoteAttribute(geometry, options) {
|
|
96
|
+
const { name, from, to, reduction } = options;
|
|
97
|
+
const target = options.as ?? name;
|
|
98
|
+
if (from === "point" && name === POSITION_ATTRIBUTE && !options.keepSource)
|
|
99
|
+
geometryError("remove-position", "point.P cannot be promoted away; pass keepSource");
|
|
100
|
+
const source = from === "detail" ? geometry.detail[name] : geometry[from][name];
|
|
101
|
+
if (source === undefined)
|
|
102
|
+
geometryError("missing-attribute", `${from}.${name} is not present`);
|
|
103
|
+
const table = sourceIndices(geometry, from, to);
|
|
104
|
+
if (to === "detail") {
|
|
105
|
+
const value = detailFrom(source, table[0] ?? [], reduction);
|
|
106
|
+
const promoted = setDetail(geometry, target, value);
|
|
107
|
+
return from === "detail" || options.keepSource
|
|
108
|
+
? promoted
|
|
109
|
+
: removeAttribute(promoted, from, name);
|
|
110
|
+
}
|
|
111
|
+
const attribute = from === "detail"
|
|
112
|
+
? detailAsAttribute(source, levelCount(geometry, to))
|
|
113
|
+
: gather(source, table, reduction);
|
|
114
|
+
const promoted = setAttribute(geometry, to, target, attribute);
|
|
115
|
+
if (from === "detail")
|
|
116
|
+
return options.keepSource ? promoted : removeDetail(promoted, name);
|
|
117
|
+
return options.keepSource
|
|
118
|
+
? promoted
|
|
119
|
+
: removeAttribute(promoted, from, name);
|
|
120
|
+
}
|
|
121
|
+
function detailFrom(source, indices, reduction) {
|
|
122
|
+
if (typeof source === "number" || typeof source === "string")
|
|
123
|
+
return source;
|
|
124
|
+
if (Array.isArray(source))
|
|
125
|
+
return [...source];
|
|
126
|
+
const attribute = source;
|
|
127
|
+
if (isStringAttribute(attribute)) {
|
|
128
|
+
if (reduction !== "first" && reduction !== "last")
|
|
129
|
+
geometryError("string-reduction", "a string attribute reduces only with first or last");
|
|
130
|
+
if (indices.length === 0)
|
|
131
|
+
return "";
|
|
132
|
+
const index = reduction === "first" ? indices[0] : indices[indices.length - 1];
|
|
133
|
+
return readString(attribute, index);
|
|
134
|
+
}
|
|
135
|
+
const values = [];
|
|
136
|
+
for (let component = 0; component < attribute.size; component += 1) {
|
|
137
|
+
const column = indices.map((index) => attribute.data[index * attribute.size + component]);
|
|
138
|
+
values.push(reduce(column, reduction));
|
|
139
|
+
}
|
|
140
|
+
return attribute.size === 1 ? values[0] : values;
|
|
141
|
+
}
|
|
142
|
+
function gather(attribute, table, reduction) {
|
|
143
|
+
if (isStringAttribute(attribute)) {
|
|
144
|
+
if (reduction !== "first" && reduction !== "last")
|
|
145
|
+
geometryError("string-reduction", "a string attribute reduces only with first or last");
|
|
146
|
+
const values = table.map((indices) => {
|
|
147
|
+
if (indices.length === 0)
|
|
148
|
+
return "";
|
|
149
|
+
const index = reduction === "first" ? indices[0] : indices[indices.length - 1];
|
|
150
|
+
return readString(attribute, index);
|
|
151
|
+
});
|
|
152
|
+
return createStringAttribute(values);
|
|
153
|
+
}
|
|
154
|
+
const numeric = attribute;
|
|
155
|
+
const size = numeric.size;
|
|
156
|
+
const data = attributeArray(reduction === "mean" && numeric.storage !== "f64" ? "f64" : numeric.storage, size * table.length);
|
|
157
|
+
for (let target = 0; target < table.length; target += 1) {
|
|
158
|
+
const indices = table[target];
|
|
159
|
+
for (let component = 0; component < size; component += 1) {
|
|
160
|
+
const column = indices.map((index) => numeric.data[index * size + component]);
|
|
161
|
+
data[target * size + component] = reduce(column, reduction);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
storage: reduction === "mean" && numeric.storage !== "f64" ? "f64" : numeric.storage,
|
|
166
|
+
size,
|
|
167
|
+
data,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Copy one attribute from another geometry, by element index. Index copying is
|
|
172
|
+
* the honest v1: nearest-point copying needs a spatial hash and is a different
|
|
173
|
+
* operation with a different failure mode.
|
|
174
|
+
*
|
|
175
|
+
* When the target has more elements than the source, the surplus is zero-filled
|
|
176
|
+
* rather than wrapped or clamped, because both of those invent values that look
|
|
177
|
+
* like data.
|
|
178
|
+
*/
|
|
179
|
+
export function copyAttribute(target, source, options) {
|
|
180
|
+
const { name, level } = options;
|
|
181
|
+
const attribute = source[level][name];
|
|
182
|
+
if (attribute === undefined)
|
|
183
|
+
geometryError("missing-attribute", `${level}.${name} is not present on the source`);
|
|
184
|
+
const count = levelCount(target, level);
|
|
185
|
+
const available = Math.min(count, levelCount(source, level));
|
|
186
|
+
if (isStringAttribute(attribute)) {
|
|
187
|
+
const values = new Array(count).fill("");
|
|
188
|
+
for (let index = 0; index < available; index += 1)
|
|
189
|
+
values[index] = readString(attribute, index);
|
|
190
|
+
return setAttribute(target, level, options.as ?? name, createStringAttribute(values));
|
|
191
|
+
}
|
|
192
|
+
const size = attribute.size;
|
|
193
|
+
const data = attributeArray(attribute.storage, size * count);
|
|
194
|
+
for (let index = 0; index < available; index += 1)
|
|
195
|
+
for (let component = 0; component < size; component += 1)
|
|
196
|
+
data[index * size + component] = attribute.data[index * size + component];
|
|
197
|
+
return setAttribute(target, level, options.as ?? name, {
|
|
198
|
+
storage: attribute.storage,
|
|
199
|
+
size,
|
|
200
|
+
data,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=promote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/geometry/promote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Geometry } from "cascade/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* Rewrite each primitive at a uniform arc-length spacing, or at a target
|
|
4
|
+
* vertex count. Most curve operations want a uniformly sampled chain, so this
|
|
5
|
+
* is the prerequisite for the rest of stage 4 and is built early.
|
|
6
|
+
*
|
|
7
|
+
* Two decisions the shape of the data forces:
|
|
8
|
+
*
|
|
9
|
+
* Loose points survive untouched. A point that no primitive references is a
|
|
10
|
+
* dot, `cascade-logo` is half made of them, and an operation on curves has no
|
|
11
|
+
* business deleting them. Points that only the resampled primitives referenced
|
|
12
|
+
* are replaced, since the new chain is the same curve at different stations.
|
|
13
|
+
*
|
|
14
|
+
* The primitive count never changes, so primitive attributes, primitive groups
|
|
15
|
+
* and detail are shared with the input by reference rather than rebuilt. Point
|
|
16
|
+
* and vertex attributes are interpolated linearly along the chain; a string
|
|
17
|
+
* attribute and a group membership take the nearer of the two source elements,
|
|
18
|
+
* because there is no meaningful blend of a tag.
|
|
19
|
+
*/
|
|
20
|
+
export interface ResampleOptions {
|
|
21
|
+
/** Target arc length between consecutive points. Exclusive with `count`. */
|
|
22
|
+
readonly spacing?: number;
|
|
23
|
+
/** Target points per primitive. Exclusive with `spacing`. */
|
|
24
|
+
readonly count?: number;
|
|
25
|
+
/** Restrict to a primitive group; the rest carry through unchanged. */
|
|
26
|
+
readonly group?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function resampleGeometry(geometry: Geometry, options: ResampleOptions): Geometry;
|
|
29
|
+
//# sourceMappingURL=resample.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resample.d.ts","sourceRoot":"","sources":["../../src/geometry/resample.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAgB5B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAOD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,eAAe,GACvB,QAAQ,CA+IV"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { attributeArray, createGeometry, isStringAttribute, } from "cascade/contracts";
|
|
2
|
+
import { createStringAttribute, geometryError, readString, } from "./attributes.js";
|
|
3
|
+
import { groupMask } from "./groups.js";
|
|
4
|
+
import { arcLengths, isBezier, isClosed, loosePointMask, primitivePoints, } from "./primitives.js";
|
|
5
|
+
export function resampleGeometry(geometry, options) {
|
|
6
|
+
const bySpacing = options.spacing !== undefined;
|
|
7
|
+
const byCount = options.count !== undefined;
|
|
8
|
+
if (bySpacing === byCount)
|
|
9
|
+
geometryError("resample-options", "resample takes either spacing or count");
|
|
10
|
+
if (bySpacing && !(options.spacing > 0))
|
|
11
|
+
geometryError("resample-options", "spacing must be greater than zero");
|
|
12
|
+
if (byCount && !(options.count >= 2))
|
|
13
|
+
geometryError("resample-options", "count must be at least 2");
|
|
14
|
+
if (geometry.primitiveCount === 0)
|
|
15
|
+
return geometry;
|
|
16
|
+
const selected = options.group === undefined
|
|
17
|
+
? undefined
|
|
18
|
+
: (groupMask(geometry, "primitive", options.group) ??
|
|
19
|
+
geometryError("missing-group", `primitive group ${options.group} is not present`));
|
|
20
|
+
const plans = new Array(geometry.primitiveCount);
|
|
21
|
+
let resampled = 0;
|
|
22
|
+
for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1) {
|
|
23
|
+
if (selected !== undefined && selected[primitive] !== 1)
|
|
24
|
+
continue;
|
|
25
|
+
// Resample is the explicit "make this a polyline" operation, and the one it
|
|
26
|
+
// cannot yet perform is the interesting one: flattening a cubic chain needs
|
|
27
|
+
// a subdivision and an arc-length table over the curve rather than over its
|
|
28
|
+
// control polygon. Refusing is the only honest answer, because reading the
|
|
29
|
+
// handles as vertices returns a plausible shape that is the wrong shape.
|
|
30
|
+
if (isBezier(geometry, primitive))
|
|
31
|
+
geometryError("curve-resample", `primitive ${primitive} is a bezier; resampling a curve is not implemented`);
|
|
32
|
+
const points = primitivePoints(geometry, primitive);
|
|
33
|
+
if (points.length < 2)
|
|
34
|
+
continue;
|
|
35
|
+
const cumulative = arcLengths(geometry, primitive);
|
|
36
|
+
const total = cumulative[cumulative.length - 1];
|
|
37
|
+
if (!(total > 0))
|
|
38
|
+
continue;
|
|
39
|
+
const closed = isClosed(geometry, primitive);
|
|
40
|
+
const target = byCount
|
|
41
|
+
? Math.max(closed ? 3 : 2, Math.floor(options.count))
|
|
42
|
+
: closed
|
|
43
|
+
? Math.max(3, Math.round(total / options.spacing))
|
|
44
|
+
: Math.max(2, Math.round(total / options.spacing) + 1);
|
|
45
|
+
plans[primitive] = stations(cumulative, total, target, closed);
|
|
46
|
+
resampled += 1;
|
|
47
|
+
}
|
|
48
|
+
if (resampled === 0)
|
|
49
|
+
return geometry;
|
|
50
|
+
// Points a carried primitive still references, plus every loose point.
|
|
51
|
+
const loose = loosePointMask(geometry);
|
|
52
|
+
const keep = new Uint8Array(geometry.pointCount);
|
|
53
|
+
for (let index = 0; index < keep.length; index += 1)
|
|
54
|
+
keep[index] = loose[index];
|
|
55
|
+
for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
|
|
56
|
+
if (plans[primitive] === undefined)
|
|
57
|
+
for (const point of primitivePoints(geometry, primitive))
|
|
58
|
+
keep[point] = 1;
|
|
59
|
+
const pointMap = new Int32Array(geometry.pointCount).fill(-1);
|
|
60
|
+
let newPointCount = 0;
|
|
61
|
+
for (let index = 0; index < keep.length; index += 1)
|
|
62
|
+
if (keep[index])
|
|
63
|
+
pointMap[index] = newPointCount++;
|
|
64
|
+
const pointSources = [];
|
|
65
|
+
for (let index = 0; index < keep.length; index += 1)
|
|
66
|
+
if (keep[index])
|
|
67
|
+
pointSources.push({ a: index, b: index, u: 0 });
|
|
68
|
+
const vertexSources = [];
|
|
69
|
+
const vertexPoints = [];
|
|
70
|
+
const offsets = [0];
|
|
71
|
+
for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1) {
|
|
72
|
+
const plan = plans[primitive];
|
|
73
|
+
const points = primitivePoints(geometry, primitive);
|
|
74
|
+
const start = geometry.topology.offsets[primitive];
|
|
75
|
+
if (plan === undefined) {
|
|
76
|
+
for (let local = 0; local < points.length; local += 1) {
|
|
77
|
+
vertexPoints.push(pointMap[points[local]]);
|
|
78
|
+
vertexSources.push({ a: start + local, b: start + local, u: 0 });
|
|
79
|
+
}
|
|
80
|
+
offsets.push(vertexPoints.length);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
for (const sample of plan) {
|
|
84
|
+
const next = (sample.segment + 1) % points.length;
|
|
85
|
+
pointSources.push({
|
|
86
|
+
a: points[sample.segment],
|
|
87
|
+
b: points[next],
|
|
88
|
+
u: sample.u,
|
|
89
|
+
});
|
|
90
|
+
vertexSources.push({
|
|
91
|
+
a: start + sample.segment,
|
|
92
|
+
b: start + next,
|
|
93
|
+
u: sample.u,
|
|
94
|
+
});
|
|
95
|
+
vertexPoints.push(newPointCount++);
|
|
96
|
+
}
|
|
97
|
+
offsets.push(vertexPoints.length);
|
|
98
|
+
}
|
|
99
|
+
const point = {};
|
|
100
|
+
for (const [name, attribute] of Object.entries(geometry.point))
|
|
101
|
+
point[name] = interpolate(attribute, pointSources);
|
|
102
|
+
const vertex = {};
|
|
103
|
+
for (const [name, attribute] of Object.entries(geometry.vertex))
|
|
104
|
+
vertex[name] = interpolate(attribute, vertexSources);
|
|
105
|
+
const pointGroups = {};
|
|
106
|
+
for (const [name, mask] of Object.entries(geometry.pointGroups)) {
|
|
107
|
+
const next = new Uint8Array(pointSources.length);
|
|
108
|
+
for (let index = 0; index < pointSources.length; index += 1) {
|
|
109
|
+
const source = pointSources[index];
|
|
110
|
+
next[index] = mask[source.u < 0.5 ? source.a : source.b];
|
|
111
|
+
}
|
|
112
|
+
pointGroups[name] = next;
|
|
113
|
+
}
|
|
114
|
+
return createGeometry({
|
|
115
|
+
pointCount: pointSources.length,
|
|
116
|
+
point,
|
|
117
|
+
vertex,
|
|
118
|
+
primitive: geometry.primitive,
|
|
119
|
+
detail: geometry.detail,
|
|
120
|
+
topology: {
|
|
121
|
+
vertexPoints: Int32Array.from(vertexPoints),
|
|
122
|
+
offsets: Int32Array.from(offsets),
|
|
123
|
+
kinds: geometry.topology.kinds,
|
|
124
|
+
closed: geometry.topology.closed,
|
|
125
|
+
},
|
|
126
|
+
pointGroups,
|
|
127
|
+
primitiveGroups: geometry.primitiveGroups,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/** Arc-length stations along one primitive, as segment plus local parameter. */
|
|
131
|
+
function stations(cumulative, total, target, closed) {
|
|
132
|
+
const samples = [];
|
|
133
|
+
let segment = 0;
|
|
134
|
+
for (let index = 0; index < target; index += 1) {
|
|
135
|
+
const distance = closed
|
|
136
|
+
? (total * index) / target
|
|
137
|
+
: (total * index) / (target - 1);
|
|
138
|
+
while (segment < cumulative.length - 1 && cumulative[segment] < distance)
|
|
139
|
+
segment += 1;
|
|
140
|
+
const before = segment === 0 ? 0 : cumulative[segment - 1];
|
|
141
|
+
const span = cumulative[segment] - before;
|
|
142
|
+
const u = span > 0 ? Math.min(1, Math.max(0, (distance - before) / span)) : 0;
|
|
143
|
+
samples.push({ segment, u });
|
|
144
|
+
}
|
|
145
|
+
return samples;
|
|
146
|
+
}
|
|
147
|
+
const INTEGER_STORAGE = new Set(["i32", "u8"]);
|
|
148
|
+
function interpolate(attribute, sources) {
|
|
149
|
+
if (isStringAttribute(attribute))
|
|
150
|
+
return createStringAttribute(sources.map((source) => readString(attribute, source.u < 0.5 ? source.a : source.b)));
|
|
151
|
+
const size = attribute.size;
|
|
152
|
+
const data = attributeArray(attribute.storage, size * sources.length);
|
|
153
|
+
const rounds = INTEGER_STORAGE.has(attribute.storage);
|
|
154
|
+
for (let index = 0; index < sources.length; index += 1) {
|
|
155
|
+
const source = sources[index];
|
|
156
|
+
for (let component = 0; component < size; component += 1) {
|
|
157
|
+
const from = attribute.data[source.a * size + component];
|
|
158
|
+
const to = attribute.data[source.b * size + component];
|
|
159
|
+
const value = from + (to - from) * source.u;
|
|
160
|
+
data[index * size + component] = rounds ? Math.round(value) : value;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return { storage: attribute.storage, size, data };
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=resample.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resample.js","sourceRoot":"","sources":["../../src/geometry/resample.ts"],"names":[],"mappings":"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"}
|