abstract-3d 4.1.1 → 4.1.3

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 (130) hide show
  1. package/lib/renderers/svg/svg-encoding.d.ts +0 -2
  2. package/lib/renderers/svg/svg-encoding.d.ts.map +1 -1
  3. package/lib/renderers/svg/svg-encoding.js +0 -12
  4. package/lib/renderers/svg/svg-encoding.js.map +1 -1
  5. package/lib/renderers/svg/svg-geometries/shared.d.ts +2 -19
  6. package/lib/renderers/svg/svg-geometries/shared.d.ts.map +1 -1
  7. package/lib/renderers/svg/svg-geometries/shared.js +1 -16
  8. package/lib/renderers/svg/svg-geometries/shared.js.map +1 -1
  9. package/lib/renderers/svg/svg-geometries/svg-box.d.ts.map +1 -1
  10. package/lib/renderers/svg/svg-geometries/svg-box.js +30 -44
  11. package/lib/renderers/svg/svg-geometries/svg-box.js.map +1 -1
  12. package/lib/renderers/svg/svg-geometries/svg-cone.d.ts.map +1 -1
  13. package/lib/renderers/svg/svg-geometries/svg-cone.js +3 -3
  14. package/lib/renderers/svg/svg-geometries/svg-cone.js.map +1 -1
  15. package/lib/renderers/svg/svg-geometries/svg-cylinder.d.ts.map +1 -1
  16. package/lib/renderers/svg/svg-geometries/svg-cylinder.js +6 -19
  17. package/lib/renderers/svg/svg-geometries/svg-cylinder.js.map +1 -1
  18. package/lib/renderers/svg/svg-geometries/svg-image.d.ts.map +1 -1
  19. package/lib/renderers/svg/svg-geometries/svg-image.js +2 -3
  20. package/lib/renderers/svg/svg-geometries/svg-image.js.map +1 -1
  21. package/lib/renderers/svg/svg-geometries/svg-line.d.ts.map +1 -1
  22. package/lib/renderers/svg/svg-geometries/svg-line.js +1 -3
  23. package/lib/renderers/svg/svg-geometries/svg-line.js.map +1 -1
  24. package/lib/renderers/svg/svg-geometries/svg-plane.d.ts.map +1 -1
  25. package/lib/renderers/svg/svg-geometries/svg-plane.js +2 -6
  26. package/lib/renderers/svg/svg-geometries/svg-plane.js.map +1 -1
  27. package/lib/renderers/svg/svg-geometries/svg-polygon.d.ts.map +1 -1
  28. package/lib/renderers/svg/svg-geometries/svg-polygon.js +2 -10
  29. package/lib/renderers/svg/svg-geometries/svg-polygon.js.map +1 -1
  30. package/lib/renderers/svg/svg-geometries/svg-shape.d.ts.map +1 -1
  31. package/lib/renderers/svg/svg-geometries/svg-shape.js +2 -5
  32. package/lib/renderers/svg/svg-geometries/svg-shape.js.map +1 -1
  33. package/lib/renderers/svg/svg-geometries/svg-text.js +1 -1
  34. package/lib/renderers/svg/svg-geometries/svg-text.js.map +1 -1
  35. package/lib/renderers/svg/svg-order.d.ts +5 -6
  36. package/lib/renderers/svg/svg-order.d.ts.map +1 -1
  37. package/lib/renderers/svg/svg-order.js +124 -233
  38. package/lib/renderers/svg/svg-order.js.map +1 -1
  39. package/lib/renderers/svg/svg.d.ts.map +1 -1
  40. package/lib/renderers/svg/svg.js +12 -11
  41. package/lib/renderers/svg/svg.js.map +1 -1
  42. package/lib/renderers/svg-bsp/class-names.d.ts +11 -0
  43. package/lib/renderers/svg-bsp/class-names.d.ts.map +1 -0
  44. package/lib/renderers/svg-bsp/class-names.js +11 -0
  45. package/lib/renderers/svg-bsp/class-names.js.map +1 -0
  46. package/lib/renderers/svg-bsp/index.d.ts +5 -0
  47. package/lib/renderers/svg-bsp/index.d.ts.map +1 -0
  48. package/lib/renderers/svg-bsp/index.js +4 -0
  49. package/lib/renderers/svg-bsp/index.js.map +1 -0
  50. package/lib/renderers/svg-bsp/svg-encoding.d.ts +19 -0
  51. package/lib/renderers/svg-bsp/svg-encoding.d.ts.map +1 -0
  52. package/lib/renderers/svg-bsp/svg-encoding.js +135 -0
  53. package/lib/renderers/svg-bsp/svg-encoding.js.map +1 -0
  54. package/lib/renderers/svg-bsp/svg-geometries/shared.d.ts +47 -0
  55. package/lib/renderers/svg-bsp/svg-geometries/shared.d.ts.map +1 -0
  56. package/lib/renderers/svg-bsp/svg-geometries/shared.js +45 -0
  57. package/lib/renderers/svg-bsp/svg-geometries/shared.js.map +1 -0
  58. package/lib/renderers/svg-bsp/svg-geometries/svg-box.d.ts +4 -0
  59. package/lib/renderers/svg-bsp/svg-geometries/svg-box.d.ts.map +1 -0
  60. package/lib/renderers/svg-bsp/svg-geometries/svg-box.js +58 -0
  61. package/lib/renderers/svg-bsp/svg-geometries/svg-box.js.map +1 -0
  62. package/lib/renderers/svg-bsp/svg-geometries/svg-cone.d.ts +4 -0
  63. package/lib/renderers/svg-bsp/svg-geometries/svg-cone.d.ts.map +1 -0
  64. package/lib/renderers/svg-bsp/svg-geometries/svg-cone.js +39 -0
  65. package/lib/renderers/svg-bsp/svg-geometries/svg-cone.js.map +1 -0
  66. package/lib/renderers/svg-bsp/svg-geometries/svg-cylinder.d.ts +4 -0
  67. package/lib/renderers/svg-bsp/svg-geometries/svg-cylinder.d.ts.map +1 -0
  68. package/lib/renderers/svg-bsp/svg-geometries/svg-cylinder.js +62 -0
  69. package/lib/renderers/svg-bsp/svg-geometries/svg-cylinder.js.map +1 -0
  70. package/lib/renderers/svg-bsp/svg-geometries/svg-image.d.ts +4 -0
  71. package/lib/renderers/svg-bsp/svg-geometries/svg-image.d.ts.map +1 -0
  72. package/lib/renderers/svg-bsp/svg-geometries/svg-image.js +44 -0
  73. package/lib/renderers/svg-bsp/svg-geometries/svg-image.js.map +1 -0
  74. package/lib/renderers/svg-bsp/svg-geometries/svg-line.d.ts +4 -0
  75. package/lib/renderers/svg-bsp/svg-geometries/svg-line.d.ts.map +1 -0
  76. package/lib/renderers/svg-bsp/svg-geometries/svg-line.js +12 -0
  77. package/lib/renderers/svg-bsp/svg-geometries/svg-line.js.map +1 -0
  78. package/lib/renderers/svg-bsp/svg-geometries/svg-plane.d.ts +4 -0
  79. package/lib/renderers/svg-bsp/svg-geometries/svg-plane.d.ts.map +1 -0
  80. package/lib/renderers/svg-bsp/svg-geometries/svg-plane.js +24 -0
  81. package/lib/renderers/svg-bsp/svg-geometries/svg-plane.js.map +1 -0
  82. package/lib/renderers/svg-bsp/svg-geometries/svg-polygon.d.ts +4 -0
  83. package/lib/renderers/svg-bsp/svg-geometries/svg-polygon.d.ts.map +1 -0
  84. package/lib/renderers/svg-bsp/svg-geometries/svg-polygon.js +24 -0
  85. package/lib/renderers/svg-bsp/svg-geometries/svg-polygon.js.map +1 -0
  86. package/lib/renderers/svg-bsp/svg-geometries/svg-shape.d.ts +4 -0
  87. package/lib/renderers/svg-bsp/svg-geometries/svg-shape.d.ts.map +1 -0
  88. package/lib/renderers/svg-bsp/svg-geometries/svg-shape.js +19 -0
  89. package/lib/renderers/svg-bsp/svg-geometries/svg-shape.js.map +1 -0
  90. package/lib/renderers/svg-bsp/svg-geometries/svg-text.d.ts +4 -0
  91. package/lib/renderers/svg-bsp/svg-geometries/svg-text.d.ts.map +1 -0
  92. package/lib/renderers/svg-bsp/svg-geometries/svg-text.js +26 -0
  93. package/lib/renderers/svg-bsp/svg-geometries/svg-text.js.map +1 -0
  94. package/lib/renderers/svg-bsp/svg-order.d.ts +10 -0
  95. package/lib/renderers/svg-bsp/svg-order.d.ts.map +1 -0
  96. package/lib/renderers/svg-bsp/svg-order.js +257 -0
  97. package/lib/renderers/svg-bsp/svg-order.js.map +1 -0
  98. package/lib/renderers/svg-bsp/svg.d.ts +16 -0
  99. package/lib/renderers/svg-bsp/svg.d.ts.map +1 -0
  100. package/lib/renderers/svg-bsp/svg.js +120 -0
  101. package/lib/renderers/svg-bsp/svg.js.map +1 -0
  102. package/package.json +6 -1
  103. package/src/renderers/svg/svg-encoding.ts +0 -13
  104. package/src/renderers/svg/svg-geometries/shared.ts +3 -31
  105. package/src/renderers/svg/svg-geometries/svg-box.ts +36 -51
  106. package/src/renderers/svg/svg-geometries/svg-cone.ts +3 -18
  107. package/src/renderers/svg/svg-geometries/svg-cylinder.ts +6 -26
  108. package/src/renderers/svg/svg-geometries/svg-image.ts +2 -3
  109. package/src/renderers/svg/svg-geometries/svg-line.ts +1 -3
  110. package/src/renderers/svg/svg-geometries/svg-plane.ts +2 -12
  111. package/src/renderers/svg/svg-geometries/svg-polygon.ts +2 -10
  112. package/src/renderers/svg/svg-geometries/svg-shape.ts +2 -11
  113. package/src/renderers/svg/svg-geometries/svg-text.ts +1 -1
  114. package/src/renderers/svg/svg.ts +12 -14
  115. package/src/renderers/svg-bsp/class-names.ts +10 -0
  116. package/src/renderers/svg-bsp/index.ts +4 -0
  117. package/src/renderers/svg-bsp/svg-encoding.ts +190 -0
  118. package/src/renderers/svg-bsp/svg-geometries/shared.ts +88 -0
  119. package/src/renderers/svg-bsp/svg-geometries/svg-box.ts +76 -0
  120. package/src/renderers/svg-bsp/svg-geometries/svg-cone.ts +68 -0
  121. package/src/renderers/svg-bsp/svg-geometries/svg-cylinder.ts +82 -0
  122. package/src/renderers/svg-bsp/svg-geometries/svg-image.ts +56 -0
  123. package/src/renderers/svg-bsp/svg-geometries/svg-line.ts +21 -0
  124. package/src/renderers/svg-bsp/svg-geometries/svg-plane.ts +43 -0
  125. package/src/renderers/svg-bsp/svg-geometries/svg-polygon.ts +33 -0
  126. package/src/renderers/svg-bsp/svg-geometries/svg-shape.ts +34 -0
  127. package/src/renderers/svg-bsp/svg-geometries/svg-text.ts +40 -0
  128. package/src/renderers/svg-bsp/svg.ts +183 -0
  129. /package/src/renderers/{svg → svg-bsp}/svg-order.test.ts +0 -0
  130. /package/src/renderers/{svg → svg-bsp}/svg-order.ts +0 -0
