@hatiolab/figure-model 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/asset-types.d.ts +1 -1
  2. package/dist/asset-types.d.ts.map +1 -1
  3. package/dist/asset.d.ts.map +1 -1
  4. package/dist/asset.js +6 -5
  5. package/dist/asset.js.map +1 -1
  6. package/dist/authoring-actions.d.ts +2 -795
  7. package/dist/authoring-actions.d.ts.map +1 -1
  8. package/dist/authoring-actions.js +66 -3777
  9. package/dist/authoring-actions.js.map +1 -1
  10. package/dist/authoring-bindings.d.ts +35 -0
  11. package/dist/authoring-bindings.d.ts.map +1 -0
  12. package/dist/authoring-bindings.js +241 -0
  13. package/dist/authoring-bindings.js.map +1 -0
  14. package/dist/authoring-dimensions.d.ts +10 -0
  15. package/dist/authoring-dimensions.d.ts.map +1 -0
  16. package/dist/authoring-dimensions.js +88 -0
  17. package/dist/authoring-dimensions.js.map +1 -0
  18. package/dist/authoring-fastening.d.ts +24 -0
  19. package/dist/authoring-fastening.d.ts.map +1 -0
  20. package/dist/authoring-fastening.js +562 -0
  21. package/dist/authoring-fastening.js.map +1 -0
  22. package/dist/authoring-geometry.d.ts +119 -0
  23. package/dist/authoring-geometry.d.ts.map +1 -0
  24. package/dist/authoring-geometry.js +419 -0
  25. package/dist/authoring-geometry.js.map +1 -0
  26. package/dist/authoring-nodes.d.ts +77 -0
  27. package/dist/authoring-nodes.d.ts.map +1 -0
  28. package/dist/authoring-nodes.js +310 -0
  29. package/dist/authoring-nodes.js.map +1 -0
  30. package/dist/authoring-occupancy.d.ts +28 -0
  31. package/dist/authoring-occupancy.d.ts.map +1 -0
  32. package/dist/authoring-occupancy.js +784 -0
  33. package/dist/authoring-occupancy.js.map +1 -0
  34. package/dist/authoring-proportion.d.ts +27 -0
  35. package/dist/authoring-proportion.d.ts.map +1 -0
  36. package/dist/authoring-proportion.js +378 -0
  37. package/dist/authoring-proportion.js.map +1 -0
  38. package/dist/authoring-size.d.ts +17 -0
  39. package/dist/authoring-size.d.ts.map +1 -0
  40. package/dist/authoring-size.js +140 -0
  41. package/dist/authoring-size.js.map +1 -0
  42. package/dist/authoring-types.d.ts +753 -0
  43. package/dist/authoring-types.d.ts.map +1 -0
  44. package/dist/authoring-types.js +42 -0
  45. package/dist/authoring-types.js.map +1 -0
  46. package/dist/command-preview.d.ts +1 -1
  47. package/dist/command-preview.d.ts.map +1 -1
  48. package/dist/command-preview.js +1 -0
  49. package/dist/command-preview.js.map +1 -1
  50. package/dist/contract.d.ts +129 -3
  51. package/dist/contract.d.ts.map +1 -1
  52. package/dist/contract.js +1 -1
  53. package/dist/contract.js.map +1 -1
  54. package/dist/cost.d.ts.map +1 -1
  55. package/dist/cost.js +3 -0
  56. package/dist/cost.js.map +1 -1
  57. package/dist/create.d.ts +36 -0
  58. package/dist/create.d.ts.map +1 -1
  59. package/dist/create.js +60 -0
  60. package/dist/create.js.map +1 -1
  61. package/dist/document.d.ts.map +1 -1
  62. package/dist/document.js +4 -3
  63. package/dist/document.js.map +1 -1
  64. package/dist/editor-workspace.d.ts +3 -3
  65. package/dist/editor-workspace.d.ts.map +1 -1
  66. package/dist/examples.d.ts.map +1 -1
  67. package/dist/examples.js +3 -1
  68. package/dist/examples.js.map +1 -1
  69. package/dist/gate.d.ts.map +1 -1
  70. package/dist/gate.js +2 -0
  71. package/dist/gate.js.map +1 -1
  72. package/dist/graph-types.d.ts +3 -2
  73. package/dist/graph-types.d.ts.map +1 -1
  74. package/dist/graph.d.ts.map +1 -1
  75. package/dist/graph.js +3 -3
  76. package/dist/graph.js.map +1 -1
  77. package/dist/index.d.ts +10 -4
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +8 -2
  80. package/dist/index.js.map +1 -1
  81. package/dist/joint-list.js +1 -1
  82. package/dist/joint-list.js.map +1 -1
  83. package/dist/joint-part-edits.d.ts +40 -0
  84. package/dist/joint-part-edits.d.ts.map +1 -0
  85. package/dist/joint-part-edits.js +488 -0
  86. package/dist/joint-part-edits.js.map +1 -0
  87. package/dist/joint-writing.d.ts +50 -0
  88. package/dist/joint-writing.d.ts.map +1 -0
  89. package/dist/joint-writing.js +847 -0
  90. package/dist/joint-writing.js.map +1 -0
  91. package/dist/json.d.ts.map +1 -1
  92. package/dist/json.js +11 -8
  93. package/dist/json.js.map +1 -1
  94. package/dist/kernel-version.d.ts +1 -1
  95. package/dist/kernel-version.js +1 -1
  96. package/dist/package.d.ts +15 -3
  97. package/dist/package.d.ts.map +1 -1
  98. package/dist/package.js +58 -0
  99. package/dist/package.js.map +1 -1
  100. package/dist/part-edit.d.ts +1 -1
  101. package/dist/part-edit.d.ts.map +1 -1
  102. package/dist/part-edit.js +7 -4
  103. package/dist/part-edit.js.map +1 -1
  104. package/dist/proposal.d.ts +1 -1
  105. package/dist/proposal.d.ts.map +1 -1
  106. package/dist/proposal.js +5 -2
  107. package/dist/proposal.js.map +1 -1
  108. package/dist/render-batches.d.ts +10 -2
  109. package/dist/render-batches.d.ts.map +1 -1
  110. package/dist/render-batches.js +19 -5
  111. package/dist/render-batches.js.map +1 -1
  112. package/dist/resize-plan.d.ts +1 -1
  113. package/dist/resize-plan.d.ts.map +1 -1
  114. package/dist/robots.d.ts.map +1 -1
  115. package/dist/robots.js +3 -1
  116. package/dist/robots.js.map +1 -1
  117. package/dist/room.d.ts +1 -1
  118. package/dist/room.d.ts.map +1 -1
  119. package/dist/room.js +2 -1
  120. package/dist/room.js.map +1 -1
  121. package/dist/shape-edit.js +4 -4
  122. package/dist/shape-edit.js.map +1 -1
  123. package/dist/shape-ops.d.ts +62 -7
  124. package/dist/shape-ops.d.ts.map +1 -1
  125. package/dist/shape-ops.js +117 -8
  126. package/dist/shape-ops.js.map +1 -1
  127. package/dist/slot-layout-presets.d.ts +102 -0
  128. package/dist/slot-layout-presets.d.ts.map +1 -0
  129. package/dist/slot-layout-presets.js +185 -0
  130. package/dist/slot-layout-presets.js.map +1 -0
  131. package/dist/slot-layout.d.ts +16 -1
  132. package/dist/slot-layout.d.ts.map +1 -1
  133. package/dist/slot-layout.js.map +1 -1
  134. package/docs/modeller-interaction-performance-2026-10-07.md +40 -8
  135. package/docs/shape-contract.md +46 -0
  136. package/package.json +1 -1
