@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,91 @@
|
|
|
1
|
+
import { Color, type Geometry } from "cascade/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* Geometry to an SVG document. The node that makes the library provably useful,
|
|
4
|
+
* because it produces a file to print or plot rather than an assertion.
|
|
5
|
+
*
|
|
6
|
+
* ## The Y flip lives here and nowhere else
|
|
7
|
+
*
|
|
8
|
+
* Geometry is +Y up: Marcus ruled on that, so a `Circle` at `+1` sits above the
|
|
9
|
+
* origin and every operation upstream reads the same way. SVG, Canvas and the
|
|
10
|
+
* existing rasterizer are all +Y down. The whole point of deciding the handedness
|
|
11
|
+
* once is that there is then exactly one flip, and this is it: a
|
|
12
|
+
* `transform="scale(1,-1)"` on the root group, with the viewBox's `y` set to
|
|
13
|
+
* `-maxY` so the flipped content lands inside it.
|
|
14
|
+
*
|
|
15
|
+
* Do not "fix" this by negating anywhere upstream. A flip applied per operation
|
|
16
|
+
* is the version that produces a drawing which is right until something rotates.
|
|
17
|
+
*
|
|
18
|
+
* ## Style is an attribute, with the prop as the fallback
|
|
19
|
+
*
|
|
20
|
+
* `Cd`, `width` and `opacity` are read per primitive when present and taken
|
|
21
|
+
* from the caller's default when absent. That rule is not invented here:
|
|
22
|
+
* `cloud-plots/src/cloud_plots/svgio.py` already runs it as
|
|
23
|
+
* `color = r.get("color", mark_color)`, having arrived at Houdini's convention
|
|
24
|
+
* independently. So the defaults go on the root group and a per-primitive value
|
|
25
|
+
* is emitted only where it exists, which also keeps the file small.
|
|
26
|
+
*
|
|
27
|
+
* ## Colour is a `vec4`, and this file is where it becomes text
|
|
28
|
+
*
|
|
29
|
+
* `Cd` is a four-component colour and nothing else. A string `Cd` used to be
|
|
30
|
+
* accepted here so that `cloud-plots`' `"#3a7f5c"` could be stored verbatim;
|
|
31
|
+
* Marcus overruled that 2026-09-04, so a hex string is now converted at the
|
|
32
|
+
* boundary by `Color.fromHex` and the attribute holds the vector. An emitted
|
|
33
|
+
* paint goes through `Color.toHex`, and `Cd`'s alpha becomes a separate
|
|
34
|
+
* `stroke-opacity` rather than an eight-digit hex, because plotter and
|
|
35
|
+
* vector-editor software does not read CSS Color 4.
|
|
36
|
+
*
|
|
37
|
+
* A `Cd` that is a string, or numeric with any size but 4, is refused rather
|
|
38
|
+
* than ignored. Silently dropping a colour attribute is the exact bug the plan
|
|
39
|
+
* records twice in `cloud-plots`, and an export that quietly turns black is
|
|
40
|
+
* worse than one that says why.
|
|
41
|
+
*
|
|
42
|
+
* ## One group element per primitive group
|
|
43
|
+
*
|
|
44
|
+
* Not a refinement either: `cloud-plots` carries a whole `layer-group` node and
|
|
45
|
+
* a layers path through its Python writer so that plotter software can assign a
|
|
46
|
+
* pen per layer, and duplicates the geometry per layer to express it. A
|
|
47
|
+
* primitive belongs to exactly one emitted group, the first it is a member of in
|
|
48
|
+
* insertion order, because a pen is not a set.
|
|
49
|
+
*/
|
|
50
|
+
export interface SvgExportOptions {
|
|
51
|
+
/** Document width; 0 or absent derives it from the geometry bounds. */
|
|
52
|
+
readonly width?: number;
|
|
53
|
+
readonly height?: number;
|
|
54
|
+
/** Added around the derived bounds, in geometry units. */
|
|
55
|
+
readonly margin?: number;
|
|
56
|
+
/** Fallback stroke colour for a primitive with no `Cd`. */
|
|
57
|
+
readonly stroke?: Color;
|
|
58
|
+
/** Fallback stroke width for a primitive with no `width`. */
|
|
59
|
+
readonly strokeWidth?: number;
|
|
60
|
+
/** Fallback opacity for a primitive with no `opacity`. */
|
|
61
|
+
readonly opacity?: number;
|
|
62
|
+
/**
|
|
63
|
+
* Fill colour for every primitive, applied only when `fillMode` is "solid".
|
|
64
|
+
*
|
|
65
|
+
* Fill is two settings rather than one because a zero-alpha fill and SVG's
|
|
66
|
+
* `fill="none"` are not the same thing: `none` says the region is not filled,
|
|
67
|
+
* while a transparent fill says it is filled with nothing, and a plotter
|
|
68
|
+
* driver reading the second still generates a fill toolpath. Inferring the
|
|
69
|
+
* intent from alpha also throws the colour away, so a fill cannot be switched
|
|
70
|
+
* back on without picking it again. Declaring the mode keeps the two
|
|
71
|
+
* independent. Stroke has no matching mode because nothing exports geometry
|
|
72
|
+
* with no stroke, and inventing one for symmetry would add a way to produce an
|
|
73
|
+
* empty file.
|
|
74
|
+
*/
|
|
75
|
+
readonly fill?: Color;
|
|
76
|
+
readonly fillMode?: "none" | "solid";
|
|
77
|
+
/** Radius for a loose point with no `pscale`. */
|
|
78
|
+
readonly pointRadius?: number;
|
|
79
|
+
/** Decimal places on emitted coordinates. */
|
|
80
|
+
readonly precision?: number;
|
|
81
|
+
}
|
|
82
|
+
export declare function geometryToSvg(geometry: Geometry, options?: SvgExportOptions): string;
|
|
83
|
+
/**
|
|
84
|
+
* UTF-8 bytes for a document, hand-rolled because the runtime's `lib` is
|
|
85
|
+
* `ES2022` and nothing else: `TextEncoder` exists in every host that will ever
|
|
86
|
+
* run this but is typed in the DOM and Node libraries, which this package
|
|
87
|
+
* deliberately does not include. Adding either to see one constructor would
|
|
88
|
+
* widen the environment-neutral surface for the sake of a nine-line loop.
|
|
89
|
+
*/
|
|
90
|
+
export declare function utf8Bytes(value: string): Uint8Array;
|
|
91
|
+
//# sourceMappingURL=svg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/geometry/svg.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAIL,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAkB5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,iDAAiD;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAKD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CA2IR;AA8GD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAsBnD"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { Color, isStringAttribute, } from "cascade/contracts";
|
|
2
|
+
import { geometryError, numericAttribute, positionAttribute, readComponent, } from "./attributes.js";
|
|
3
|
+
import { groupNames } from "./groups.js";
|
|
4
|
+
import { bezierSegments, geometryBounds, isBezier, isClosed, loosePointMask, primitivePoints, } from "./primitives.js";
|
|
5
|
+
const UNGROUPED = "ungrouped";
|
|
6
|
+
const BLACK = [0, 0, 0, 1];
|
|
7
|
+
export function geometryToSvg(geometry, options = {}) {
|
|
8
|
+
validateOptions(options);
|
|
9
|
+
const margin = options.margin ?? 0;
|
|
10
|
+
const bounds = geometryBounds(geometry);
|
|
11
|
+
const minX = bounds === undefined ? 0 : bounds.min[0] - margin;
|
|
12
|
+
const minY = bounds === undefined ? 0 : bounds.min[1] - margin;
|
|
13
|
+
const maxX = bounds === undefined ? 1 : bounds.max[0] + margin;
|
|
14
|
+
const maxY = bounds === undefined ? 1 : bounds.max[1] + margin;
|
|
15
|
+
const spanX = Math.max(maxX - minX, Number.EPSILON);
|
|
16
|
+
const spanY = Math.max(maxY - minY, Number.EPSILON);
|
|
17
|
+
const width = options.width && options.width > 0 ? options.width : spanX;
|
|
18
|
+
const height = options.height && options.height > 0 ? options.height : spanY;
|
|
19
|
+
const precision = options.precision ?? 3;
|
|
20
|
+
const number = (value) => format(value, precision);
|
|
21
|
+
const stroke = options.stroke ?? BLACK;
|
|
22
|
+
const strokeWidth = options.strokeWidth ?? 1;
|
|
23
|
+
const fill = options.fill ?? BLACK;
|
|
24
|
+
const filled = (options.fillMode ?? "none") === "solid";
|
|
25
|
+
const colour = geometry.primitive.Cd;
|
|
26
|
+
const strokeWidths = numericAttribute(geometry.primitive.width, "primitive.width", [1]);
|
|
27
|
+
const opacities = numericAttribute(geometry.primitive.opacity, "primitive.opacity", [1]);
|
|
28
|
+
const pointScale = numericAttribute(geometry.point.pscale, "point.pscale", [1]);
|
|
29
|
+
const pointColour = geometry.point.Cd;
|
|
30
|
+
validateRange(strokeWidths, "primitive.width", (value) => value >= 0, "non-negative");
|
|
31
|
+
validateRange(opacities, "primitive.opacity", (value) => value >= 0 && value <= 1, "between 0 and 1");
|
|
32
|
+
validateRange(pointScale, "point.pscale", (value) => value >= 0, "non-negative");
|
|
33
|
+
const names = groupNames(geometry, "primitive");
|
|
34
|
+
const assigned = new Int32Array(geometry.primitiveCount).fill(-1);
|
|
35
|
+
for (let index = 0; index < names.length; index += 1) {
|
|
36
|
+
const mask = geometry.primitiveGroups[names[index]];
|
|
37
|
+
for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
|
|
38
|
+
if (mask[primitive] === 1 && assigned[primitive] === -1)
|
|
39
|
+
assigned[primitive] = index;
|
|
40
|
+
}
|
|
41
|
+
const path = (primitive) => {
|
|
42
|
+
const attributes = [`d="${pathData(geometry, primitive, number)}"`];
|
|
43
|
+
const paint = paintOf(colour, primitive, "primitive");
|
|
44
|
+
if (paint !== undefined) {
|
|
45
|
+
attributes.push(`stroke="${Color.toHex(paint)}"`);
|
|
46
|
+
if (Color.alpha(paint) < 1)
|
|
47
|
+
attributes.push(`stroke-opacity="${number(Color.alpha(paint))}"`);
|
|
48
|
+
}
|
|
49
|
+
if (strokeWidths !== undefined)
|
|
50
|
+
attributes.push(`stroke-width="${number(readComponent(strokeWidths, primitive))}"`);
|
|
51
|
+
if (opacities !== undefined)
|
|
52
|
+
attributes.push(`opacity="${number(readComponent(opacities, primitive))}"`);
|
|
53
|
+
return `<path ${attributes.join(" ")} />`;
|
|
54
|
+
};
|
|
55
|
+
const body = [];
|
|
56
|
+
if (names.length === 0) {
|
|
57
|
+
for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
|
|
58
|
+
body.push(indent(path(primitive), 2));
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
for (let index = 0; index < names.length; index += 1) {
|
|
62
|
+
const members = [];
|
|
63
|
+
for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
|
|
64
|
+
if (assigned[primitive] === index)
|
|
65
|
+
members.push(indent(path(primitive), 3));
|
|
66
|
+
body.push(indent(`<g id="${escapeXml(names[index])}">`, 2), ...members, indent("</g>", 2));
|
|
67
|
+
}
|
|
68
|
+
const rest = [];
|
|
69
|
+
for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
|
|
70
|
+
if (assigned[primitive] === -1)
|
|
71
|
+
rest.push(indent(path(primitive), 3));
|
|
72
|
+
if (rest.length > 0)
|
|
73
|
+
body.push(indent(`<g id="${UNGROUPED}">`, 2), ...rest, indent("</g>", 2));
|
|
74
|
+
}
|
|
75
|
+
// Loose points are the dots: a point no primitive references. `cascade-logo`
|
|
76
|
+
// is half made of them and `cloud-plots` stipples thousands, so they are a
|
|
77
|
+
// first-class part of the drawing rather than debris. They take their radius
|
|
78
|
+
// from `pscale`, which is Houdini's name for exactly that quantity and what
|
|
79
|
+
// the Python stipple stage already means by its third position component.
|
|
80
|
+
const loose = loosePointMask(geometry);
|
|
81
|
+
const position = positionAttribute(geometry);
|
|
82
|
+
for (let point = 0; point < geometry.pointCount; point += 1) {
|
|
83
|
+
if (loose[point] !== 1)
|
|
84
|
+
continue;
|
|
85
|
+
const radius = pointScale === undefined
|
|
86
|
+
? (options.pointRadius ?? 0.5)
|
|
87
|
+
: readComponent(pointScale, point);
|
|
88
|
+
const paint = paintOf(pointColour, point, "point") ?? stroke;
|
|
89
|
+
const transparent = Color.alpha(paint) < 1;
|
|
90
|
+
body.push(indent(`<circle cx="${number(readComponent(position, point, 0))}" cy="${number(readComponent(position, point, 1))}" r="${number(radius)}" fill="${Color.toHex(paint)}"${transparent ? ` fill-opacity="${number(Color.alpha(paint))}"` : ""} stroke="none" />`, 2));
|
|
91
|
+
}
|
|
92
|
+
const root = [
|
|
93
|
+
`<svg xmlns="http://www.w3.org/2000/svg" width="${number(width)}" height="${number(height)}" viewBox="${number(minX)} ${number(-maxY)} ${number(spanX)} ${number(spanY)}">`,
|
|
94
|
+
indent("<!-- Geometry is +Y up; SVG is +Y down. This is the one flip. -->", 1),
|
|
95
|
+
indent(`<g transform="scale(1,-1)" fill="${filled ? Color.toHex(fill) : "none"}"${filled && Color.alpha(fill) < 1
|
|
96
|
+
? ` fill-opacity="${number(Color.alpha(fill))}"`
|
|
97
|
+
: ""} stroke="${Color.toHex(stroke)}"${Color.alpha(stroke) < 1
|
|
98
|
+
? ` stroke-opacity="${number(Color.alpha(stroke))}"`
|
|
99
|
+
: ""} stroke-width="${number(strokeWidth)}"${options.opacity !== undefined && options.opacity !== 1
|
|
100
|
+
? ` opacity="${number(options.opacity)}"`
|
|
101
|
+
: ""}>`, 1),
|
|
102
|
+
...body,
|
|
103
|
+
indent("</g>", 1),
|
|
104
|
+
"</svg>",
|
|
105
|
+
];
|
|
106
|
+
return `${root.join("\n")}\n`;
|
|
107
|
+
}
|
|
108
|
+
function pathData(geometry, primitive, number) {
|
|
109
|
+
const position = positionAttribute(geometry);
|
|
110
|
+
const at = (point) => `${number(readComponent(position, point, 0))} ${number(readComponent(position, point, 1))}`;
|
|
111
|
+
const closed = isClosed(geometry, primitive);
|
|
112
|
+
if (isBezier(geometry, primitive)) {
|
|
113
|
+
const segments = bezierSegments(geometry, primitive);
|
|
114
|
+
if (segments.length === 0)
|
|
115
|
+
return "";
|
|
116
|
+
const commands = [`M ${at(segments[0][0])}`];
|
|
117
|
+
for (const [, first, second, end] of segments)
|
|
118
|
+
commands.push(`C ${at(first)} ${at(second)} ${at(end)}`);
|
|
119
|
+
if (closed)
|
|
120
|
+
commands.push("Z");
|
|
121
|
+
return commands.join(" ");
|
|
122
|
+
}
|
|
123
|
+
const points = primitivePoints(geometry, primitive);
|
|
124
|
+
if (points.length === 0)
|
|
125
|
+
return "";
|
|
126
|
+
const commands = [`M ${at(points[0])}`];
|
|
127
|
+
for (let index = 1; index < points.length; index += 1)
|
|
128
|
+
commands.push(`L ${at(points[index])}`);
|
|
129
|
+
if (closed)
|
|
130
|
+
commands.push("Z");
|
|
131
|
+
return commands.join(" ");
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The colour of one element from a `Cd` attribute. `Cd` is a `vec4` and this
|
|
135
|
+
* refuses anything else, loudly: a string attribute is the representation the
|
|
136
|
+
* ruling removed, and a numeric attribute of any other size is a colour whose
|
|
137
|
+
* components do not mean what the reader assumes.
|
|
138
|
+
*/
|
|
139
|
+
function paintOf(attribute, index, level) {
|
|
140
|
+
if (attribute === undefined)
|
|
141
|
+
return undefined;
|
|
142
|
+
if (isStringAttribute(attribute))
|
|
143
|
+
geometryError("colour-storage", `${level}.Cd is a string attribute; colour is a vec4. Convert with Color.fromHex at the boundary.`);
|
|
144
|
+
if (attribute.size !== 4)
|
|
145
|
+
geometryError("colour-size", `${level}.Cd has size ${attribute.size}; colour is a vec4`);
|
|
146
|
+
return Color.fromComponents(attribute.data, index * 4, 4);
|
|
147
|
+
}
|
|
148
|
+
function format(value, precision) {
|
|
149
|
+
if (!Number.isFinite(value))
|
|
150
|
+
geometryError("svg-number", `cannot format non-finite value ${String(value)}`);
|
|
151
|
+
const rounded = Number.parseFloat(value.toFixed(precision));
|
|
152
|
+
return Object.is(rounded, -0) ? "0" : String(rounded);
|
|
153
|
+
}
|
|
154
|
+
function validateOptions(options) {
|
|
155
|
+
for (const [name, value] of [
|
|
156
|
+
["width", options.width],
|
|
157
|
+
["height", options.height],
|
|
158
|
+
["margin", options.margin],
|
|
159
|
+
["strokeWidth", options.strokeWidth],
|
|
160
|
+
["opacity", options.opacity],
|
|
161
|
+
["pointRadius", options.pointRadius],
|
|
162
|
+
]) {
|
|
163
|
+
if (value !== undefined && !Number.isFinite(value))
|
|
164
|
+
geometryError("svg-option", `${name} must be finite`);
|
|
165
|
+
}
|
|
166
|
+
if ((options.width ?? 0) < 0 || (options.height ?? 0) < 0)
|
|
167
|
+
geometryError("svg-option", "width and height must not be negative");
|
|
168
|
+
if ((options.strokeWidth ?? 0) < 0 || (options.pointRadius ?? 0) < 0)
|
|
169
|
+
geometryError("svg-option", "strokeWidth and pointRadius must not be negative");
|
|
170
|
+
if (options.opacity !== undefined && (options.opacity < 0 || options.opacity > 1))
|
|
171
|
+
geometryError("svg-option", "opacity must be between 0 and 1");
|
|
172
|
+
const precision = options.precision ?? 3;
|
|
173
|
+
if (!Number.isSafeInteger(precision) || precision < 0 || precision > 15)
|
|
174
|
+
geometryError("svg-precision", "precision must be an integer from 0 to 15");
|
|
175
|
+
}
|
|
176
|
+
function validateRange(attribute, path, accepts, expectation) {
|
|
177
|
+
if (attribute === undefined)
|
|
178
|
+
return;
|
|
179
|
+
for (const value of attribute.data)
|
|
180
|
+
if (!accepts(value))
|
|
181
|
+
geometryError("attribute-value", `${path} values must be ${expectation}`);
|
|
182
|
+
}
|
|
183
|
+
function indent(line, depth) {
|
|
184
|
+
return `${" ".repeat(depth)}${line}`;
|
|
185
|
+
}
|
|
186
|
+
function escapeXml(value) {
|
|
187
|
+
return value
|
|
188
|
+
.replace(/&/g, "&")
|
|
189
|
+
.replace(/</g, "<")
|
|
190
|
+
.replace(/>/g, ">")
|
|
191
|
+
.replace(/"/g, """);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* UTF-8 bytes for a document, hand-rolled because the runtime's `lib` is
|
|
195
|
+
* `ES2022` and nothing else: `TextEncoder` exists in every host that will ever
|
|
196
|
+
* run this but is typed in the DOM and Node libraries, which this package
|
|
197
|
+
* deliberately does not include. Adding either to see one constructor would
|
|
198
|
+
* widen the environment-neutral surface for the sake of a nine-line loop.
|
|
199
|
+
*/
|
|
200
|
+
export function utf8Bytes(value) {
|
|
201
|
+
const bytes = [];
|
|
202
|
+
for (const character of value) {
|
|
203
|
+
let code = character.codePointAt(0);
|
|
204
|
+
if (code < 0x80)
|
|
205
|
+
bytes.push(code);
|
|
206
|
+
else if (code < 0x800)
|
|
207
|
+
bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));
|
|
208
|
+
else if (code < 0x10000)
|
|
209
|
+
bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
|
|
210
|
+
else
|
|
211
|
+
bytes.push(0xf0 | (code >> 18), 0x80 | ((code >> 12) & 0x3f), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
|
|
212
|
+
code = 0;
|
|
213
|
+
}
|
|
214
|
+
return Uint8Array.from(bytes);
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=svg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/geometry/svg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Geometry, type Mat3, type Mat4 } from "cascade/contracts";
|
|
2
|
+
/**
|
|
3
|
+
* Transform `P`. Matrices are column-major, as the `mat3` and `mat4` types are
|
|
4
|
+
* already documented to be, so a `mat3`'s third column carries the 2D
|
|
5
|
+
* translation.
|
|
6
|
+
*
|
|
7
|
+
* Geometry is authored +Y up. The flip into SVG's and Canvas's +Y-down frame
|
|
8
|
+
* belongs in the export and render operations, once, and never here: a flip
|
|
9
|
+
* applied per operation is the version that produces a drawing which is right
|
|
10
|
+
* until something rotates.
|
|
11
|
+
*
|
|
12
|
+
* A `mat3` moves x and y and leaves a third position component alone, which is
|
|
13
|
+
* what 2D work wants on a 3-component `P`. A `mat4` moves all three, treating a
|
|
14
|
+
* 2-component `P` as z = 0 and discarding the resulting z, because widening `P`
|
|
15
|
+
* is a declaration and not a side effect of a transform.
|
|
16
|
+
*/
|
|
17
|
+
export declare function transformGeometry(geometry: Geometry, matrix: Mat3 | Mat4): Geometry;
|
|
18
|
+
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/geometry/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,KAAK,IAAI,EACV,MAAM,oBAAoB,CAAC;AAU5B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,IAAI,GAAG,IAAI,GAClB,QAAQ,CAmCV"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { POSITION_ATTRIBUTE, } from "cascade/contracts";
|
|
2
|
+
import { attributeSet, copyAttributeArray, geometryError, positionAttribute, withAttributeSet, } from "./attributes.js";
|
|
3
|
+
/**
|
|
4
|
+
* Transform `P`. Matrices are column-major, as the `mat3` and `mat4` types are
|
|
5
|
+
* already documented to be, so a `mat3`'s third column carries the 2D
|
|
6
|
+
* translation.
|
|
7
|
+
*
|
|
8
|
+
* Geometry is authored +Y up. The flip into SVG's and Canvas's +Y-down frame
|
|
9
|
+
* belongs in the export and render operations, once, and never here: a flip
|
|
10
|
+
* applied per operation is the version that produces a drawing which is right
|
|
11
|
+
* until something rotates.
|
|
12
|
+
*
|
|
13
|
+
* A `mat3` moves x and y and leaves a third position component alone, which is
|
|
14
|
+
* what 2D work wants on a 3-component `P`. A `mat4` moves all three, treating a
|
|
15
|
+
* 2-component `P` as z = 0 and discarding the resulting z, because widening `P`
|
|
16
|
+
* is a declaration and not a side effect of a transform.
|
|
17
|
+
*/
|
|
18
|
+
export function transformGeometry(geometry, matrix) {
|
|
19
|
+
if (matrix.length !== 9 && matrix.length !== 16)
|
|
20
|
+
geometryError("matrix", "transform needs a mat3 or a mat4");
|
|
21
|
+
if (!matrix.every(Number.isFinite))
|
|
22
|
+
geometryError("matrix", "transform matrix values must be finite");
|
|
23
|
+
if (geometry.pointCount === 0)
|
|
24
|
+
return geometry;
|
|
25
|
+
const position = positionAttribute(geometry);
|
|
26
|
+
const size = position.size;
|
|
27
|
+
const data = copyAttributeArray(position);
|
|
28
|
+
if (matrix.length === 9) {
|
|
29
|
+
const m = matrix;
|
|
30
|
+
for (let point = 0; point < geometry.pointCount; point += 1) {
|
|
31
|
+
const base = point * size;
|
|
32
|
+
const x = data[base];
|
|
33
|
+
const y = data[base + 1];
|
|
34
|
+
data[base] = m[0] * x + m[3] * y + m[6];
|
|
35
|
+
data[base + 1] = m[1] * x + m[4] * y + m[7];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const m = matrix;
|
|
40
|
+
for (let point = 0; point < geometry.pointCount; point += 1) {
|
|
41
|
+
const base = point * size;
|
|
42
|
+
const x = data[base];
|
|
43
|
+
const y = data[base + 1];
|
|
44
|
+
const z = size === 3 ? data[base + 2] : 0;
|
|
45
|
+
data[base] = m[0] * x + m[4] * y + m[8] * z + m[12];
|
|
46
|
+
data[base + 1] = m[1] * x + m[5] * y + m[9] * z + m[13];
|
|
47
|
+
if (size === 3)
|
|
48
|
+
data[base + 2] = m[2] * x + m[6] * y + m[10] * z + m[14];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return withAttributeSet(geometry, "point", {
|
|
52
|
+
...attributeSet(geometry, "point"),
|
|
53
|
+
[POSITION_ATTRIBUTE]: { storage: position.storage, size, data },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/geometry/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAInB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAkB,EAClB,MAAmB;IAEnB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE;QAC7C,aAAa,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChC,aAAa,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;IACpE,IAAI,QAAQ,CAAC,UAAU,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,MAAc,CAAC;QACzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;YAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,MAAc,CAAC;QACzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;YAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACxD,IAAI,IAAI,KAAK,CAAC;gBACZ,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE;QACzC,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;QAClC,CAAC,kBAAkB,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;KAChE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,mBAAmB,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,GAC9B,WAAW,CAgBb"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function createNodeRuntimeHost(options) {
|
|
2
|
+
const { modules, legacyShell, now = () => Date.now(), report = () => { }, ...capabilities } = options;
|
|
3
|
+
return {
|
|
4
|
+
environment: "server",
|
|
5
|
+
modules,
|
|
6
|
+
legacyShell,
|
|
7
|
+
capabilities,
|
|
8
|
+
now,
|
|
9
|
+
report,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,qBAAqB,CACnC,OAA+B;IAE/B,MAAM,EACJ,OAAO,EACP,WAAW,EACX,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EACtB,MAAM,GAAG,GAAG,EAAE,GAAE,CAAC,EACjB,GAAG,YAAY,EAChB,GAAG,OAAO,CAAC;IACZ,OAAO;QACL,WAAW,EAAE,QAAQ;QACrB,OAAO;QACP,WAAW;QACX,YAAY;QACZ,GAAG;QACH,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAKV,cAAc,EAEd,oBAAoB,EAYrB,MAAM,YAAY,CAAC;AAuEpB,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc,CAE3E"}
|