@@ -0,0 +1,34 @@
1
+ import type { Vec3, Vec2, Shape, Material } from "../../../abstract-3d.js";
2
+ import { vec3ZMean, vec3TransRot, vec3RotCombine, vec3, vec3Zero } from "../../../abstract-3d.js";
3
+ import { rgbGrayScale } from "../../../utils.js";
4
+ import { svgPolygon } from "../svg-encoding.js";
5
+ import type { zOrderElement, SvgOptions } from "./shared.js";
6
+ import { gray, isOpaque, zElem, transparent } from "./shared.js";
7
+
8
+ export function shape(
9
+ s: Shape,
10
+ point: (x: number, y: number) => Vec2,
11
+ material: Material,
12
+ opts: SvgOptions,
13
+ parentPos: Vec3,
14
+ parentRot: Vec3
15
+ ): ReadonlyArray<zOrderElement> {
16
+ const pos = vec3TransRot(s.pos, parentPos, parentRot);
17
+ const rot = vec3RotCombine(parentRot, s.rot ?? vec3Zero);
18
+ const rotatedPoints = s.points.map((p) => vec3TransRot(vec3(p.x, p.y, 0), pos, rot));
19
+ const points = rotatedPoints.map(({ x, y }) => point(x, y));
20
+ const color = material.normal;
21
+ const [strokeColor, fill] = opts.only_stroke
22
+ ? [opts.gray_scale ? gray : color, opts.background]
23
+ : [transparent, opts.gray_scale ? rgbGrayScale(color) : color];
24
+ const opacity = material.opacity ?? 1.0;
25
+ return [
26
+ zElem(
27
+ svgPolygon(rot, points, fill, opacity, strokeColor, 0),
28
+ vec3ZMean(...rotatedPoints),
29
+ rotatedPoints,
30
+ isOpaque(fill, opacity) && !s.holes?.length,
31
+ { fill, opacity, stroke: strokeColor, strokeWidth: 0 }
32
+ ),
33
+ ];
34
+ }
@@ -0,0 +1,40 @@
1
+ import type { Text, Vec2, Vec3 } from "../../../abstract-3d.js";
2
+ import { vec3TransRot, vec3RotCombine, vec3Zero, vec3, vec3Dot, vec3Rot } from "../../../abstract-3d.js";
3
+ import { svgText } from "../svg-encoding.js";
4
+ import type { SvgOptions, zOrderElement } from "./shared.js";
5
+ import { svgTrsMatrix, zElem } from "./shared.js";
6
+
7
+ const SVG_FORWARD: Vec3 = vec3(0.0, 0.0, 1.0);
8
+ const SVG_DOT_OPPOSITE_THRESHOLD: number = -0.9;
9
+
10
+ // dummy
11
+ export function text(
12
+ t: Text,
13
+ point: (x: number, y: number) => Vec2,
14
+ fill: string,
15
+ opts: SvgOptions,
16
+ parentPos: Vec3,
17
+ parentRot: Vec3
18
+ ): ReadonlyArray<zOrderElement> {
19
+ const pos = vec3TransRot(t.pos, parentPos, parentRot);
20
+ const rot = vec3RotCombine(parentRot, t.rot ?? vec3Zero);
21
+
22
+ const textForward = vec3Rot({ x: 0, y: 0, z: 1 }, vec3Zero, rot);
23
+
24
+ //discard texts that are pointing away
25
+ if (vec3Dot(textForward, SVG_FORWARD) <= SVG_DOT_OPPOSITE_THRESHOLD) {
26
+ return [];
27
+ }
28
+
29
+ const texts = Array<zOrderElement>();
30
+ const fontSize = t.fontSize;
31
+ const strings = t.text.split("\n");
32
+ let posY = strings.length === 1 ? 0 : (fontSize * strings.length - fontSize) / 2;
33
+ for (const s of strings) {
34
+ const matrix = svgTrsMatrix(point(pos.x, pos.y + posY), rot);
35
+ texts.push(zElem(svgText(s, matrix, fill, opts.font, fontSize), pos.z, [pos]));
36
+ posY -= fontSize * 1.2;
37
+ }
38
+
39
+ return texts;
40
+ }
@@ -0,0 +1,183 @@
1
+ import { exhaustiveCheck } from "ts-exhaustive-check";
2
+ import type { Scene, Vec3, Mesh, Vec2, Group, Material, Bounds2 } from "../../abstract-3d.js";
3
+ import {
4
+ vec2,
5
+ vec3Rot,
6
+ vec3Zero,
7
+ vec3RotCombine,
8
+ vec3,
9
+ vec3TransRot,
10
+ rotationForCameraPos,
11
+ sizeBoundsForCameraPos,
12
+ bounds2FromPosAndSize,
13
+ bounds2ToSize,
14
+ bounds2Merge,
15
+ vec2Zero,
16
+ vec3Flip,
17
+ dimensionConvertToTypeMesh,
18
+ } from "../../abstract-3d.js";
19
+ import type { Optional } from "../../utils.js";
20
+ import { calculateVisibleViews, isViewVisible } from "../../utils.js";
21
+ import { svg } from "./svg-encoding.js";
22
+ import type { SvgOptions, zOrderElement } from "./svg-geometries/shared.js";
23
+ import { box } from "./svg-geometries/svg-box.js";
24
+ import { cone } from "./svg-geometries/svg-cone.js";
25
+ import { cylinder } from "./svg-geometries/svg-cylinder.js";
26
+ import { image } from "./svg-geometries/svg-image.js";
27
+ import { line } from "./svg-geometries/svg-line.js";
28
+ import { plane } from "./svg-geometries/svg-plane.js";
29
+ import { polygon } from "./svg-geometries/svg-polygon.js";
30
+ import { shape } from "./svg-geometries/svg-shape.js";
31
+ import { text } from "./svg-geometries/svg-text.js";
32
+ import { orderElements } from "./svg-order.js";
33
+
34
+ export type SvgScene = {
35
+ readonly scene: Scene;
36
+ readonly options?: Optional<SvgOptions>;
37
+ readonly pos: Vec2;
38
+ };
39
+
40
+ export type SvgWithSize = { readonly image: string; readonly width: number; readonly height: number };
41
+
42
+ export function renderScenes(scenes: ReadonlyArray<SvgScene>, baseOptions?: Optional<SvgOptions>): SvgWithSize {
43
+ const allElements = Array<zOrderElement>();
44
+ const bounds = Array<Bounds2>();
45
+
46
+ for (const view of scenes) {
47
+ const { elements, size, center } = renderInternal(view.scene, { ...baseOptions, ...view.options }, view.pos);
48
+ allElements.push(...elements);
49
+ const newBounds = bounds2FromPosAndSize(center, size);
50
+ bounds.push(newBounds);
51
+ }
52
+ const mergedBounds = bounds2Merge(...bounds);
53
+ const size = bounds2ToSize(mergedBounds);
54
+ const image = svg(
55
+ mergedBounds.min,
56
+ size,
57
+ allElements.reduce((a, { element }) => `${a} ${element}`, ""),
58
+ baseOptions?.className ?? ""
59
+ );
60
+ return { image, width: size.x, height: size.y };
61
+ }
62
+
63
+ export function render(scene: Scene, options?: Optional<SvgOptions>): SvgWithSize {
64
+ const { elements, size, center } = renderInternal(scene, options, vec2Zero);
65
+
66
+ const image = svg(
67
+ vec2(center.x - size.x / 2, center.y - size.y / 2),
68
+ size,
69
+ elements.reduce((a, { element }) => `${a} ${element}`, ""),
70
+ options?.className ?? ""
71
+ );
72
+ return { image, width: size.x, height: size.y };
73
+ }
74
+
75
+ function renderInternal(
76
+ scene: Scene,
77
+ options: Optional<SvgOptions> | undefined,
78
+ offset: Vec2
79
+ ): {
80
+ readonly elements: ReadonlyArray<zOrderElement>;
81
+ readonly size: Vec2;
82
+ readonly center: Vec2;
83
+ } {
84
+ const opts: SvgOptions = {
85
+ view: options?.view ?? "front",
86
+ stroke_thickness: options?.stroke_thickness ?? 2,
87
+ only_stroke: options?.only_stroke ?? false,
88
+ gray_scale: options?.gray_scale ?? false,
89
+ background: options?.background ?? "rgba(255,255,255,0)",
90
+ font: options?.font ?? "",
91
+ imageDataByUrl: options?.imageDataByUrl ?? {},
92
+ rotation: options?.rotation ?? 0,
93
+ imageBg: options?.imageBg ?? false,
94
+ className: options?.className ?? "",
95
+ };
96
+ // A three-quarter view: the front turned 30° to show the side, and tilted 20° to show the top, the front foremost
97
+ const angled = opts.view === "TopLeft" || opts.view === "TopRight";
98
+ const view = angled ? "front" : opts.view;
99
+ const angledRot = angled
100
+ ? vec3RotCombine(vec3((20 * Math.PI) / 180, 0, 0), vec3(0, ((opts.view === "TopRight" ? -1 : 1) * 30 * Math.PI) / 180, 0))
101
+ : vec3Zero;
102
+ const cameraRot = vec3RotCombine(angledRot, rotationForCameraPos(view));
103
+ const viewRot = opts.rotation ? vec3RotCombine(vec3(0, 0, (opts.rotation * Math.PI) / 180), cameraRot) : cameraRot;
104
+ const unitRot = vec3RotCombine(viewRot, scene.rotation_deprecated ?? vec3Zero);
105
+
106
+ const unitCenter = vec3Rot(scene.center_deprecated ?? vec3Zero, vec3Zero, cameraRot);
107
+ const [unitSize] = sizeBoundsForCameraPos(scene.size_deprecated, unitCenter, unitRot);
108
+ const svgSize = vec2(unitSize.x + 1.5 * opts.stroke_thickness, unitSize.y + 1.5 * opts.stroke_thickness);
109
+ const svgCenter = vec2(offset.x + opts.stroke_thickness * 0.75, offset.y + opts.stroke_thickness * 0.75);
110
+ const point = (x: number, y: number): Vec2 => vec2(svgCenter.x + x, svgCenter.y - y);
111
+ const unitCenterFlipped = vec3Flip(unitCenter);
112
+
113
+ const elements = [
114
+ ...orderElements(
115
+ scene.groups.flatMap((g) => svgGroup(g, unitCenterFlipped, unitRot, point, opts)),
116
+ point
117
+ ),
118
+ ];
119
+ const dimOpts: SvgOptions = { ...opts, only_stroke: false, gray_scale: false };
120
+ const visibleViews = calculateVisibleViews(view, scene.rotation_deprecated);
121
+
122
+ // Dimensions are drawn for the flat views
123
+ for (const dim of angled ? [] : (scene.dimensions_deprecated?.dimensions ?? [])) {
124
+ const d = dimensionConvertToTypeMesh(dim, scene.rotation_deprecated ?? vec3Zero, scene.dimensions_deprecated?.material);
125
+ if (isViewVisible(d.views[0], visibleViews)) {
126
+ const pos = vec3TransRot(d.pos, unitCenterFlipped, unitRot);
127
+ const rot = vec3RotCombine(unitRot, d.rot);
128
+ for (const m of d.meshes) {
129
+ elements.push(...svgMesh(m, pos, rot, point, scene.dimensions_deprecated?.material ?? { normal: "" }, dimOpts));
130
+ }
131
+ }
132
+ }
133
+ return { elements, size: svgSize, center: svgCenter };
134
+ }
135
+
136
+ function svgGroup(g: Group, parentPos: Vec3, parentRot: Vec3, point: (x: number, y: number) => Vec2, opts: SvgOptions): ReadonlyArray<zOrderElement> {
137
+ const pos = vec3TransRot(g.pos, parentPos, parentRot);
138
+ const rot = vec3RotCombine(parentRot, g.rot ?? vec3Zero);
139
+ const elements = Array<zOrderElement>();
140
+ for (const m of g.meshes ?? []) {
141
+ elements.push(...svgMesh(m, pos, rot, point, m.material, opts));
142
+ }
143
+ for (const sg of g.groups ?? []) {
144
+ elements.push(...svgGroup(sg, pos, rot, point, opts));
145
+ }
146
+ return elements;
147
+ }
148
+
149
+ function svgMesh(
150
+ mesh: Mesh,
151
+ parentPos: Vec3,
152
+ parentRot: Vec3,
153
+ point: (x: number, y: number) => Vec2,
154
+ material: Material,
155
+ opts: SvgOptions
156
+ ): ReadonlyArray<zOrderElement> {
157
+ switch (mesh.geometry.type) {
158
+ case "Box":
159
+ return box(mesh.geometry, point, material, opts, parentPos, parentRot);
160
+ case "Plane":
161
+ return plane(mesh.geometry, point, material, opts, parentPos, parentRot);
162
+ case "Cylinder":
163
+ return cylinder(mesh.geometry, point, material, opts, parentPos, parentRot);
164
+ case "Cone":
165
+ return cone(mesh.geometry, point, material, opts, parentPos, parentRot);
166
+ case "CulledLine":
167
+ case "Line":
168
+ return line(mesh.geometry, point, material.normal, opts, parentPos, parentRot);
169
+ case "Polygon":
170
+ return polygon(mesh.geometry, point, material, opts, parentPos, parentRot);
171
+ case "Shape":
172
+ return shape(mesh.geometry, point, material, opts, parentPos, parentRot);
173
+ case "Text":
174
+ return text(mesh.geometry, point, material.normal, opts, parentPos, parentRot);
175
+ case "Image":
176
+ return image(mesh.geometry, point, opts, parentPos, parentRot);
177
+ case "Tube":
178
+ case "Sphere":
179
+ return [];
180
+ default:
181
+ return exhaustiveCheck(mesh.geometry);
182
+ }
183
+ }
File without changes