@@ -0,0 +1,119 @@
1
+ import { type FigureShapeFace } from './graph.ts';
2
+ import { type Axis } from './words.ts';
3
+ import type { FigurePlacement } from './asset-types.ts';
4
+ import { type FigureFace, type FigureJoint, type FigureFaceAlignment } from './authoring-types.ts';
5
+ type Dynamic = any;
6
+ /** The three size references of a box-shaped part, or a refusal naming what it is instead. */
7
+ /** One extent of a part: a value in the graph, times a factor (a cylinder's width is its radius times two). */
8
+ export type Extent = {
9
+ ref: string;
10
+ k: number;
11
+ };
12
+ /**
13
+ * Where a drawn section reaches across one axis, from the part's own origin: each point's coordinate (and a pyramid's
14
+ * apex), every one a candidate for both ends -- the room's low end takes the least, its high end the greatest.
15
+ */
16
+ export type Reach = {
17
+ offsets: Extent[];
18
+ };
19
+ export declare const isReach: (e: Extent[] | Reach) => e is Reach;
20
+ export declare function sizeRefsOf(m: Dynamic, id: string, path: string): Record<Axis, Extent>;
21
+ /**
22
+ * What a part takes up along each of its own axes, as candidates whose largest is the answer. A taper is as wide as
23
+ * the larger of its two ends, and which end that is changes when a radius follows a size -- so both are candidates, and
24
+ * the room's bounds take the larger when the graph is evaluated (G5, chief architect 2026-09-26). Every other part
25
+ * has one candidate: its size.
26
+ */
27
+ export declare function occupiedExtentsOf(m: Dynamic, id: string, path: string, single?: boolean): Record<Axis, Extent[] | Reach>;
28
+ /** The angle a pose argument holds, whether it is a constant or a design input, or null when it is neither. */
29
+ export declare function angleOf(m: Dynamic, asset: Dynamic, ref: string): number | null;
30
+ /** The turn in a part's pose, in degrees about X, Y and Z, or null for an axis whose turn is neither a number nor a design value. */
31
+ export declare function turnOf(m: Dynamic, asset: Dynamic, id: string, path: string): (number | null)[];
32
+ /** A quarter turn in degrees about X, Y and Z as `rigid@1` turns (X, then Y, then Z), as a signed axis permutation. */
33
+ export declare function turnMatrix(turn: number[]): number[][];
34
+ export declare const mul3: (a: number[][], b: number[][]) => number[][];
35
+ export declare function standingRefsOf(m: Dynamic, asset: Dynamic, id: string, path: string, freeze?: boolean): Record<Axis, Extent>;
36
+ /** A sum of graph values times factors: where a plane lies along an axis, from a part's origin. */
37
+ export type Terms = Extent[];
38
+ /**
39
+ * Where a part's outer faces lie along one axis. `centred` when the two are each other's negatives -- a box, a
40
+ * cylinder -- which is what every shape measured before faces were declared was, and what keeps their nodes as they were.
41
+ */
42
+ export type Span = {
43
+ lo: Terms;
44
+ hi: Terms;
45
+ centred: boolean;
46
+ };
47
+ export declare const neg: (lin: Terms) => Terms;
48
+ export declare const half: (lin: Terms) => Terms;
49
+ /** A part's declared faces, from its shape's own definition, or a refusal saying the shape has none. */
50
+ export declare function facesOfPart(m: Dynamic, id: string, path: string): {
51
+ shape: Dynamic;
52
+ faces: Readonly<Record<string, FigureShapeFace>>;
53
+ };
54
+ /**
55
+ * The face a joint's child is measured by: its own, or for `centre` the face that would meet the parent's -- the part is
56
+ * measured and turned as that face, and only where its middle sits differs (\`attach\`).
57
+ */
58
+ export declare function childFaceOf(m: Dynamic, j: FigureJoint): FigureFace;
59
+ export declare const planeOf: (shape: Dynamic, face: FigureShapeFace) => Terms;
60
+ /** The part's outer faces on each axis in its own frame; an axis without a pair of flat faces has none. */
61
+ export declare function ownSpansOf(m: Dynamic, id: string, path: string): Partial<Record<Axis, Span>>;
62
+ /**
63
+ * The part's spans as it stands in its seat, after its own quarter turn (the turn is fixed as `standingRefsOf` fixes
64
+ * it). A turn that flips an axis swaps its two faces: the part's own right face becomes the standing left.
65
+ */
66
+ export declare function standingSpansOf(m: Dynamic, asset: Dynamic, id: string, path: string): Partial<Record<Axis, Span>>;
67
+ /**
68
+ * Standing a part on the plane the figure is mounted on. The plane has no width and no depth, so there is
69
+ * nothing to line the part's edges up with: across the plane, only the centre or a measured offset.
70
+ */
71
+ /** The faces a part is fastened to the mounting plane by, for a figure placed so (ADR-0093). */
72
+ export declare function planeFacesOf(placement: FigurePlacement): FigureFace[];
73
+ export declare const IDENTITY: number[][];
74
+ export declare const isIdentity: (r: number[][]) => boolean;
75
+ export declare const transpose3: (r: number[][]) => number[][];
76
+ export declare const mv3: (r: number[][], v: number[]) => number[];
77
+ export declare const FACE_VECTOR: Record<FigureFace, number[]>;
78
+ export declare const faceAlong: (v: number[]) => "left" | "right" | "bottom" | "top" | "back" | "front";
79
+ /**
80
+ * How a part stands, as a signed axis permutation: its own quarter turn, which its joint record keeps (the pose may
81
+ * carry the turn back given under a turned parent). A part with no joint stands as its pose turns it. Any turn but
82
+ * quarter turns is refused and says the angle: nothing can be fastened level with its faces.
83
+ */
84
+ export declare function standingTurnOf(asset: Dynamic, part: string, path: string): number[][];
85
+ /** How a part stands before its twist: its quarter turn only. */
86
+ export declare function standingQuarterOf(asset: Dynamic, part: string, path: string): number[][];
87
+ /** A quarter-turn matrix back as degrees about X, Y and Z in the order `rigid@1` turns. */
88
+ export declare function eulerOf(r: number[][]): number[];
89
+ /** The two axes across a face along `axis`, in the order a right-handed turn about it takes one into the other. */
90
+ export declare const ACROSS: Record<Axis, [Axis, Axis]>;
91
+ /** A turn of `deg` degrees about one axis. */
92
+ export declare function axisTurn(axis: Axis, deg: number): number[][];
93
+ /** A direction that must lie along an axis to name a face or an edge there; otherwise refused with the parent's twist. */
94
+ export declare function axisOf(v: number[], what: string, parent: string, back: number[][], path: string): {
95
+ axis: Axis;
96
+ vector: number[];
97
+ };
98
+ /**
99
+ * A turn as a twist about one axis after a quarter turn: r = twist(axis, deg) · quarter, with the twist nearest
100
+ * `asked`. A turn that is no such thing (a face not level with the axis) is refused.
101
+ */
102
+ export declare function splitTwist(r: number[][], axis: Axis, asked: number, path: string): {
103
+ quarter: number[][];
104
+ deg: number;
105
+ };
106
+ /** Any turn back as degrees about X, Y and Z in the order `rigid@1` turns (X, then Y, then Z). */
107
+ export declare function eulerOfAny(r: number[][]): number[];
108
+ /** Where a part sits across a face, said on the standing axes, turned onto the parent's own: an edge flips where an axis does. */
109
+ export declare function alignInto(back: number[][], align: Partial<Record<Axis, FigureFaceAlignment>>, path: string): Partial<Record<Axis, FigureFaceAlignment>>;
110
+ /**
111
+ * How wide a frustum is across its own axis, where the row runs: the larger of its two diameters, as the bounds of two
112
+ * candidates (\`affine-bounds@1\`) -- the room's own way to take the larger of sums, so the gate still reads it as a sum
113
+ * (chief architect, 2026-09-26). Undefined for any other shape, or a row along the frustum's own axis.
114
+ */
115
+ export declare function frustumWidthAlong(m: Dynamic, asset: Dynamic, part: string, axis: Axis, path: string): string | undefined;
116
+ /** XYZ angles in degrees of a rotation written as rigid@1 writes it, Rx·Ry·Rz. */
117
+ export declare function eulerXYZ(r: number[][]): [number, number, number];
118
+ export {};
119
+ //# sourceMappingURL=authoring-geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoring-geometry.d.ts","sourceRoot":"","sources":["../src/authoring-geometry.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,YAAY,CAAA;AAEnE,OAAO,EAAE,KAAK,IAAI,EAAQ,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,WAAW,EAGhB,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAA;AAG7B,KAAK,OAAO,GAAG,GAAG,CAAA;AAElB,8FAA8F;AAC9F,+GAA+G;AAC/G,MAAM,MAAM,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAC/C;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AACzC,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,EAAE,GAAG,KAAK,KAAG,CAAC,IAAI,KAA0B,CAAA;AAa7E,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAmBrF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,OAAO,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,UAAQ,GACb,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAgBhC;AAED,+GAA+G;AAC/G,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM9E;AAED,qIAAqI;AACrI,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAI9F;AAwCD,uHAAuH;AACvH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAoBrD;AACD,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,eACqC,CAAA;AAEtF,wBAAgB,cAAc,CAC5B,CAAC,EAAE,OAAO,EACV,KAAK,EAAE,OAAO,EACd,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,UAAO,GACZ,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAMtB;AAED,mGAAmG;AACnG,MAAM,MAAM,KAAK,GAAG,MAAM,EAAE,CAAA;AAC5B;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAC7D,eAAO,MAAM,GAAG,GAAI,KAAK,KAAK,KAAG,KAAgD,CAAA;AACjF,eAAO,MAAM,IAAI,GAAI,KAAK,KAAK,KAAG,KAAmD,CAAA;AAGrF,wGAAwG;AACxG,wBAAgB,WAAW,CACzB,CAAC,EAAE,OAAO,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAA;CAAE,CAMtE;AACD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,GAAG,UAAU,CAqBlE;AACD,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,EAAE,MAAM,eAAe,KAAG,KACL,CAAA;AAE3D,2GAA2G;AAC3G,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAmB5F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAWjH;AAED;;;GAGG;AACH,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,SAAS,EAAE,eAAe,GAAG,UAAU,EAAE,CAErE;AAED,eAAO,MAAM,QAAQ,YAIpB,CAAA;AACD,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,EAAE,EAAE,YAC2C,CAAA;AACnF,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,EAAE,EAAE,eAA+C,CAAA;AACvF,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,aAAgE,CAAA;AAC9G,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAOpD,CAAA;AACD,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,EAAE,2DAC8D,CAAA;AAEnG;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAcrF;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAKxF;AAED,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAqB/C;AAED,mHAAmH;AACnH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAmD,CAAA;AAEjG,8CAA8C;AAC9C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAc5D;AAED,0HAA0H;AAC1H,wBAAgB,MAAM,CACpB,CAAC,EAAE,MAAM,EAAE,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CASlC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,CAAC,EAAE,MAAM,EAAE,EAAE,EACb,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX;IAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAuBtC;AAYD,kGAAkG;AAClG,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CASlD;AAED,kIAAkI;AAClI,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,EACjD,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAuB5C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,OAAO,EACV,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAiCpB;AAED,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAMhE"}
@@ -0,0 +1,419 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ /*
5
+ * The geometry the authoring commands read: a part's faces and spans, its turn, and the rotations a joint is written with.
6
+ */
7
+ import { figureShapeFaces } from "./graph.js";
8
+ import { figureLoftLayoutOf, figureExtrudeLayoutOf, figureShapeDescriptionOf } from "./shape-ops.js";
9
+ import { AXES } from "./words.js";
10
+ import { FIGURE_FACES, SIGN } from "./authoring-types.js";
11
+ import { fail, nodeById, partOf, constantOf, ownInput, dropIfUnused, round6 } from "./authoring-nodes.js";
12
+ export const isReach = (e) => !Array.isArray(e);
13
+ /** A drawn section's points (and a pyramid's apex) along one plane axis, as graph values. */
14
+ function drawnOffsetsOf(shape, axis) {
15
+ const L = shape.op === 'loft@1' ? figureLoftLayoutOf(shape.params, shape.id) : figureExtrudeLayoutOf(shape.params, shape.id);
16
+ const at = Object.values(L.arg.point ?? {})
17
+ .map(p => p[axis])
18
+ .filter(i => i !== undefined);
19
+ const apex = L.apex?.[axis];
20
+ return [...at, ...(apex !== undefined ? [apex] : [])].map(i => ({ ref: shape.args[i], k: 1 }));
21
+ }
22
+ export function sizeRefsOf(m, id, path) {
23
+ const { shape } = partOf(m, id, path);
24
+ /* A shape operation says itself which argument is each axis's measure (ADR-0100). */
25
+ const described = figureShapeDescriptionOf(shape);
26
+ if (described) {
27
+ const out = {};
28
+ for (const axis of AXES) {
29
+ const e = described.edit[axis];
30
+ if ('refused' in e)
31
+ return fail('EDIT_TARGET', path, `${id} is a drawn section; its reach across is its points, not a measure this command can read`);
32
+ out[axis] = { ref: shape.args[e.arg], k: e.k };
33
+ }
34
+ return out;
35
+ }
36
+ return fail('EDIT_TARGET', path, `${id} is a ${shape.op}; it is not a shape this command can measure`);
37
+ }
38
+ /**
39
+ * What a part takes up along each of its own axes, as candidates whose largest is the answer. A taper is as wide as
40
+ * the larger of its two ends, and which end that is changes when a radius follows a size -- so both are candidates, and
41
+ * the room's bounds take the larger when the graph is evaluated (G5, chief architect 2026-09-26). Every other part
42
+ * has one candidate: its size.
43
+ */
44
+ export function occupiedExtentsOf(m, id, path, single = false) {
45
+ const { shape } = partOf(m, id, path);
46
+ const described = figureShapeDescriptionOf(shape);
47
+ if (described && !single) {
48
+ const out = {};
49
+ for (const axis of AXES) {
50
+ const terms = described.measure[axis];
51
+ /* A drawn section across its plane: its points, which need not sit about its origin (a wedge drawn off centre). */
52
+ if (terms === 'profile')
53
+ out[axis] = { offsets: drawnOffsetsOf(shape, axis) };
54
+ else
55
+ out[axis] = terms.map(t => ({ ref: shape.args[t.arg], k: t.k }));
56
+ }
57
+ return out;
58
+ }
59
+ const own = sizeRefsOf(m, id, path);
60
+ return { x: [own.x], y: [own.y], z: [own.z] };
61
+ }
62
+ /** The angle a pose argument holds, whether it is a constant or a design input, or null when it is neither. */
63
+ export function angleOf(m, asset, ref) {
64
+ const constant = m.constants.find((c) => c.id === ref);
65
+ if (constant)
66
+ return constant.value;
67
+ const input = m.inputs.find((i) => i.id === ref);
68
+ if (input && input.role !== 'state')
69
+ return asset.designInputs[ref] ?? null;
70
+ return null;
71
+ }
72
+ /** The turn in a part's pose, in degrees about X, Y and Z, or null for an axis whose turn is neither a number nor a design value. */
73
+ export function turnOf(m, asset, id, path) {
74
+ return partOf(m, id, path)
75
+ .pose.args.slice(3, 6)
76
+ .map((ref) => angleOf(m, asset, ref));
77
+ }
78
+ const saidTurn = (turn) => AXES.map((a, i) => `${a.toUpperCase()} ${turn[i] ?? '?'}°`).join(', ');
79
+ /**
80
+ * The part's size along each axis as it stands in its seat -- after its own turn. A turn by a whole number of
81
+ * quarter turns only swaps the axes (a cylinder laid on its side is 2r tall and its length deep), so its faces are
82
+ * still axis-aligned planes; any other turn is refused, and says the angle. The turn is then fixed as it is: a part
83
+ * fastened by its faces keeps the turn its faces were measured in (chief architect's ruling 2026-09-25).
84
+ */
85
+ /**
86
+ * The part's own turn as a signed axis permutation, when it is a whole number of quarter turns; any other turn is
87
+ * refused and says the angle. With `freeze` the turn is fixed as it is: a part fastened by its faces keeps the turn
88
+ * its faces were measured in (chief architect's ruling 2026-09-25).
89
+ */
90
+ function quarterTurnOf(m, asset, id, path, freeze) {
91
+ const turn = turnOf(m, asset, id, path);
92
+ if (turn.every(t => t === 0))
93
+ return [
94
+ [1, 0, 0],
95
+ [0, 1, 0],
96
+ [0, 0, 1]
97
+ ];
98
+ if (turn.some(t => t === null || !Number.isFinite(t) || Math.abs(t / 90 - Math.round(t / 90)) > 1e-9))
99
+ fail('EDIT_TARGET', path, `${id} is turned (${saidTurn(turn)}); only quarter turns keep its faces level with the axes`);
100
+ const r = turnMatrix(turn);
101
+ if (freeze) {
102
+ const pose = partOf(m, id, path).pose;
103
+ const old = pose.args.slice(3, 6);
104
+ pose.args = [...pose.args.slice(0, 3), ...turn.map(t => constantOf(m, 'deg', t, 'a'))];
105
+ // Its turn fields go with it: typing into them would change nothing.
106
+ for (const ref of old)
107
+ dropIfUnused(asset, ref, ownInput(m, id, ref) ? ref : undefined);
108
+ }
109
+ return r;
110
+ }
111
+ /** A quarter turn in degrees about X, Y and Z as `rigid@1` turns (X, then Y, then Z), as a signed axis permutation. */
112
+ export function turnMatrix(turn) {
113
+ const [rx, ry, rz] = turn.map(t => (t * Math.PI) / 180);
114
+ const cos = (a) => Math.round(Math.cos(a)), sin = (a) => Math.round(Math.sin(a));
115
+ const X = [
116
+ [1, 0, 0],
117
+ [0, cos(rx), -sin(rx)],
118
+ [0, sin(rx), cos(rx)]
119
+ ];
120
+ const Y = [
121
+ [cos(ry), 0, sin(ry)],
122
+ [0, 1, 0],
123
+ [-sin(ry), 0, cos(ry)]
124
+ ];
125
+ const Z = [
126
+ [cos(rz), -sin(rz), 0],
127
+ [sin(rz), cos(rz), 0],
128
+ [0, 0, 1]
129
+ ];
130
+ return mul3(mul3(X, Y), Z);
131
+ }
132
+ export const mul3 = (a, b) => a.map(row => b[0].map((_, j) => row.reduce((sum, v, k) => sum + v * b[k][j], 0)));
133
+ export function standingRefsOf(m, asset, id, path, freeze = true) {
134
+ const own = sizeRefsOf(m, id, path);
135
+ const r = quarterTurnOf(m, asset, id, path, freeze);
136
+ const standing = {};
137
+ AXES.forEach((axis, i) => (standing[axis] = own[AXES[r[i].findIndex(v => v !== 0)]]));
138
+ return standing;
139
+ }
140
+ export const neg = (lin) => lin.map(t => ({ ref: t.ref, k: -t.k }));
141
+ export const half = (lin) => lin.map(t => ({ ref: t.ref, k: t.k / 2 }));
142
+ const OUTER = { x: ['left', 'right'], y: ['bottom', 'top'], z: ['back', 'front'] };
143
+ /** A part's declared faces, from its shape's own definition, or a refusal saying the shape has none. */
144
+ export function facesOfPart(m, id, path) {
145
+ const { shape } = partOf(m, id, path);
146
+ /* With the graph: a centred push's ends are ±half its length, the planes fastenings have always been made from. */
147
+ const faces = figureShapeFaces(shape, m);
148
+ if (!faces)
149
+ fail('EDIT_TARGET', path, `${id} is a ${shape.op}; it has no flat face to fasten by`);
150
+ return { shape, faces: faces };
151
+ }
152
+ /**
153
+ * The face a joint's child is measured by: its own, or for `centre` the face that would meet the parent's -- the part is
154
+ * measured and turned as that face, and only where its middle sits differs (\`attach\`).
155
+ */
156
+ export function childFaceOf(m, j) {
157
+ if (j.body1.face !== 'centre')
158
+ return j.body1.face;
159
+ const path = `joints.${j.id}.body1.face`;
160
+ if (!('part' in j.body0))
161
+ fail('JOINT_SCHEMA', path, 'a part stands on the mounting plane by a face of its own, not by its centre');
162
+ /* One of the six, in the record's words: the face across from it. An opening's face, read from the parent's shape. */
163
+ const named = j.body0.face;
164
+ if (Object.hasOwn(FIGURE_FACES, named))
165
+ return Object.keys(FIGURE_FACES).find(f => FIGURE_FACES[f] === FIGURE_FACES[named] && SIGN[f] === -SIGN[named]);
166
+ const theirs = facesOfPart(m, j.body0.part, path).faces[j.body0.face];
167
+ if (!theirs)
168
+ fail('JOINT_SCHEMA', path, `${j.body0.part} has no face ${j.body0.face}`);
169
+ return Object.keys(FIGURE_FACES).find(f => FIGURE_FACES[f] === theirs.axis && SIGN[f] === -theirs.normal);
170
+ }
171
+ export const planeOf = (shape, face) => face.plane.map(p => ({ ref: shape.args[p.arg], k: p.k }));
172
+ /** The part's outer faces on each axis in its own frame; an axis without a pair of flat faces has none. */
173
+ export function ownSpansOf(m, id, path) {
174
+ const { shape, faces } = facesOfPart(m, id, path);
175
+ const spans = {};
176
+ const measure = figureShapeDescriptionOf(shape, m).measure;
177
+ for (const axis of AXES) {
178
+ const [lo, hi] = OUTER[axis].map(n => faces[n]);
179
+ /* One face on an axis and a measure along it (a pyramid's base): the span's other end is the face plus the measure. */
180
+ const reach = measure[axis];
181
+ const along = reach && reach !== 'profile'
182
+ ? planeOf(shape, { axis, normal: 1, plane: reach })
183
+ : undefined;
184
+ if (!lo && !hi)
185
+ continue;
186
+ if ((!lo || !hi) && !along)
187
+ continue;
188
+ const l = lo ? planeOf(shape, lo) : [...planeOf(shape, hi), ...neg(along)], h = hi ? planeOf(shape, hi) : [...planeOf(shape, lo), ...along];
189
+ spans[axis] = { lo: l, hi: h, centred: JSON.stringify(l) === JSON.stringify(neg(h)) };
190
+ }
191
+ return spans;
192
+ }
193
+ /**
194
+ * The part's spans as it stands in its seat, after its own quarter turn (the turn is fixed as `standingRefsOf` fixes
195
+ * it). A turn that flips an axis swaps its two faces: the part's own right face becomes the standing left.
196
+ */
197
+ export function standingSpansOf(m, asset, id, path) {
198
+ const own = ownSpansOf(m, id, path);
199
+ const r = quarterTurnOf(m, asset, id, path, true);
200
+ const standing = {};
201
+ AXES.forEach((axis, i) => {
202
+ const j = r[i].findIndex(v => v !== 0);
203
+ const span = own[AXES[j]];
204
+ if (!span)
205
+ return;
206
+ standing[axis] = r[i][j] > 0 ? span : { lo: neg(span.hi), hi: neg(span.lo), centred: span.centred };
207
+ });
208
+ return standing;
209
+ }
210
+ /**
211
+ * Standing a part on the plane the figure is mounted on. The plane has no width and no depth, so there is
212
+ * nothing to line the part's edges up with: across the plane, only the centre or a measured offset.
213
+ */
214
+ /** The faces a part is fastened to the mounting plane by, for a figure placed so (ADR-0093). */
215
+ export function planeFacesOf(placement) {
216
+ return placement === 'wall' ? ['back'] : ['bottom', 'top'];
217
+ }
218
+ export const IDENTITY = [
219
+ [1, 0, 0],
220
+ [0, 1, 0],
221
+ [0, 0, 1]
222
+ ];
223
+ export const isIdentity = (r) => r.every((row, i) => row.every((v, k) => Math.abs(v - (i === k ? 1 : 0)) < 1e-12));
224
+ export const transpose3 = (r) => r[0].map((_, i) => r.map(row => row[i]));
225
+ export const mv3 = (r, v) => r.map(row => row.reduce((sum, x, k) => sum + x * v[k], 0));
226
+ export const FACE_VECTOR = {
227
+ left: [-1, 0, 0],
228
+ right: [1, 0, 0],
229
+ bottom: [0, -1, 0],
230
+ top: [0, 1, 0],
231
+ back: [0, 0, -1],
232
+ front: [0, 0, 1]
233
+ };
234
+ export const faceAlong = (v) => Object.keys(FACE_VECTOR).find(f => FACE_VECTOR[f].every((x, i) => x === v[i]));
235
+ /**
236
+ * How a part stands, as a signed axis permutation: its own quarter turn, which its joint record keeps (the pose may
237
+ * carry the turn back given under a turned parent). A part with no joint stands as its pose turns it. Any turn but
238
+ * quarter turns is refused and says the angle: nothing can be fastened level with its faces.
239
+ */
240
+ export function standingTurnOf(asset, part, path) {
241
+ const record = (asset.joints ?? []).find(o => o.body1.part === part);
242
+ const turn = record ? AXES.map(a => record.origin?.turn?.[a] ?? 0) : turnOf(asset.document.model, asset, part, path);
243
+ if (turn.some(t => t === null || !Number.isFinite(t) || Math.abs(t / 90 - Math.round(t / 90)) > 1e-9))
244
+ fail('EDIT_TARGET', path, `${part} is turned (${saidTurn(turn)}); fastening to a turned part by its faces is covered only for quarter turns`);
245
+ const quarter = turn.every(t => t === 0) ? IDENTITY : turnMatrix(turn);
246
+ /* A twisted part stands twisted about the normal of the face it is fastened by. */
247
+ return record?.origin?.twist
248
+ ? mul3(axisTurn(FIGURE_FACES[childFaceOf(asset.document.model, record)], record.origin.twist), quarter)
249
+ : quarter;
250
+ }
251
+ /** How a part stands before its twist: its quarter turn only. */
252
+ export function standingQuarterOf(asset, part, path) {
253
+ const record = (asset.joints ?? []).find(o => o.body1.part === part);
254
+ if (!record?.origin?.twist)
255
+ return standingTurnOf(asset, part, path);
256
+ const turn = AXES.map(a => record.origin?.turn?.[a] ?? 0);
257
+ return turn.every(t => t === 0) ? IDENTITY : turnMatrix(turn);
258
+ }
259
+ /** A quarter-turn matrix back as degrees about X, Y and Z in the order `rigid@1` turns. */
260
+ export function eulerOf(r) {
261
+ const deg = (a) => {
262
+ const d = Math.round((a * 180) / Math.PI / 90) * 90;
263
+ return d === 0 ? 0 : d;
264
+ };
265
+ /*
266
+ About Y by a quarter turn, X and Z turn about the same axis and only their sum counts; Z is taken as 0. At +90 the X
267
+ turn reads off as atan2(r10, r11), at -90 as atan2(-r10, r11) -- the -90 case had used the +90 reading, so two of the 24
268
+ quarter turns (Y at -90 with X at +-90) did not come back and a host turned that way refused every fastening.
269
+ */
270
+ const out = Math.abs(r[0][2]) < 1
271
+ ? [deg(Math.atan2(-r[1][2], r[2][2])), deg(Math.asin(r[0][2])), deg(Math.atan2(-r[0][1], r[0][0]))]
272
+ : [deg(Math.atan2(Math.sign(r[0][2]) * r[1][0], r[1][1])), deg(Math.asin(r[0][2])), 0];
273
+ if (!turnMatrix(out).every((row, i) => row.every((v, k) => v === r[i][k])))
274
+ fail('EDIT_TARGET', 'turn', `${JSON.stringify(r)} is not a quarter turn; a fastening is covered only for quarter turns`);
275
+ return out;
276
+ }
277
+ /** The two axes across a face along `axis`, in the order a right-handed turn about it takes one into the other. */
278
+ export const ACROSS = { x: ['y', 'z'], y: ['z', 'x'], z: ['x', 'y'] };
279
+ /** A turn of `deg` degrees about one axis. */
280
+ export function axisTurn(axis, deg) {
281
+ const c = Math.cos((deg * Math.PI) / 180), s = Math.sin((deg * Math.PI) / 180);
282
+ const [p, q] = ACROSS[axis].map(a => AXES.indexOf(a));
283
+ const r = [
284
+ [1, 0, 0],
285
+ [0, 1, 0],
286
+ [0, 0, 1]
287
+ ];
288
+ r[p][p] = c;
289
+ r[p][q] = -s;
290
+ r[q][p] = s;
291
+ r[q][q] = c;
292
+ return r;
293
+ }
294
+ /** A direction that must lie along an axis to name a face or an edge there; otherwise refused with the parent's twist. */
295
+ export function axisOf(v, what, parent, back, path) {
296
+ const k = v.findIndex(x => Math.abs(Math.abs(x) - 1) < 1e-9);
297
+ if (k < 0)
298
+ fail('ATTACH_FACE', path, `${parent} stands twisted (${saidTurn(eulerOfAny(transpose3(back)))}); ${what} is not level with an axis in it`);
299
+ return { axis: AXES[k], vector: v.map(x => (Math.abs(x) < 1e-9 ? 0 : Math.sign(x))) };
300
+ }
301
+ /**
302
+ * A turn as a twist about one axis after a quarter turn: r = twist(axis, deg) · quarter, with the twist nearest
303
+ * `asked`. A turn that is no such thing (a face not level with the axis) is refused.
304
+ */
305
+ export function splitTwist(r, axis, asked, path) {
306
+ const k = AXES.indexOf(axis);
307
+ const [p, q] = ACROSS[axis].map(a => AXES.indexOf(a));
308
+ let best;
309
+ for (const quarter of QUARTER_TURNS) {
310
+ const t = mul3(r, transpose3(quarter));
311
+ if (Math.abs(t[k][k] - 1) > 1e-9)
312
+ continue;
313
+ const d = (Math.atan2(t[q][p], t[p][p]) * 180) / Math.PI;
314
+ const off = Math.abs(((((d - asked) % 360) + 540) % 360) - 180);
315
+ if (!best || off < best.off - 1e-9)
316
+ best = { quarter, deg: Math.abs(d) < 1e-9 ? 0 : d, off };
317
+ }
318
+ if (!best)
319
+ fail('ATTACH_FACE', path, `the part would stand turned about more than the face's normal (${saidTurn(eulerOfAny(r))})`);
320
+ /*
321
+ The angle as asked when that is what the turn is: taken back out of a matrix it carries float noise that depends
322
+ on the path it was computed by, and the numbers made from it are named by their value -- the first write and the
323
+ parse's rewrite then named them apart (JOINT_DRIFT, the architect's fan, 2026-09-25).
324
+ */
325
+ return { quarter: best.quarter, deg: best.off < 1e-6 ? asked : round6(best.deg) };
326
+ }
327
+ const QUARTER_TURNS = (() => {
328
+ const out = [];
329
+ for (const x of [0, 90, 180, 270])
330
+ for (const y of [0, 90, 180, 270])
331
+ for (const z of [0, 90, 180, 270]) {
332
+ const r = turnMatrix([x, y, z]);
333
+ if (!out.some(o => o.every((row, i) => row.every((v, j) => v === r[i][j]))))
334
+ out.push(r);
335
+ }
336
+ return out;
337
+ })();
338
+ /** Any turn back as degrees about X, Y and Z in the order `rigid@1` turns (X, then Y, then Z). */
339
+ export function eulerOfAny(r) {
340
+ const deg = (a) => {
341
+ const d = round6((a * 180) / Math.PI);
342
+ return d === 0 ? 0 : d;
343
+ };
344
+ const sy = Math.max(-1, Math.min(1, r[0][2]));
345
+ if (Math.abs(sy) < 1 - 1e-12)
346
+ return [deg(Math.atan2(-r[1][2], r[2][2])), deg(Math.asin(sy)), deg(Math.atan2(-r[0][1], r[0][0]))];
347
+ return [deg(Math.atan2(r[1][0], r[1][1])), deg(Math.asin(sy)), 0];
348
+ }
349
+ /** Where a part sits across a face, said on the standing axes, turned onto the parent's own: an edge flips where an axis does. */
350
+ export function alignInto(back, align, path) {
351
+ const out = {};
352
+ for (const [a, how] of Object.entries(align)) {
353
+ const v = mv3(back, AXES.map(x => (x === a ? 1 : 0)));
354
+ const k = v.findIndex(x => Math.abs(Math.abs(x) - 1) < 1e-9);
355
+ if (k < 0)
356
+ fail('ATTACH_FACE', path, `the parent stands twisted; placing along ${a} is not level with an axis in it -- place it by the centre`);
357
+ const s = Math.sign(v[k]);
358
+ const to = AXES[k];
359
+ if (how === 'centre' || s > 0)
360
+ out[to] = how;
361
+ else if (how === 'min' || how === 'max')
362
+ out[to] = how === 'min' ? 'max' : 'min';
363
+ else if (typeof how.mm === 'number')
364
+ out[to] = { mm: -how.mm };
365
+ else
366
+ fail('SCHEMA', path, `an offset that follows another value cannot be turned over onto ${to}; give it as a number`);
367
+ }
368
+ return out;
369
+ }
370
+ /**
371
+ * How wide a frustum is across its own axis, where the row runs: the larger of its two diameters, as the bounds of two
372
+ * candidates (\`affine-bounds@1\`) -- the room's own way to take the larger of sums, so the gate still reads it as a sum
373
+ * (chief architect, 2026-09-26). Undefined for any other shape, or a row along the frustum's own axis.
374
+ */
375
+ export function frustumWidthAlong(m, asset, part, axis, path) {
376
+ const { shape } = partOf(m, part, path);
377
+ /* A taper's two radii, end then start -- read from the node, not assumed. */
378
+ const taper = shape.op === 'revolve@1' && shape.params?.profile === 'taper'
379
+ ? { along: shape.params.axis, radii: [shape.args[3], shape.args[2]] }
380
+ : undefined;
381
+ if (!taper)
382
+ return undefined;
383
+ const r = quarterTurnOf(m, asset, part, path, true);
384
+ const own = AXES[r[AXES.indexOf(axis)].findIndex(v => v !== 0)];
385
+ if (own === taper.along)
386
+ return undefined;
387
+ const id = `${part}.width.${own}`;
388
+ if (!nodeById(m, id)) {
389
+ const zero = constantOf(m, 'mm', 0, 'd');
390
+ const two = constantOf(m, 'ratio', 2, 'k');
391
+ const [top, bottom] = taper.radii;
392
+ /* xmin, xmax, ymin, ymax, zmin, zmax: only the one maximum is read; the others hold a zero each. */
393
+ m.nodes.push({
394
+ id,
395
+ op: 'affine-bounds@1',
396
+ args: [zero, zero, top, two, zero, bottom, two, zero, zero, zero, zero],
397
+ outputs: {
398
+ xmin: `${id}.unused.xmin`,
399
+ xmax: `${id}.value`,
400
+ ymin: `${id}.unused.ymin`,
401
+ ymax: `${id}.unused.ymax`,
402
+ zmin: `${id}.unused.zmin`,
403
+ zmax: `${id}.unused.zmax`
404
+ },
405
+ params: { layout: 'L0.1_1.0.0.0.0' }
406
+ });
407
+ }
408
+ return `${id}.value`;
409
+ }
410
+ /** XYZ angles in degrees of a rotation written as rigid@1 writes it, Rx·Ry·Rz. */
411
+ export function eulerXYZ(r) {
412
+ const deg = (v) => round6((v * 180) / Math.PI) + 0;
413
+ const sy = Math.max(-1, Math.min(1, r[0][2]));
414
+ const ry = Math.asin(sy);
415
+ if (Math.abs(Math.cos(ry)) < 1e-9)
416
+ return [deg(Math.atan2(r[2][1], r[1][1])), deg(ry), 0];
417
+ return [deg(Math.atan2(-r[1][2], r[2][2])), deg(ry), deg(Math.atan2(-r[0][1], r[0][0]))];
418
+ }
419
+ //# sourceMappingURL=authoring-geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoring-geometry.js","sourceRoot":"","sources":["../src/authoring-geometry.ts"],"names":[],"mappings":"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"}