abstract-3d 3.1.2 → 4.0.0-beta.0

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 (216) hide show
  1. package/README.md +21 -1
  2. package/lib/renderers/dxf/dxf-encoding/dxf-build.d.ts.map +1 -1
  3. package/lib/renderers/dxf/dxf-encoding/dxf-build.js +1 -2
  4. package/lib/renderers/dxf/dxf-encoding/dxf-build.js.map +1 -1
  5. package/lib/renderers/ifc/ifc.test.d.ts +2 -0
  6. package/lib/renderers/ifc/ifc.test.d.ts.map +1 -0
  7. package/lib/renderers/ifc/ifc.test.js +380 -0
  8. package/lib/renderers/ifc/ifc.test.js.map +1 -0
  9. package/lib/renderers/index.d.ts +1 -0
  10. package/lib/renderers/index.d.ts.map +1 -1
  11. package/lib/renderers/index.js +1 -0
  12. package/lib/renderers/index.js.map +1 -1
  13. package/lib/renderers/react/index.d.ts +2 -5
  14. package/lib/renderers/react/index.d.ts.map +1 -1
  15. package/lib/renderers/react/index.js +1 -2
  16. package/lib/renderers/react/index.js.map +1 -1
  17. package/lib/renderers/react/react.d.ts +16 -42
  18. package/lib/renderers/react/react.d.ts.map +1 -1
  19. package/lib/renderers/react/react.js +49 -32
  20. package/lib/renderers/react/react.js.map +1 -1
  21. package/lib/renderers/three/appearance/appearance.d.ts +41 -0
  22. package/lib/renderers/three/appearance/appearance.d.ts.map +1 -0
  23. package/lib/renderers/three/appearance/appearance.js +89 -0
  24. package/lib/renderers/three/appearance/appearance.js.map +1 -0
  25. package/lib/renderers/three/appearance/appearance.test.d.ts +2 -0
  26. package/lib/renderers/three/appearance/appearance.test.d.ts.map +1 -0
  27. package/lib/renderers/three/appearance/appearance.test.js +97 -0
  28. package/lib/renderers/three/appearance/appearance.test.js.map +1 -0
  29. package/lib/renderers/three/appearance.d.ts +41 -0
  30. package/lib/renderers/three/appearance.d.ts.map +1 -0
  31. package/lib/renderers/three/appearance.js +100 -0
  32. package/lib/renderers/three/appearance.js.map +1 -0
  33. package/lib/renderers/three/build/build.d.ts +51 -0
  34. package/lib/renderers/three/build/build.d.ts.map +1 -0
  35. package/lib/renderers/three/build/build.js +174 -0
  36. package/lib/renderers/three/build/build.js.map +1 -0
  37. package/lib/renderers/three/build/build.test.d.ts +2 -0
  38. package/lib/renderers/three/build/build.test.d.ts.map +1 -0
  39. package/lib/renderers/three/build/build.test.js +120 -0
  40. package/lib/renderers/three/build/build.test.js.map +1 -0
  41. package/lib/renderers/three/build/materials.d.ts +12 -0
  42. package/lib/renderers/three/build/materials.d.ts.map +1 -0
  43. package/lib/renderers/three/build/materials.js +55 -0
  44. package/lib/renderers/three/build/materials.js.map +1 -0
  45. package/lib/renderers/three/build/parts.d.ts +65 -0
  46. package/lib/renderers/three/build/parts.d.ts.map +1 -0
  47. package/lib/renderers/three/build/parts.js +203 -0
  48. package/lib/renderers/three/build/parts.js.map +1 -0
  49. package/lib/renderers/three/build.d.ts +50 -0
  50. package/lib/renderers/three/build.d.ts.map +1 -0
  51. package/lib/renderers/three/build.js +210 -0
  52. package/lib/renderers/three/build.js.map +1 -0
  53. package/lib/renderers/three/camera/camera.d.ts +40 -0
  54. package/lib/renderers/three/camera/camera.d.ts.map +1 -0
  55. package/lib/renderers/three/camera/camera.js +51 -0
  56. package/lib/renderers/three/camera/camera.js.map +1 -0
  57. package/lib/renderers/three/camera/camera.test.d.ts +2 -0
  58. package/lib/renderers/three/camera/camera.test.d.ts.map +1 -0
  59. package/lib/renderers/three/camera/camera.test.js +46 -0
  60. package/lib/renderers/three/camera/camera.test.js.map +1 -0
  61. package/lib/renderers/three/camera/controls.d.ts +24 -0
  62. package/lib/renderers/three/camera/controls.d.ts.map +1 -0
  63. package/lib/renderers/three/camera/controls.js +39 -0
  64. package/lib/renderers/three/camera/controls.js.map +1 -0
  65. package/lib/renderers/three/camera/gizmo.d.ts +44 -0
  66. package/lib/renderers/three/camera/gizmo.d.ts.map +1 -0
  67. package/lib/renderers/three/camera/gizmo.js +42 -0
  68. package/lib/renderers/three/camera/gizmo.js.map +1 -0
  69. package/lib/renderers/three/camera.d.ts +63 -0
  70. package/lib/renderers/three/camera.d.ts.map +1 -0
  71. package/lib/renderers/three/camera.js +85 -0
  72. package/lib/renderers/three/camera.js.map +1 -0
  73. package/lib/renderers/three/compile/compile.d.ts +59 -0
  74. package/lib/renderers/three/compile/compile.d.ts.map +1 -0
  75. package/lib/renderers/three/compile/compile.js +88 -0
  76. package/lib/renderers/three/compile/compile.js.map +1 -0
  77. package/lib/renderers/three/compile/compile.test.d.ts +2 -0
  78. package/lib/renderers/three/compile/compile.test.d.ts.map +1 -0
  79. package/lib/renderers/three/compile/compile.test.js +93 -0
  80. package/lib/renderers/three/compile/compile.test.js.map +1 -0
  81. package/lib/renderers/three/compile.d.ts +58 -0
  82. package/lib/renderers/three/compile.d.ts.map +1 -0
  83. package/lib/renderers/three/compile.js +89 -0
  84. package/lib/renderers/three/compile.js.map +1 -0
  85. package/lib/renderers/three/controls.d.ts +27 -0
  86. package/lib/renderers/three/controls.d.ts.map +1 -0
  87. package/lib/renderers/three/controls.js +115 -0
  88. package/lib/renderers/three/controls.js.map +1 -0
  89. package/lib/renderers/three/geometry/geometry.d.ts +21 -0
  90. package/lib/renderers/three/geometry/geometry.d.ts.map +1 -0
  91. package/lib/renderers/three/geometry/geometry.js +132 -0
  92. package/lib/renderers/three/geometry/geometry.js.map +1 -0
  93. package/lib/renderers/three/geometry/geometry.test.d.ts +2 -0
  94. package/lib/renderers/three/geometry/geometry.test.d.ts.map +1 -0
  95. package/lib/renderers/three/geometry/geometry.test.js +80 -0
  96. package/lib/renderers/three/geometry/geometry.test.js.map +1 -0
  97. package/lib/renderers/three/geometry.d.ts +20 -0
  98. package/lib/renderers/three/geometry.d.ts.map +1 -0
  99. package/lib/renderers/three/geometry.js +164 -0
  100. package/lib/renderers/three/geometry.js.map +1 -0
  101. package/lib/renderers/three/gizmo.d.ts +49 -0
  102. package/lib/renderers/three/gizmo.d.ts.map +1 -0
  103. package/lib/renderers/three/gizmo.js +172 -0
  104. package/lib/renderers/three/gizmo.js.map +1 -0
  105. package/lib/renderers/three/index.d.ts +16 -0
  106. package/lib/renderers/three/index.d.ts.map +1 -0
  107. package/lib/renderers/three/index.js +6 -0
  108. package/lib/renderers/three/index.js.map +1 -0
  109. package/lib/renderers/three/input.d.ts +25 -0
  110. package/lib/renderers/three/input.d.ts.map +1 -0
  111. package/lib/renderers/three/input.js +71 -0
  112. package/lib/renderers/three/input.js.map +1 -0
  113. package/lib/renderers/three/lines.d.ts +16 -0
  114. package/lib/renderers/three/lines.d.ts.map +1 -0
  115. package/lib/renderers/three/lines.js +63 -0
  116. package/lib/renderers/three/lines.js.map +1 -0
  117. package/lib/renderers/three/materials.d.ts +15 -0
  118. package/lib/renderers/three/materials.d.ts.map +1 -0
  119. package/lib/renderers/three/materials.js +70 -0
  120. package/lib/renderers/three/materials.js.map +1 -0
  121. package/lib/renderers/three/options.d.ts +68 -0
  122. package/lib/renderers/three/options.d.ts.map +1 -0
  123. package/lib/renderers/three/options.js +64 -0
  124. package/lib/renderers/three/options.js.map +1 -0
  125. package/lib/renderers/three/overlays.d.ts +25 -0
  126. package/lib/renderers/three/overlays.d.ts.map +1 -0
  127. package/lib/renderers/three/overlays.js +57 -0
  128. package/lib/renderers/three/overlays.js.map +1 -0
  129. package/lib/renderers/three/quality/quality.d.ts +37 -0
  130. package/lib/renderers/three/quality/quality.d.ts.map +1 -0
  131. package/lib/renderers/three/quality/quality.js +64 -0
  132. package/lib/renderers/three/quality/quality.js.map +1 -0
  133. package/lib/renderers/three/quality/quality.test.d.ts +2 -0
  134. package/lib/renderers/three/quality/quality.test.d.ts.map +1 -0
  135. package/lib/renderers/three/quality/quality.test.js +23 -0
  136. package/lib/renderers/three/quality/quality.test.js.map +1 -0
  137. package/lib/renderers/three/quality.d.ts +24 -0
  138. package/lib/renderers/three/quality.d.ts.map +1 -0
  139. package/lib/renderers/three/quality.js +67 -0
  140. package/lib/renderers/three/quality.js.map +1 -0
  141. package/lib/renderers/three/text/text.d.ts +55 -0
  142. package/lib/renderers/three/text/text.d.ts.map +1 -0
  143. package/lib/renderers/three/text/text.js +90 -0
  144. package/lib/renderers/three/text/text.js.map +1 -0
  145. package/lib/renderers/three/text/text.test.d.ts +2 -0
  146. package/lib/renderers/three/text/text.test.d.ts.map +1 -0
  147. package/lib/renderers/three/text/text.test.js +70 -0
  148. package/lib/renderers/three/text/text.test.js.map +1 -0
  149. package/lib/renderers/three/text.d.ts +53 -0
  150. package/lib/renderers/three/text.d.ts.map +1 -0
  151. package/lib/renderers/three/text.js +151 -0
  152. package/lib/renderers/three/text.js.map +1 -0
  153. package/lib/renderers/three/viewer/options.d.ts +71 -0
  154. package/lib/renderers/three/viewer/options.d.ts.map +1 -0
  155. package/lib/renderers/three/viewer/options.js +31 -0
  156. package/lib/renderers/three/viewer/options.js.map +1 -0
  157. package/lib/renderers/three/viewer/options.test.d.ts +2 -0
  158. package/lib/renderers/three/viewer/options.test.d.ts.map +1 -0
  159. package/lib/renderers/three/viewer/options.test.js +38 -0
  160. package/lib/renderers/three/viewer/options.test.js.map +1 -0
  161. package/lib/renderers/three/viewer/overlays.d.ts +31 -0
  162. package/lib/renderers/three/viewer/overlays.d.ts.map +1 -0
  163. package/lib/renderers/three/viewer/overlays.js +43 -0
  164. package/lib/renderers/three/viewer/overlays.js.map +1 -0
  165. package/lib/renderers/three/viewer/viewer.d.ts +90 -0
  166. package/lib/renderers/three/viewer/viewer.d.ts.map +1 -0
  167. package/lib/renderers/three/viewer/viewer.js +432 -0
  168. package/lib/renderers/three/viewer/viewer.js.map +1 -0
  169. package/lib/renderers/three/viewer.d.ts +38 -0
  170. package/lib/renderers/three/viewer.d.ts.map +1 -0
  171. package/lib/renderers/three/viewer.js +435 -0
  172. package/lib/renderers/three/viewer.js.map +1 -0
  173. package/package.json +36 -16
  174. package/src/custom_typings/n8ao.d.ts +11 -0
  175. package/src/renderers/dxf/dxf-encoding/dxf-build.ts +1 -2
  176. package/src/renderers/index.ts +1 -0
  177. package/src/renderers/react/index.ts +2 -5
  178. package/src/renderers/react/react.tsx +96 -181
  179. package/src/renderers/three/appearance/appearance.test.ts +116 -0
  180. package/src/renderers/three/appearance/appearance.ts +132 -0
  181. package/src/renderers/three/build/build.test.ts +141 -0
  182. package/src/renderers/three/build/build.ts +270 -0
  183. package/src/renderers/three/build/materials.ts +85 -0
  184. package/src/renderers/three/build/parts.ts +277 -0
  185. package/src/renderers/three/camera/camera.test.ts +53 -0
  186. package/src/renderers/three/camera/camera.ts +82 -0
  187. package/src/renderers/three/camera/controls.ts +65 -0
  188. package/src/renderers/three/camera/gizmo.ts +93 -0
  189. package/src/renderers/three/compile/compile.test.ts +113 -0
  190. package/src/renderers/three/compile/compile.ts +151 -0
  191. package/src/renderers/three/geometry/geometry.test.ts +95 -0
  192. package/src/renderers/three/geometry/geometry.ts +179 -0
  193. package/src/renderers/three/index.ts +15 -0
  194. package/src/renderers/three/quality/quality.test.ts +30 -0
  195. package/src/renderers/three/quality/quality.ts +95 -0
  196. package/src/renderers/three/text/text.test.ts +79 -0
  197. package/src/renderers/three/text/text.ts +128 -0
  198. package/src/renderers/three/viewer/options.ts +98 -0
  199. package/src/renderers/three/viewer/overlays.ts +71 -0
  200. package/src/renderers/three/viewer/viewer.ts +540 -0
  201. package/lib/renderers/react/react-hotspot.d.ts +0 -27
  202. package/lib/renderers/react/react-hotspot.d.ts.map +0 -1
  203. package/lib/renderers/react/react-hotspot.js +0 -37
  204. package/lib/renderers/react/react-hotspot.js.map +0 -1
  205. package/src/custom_typings/react-three-fiber.d.ts +0 -9
  206. package/src/custom_typings/react-three-postprocessing.d.ts +0 -1
  207. package/src/renderers/react/react-camera.tsx +0 -391
  208. package/src/renderers/react/react-dimension.tsx +0 -122
  209. package/src/renderers/react/react-group.test.ts +0 -56
  210. package/src/renderers/react/react-group.tsx +0 -202
  211. package/src/renderers/react/react-image-material.tsx +0 -139
  212. package/src/renderers/react/react-material.tsx +0 -91
  213. package/src/renderers/react/react-mesh.tsx +0 -512
  214. package/src/renderers/react/react-relation.tsx +0 -86
  215. package/src/renderers/react/react-scene.tsx +0 -111
  216. package/src/renderers/react/react-types.ts +0 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../../src/renderers/three/compile/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compile.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.test.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/compile/compile.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ import { Matrix4, Vector3 } from "three";
