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,151 @@
1
+ import TinySDF from "@mapbox/tiny-sdf";
2
+ import { Color, DataTexture, FrontSide, InstancedBufferAttribute, InstancedMesh, LinearFilter, Matrix4, PlaneGeometry, RedFormat, UnsignedByteType, Vector3, } from "three";
3
+ import { float, fwidth, instancedBufferAttribute, smoothstep, texture as textureNode, uv } from "three/tsl";
4
+ import { MeshBasicNodeMaterial } from "three/webgpu";
5
+ /** Text as signed distance field glyphs from the system font, packed into one atlas texture, so all text draws in one call */
6
+ export const RASTER_SIZE = 40;
7
+ export const SDF_BUFFER = 4;
8
+ const SDF_RADIUS = 10;
9
+ /** The distance field's value at the glyph's edge, from tiny-sdf's default cutoff of 0.25 */
10
+ export const SDF_EDGE = 0.75;
11
+ const FONT_FAMILY = "Helvetica, Arial, sans-serif";
12
+ const LINE_HEIGHT = 1.5;
13
+ const LETTER_SPACING = 0.001;
14
+ /** Of the font size, above the baseline, to center a line's glyphs in it */
15
+ const ASCENT = 0.8;
16
+ /** Rasterizes with the OS's built-in Helvetica or Arial, on a canvas created at first use */
17
+ export function createSystemFontRasterizer() {
18
+ const sdf = {};
19
+ return (char) => {
20
+ sdf.current ??= new TinySDF({ fontSize: RASTER_SIZE, buffer: SDF_BUFFER, radius: SDF_RADIUS, fontFamily: FONT_FAMILY });
21
+ return sdf.current.draw(char);
22
+ };
23
+ }
24
+ export function createGlyphAtlas(rasterize = createSystemFontRasterizer(), size = 1024) {
25
+ const data = new Uint8Array(size * size);
26
+ const texture = new DataTexture(data, size, size, RedFormat, UnsignedByteType);
27
+ texture.minFilter = LinearFilter;
28
+ texture.magFilter = LinearFilter;
29
+ texture.generateMipmaps = false;
30
+ const glyphs = new Map();
31
+ const shelf = { x: 0, y: 0, height: 0 };
32
+ const pack = (bitmap) => {
33
+ if (shelf.x + bitmap.width > size) {
34
+ Object.assign(shelf, { x: 0, y: shelf.y + shelf.height, height: 0 });
35
+ }
36
+ if (shelf.y + bitmap.height > size) {
37
+ return undefined;
38
+ }
39
+ const [x, y] = [shelf.x, shelf.y];
40
+ for (let row = 0; row < bitmap.height; row++) {
41
+ data.set(bitmap.data.subarray(row * bitmap.width, (row + 1) * bitmap.width), (y + row) * size + x);
42
+ }
43
+ Object.assign(shelf, { x: x + bitmap.width, height: Math.max(shelf.height, bitmap.height) });
44
+ texture.needsUpdate = true;
45
+ // Bitmap rows run top down from the texture's v = 0, while the quad's uv runs bottom up
46
+ return [x / size, (y + bitmap.height) / size, bitmap.width / size, -bitmap.height / size];
47
+ };
48
+ const getGlyph = (char) => {
49
+ const cached = glyphs.get(char);
50
+ if (cached) {
51
+ return cached;
52
+ }
53
+ const bitmap = rasterize(char);
54
+ const hasInk = bitmap.width > 2 * SDF_BUFFER && bitmap.height > 2 * SDF_BUFFER;
55
+ const rect = hasInk ? pack(bitmap) : undefined;
56
+ const glyph = {
57
+ rect: rect ?? [0, 0, 0, 0],
58
+ left: (bitmap.glyphLeft - SDF_BUFFER) / RASTER_SIZE,
59
+ top: (bitmap.glyphTop + SDF_BUFFER) / RASTER_SIZE,
60
+ width: rect ? bitmap.width / RASTER_SIZE : 0,
61
+ height: rect ? bitmap.height / RASTER_SIZE : 0,
62
+ advance: bitmap.glyphAdvance / RASTER_SIZE,
63
+ };
64
+ glyphs.set(char, glyph);
65
+ return glyph;
66
+ };
67
+ return { texture, getGlyph, dispose: () => texture.dispose() };
68
+ }
69
+ /** Lays out the text centered on the origin, each line centered, as drei's Text did */
70
+ export function layoutText(text, fontSize, getGlyph) {
71
+ const lineHeight = LINE_HEIGHT * fontSize;
72
+ const lines = text.split("\n");
73
+ const top = (lines.length * lineHeight) / 2;
74
+ return lines.flatMap((line, i) => {
75
+ const glyphs = Array.from(line, getGlyph);
76
+ const advances = glyphs.map((g) => (g.advance + LETTER_SPACING) * fontSize);
77
+ const baseline = top - i * lineHeight - (lineHeight - fontSize) / 2 - ASCENT * fontSize;
78
+ const starts = advances.reduce((acc, a, j) => [...acc, acc[j] + a], [-advances.reduce((sum, a) => sum + a, 0) / 2]);
79
+ return glyphs.flatMap((glyph, j) => glyph.width === 0
80
+ ? []
81
+ : [
82
+ {
83
+ glyph,
84
+ x: starts[j] + (glyph.left + glyph.width / 2) * fontSize,
85
+ y: baseline + (glyph.top - glyph.height / 2) * fontSize,
86
+ width: glyph.width * fontSize,
87
+ height: glyph.height * fontSize,
88
+ },
89
+ ]);
90
+ });
91
+ }
92
+ /** All texts of a part as glyph quads of one instanced mesh, each slot a text */
93
+ export function createTextPart(entries, atlas) {
94
+ const layouts = entries.map((e) => layoutText(e.text, e.fontSize, atlas.getGlyph));
95
+ const firsts = layouts.reduce((acc, quads, i) => [...acc, acc[i] + quads.length], [0]);
96
+ const count = firsts[layouts.length];
97
+ const quads = layouts.flat();
98
+ const slotOfGlyph = Int32Array.from(layouts.flatMap((l, slot) => l.map(() => slot)));
99
+ const rects = new InstancedBufferAttribute(Float32Array.from(quads.flatMap((q) => q.glyph.rect)), 4);
100
+ const opacities = new InstancedBufferAttribute(new Float32Array(count).fill(1), 1);
101
+ const glyphMatrices = quads.map((q) => new Matrix4().makeTranslation(q.x, q.y, 0).scale(scale.set(q.width, q.height, 1)));
102
+ const geometry = new PlaneGeometry();
103
+ const mesh = new InstancedMesh(geometry, createTextMaterial(atlas.texture, rects, opacities), count);
104
+ // Drawn after the opaque batches, and never culled as a whole, as its glyphs move with their items
105
+ mesh.renderOrder = 1;
106
+ mesh.frustumCulled = false;
107
+ return {
108
+ object: mesh,
109
+ place: (slot, matrix) => {
110
+ const text = scratch.multiplyMatrices(matrix, entries[slot].local);
111
+ for (let i = firsts[slot]; i < firsts[slot + 1]; i++) {
112
+ mesh.setMatrixAt(i, glyph.multiplyMatrices(text, glyphMatrices[i]));
113
+ }
114
+ mesh.boundingSphere = null;
115
+ },
116
+ paint: (slot, rgba) => {
117
+ color.setRGB(rgba.x, rgba.y, rgba.z);
118
+ for (let i = firsts[slot]; i < firsts[slot + 1]; i++) {
119
+ mesh.setColorAt(i, color);
120
+ opacities.setX(i, rgba.w);
121
+ }
122
+ },
123
+ flush: () => {
124
+ mesh.instanceMatrix.needsUpdate = true;
125
+ if (mesh.instanceColor) {
126
+ mesh.instanceColor.needsUpdate = true;
127
+ }
128
+ opacities.needsUpdate = true;
129
+ },
130
+ pickSlot: (hit) => (hit.instanceId === undefined ? undefined : slotOfGlyph[hit.instanceId]),
131
+ dispose: () => {
132
+ geometry.dispose();
133
+ mesh.material.dispose();
134
+ mesh.dispose();
135
+ },
136
+ };
137
+ }
138
+ /** White glyphs, colored per instance, with antialiased edges from the distance field's screen-space gradient */
139
+ function createTextMaterial(atlas, rects, opacities) {
140
+ const material = new MeshBasicNodeMaterial({ side: FrontSide, transparent: true, depthWrite: false });
141
+ const rect = instancedBufferAttribute(rects, "vec4");
142
+ const distance = textureNode(atlas, uv().mul(rect.zw).add(rect.xy)).r;
143
+ const edge = fwidth(distance).mul(0.7);
144
+ material.opacityNode = smoothstep(float(SDF_EDGE).sub(edge), float(SDF_EDGE).add(edge), distance).mul(instancedBufferAttribute(opacities, "float"));
145
+ return material;
146
+ }
147
+ const scratch = new Matrix4();
148
+ const glyph = new Matrix4();
149
+ const scale = new Vector3();
150
+ const color = new Color();
151
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/renderers/three/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type { Object3D, Texture } from "three";
2
+ import type { Group, Relation, Scene, Vec3, View } from "../../../abstract-3d.js";
3
+ import type { MaterialState } from "../appearance/appearance.js";
4
+ import type { BufferZones, CameraOptions } from "../camera/camera.js";
5
+ import type { ControlsOptions } from "../camera/controls.js";
6
+ import type { ControlsHelper } from "../camera/gizmo.js";
7
+ import type { Quality } from "../quality/quality.js";
8
+ import type { MountOverlays } from "./overlays.js";
9
+ /** The viewer's options, and what passing each of them in an update redoes; telling which actually changed is the caller's, e.g. React's dependencies */
10
+ export type Popover<Content> = {
11
+ readonly id: string;
12
+ readonly pos: Vec3;
13
+ readonly content: Content;
14
+ };
15
+ export type SceneEvent = {
16
+ readonly nativeEvent: MouseEvent;
17
+ /** Where the pointer hit, in world space */
18
+ readonly point: Vec3;
19
+ };
20
+ /** A group's data: of the top-level group, and of the group the hit mesh is in */
21
+ type Data = Record<string, string> | undefined;
22
+ export type ViewerOptions<Content> = {
23
+ /** Undefined shows the fallback */
24
+ readonly scene?: Scene;
25
+ /** The id of a top-level group, which its hover, selection, material state and events are by; groups without an id can't be clicked */
26
+ readonly createGroupId?: (g: Group) => string;
27
+ readonly selectedIds?: Record<string, boolean>;
28
+ readonly hoveredIds?: ReadonlyArray<string>;
29
+ readonly activeComponents?: Record<string, MaterialState>;
30
+ /**
31
+ * The ids of the relations whose shape is drawn to be clicked, e.g. where a component can be inserted. While defined, even when empty, only the
32
+ * groups whose material state is Accept can be clicked
33
+ */
34
+ readonly activeRelations?: ReadonlyArray<string>;
35
+ readonly showDimensions?: boolean;
36
+ /** View, buffer zones and padding are read when the scene is fitted: first, and for a new camera or canvas size */
37
+ readonly camera?: CameraOptions;
38
+ readonly view?: View;
39
+ readonly bufferZones?: BufferZones;
40
+ readonly fitPadding?: number;
41
+ readonly controls?: ControlsOptions;
42
+ readonly gizmo?: ControlsHelper;
43
+ /** Replace the default lights, a weak ambient light, a key light from the upper left and two fills */
44
+ readonly lights?: ReadonlyArray<Object3D> | ((scene: Scene) => ReadonlyArray<Object3D>);
45
+ /** Lights faces by which way they turn and gives metal reflections: `studio` by default, `room` for three's RoomEnvironment, or null for none */
46
+ readonly environment?: Texture | "studio" | "room" | null;
47
+ readonly environmentIntensity?: number;
48
+ /** `low` by default, without ambient occlusion */
49
+ readonly quality?: Quality;
50
+ readonly useAlphaTest?: boolean;
51
+ readonly materialStateImages?: Record<string, string>;
52
+ readonly popovers?: ReadonlyArray<Popover<Content>>;
53
+ readonly getTooltips?: (id: string) => ReadonlyArray<Popover<Content>>;
54
+ /** Mounts popover and tooltip content, e.g. as React portals; without it, strings and DOM nodes are mounted directly */
55
+ readonly onOverlays?: MountOverlays<Content>;
56
+ /** A built scene's shaders are compiled, so its first frame renders without a stall, e.g. to hide a fallback */
57
+ readonly onLoad?: () => void;
58
+ readonly onClickGroup?: (id: string, rootData: Data, data: Data, event: SceneEvent) => void;
59
+ /** Called with no id when the pointer leaves the group */
60
+ readonly onHoverGroup?: (id: string | undefined, rootData: Data, data: Data, event: SceneEvent) => void;
61
+ readonly onContextMenuGroup?: (id: string, rootData: Data, data: Data, left: number, top: number, event: SceneEvent) => void;
62
+ readonly onClickRelation?: (relation: Relation, event: SceneEvent) => void;
63
+ };
64
+ /** What an update has to redo, in the order it's redone */
65
+ export type Change = "compile" | "build" | "camera" | "controls" | "gizmo" | "lights" | "quality" | "paint" | "dimensions" | "overlays";
66
+ /** What passing each option redoes; callbacks and what's read later need nothing */
67
+ export declare const effects: {
68
+ readonly [K in keyof ViewerOptions<unknown>]-?: ReadonlyArray<Change>;
69
+ };
70
+ export {};
71
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/viewer/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /** What passing each option redoes; callbacks and what's read later need nothing */
2
+ export const effects = {
3
+ scene: ["compile", "build", "lights", "overlays"],
4
+ createGroupId: ["compile", "build"],
5
+ activeComponents: ["build"],
6
+ activeRelations: ["build"],
7
+ useAlphaTest: ["build"],
8
+ materialStateImages: ["build"],
9
+ selectedIds: ["paint"],
10
+ hoveredIds: ["paint"],
11
+ showDimensions: ["dimensions"],
12
+ camera: ["camera"],
13
+ view: [],
14
+ bufferZones: [],
15
+ fitPadding: [],
16
+ controls: ["controls"],
17
+ gizmo: ["gizmo"],
18
+ lights: ["lights"],
19
+ environment: ["lights"],
20
+ environmentIntensity: ["lights"],
21
+ quality: ["quality"],
22
+ popovers: ["overlays"],
23
+ getTooltips: ["overlays"],
24
+ onOverlays: [],
25
+ onLoad: [],
26
+ onClickGroup: ["paint"],
27
+ onHoverGroup: [],
28
+ onContextMenuGroup: [],
29
+ onClickRelation: [],
30
+ };
31
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../src/renderers/three/viewer/options.ts"],"names":[],"mappings":"AAoEA,oFAAoF;AACpF,MAAM,CAAC,MAAM,OAAO,GAA8E;IAChG,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;IACjD,aAAa,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;IACnC,gBAAgB,EAAE,CAAC,OAAO,CAAC;IAC3B,eAAe,EAAE,CAAC,OAAO,CAAC;IAC1B,YAAY,EAAE,CAAC,OAAO,CAAC;IACvB,mBAAmB,EAAE,CAAC,OAAO,CAAC;IAC9B,WAAW,EAAE,CAAC,OAAO,CAAC;IACtB,UAAU,EAAE,CAAC,OAAO,CAAC;IACrB,cAAc,EAAE,CAAC,YAAY,CAAC;IAC9B,MAAM,EAAE,CAAC,QAAQ,CAAC;IAClB,IAAI,EAAE,EAAE;IACR,WAAW,EAAE,EAAE;IACf,UAAU,EAAE,EAAE;IACd,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,MAAM,EAAE,CAAC,QAAQ,CAAC;IAClB,WAAW,EAAE,CAAC,QAAQ,CAAC;IACvB,oBAAoB,EAAE,CAAC,QAAQ,CAAC;IAChC,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,WAAW,EAAE,CAAC,UAAU,CAAC;IACzB,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,CAAC,OAAO,CAAC;IACvB,YAAY,EAAE,EAAE;IAChB,kBAAkB,EAAE,EAAE;IACtB,eAAe,EAAE,EAAE;CACpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=options.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.test.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/viewer/options.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { vec3 } from "../../../abstract-3d.js";
3
+ import { getChanges } from "./options.js";
4
+ const scene = { size_deprecated: vec3(1, 1, 1), groups: [] };
5
+ const changes = (a, b) => [...getChanges(a, b)].toSorted();
6
+ describe("getChanges", () => {
7
+ it("changes nothing for equal options, even when records and arrays are new objects", () => {
8
+ const a = {
9
+ scene,
10
+ selectedIds: { a: true },
11
+ hoveredIds: ["a"],
12
+ camera: { type: "Perspective", fov: 45 },
13
+ onClickGroup: () => undefined,
14
+ };
15
+ expect(changes(a, { ...a, selectedIds: { a: true }, hoveredIds: ["a"], camera: { type: "Perspective", fov: 45 } })).toEqual([]);
16
+ });
17
+ it("only repaints for a new selection or hover", () => {
18
+ expect(changes({ selectedIds: { a: true } }, { selectedIds: { b: true } })).toEqual(["paint"]);
19
+ expect(changes({ hoveredIds: ["a"] }, { hoveredIds: [] })).toEqual(["paint"]);
20
+ });
21
+ it("rebuilds for a new scene, and recompiles it", () => {
22
+ expect(changes({ scene }, { scene: { ...scene } })).toEqual(["build", "compile", "lights", "overlays"]);
23
+ });
24
+ it("rebuilds without compiling for new material states and active relations", () => {
25
+ expect(changes({}, { activeComponents: { a: "Accept" } })).toEqual(["build"]);
26
+ expect(changes({}, { activeRelations: [] })).toEqual(["build"]);
27
+ });
28
+ it("leaves view, buffer zones and padding for the next fit, which a new camera does", () => {
29
+ expect(changes({ view: "front" }, { view: "top" })).toEqual([]);
30
+ expect(changes({}, { bufferZones: { left: 10 } })).toEqual([]);
31
+ expect(changes({ camera: { type: "Perspective" } }, { camera: { type: "Orthographic" } })).toEqual(["camera"]);
32
+ });
33
+ it("only stores new callbacks, except that clicking dimensions depends on onClickGroup", () => {
34
+ expect(changes({ onHoverGroup: () => undefined }, { onHoverGroup: () => undefined })).toEqual([]);
35
+ expect(changes({}, { onClickGroup: () => undefined })).toEqual(["paint"]);
36
+ });
37
+ });
38
+ //# sourceMappingURL=options.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.test.js","sourceRoot":"","sources":["../../../../src/renderers/three/viewer/options.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { Scene, type Vector3 } from "three";
2
+ import { CSS2DObject, CSS2DRenderer } from "three/addons/renderers/CSS2DRenderer.js";
3
+ /**
4
+ * HTML elements over the canvas at 3D anchors, e.g. popovers and tooltips, placed by three.js's CSS2DRenderer; their content is mounted by the app,
5
+ * or directly
6
+ */
7
+ export type Overlay<Content> = {
8
+ readonly key: string;
9
+ /** In world space */
10
+ readonly position: Vector3;
11
+ readonly content: Content;
12
+ };
13
+ export type MountedOverlay<Content> = {
14
+ readonly key: string;
15
+ readonly element: HTMLElement;
16
+ readonly content: Content;
17
+ };
18
+ /** Mounts the overlays' content into their elements, called when the set of overlays or their content changes */
19
+ export type MountOverlays<Content> = (overlays: ReadonlyArray<MountedOverlay<Content>>) => void;
20
+ export type OverlayLayer<Content> = {
21
+ readonly renderer: CSS2DRenderer;
22
+ readonly scene: Scene;
23
+ readonly mounted: Map<string, {
24
+ readonly object: CSS2DObject;
25
+ overlay: Overlay<Content>;
26
+ }>;
27
+ };
28
+ export declare function createOverlayLayer<Content>(container: HTMLElement): OverlayLayer<Content>;
29
+ /** Without `mount`, strings and DOM nodes are mounted as they are */
30
+ export declare function setOverlays<Content>(layer: OverlayLayer<Content>, overlays: ReadonlyArray<Overlay<Content>>, mount: MountOverlays<Content> | undefined): void;
31
+ //# sourceMappingURL=overlays.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/viewer/overlays.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAErF;;;GAGG;AAEH,MAAM,MAAM,OAAO,CAAC,OAAO,IAAI;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,OAAO,IAAI;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzH,iHAAiH;AACjH,MAAM,MAAM,aAAa,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;AAEhG,MAAM,MAAM,YAAY,CAAC,OAAO,IAAI;IAClC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CAC5F,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAKzF;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,OAAO,EACjC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,EAC5B,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EACzC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS,GACxC,IAAI,CAgCN"}
@@ -0,0 +1,43 @@
1
+ import { Scene } from "three";
2
+ import { CSS2DObject, CSS2DRenderer } from "three/addons/renderers/CSS2DRenderer.js";
3
+ export function createOverlayLayer(container) {
4
+ const renderer = new CSS2DRenderer();
5
+ renderer.domElement.style.cssText = "position:absolute;inset:0;overflow:hidden;pointer-events:none";
6
+ container.append(renderer.domElement);
7
+ return { renderer, scene: new Scene(), mounted: new Map() };
8
+ }
9
+ /** Without `mount`, strings and DOM nodes are mounted as they are */
10
+ export function setOverlays(layer, overlays, mount) {
11
+ const keys = new Set();
12
+ const changed = { current: false };
13
+ overlays.forEach((overlay) => {
14
+ keys.add(overlay.key);
15
+ const existing = layer.mounted.get(overlay.key);
16
+ changed.current ||= existing?.overlay.content !== overlay.content;
17
+ const object = existing?.object ?? new CSS2DObject(document.createElement("div"));
18
+ object.position.copy(overlay.position);
19
+ if (existing) {
20
+ existing.overlay = overlay;
21
+ }
22
+ else {
23
+ object.element.style.pointerEvents = "none";
24
+ layer.scene.add(object);
25
+ layer.mounted.set(overlay.key, { object, overlay });
26
+ }
27
+ });
28
+ layer.mounted.forEach(({ object }, key) => {
29
+ if (!keys.has(key)) {
30
+ // Its element is removed with it
31
+ layer.scene.remove(object);
32
+ layer.mounted.delete(key);
33
+ changed.current = true;
34
+ }
35
+ });
36
+ if (changed.current && mount) {
37
+ mount(Array.from(layer.mounted, ([key, { object, overlay }]) => ({ key, element: object.element, content: overlay.content })));
38
+ }
39
+ else if (changed.current) {
40
+ layer.mounted.forEach(({ object, overlay: { content } }) => object.element.replaceChildren(content instanceof Node ? content : String(content ?? "")));
41
+ }
42
+ }
43
+ //# sourceMappingURL=overlays.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlays.js","sourceRoot":"","sources":["../../../../src/renderers/three/viewer/overlays.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { type BufferGeometry, Group, OrthographicCamera, PerspectiveCamera, Scene as ThreeScene, type Texture, Vector3, WebGLRenderer } from "three";
2
+ import type { ViewportGizmo } from "three-viewport-gizmo";
3
+ import type { StructureState } from "../appearance/appearance.js";
4
+ import type { BuiltScene } from "../build/build.js";
5
+ import type { TextureCache } from "../build/materials.js";
6
+ import type { Controls } from "../camera/controls.js";
7
+ import type { CompiledScene } from "../compile/compile.js";
8
+ import type { RenderPath, TierGovernor } from "../quality/quality.js";
9
+ import type { GlyphAtlas } from "../text/text.js";
10
+ import type { Change, ViewerOptions } from "./options.js";
11
+ import type { OverlayLayer } from "./overlays.js";
12
+ /**
13
+ * The interactive viewer: renderer, render on demand, camera, controls, pointer input, overlays and gizmo. Updates are batched into the next frame,
14
+ * as r3f applies props; render on demand and `invalidate` are r3f's `frameloop="demand"`; the state with functions instead of a class keeps it free
15
+ * of `this`
16
+ */
17
+ type Hit = {
18
+ readonly item: number;
19
+ readonly target: number;
20
+ readonly point: Vector3;
21
+ };
22
+ export type Viewer<Content> = {
23
+ options: ViewerOptions<Content>;
24
+ readonly container: HTMLElement;
25
+ readonly canvas: HTMLCanvasElement;
26
+ readonly renderer: WebGLRenderer;
27
+ /** Apps can add their own objects, then `invalidate` */
28
+ readonly scene: ThreeScene;
29
+ readonly lights: Group;
30
+ readonly cameras: {
31
+ readonly Perspective: PerspectiveCamera;
32
+ readonly Orthographic: OrthographicCamera;
33
+ };
34
+ camera: PerspectiveCamera | OrthographicCamera;
35
+ readonly controls: Controls;
36
+ readonly geometries: Map<string, BufferGeometry>;
37
+ readonly atlas: GlyphAtlas;
38
+ readonly textures: TextureCache;
39
+ readonly overlays: OverlayLayer<Content>;
40
+ readonly size: {
41
+ width: number;
42
+ height: number;
43
+ };
44
+ readonly listeners: AbortController;
45
+ readonly resizeObserver: ResizeObserver;
46
+ readonly pointer: {
47
+ last?: PointerEvent;
48
+ down?: {
49
+ readonly x: number;
50
+ readonly y: number;
51
+ };
52
+ hovered?: Hit;
53
+ frame: number;
54
+ };
55
+ readonly loop: {
56
+ frame: number;
57
+ last: number;
58
+ wasMoving: boolean;
59
+ seconds: number;
60
+ };
61
+ /** What the next frame redoes, from the options passed since the last */
62
+ readonly pending: Set<Change>;
63
+ /** CPU times in ms of the last frame, pick and repaint, and the last frame's draw calls, post-processing included */
64
+ readonly stats: {
65
+ frames: number;
66
+ frameMs: number;
67
+ drawCalls: number;
68
+ pickMs: number;
69
+ paintMs: number;
70
+ };
71
+ structure: StructureState;
72
+ compiled?: CompiledScene;
73
+ built?: BuiltScene;
74
+ gizmo?: ViewportGizmo;
75
+ path?: RenderPath;
76
+ governor?: TierGovernor;
77
+ readonly environments: Partial<Record<"studio" | "room", Texture>>;
78
+ /** The scene is built and its shaders compiled */
79
+ loaded: boolean;
80
+ fitted: boolean;
81
+ disposed: boolean;
82
+ };
83
+ export declare function createViewer<Content>(container: HTMLElement, options: ViewerOptions<Content>): Viewer<Content>;
84
+ /** Sets the options passed, redone in the next frame; what each redoes is in `effects`, so pass only the ones that changed */
85
+ export declare function updateViewer<Content>(v: Viewer<Content>, options: Partial<ViewerOptions<Content>>): void;
86
+ /** Renders a frame on the next animation frame, e.g. after changing objects added to `scene` */
87
+ export declare function invalidate<Content>(v: Viewer<Content>): void;
88
+ export declare function disposeViewer<Content>(v: Viewer<Content>): void;
89
+ export {};
90
+ //# sourceMappingURL=viewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../../../src/renderers/three/viewer/viewer.ts"],"names":[],"mappings":"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"}