2
+ import { describe, expect, it } from "vitest";
3
+ import { alignedDimension, box, group, line, sphere, text, vec3, vec3Zero } from "../../../abstract-3d.js";
4
+ import { compileScene, getItemMatrix } from "./compile.js";
5
+ const red = { normal: "rgb(255, 0, 0)" };
6
+ const scene = (groups, rest = {}) => ({ size_deprecated: vec3(1, 1, 1), groups, ...rest });
7
+ const apply = (m, x, y, z) => new Vector3(x, y, z)
8
+ .applyMatrix4(m)
9
+ .toArray()
10
+ .map((v) => Math.round(v * 1000) / 1000 + 0);
11
+ describe("compileScene", () => {
12
+ it("flattens nested groups into items with world matrices", () => {
13
+ const inner = group([sphere(1, red)], vec3(0, 10, 0));
14
+ const compiled = compileScene(scene([group([box(vec3(1, 1, 1), red)], vec3(100, 0, 0), vec3Zero, [inner])]));
15
+ expect(compiled.items.map((i) => i.role)).toEqual(["solid", "solid"]);
16
+ expect(apply(compiled.items[0].matrix, 0, 0, 0)).toEqual([100, 0, 0]);
17
+ expect(apply(compiled.items[1].matrix, 0, 0, 0)).toEqual([100, 10, 0]);
18
+ });
19
+ it("applies group rotation before the group's position", () => {
20
+ const compiled = compileScene(scene([group([box(vec3(1, 1, 1), red)], vec3(5, 0, 0), vec3(0, 0, Math.PI / 2))]));
21
+ expect(apply(compiled.items[0].matrix, 1, 0, 0)).toEqual([5, 1, 0]);
22
+ });
23
+ it("rotates the scene by its deprecated rotation, then moves it by minus its deprecated center", () => {
24
+ const g = group([box(vec3(1, 1, 1), red)], vec3(10, 0, 0));
25
+ const centered = compileScene(scene([g], { center_deprecated: vec3(10, 0, 0) }));
26
+ expect(apply(centered.items[0].matrix, 0, 0, 0)).toEqual([0, 0, 0]);
27
+ const rotated = compileScene(scene([g], { center_deprecated: vec3(-10, 0, 0), rotation_deprecated: vec3(0, Math.PI, 0) }));
28
+ expect(apply(rotated.items[0].matrix, 1, 0, 0)).toEqual([-1, 0, 0]);
29
+ });
30
+ it("gives every item of a top-level group that group's target, and the data of the group it's in", () => {
31
+ const inner = group([sphere(1, red)], vec3Zero, vec3Zero, [], { part: "motor" });
32
+ const fan = group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [inner], { id: "fan" });
33
+ const compiled = compileScene(scene([fan, group([box(vec3(1, 1, 1), red)], vec3Zero, vec3Zero, [], { id: "coil" })]), (g) => g.data?.["id"] ?? "");
34
+ expect(compiled.targets).toEqual([
35
+ { kind: "group", id: "fan", root: 0, rootData: { id: "fan" } },
36
+ { kind: "group", id: "coil", root: 1, rootData: { id: "coil" } },
37
+ ]);
38
+ expect(compiled.items.map((i) => [i.target, i.data])).toEqual([
39
+ [0, { id: "fan" }],
40
+ [0, { part: "motor" }],
41
+ [1, { id: "coil" }],
42
+ ]);
43
+ });
44
+ it("gives groups an empty id without createGroupId", () => {
45
+ const compiled = compileScene(scene([group([box(vec3(1, 1, 1), red)])]));
46
+ expect(compiled.targets[0]).toMatchObject({ kind: "group", id: "" });
47
+ });
48
+ it("assigns roles by geometry type", () => {
49
+ const g = group([box(vec3(1, 1, 1), red), text(vec3Zero, "A", 10, red), line(vec3Zero, vec3(1, 0, 0), 1, red)]);
50
+ expect(compileScene(scene([g])).items.map((i) => i.role)).toEqual(["solid", "text", "line"]);
51
+ });
52
+ it("makes items of animated groups relative to an animation that rotates the group", () => {
53
+ const fan = group([box(vec3(1, 1, 1), red)], vec3(0, 5, 0), vec3Zero, [], {}, { transform: { rot: vec3(0, 0, Math.PI), trans: vec3Zero }, duration: 1000 });
54
+ const compiled = compileScene(scene([group([], vec3(10, 0, 0), vec3Zero, [fan])]));
55
+ expect(compiled.animations).toHaveLength(1);
56
+ expect(compiled.animations[0].speed).toEqual(vec3(0, 0, Math.PI));
57
+ expect(compiled.items[0].animation).toBe(0);
58
+ const world = (seconds) => apply(getItemMatrix(compiled, compiled.items[0], seconds, new Matrix4()), 1, 0, 0);
59
+ expect(world(0)).toEqual([11, 5, 0]);
60
+ expect(world(0.5)).toEqual([10, 6, 0]);
61
+ });
62
+ it("chains nested animations", () => {
63
+ const spin = { transform: { rot: vec3(0, 0, Math.PI), trans: vec3Zero }, duration: 1000 };
64
+ const inner = group([box(vec3(1, 1, 1), red)], vec3(1, 0, 0), vec3Zero, [], {}, spin);
65
+ const compiled = compileScene(scene([group([], vec3Zero, vec3Zero, [inner], {}, spin)]));
66
+ expect(compiled.animations.map((a) => a.parent)).toEqual([undefined, 0]);
67
+ expect(apply(getItemMatrix(compiled, compiled.items[0], 0.5, new Matrix4()), 0, 0, 0)).toEqual([0, 1, 0]);
68
+ expect(apply(getItemMatrix(compiled, compiled.items[0], 0.5, new Matrix4()), 1, 0, 0)).toEqual([-1, 1, 0]);
69
+ });
70
+ it("converts aligned dimensions to dimension items with a target per dimension", () => {
71
+ const dimension = alignedDimension(vec3Zero, vec3(1000, 0, 0), vec3(0, -100, 0), "1000", ["front"], undefined, "fan");
72
+ const compiled = compileScene(scene([], { dimensions_deprecated: { dimensions: [dimension], material: red } }));
73
+ const items = compiled.items.filter((i) => i.style === "dimension");
74
+ expect(items.length).toBeGreaterThan(0);
75
+ expect(new Set(items.map((i) => i.role))).toEqual(new Set(["line", "text", "solid"]));
76
+ expect(compiled.targets[items[0].target]).toEqual({ kind: "dimension", id: "fan" });
77
+ });
78
+ it("adds relation shapes, with an outline around their boxes", () => {
79
+ const relation = { id: "r1", pos: vec3Zero, groups: [group([box(vec3(10, 10, 10), red), sphere(1, red)], vec3(5, 0, 0))] };
80
+ const compiled = compileScene(scene([], { relations: [relation] }));
81
+ expect(compiled.items.map((i) => i.style)).toEqual(["relation", "outline", "relation"]);
82
+ expect(compiled.targets[compiled.items[0].target]).toEqual({ kind: "relation", relation });
83
+ const outline = compiled.items[1].mesh.geometry;
84
+ expect(outline.type === "Box" && outline.size).toEqual(vec3(10.125, 10.125, 10.125));
85
+ expect(apply(compiled.items[0].matrix, 0, 0, 0)).toEqual([5, 0, 0]);
86
+ });
87
+ it("keeps the world matrix of each top-level group for its tooltips", () => {
88
+ const compiled = compileScene(scene([group([], vec3(3, 0, 0))], { center_deprecated: vec3(1, 0, 0) }));
89
+ expect(apply(compiled.roots[0], 0, 0, 0)).toEqual([2, 0, 0]);
90
+ expect(apply(compiled.matrix, 0, 0, 0)).toEqual([-1, 0, 0]);
91
+ });
92
+ });
93
+ //# sourceMappingURL=compile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.test.js","sourceRoot":"","sources":["../../../../src/renderers/three/compile/compile.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC3G,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;AACzC,MAAM,KAAK,GAAG,CAAC,MAA4B,EAAE,IAAI,GAAmB,EAAE,EAAS,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACxI,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAyB,EAAE,CACnF,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KACjB,YAAY,CAAC,CAAC,CAAC;KACf,OAAO,EAAE;KACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;AAEjD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7G,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4FAA4F,EAAE,GAAG,EAAE;QACpG,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3H,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8FAA8F,EAAE,GAAG,EAAE;QACtG,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACjF,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACzF,MAAM,QAAQ,GAAG,YAAY,CAC3B,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EACtF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAC5B,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;YAC9D,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;SACjE,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5D,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YAClB,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACtB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;SACpB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAChH,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,GAAG,GAAG,KAAK,CACf,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EACzB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACb,QAAQ,EACR,EAAE,EACF,EAAE,EACF,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAC7E,CAAC;QACF,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,OAAe,EAAyB,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9I,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1F,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3G,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACtH,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,qBAAqB,EAAE,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAChH,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3H,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACxF,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5F,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACrF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { Matrix4 } from "three";
2
+ import type { Group, Mesh, Relation, Scene, Vec3 } from "../../abstract-3d.js";
3
+ /** Scene → flat items with world matrices, with no GPU objects, so everything here is testable in Node */
4
+ /** How the item's geometry is drawn */
5
+ export type Role = "solid" | "text" | "line" | "image";
6
+ /** What the item belongs to, which decides its material and whether it's shown */
7
+ export type Style = "group" | "dimension" | "relation" | "outline";
8
+ /** What a pointer event on an item is about, and what hover and selection apply to */
9
+ export type Target = {
10
+ readonly kind: "group";
11
+ readonly id: string;
12
+ readonly root: number;
13
+ readonly rootData: Record<string, string> | undefined;
14
+ } | {
15
+ readonly kind: "dimension";
16
+ readonly id: string | undefined;
17
+ } | {
18
+ readonly kind: "relation";
19
+ readonly relation: Relation;
20
+ };
21
+ export type Item = {
22
+ readonly mesh: Mesh;
23
+ readonly role: Role;
24
+ readonly style: Style;
25
+ /** World matrix, or for an animated item its matrix relative to its animation's group */
26
+ readonly matrix: Matrix4;
27
+ readonly target: number;
28
+ /** The data of the group the mesh is in */
29
+ readonly data: Record<string, string> | undefined;
30
+ readonly animation: number | undefined;
31
+ };
32
+ export type Animation = {
33
+ readonly parent: number | undefined;
34
+ /** The matrix of the group's parent, in world space or relative to the parent animation's group */
35
+ readonly base: Matrix4;
36
+ readonly pos: Vec3;
37
+ readonly rot: Vec3;
38
+ /** Radians per second around x, y and z */
39
+ readonly speed: Vec3;
40
+ };
41
+ export type CompiledScene = {
42
+ readonly items: ReadonlyArray<Item>;
43
+ readonly targets: ReadonlyArray<Target>;
44
+ readonly animations: ReadonlyArray<Animation>;
45
+ /** World matrix of the scene's root, from its deprecated center and rotation */
46
+ readonly matrix: Matrix4;
47
+ /** World matrix of each top-level group */
48
+ readonly roots: ReadonlyArray<Matrix4>;
49
+ };
50
+ export type CompileOptions = {
51
+ readonly createGroupId?: (g: Group) => string;
52
+ };
53
+ export declare function compileScene(scene: Scene, options?: CompileOptions): CompiledScene;
54
+ /** The item's world matrix at `seconds` into its animations, written to `out` */
55
+ export declare function itemWorldMatrix(compiled: CompiledScene, item: Item, seconds: number, out: Matrix4): Matrix4;
56
+ /** Translation, then XYZ Euler rotation, then scale, as on a three.js Object3D */
57
+ export declare function transform(pos: Vec3, rot: Vec3 | undefined, out?: Matrix4, size?: Vec3 | undefined): Matrix4;
58
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { Euler, Matrix4, Quaternion, Vector3 } from "three";
2
+ import { dimensionConvertToTypeMesh, vec3, vec3Scale, vec3Zero } from "../../abstract-3d.js";
3
+ const outlineScale = 1.0125;
4
+ export function compileScene(scene, options = {}) {
5
+ const items = [];
6
+ const targets = [];
7
+ const animations = [];
8
+ const sceneMatrix = new Matrix4()
9
+ .makeTranslation(-(scene.center_deprecated?.x ?? 0), -(scene.center_deprecated?.y ?? 0), -(scene.center_deprecated?.z ?? 0))
10
+ .multiply(transform(vec3Zero, scene.rotation_deprecated));
11
+ const addMeshes = (meshes, parent, item) => meshes?.forEach((mesh) => {
12
+ items.push({ ...item, mesh, role: getRole(mesh), matrix: parent });
13
+ if (item.style === "relation" && mesh.geometry.type === "Box") {
14
+ const outline = { ...mesh.geometry, size: vec3Scale(mesh.geometry.size, outlineScale) };
15
+ items.push({ ...item, style: "outline", mesh: { ...mesh, geometry: outline }, role: "solid", matrix: parent });
16
+ }
17
+ });
18
+ const addGroup = (g, parent, animation, item) => {
19
+ const animated = g.animation !== undefined;
20
+ const ownAnimation = animated ? animations.push(createAnimation(g, parent, animation)) - 1 : animation;
21
+ const matrix = animated ? new Matrix4() : parent.clone().multiply(transform(g.pos, g.rot));
22
+ addMeshes(g.meshes, matrix, { ...item, data: g.data, animation: ownAnimation });
23
+ g.groups?.forEach((child) => addGroup(child, matrix, ownAnimation, item));
24
+ return matrix;
25
+ };
26
+ const roots = scene.groups.map((g, root) => {
27
+ const target = targets.push({ kind: "group", id: options.createGroupId?.(g) ?? "", root, rootData: g.data }) - 1;
28
+ addGroup(g, sceneMatrix, undefined, { style: "group", target });
29
+ return sceneMatrix.clone().multiply(transform(g.pos, g.rot));
30
+ });
31
+ scene.dimensions_deprecated?.dimensions.forEach((dimension) => {
32
+ const target = targets.push({ kind: "dimension", id: dimension.id }) - 1;
33
+ const mesh = dimensionConvertToTypeMesh(dimension, scene.rotation_deprecated ?? vec3Zero, scene.dimensions_deprecated?.material);
34
+ const matrix = sceneMatrix.clone().multiply(transform(mesh.pos, mesh.rot));
35
+ addMeshes(mesh.meshes, matrix, { style: "dimension", target, data: undefined, animation: undefined });
36
+ });
37
+ scene.relations?.forEach((relation) => {
38
+ const target = targets.push({ kind: "relation", relation }) - 1;
39
+ relation.groups?.forEach((g) => addGroup(g, sceneMatrix, undefined, { style: "relation", target }));
40
+ });
41
+ return { items, targets, animations, matrix: sceneMatrix, roots };
42
+ }
43
+ /** The item's world matrix at `seconds` into its animations, written to `out` */
44
+ export function itemWorldMatrix(compiled, item, seconds, out) {
45
+ return item.animation === undefined
46
+ ? out.copy(item.matrix)
47
+ : animationMatrix(compiled.animations, item.animation, seconds, out).multiply(item.matrix);
48
+ }
49
+ const scratchAnimation = new Matrix4();
50
+ function animationMatrix(animations, index, seconds, out) {
51
+ const a = animations[index];
52
+ const rot = vec3(a.rot.x + a.speed.x * seconds, a.rot.y + a.speed.y * seconds, a.rot.z + a.speed.z * seconds);
53
+ const local = out.copy(a.base).multiply(transform(a.pos, rot, scratchAnimation));
54
+ return a.parent === undefined ? local : local.premultiply(animationMatrix(animations, a.parent, seconds, new Matrix4()));
55
+ }
56
+ function createAnimation(g, parent, parentAnimation) {
57
+ const { transform: { rot }, duration, } = g.animation;
58
+ const perSecond = 1000 / duration;
59
+ return {
60
+ parent: parentAnimation,
61
+ base: parent.clone(),
62
+ pos: g.pos,
63
+ rot: g.rot ?? vec3Zero,
64
+ speed: vec3(rot.x * perSecond, rot.y * perSecond, rot.z * perSecond),
65
+ };
66
+ }
67
+ function getRole(mesh) {
68
+ switch (mesh.geometry.type) {
69
+ case "Text":
70
+ return "text";
71
+ case "Line":
72
+ case "CulledLine":
73
+ return "line";
74
+ case "Image":
75
+ return "image";
76
+ default:
77
+ return "solid";
78
+ }
79
+ }
80
+ const euler = new Euler();
81
+ const quaternion = new Quaternion();
82
+ const position = new Vector3();
83
+ const scale = new Vector3();
84
+ /** Translation, then XYZ Euler rotation, then scale, as on a three.js Object3D */
85
+ export function transform(pos, rot, out = new Matrix4(), size = undefined) {
86
+ quaternion.setFromEuler(euler.set(rot?.x ?? 0, rot?.y ?? 0, rot?.z ?? 0));
87
+ return out.compose(position.set(pos.x, pos.y, pos.z), quaternion, size ? scale.set(size.x, size.y, size.z) : scale.set(1, 1, 1));
88
+ }
89
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../src/renderers/three/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import CameraControls from "camera-controls";
2
+ import { type OrthographicCamera, type PerspectiveCamera, Vector3 } from "three";
3
+ import { OrbitControls } from "three/addons/controls/OrbitControls.js";
4
+ export type SmoothControlsOptions = Partial<Pick<CameraControls, "enabled" | "smoothTime" | "draggingSmoothTime" | "minDistance" | "maxDistance" | "minZoom" | "maxZoom" | "minPolarAngle" | "maxPolarAngle" | "minAzimuthAngle" | "maxAzimuthAngle" | "azimuthRotateSpeed" | "polarRotateSpeed" | "dollySpeed" | "truckSpeed" | "dollyToCursor">>;
5
+ export type OrbitControlsOptions = Partial<Pick<OrbitControls, "enabled" | "enableDamping" | "dampingFactor" | "enableZoom" | "zoomSpeed" | "enableRotate" | "rotateSpeed" | "enablePan" | "panSpeed" | "screenSpacePanning" | "minDistance" | "maxDistance" | "minZoom" | "maxZoom" | "minPolarAngle" | "maxPolarAngle" | "minAzimuthAngle" | "maxAzimuthAngle" | "zoomToCursor" | "autoRotate" | "autoRotateSpeed" | "keyPanSpeed">> & {
6
+ readonly onStart?: () => void;
7
+ readonly onChange?: () => void;
8
+ readonly onEnd?: () => void;
9
+ };
10
+ export type ControlsOptions = {
11
+ readonly type: "smooth";
12
+ readonly options?: SmoothControlsOptions;
13
+ } | {
14
+ readonly type: "orbit";
15
+ readonly options?: OrbitControlsOptions;
16
+ };
17
+ export type Rig = {
18
+ /** Moves the camera by input and transitions, true while it moves */
19
+ readonly update: (delta: number) => boolean;
20
+ readonly setPose: (position: Vector3, target: Vector3, animate: boolean) => void;
21
+ readonly getTarget: (out: Vector3) => Vector3;
22
+ /** The user drags the camera, and it has moved since the drag started */
23
+ readonly isDragging: () => boolean;
24
+ readonly dispose: () => void;
25
+ };
26
+ export declare function createRig(controls: ControlsOptions, camera: PerspectiveCamera | OrthographicCamera, element: HTMLElement, onInput: () => void): Rig;
27
+ //# sourceMappingURL=controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../../src/renderers/three/controls.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAMtB,OAAO,EAER,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AASvE,MAAM,MAAM,qBAAqB,GAAG,OAAO,CACzC,IAAI,CACF,cAAc,EACZ,SAAS,GACT,YAAY,GACZ,oBAAoB,GACpB,aAAa,GACb,aAAa,GACb,SAAS,GACT,SAAS,GACT,eAAe,GACf,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,oBAAoB,GACpB,kBAAkB,GAClB,YAAY,GACZ,YAAY,GACZ,eAAe,CAClB,CACF,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,OAAO,CACxC,IAAI,CACF,aAAa,EACX,SAAS,GACT,eAAe,GACf,eAAe,GACf,YAAY,GACZ,WAAW,GACX,cAAc,GACd,aAAa,GACb,WAAW,GACX,UAAU,GACV,oBAAoB,GACpB,aAAa,GACb,aAAa,GACb,SAAS,GACT,SAAS,GACT,eAAe,GACf,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,GACd,YAAY,GACZ,iBAAiB,GACjB,aAAa,CAChB,CACF,GAAG;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAA;CAAE,GACrE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,GAAG,GAAG;IAChB,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjF,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,GAAG,CAInJ"}
@@ -0,0 +1,115 @@
1
+ import CameraControls from "camera-controls";
2
+ import { Box3, MathUtils, Matrix4, Quaternion, Raycaster, Sphere, Spherical, Vector2, Vector3, Vector4, } from "three";
3
+ import { OrbitControls } from "three/addons/controls/OrbitControls.js";
4
+ /**
5
+ * Camera controls: smooth by default (camera-controls), or the r3f renderer's OrbitControls, kept as an option with its behavior: damping, callbacks
6
+ * and an animated turn to the gizmo's views
7
+ */
8
+ CameraControls.install({ THREE: { Vector2, Vector3, Vector4, Quaternion, Matrix4, Spherical, Box3, Sphere, Raycaster } });
9
+ export function createRig(controls, camera, element, onInput) {
10
+ return controls.type === "orbit"
11
+ ? createOrbitRig(controls.options ?? {}, camera, element, onInput)
12
+ : createSmoothRig(controls.options ?? {}, camera, element, onInput);
13
+ }
14
+ function createSmoothRig(options, camera, element, onInput) {
15
+ const controls = new CameraControls(camera, element);
16
+ Object.assign(controls, { smoothTime: 0.15, draggingSmoothTime: 0.08, ...options });
17
+ const drag = { active: false, moved: false };
18
+ controls.addEventListener("controlstart", () => {
19
+ Object.assign(drag, { active: true, moved: false });
20
+ onInput();
21
+ });
22
+ controls.addEventListener("control", () => {
23
+ drag.moved = drag.active;
24
+ onInput();
25
+ });
26
+ controls.addEventListener("controlend", () => Object.assign(drag, { active: false, moved: false }));
27
+ // The wheel doesn't emit control events
28
+ element.addEventListener("wheel", onInput, { passive: true });
29
+ return {
30
+ update: (delta) => controls.update(delta),
31
+ setPose: (position, target, animate) => void controls.setLookAt(position.x, position.y, position.z, target.x, target.y, target.z, animate),
32
+ getTarget: (out) => controls.getTarget(out),
33
+ isDragging: () => drag.moved,
34
+ dispose: () => {
35
+ element.removeEventListener("wheel", onInput);
36
+ controls.dispose();
37
+ },
38
+ };
39
+ }
40
+ const turnSeconds = 0.4;
41
+ function createOrbitRig(options, camera, element, onInput) {
42
+ const { onStart, onChange, onEnd, ...properties } = options;
43
+ const controls = new OrbitControls(camera, element);
44
+ // drei's OrbitControls default
45
+ Object.assign(controls, { enableDamping: true, ...properties });
46
+ const drag = { active: false, moved: false };
47
+ controls.addEventListener("start", () => {
48
+ Object.assign(drag, { active: true, moved: false });
49
+ onStart?.();
50
+ onInput();
51
+ });
52
+ controls.addEventListener("change", () => {
53
+ drag.moved = drag.active;
54
+ onChange?.();
55
+ onInput();
56
+ });
57
+ controls.addEventListener("end", () => {
58
+ Object.assign(drag, { active: false, moved: false });
59
+ onEnd?.();
60
+ });
61
+ // A turn to a new pose, rotating around the target on a sphere while the distance and target move linearly
62
+ const turn = {
63
+ elapsed: turnSeconds,
64
+ fromTarget: new Vector3(),
65
+ toTarget: new Vector3(),
66
+ from: new Quaternion(),
67
+ to: new Quaternion(),
68
+ fromDistance: 0,
69
+ toDistance: 0,
70
+ };
71
+ const direction = new Vector3();
72
+ const forward = new Vector3(0, 0, 1);
73
+ const step = (delta) => {
74
+ if (turn.elapsed >= turnSeconds) {
75
+ return false;
76
+ }
77
+ turn.elapsed = Math.min(turnSeconds, turn.elapsed + delta);
78
+ const t = MathUtils.smootherstep(turn.elapsed / turnSeconds, 0, 1);
79
+ controls.target.lerpVectors(turn.fromTarget, turn.toTarget, t);
80
+ direction.copy(forward).applyQuaternion(scratchQuaternion.slerpQuaternions(turn.from, turn.to, t));
81
+ camera.position.copy(controls.target).addScaledVector(direction, MathUtils.lerp(turn.fromDistance, turn.toDistance, t));
82
+ return true;
83
+ };
84
+ return {
85
+ update: (delta) => {
86
+ const turning = step(delta);
87
+ return controls.update(delta) || turning;
88
+ },
89
+ setPose: (position, target, animate) => {
90
+ if (!animate) {
91
+ turn.elapsed = turnSeconds;
92
+ controls.target.copy(target);
93
+ camera.position.copy(position);
94
+ controls.update();
95
+ return;
96
+ }
97
+ const fromOffset = scratchVector.subVectors(camera.position, controls.target);
98
+ turn.fromDistance = fromOffset.length();
99
+ turn.from.setFromUnitVectors(forward, fromOffset.normalize());
100
+ const toOffset = scratchVector.subVectors(position, target);
101
+ turn.toDistance = toOffset.length();
102
+ turn.to.setFromUnitVectors(forward, toOffset.normalize());
103
+ turn.fromTarget.copy(controls.target);
104
+ turn.toTarget.copy(target);
105
+ turn.elapsed = 0;
106
+ onInput();
107
+ },
108
+ getTarget: (out) => out.copy(controls.target),
109
+ isDragging: () => drag.moved,
110
+ dispose: () => controls.dispose(),
111
+ };
112
+ }
113
+ const scratchVector = new Vector3();
114
+ const scratchQuaternion = new Quaternion();
115
+ //# sourceMappingURL=controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.js","sourceRoot":"","sources":["../../../src/renderers/three/controls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { BufferGeometry, type Matrix4 } from "three";
2
+ import type { Mesh } from "../../../abstract-3d.js";
3
+ /**
4
+ * Solid geometries by key, so identical shapes share one geometry; primitives are unit geometries scaled by their local matrix. The shapes, holes and
5
+ * radius-ratio cylinders are the r3f renderer's react-mesh.tsx
6
+ */
7
+ export type SolidShape = {
8
+ readonly key: string;
9
+ /** Position, rotation and, for unit geometries, scale, relative to the item's matrix */
10
+ readonly local: Matrix4;
11
+ };
12
+ /**
13
+ * The shape of a solid geometry, undefined for text and lines; images are unit planes. Shapes with their own geometry are keyed by JSON of what
14
+ * identifies them: cheap next to the geometry creation that sharing skips (measured: unique keys built systemair3 2–4 times slower)
15
+ */
16
+ export declare function getSolidShape(g: Mesh["geometry"]): SolidShape | undefined;
17
+ /** The geometry of a solid shape, indexed, with exactly position, normal and uv attributes and no groups, as a BatchedMesh needs */
18
+ export declare function createSolidGeometry(g: Mesh["geometry"]): BufferGeometry;
19
+ /** Disposes the cached geometries whose keys aren't in `keys` */
20
+ export declare function keepGeometries(cache: Map<string, BufferGeometry>, keys: ReadonlySet<string>): void;
21
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/geometry/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAMd,KAAK,OAAO,EAOb,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAQ,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAK1D;;;GAGG;AAEH,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,SAAS,CAoCzE;AAED,oIAAoI;AACpI,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,cAAc,CAmBvE;AA2ED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAOlG"}
@@ -0,0 +1,132 @@
1
+ import { BoxGeometry, BufferGeometry, CatmullRomCurve3, ConeGeometry, CylinderGeometry, ExtrudeGeometry, Float32BufferAttribute, PlaneGeometry, Shape, SphereGeometry, TubeGeometry, Vector2, Vector3, } from "three";
2
+ import { mergeGeometries } from "three/addons/utils/BufferGeometryUtils.js";
3
+ import { isZero, vec3, vec3Zero } from "../../../abstract-3d.js";
4
+ import { addHoles, CircleCurve, CYLINDER_SEGMENTS, cylinderCutPositions, holeIsZero } from "../../shared/three-geometry.js";
5
+ import { transform } from "../compile/compile.js";
6
+ /**
7
+ * The shape of a solid geometry, undefined for text and lines; images are unit planes. Shapes with their own geometry are keyed by JSON of what
8
+ * identifies them: cheap next to the geometry creation that sharing skips (measured: unique keys built systemair3 2–4 times slower)
9
+ */
10
+ export function getSolidShape(g) {
11
+ switch (g.type) {
12
+ case "Box":
13
+ case "Plane": {
14
+ const size = g.type === "Box" ? g.size : vec3(g.size.x, g.size.y, 1);
15
+ return g.holes?.some((h) => !holeIsZero(h))
16
+ ? { key: JSON.stringify([g.type, g.size, g.holes]), local: transform(g.pos, g.rot) }
17
+ : { key: g.type, local: transform(g.pos, g.rot, undefined, size) };
18
+ }
19
+ case "Image":
20
+ return { key: "Plane", local: transform(g.pos, g.rot, undefined, vec3(g.size.x, g.size.y, 1)) };
21
+ case "Sphere":
22
+ return { key: g.type, local: transform(g.pos, vec3Zero, undefined, vec3(g.radius, g.radius, g.radius)) };
23
+ case "Cone":
24
+ return { key: g.type, local: transform(g.pos, g.rot, undefined, vec3(g.radius, g.length, g.radius)) };
25
+ case "Cylinder": {
26
+ const { radius, radiusEnd = radius, open = false, angleStart = 0, angleLength = Math.PI * 2 } = g;
27
+ if (radiusEnd === radius && isZero(Math.PI * 2 - angleLength) && g.holes?.some((h) => !holeIsZero(h))) {
28
+ return { key: JSON.stringify([g.type, radius, g.length, g.holes]), local: transform(g.pos, g.rot) };
29
+ }
30
+ // Unit geometry scaled by the largest radius, so only the radius ratio needs its own geometry
31
+ const max = Math.max(radius, radiusEnd) || 1;
32
+ return {
33
+ key: `${g.type} ${radiusEnd / max} ${radius / max} ${open} ${angleStart} ${angleLength}`,
34
+ local: transform(g.pos, g.rot, undefined, vec3(max, g.length, max)),
35
+ };
36
+ }
37
+ case "Shape":
38
+ return { key: JSON.stringify([g.type, g.points, g.thickness, g.holes]), local: transform(g.pos, g.rot) };
39
+ case "Polygon":
40
+ return { key: JSON.stringify([g.type, g.points]), local: transform(g.pos, g.rot) };
41
+ case "Tube":
42
+ return { key: JSON.stringify([g.type, g.curve, g.radius]), local: transform(g.pos, g.rot) };
43
+ default:
44
+ return undefined;
45
+ }
46
+ }
47
+ /** The geometry of a solid shape, indexed, with exactly position, normal and uv attributes and no groups, as a BatchedMesh needs */
48
+ export function createSolidGeometry(g) {
49
+ const geometry = createGeometry(g);
50
+ const count = geometry.getAttribute("position").count;
51
+ if (!geometry.index) {
52
+ geometry.setIndex(Array.from({ length: count }, (_, i) => i));
53
+ }
54
+ if (!geometry.hasAttribute("normal")) {
55
+ geometry.computeVertexNormals();
56
+ }
57
+ if (!geometry.hasAttribute("uv")) {
58
+ geometry.setAttribute("uv", new Float32BufferAttribute(new Float32Array(count * 2), 2));
59
+ }
60
+ Object.keys(geometry.attributes).forEach((name) => {
61
+ if (name !== "position" && name !== "normal" && name !== "uv") {
62
+ geometry.deleteAttribute(name);
63
+ }
64
+ });
65
+ geometry.clearGroups();
66
+ return geometry;
67
+ }
68
+ function createGeometry(g) {
69
+ switch (g.type) {
70
+ case "Box":
71
+ case "Plane": {
72
+ if (!g.holes?.some((h) => !holeIsZero(h))) {
73
+ return g.type === "Box" ? new BoxGeometry() : new PlaneGeometry();
74
+ }
75
+ const [x, y] = [g.size.x / 2, g.size.y / 2];
76
+ return extrude(new Shape([new Vector2(-x, -y), new Vector2(-x, y), new Vector2(x, y), new Vector2(x, -y)]), g.holes, g.type === "Box" ? g.size.z : 0);
77
+ }
78
+ case "Image":
79
+ return new PlaneGeometry();
80
+ case "Sphere":
81
+ return new SphereGeometry(1, 12, 12);
82
+ case "Cone":
83
+ return new ConeGeometry(1, 1, 16, 1);
84
+ case "Cylinder": {
85
+ const { radius, radiusEnd = radius, open = false, angleStart = 0, angleLength = Math.PI * 2 } = g;
86
+ const whole = isZero(Math.PI * 2 - angleLength);
87
+ if (radiusEnd === radius && whole && g.holes?.some((h) => !holeIsZero(h))) {
88
+ return extrude(new Shape().moveTo(0, radius).absellipse(0, 0, radius, radius, 0, Math.PI * 2, true), g.holes, g.length).rotateX(Math.PI / 2);
89
+ }
90
+ const max = Math.max(radius, radiusEnd) || 1;
91
+ const [top, bottom] = [radiusEnd / max, radius / max];
92
+ const mantle = new CylinderGeometry(top, bottom, 1, CYLINDER_SEGMENTS, 1, open && whole, angleStart, angleLength);
93
+ if (whole) {
94
+ return mantle;
95
+ }
96
+ // The walls closing the cut, merged with the mantle, both unindexed
97
+ const positions = cylinderCutPositions(top, bottom, 1, angleStart, angleLength);
98
+ const walls = new BufferGeometry().setAttribute("position", new Float32BufferAttribute(positions, 3));
99
+ walls.setAttribute("uv", new Float32BufferAttribute(new Float32Array((positions.length / 3) * 2), 2));
100
+ walls.computeVertexNormals();
101
+ return mergeGeometries([mantle.toNonIndexed(), walls]);
102
+ }
103
+ case "Shape":
104
+ return extrude(new Shape(g.points.map((p) => new Vector2(p.x, p.y))), g.holes, g.thickness);
105
+ case "Polygon": {
106
+ // A quad for 4 points, else a list of triangles, as the points are given
107
+ const geometry = new BufferGeometry().setAttribute("position", new Float32BufferAttribute(g.points.flatMap((p) => [p.x, p.y, p.z]), 3));
108
+ geometry.setIndex(g.points.length === 4 ? [0, 1, 2, 2, 3, 0] : Array.from({ length: Math.floor(g.points.length / 3) * 3 }, (_, i) => i));
109
+ geometry.computeVertexNormals();
110
+ return geometry;
111
+ }
112
+ case "Tube":
113
+ return new TubeGeometry(g.curve.type === "SplineCurve" ? new CatmullRomCurve3(g.curve.points.map((p) => new Vector3(p.x, p.y, p.z))) : new CircleCurve(g.curve), 9, g.radius, 9, false);
114
+ default:
115
+ return new BufferGeometry();
116
+ }
117
+ }
118
+ /** Extruded along z and centered on it */
119
+ function extrude(shape, holes, depth) {
120
+ addHoles(holes, shape);
121
+ return new ExtrudeGeometry(shape, { depth, bevelEnabled: false }).translate(0, 0, -depth / 2);
122
+ }
123
+ /** Disposes the cached geometries whose keys aren't in `keys` */
124
+ export function keepGeometries(cache, keys) {
125
+ cache.forEach((geometry, key) => {
126
+ if (!keys.has(key)) {
127
+ geometry.dispose();
128
+ cache.delete(key);
129
+ }
130
+ });
131
+ }
132
+ //# sourceMappingURL=geometry.js.map