abstract-3d 4.1.1 → 4.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/renderers/svg/svg-encoding.d.ts +0 -2
- package/lib/renderers/svg/svg-encoding.d.ts.map +1 -1
- package/lib/renderers/svg/svg-encoding.js +0 -12
- package/lib/renderers/svg/svg-encoding.js.map +1 -1
- package/lib/renderers/svg/svg-geometries/shared.d.ts +2 -19
- package/lib/renderers/svg/svg-geometries/shared.d.ts.map +1 -1
- package/lib/renderers/svg/svg-geometries/shared.js +1 -16
- package/lib/renderers/svg/svg-geometries/shared.js.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-box.d.ts.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-box.js +30 -44
- package/lib/renderers/svg/svg-geometries/svg-box.js.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-cone.d.ts.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-cone.js +3 -3
- package/lib/renderers/svg/svg-geometries/svg-cone.js.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-cylinder.d.ts.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-cylinder.js +6 -19
- package/lib/renderers/svg/svg-geometries/svg-cylinder.js.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-image.d.ts.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-image.js +2 -3
- package/lib/renderers/svg/svg-geometries/svg-image.js.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-line.d.ts.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-line.js +1 -3
- package/lib/renderers/svg/svg-geometries/svg-line.js.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-plane.d.ts.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-plane.js +2 -6
- package/lib/renderers/svg/svg-geometries/svg-plane.js.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-polygon.d.ts.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-polygon.js +2 -10
- package/lib/renderers/svg/svg-geometries/svg-polygon.js.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-shape.d.ts.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-shape.js +2 -5
- package/lib/renderers/svg/svg-geometries/svg-shape.js.map +1 -1
- package/lib/renderers/svg/svg-geometries/svg-text.js +1 -1
- package/lib/renderers/svg/svg-geometries/svg-text.js.map +1 -1
- package/lib/renderers/svg/svg-order.d.ts +5 -6
- package/lib/renderers/svg/svg-order.d.ts.map +1 -1
- package/lib/renderers/svg/svg-order.js +124 -233
- package/lib/renderers/svg/svg-order.js.map +1 -1
- package/lib/renderers/svg/svg.d.ts.map +1 -1
- package/lib/renderers/svg/svg.js +12 -11
- package/lib/renderers/svg/svg.js.map +1 -1
- package/lib/renderers/svg-bsp/class-names.d.ts +11 -0
- package/lib/renderers/svg-bsp/class-names.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/class-names.js +11 -0
- package/lib/renderers/svg-bsp/class-names.js.map +1 -0
- package/lib/renderers/svg-bsp/index.d.ts +5 -0
- package/lib/renderers/svg-bsp/index.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/index.js +4 -0
- package/lib/renderers/svg-bsp/index.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-encoding.d.ts +19 -0
- package/lib/renderers/svg-bsp/svg-encoding.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-encoding.js +135 -0
- package/lib/renderers/svg-bsp/svg-encoding.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/shared.d.ts +47 -0
- package/lib/renderers/svg-bsp/svg-geometries/shared.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/shared.js +45 -0
- package/lib/renderers/svg-bsp/svg-geometries/shared.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-box.d.ts +4 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-box.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-box.js +58 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-box.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-cone.d.ts +4 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-cone.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-cone.js +39 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-cone.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-cylinder.d.ts +4 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-cylinder.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-cylinder.js +62 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-cylinder.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-image.d.ts +4 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-image.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-image.js +44 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-image.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-line.d.ts +4 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-line.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-line.js +12 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-line.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-plane.d.ts +4 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-plane.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-plane.js +24 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-plane.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-polygon.d.ts +4 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-polygon.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-polygon.js +24 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-polygon.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-shape.d.ts +4 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-shape.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-shape.js +19 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-shape.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-text.d.ts +4 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-text.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-text.js +26 -0
- package/lib/renderers/svg-bsp/svg-geometries/svg-text.js.map +1 -0
- package/lib/renderers/svg-bsp/svg-order.d.ts +10 -0
- package/lib/renderers/svg-bsp/svg-order.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg-order.js +257 -0
- package/lib/renderers/svg-bsp/svg-order.js.map +1 -0
- package/lib/renderers/svg-bsp/svg.d.ts +16 -0
- package/lib/renderers/svg-bsp/svg.d.ts.map +1 -0
- package/lib/renderers/svg-bsp/svg.js +120 -0
- package/lib/renderers/svg-bsp/svg.js.map +1 -0
- package/package.json +6 -1
- package/src/renderers/svg/svg-encoding.ts +0 -13
- package/src/renderers/svg/svg-geometries/shared.ts +3 -31
- package/src/renderers/svg/svg-geometries/svg-box.ts +36 -51
- package/src/renderers/svg/svg-geometries/svg-cone.ts +3 -18
- package/src/renderers/svg/svg-geometries/svg-cylinder.ts +6 -26
- package/src/renderers/svg/svg-geometries/svg-image.ts +2 -3
- package/src/renderers/svg/svg-geometries/svg-line.ts +1 -3
- package/src/renderers/svg/svg-geometries/svg-plane.ts +2 -12
- package/src/renderers/svg/svg-geometries/svg-polygon.ts +2 -10
- package/src/renderers/svg/svg-geometries/svg-shape.ts +2 -11
- package/src/renderers/svg/svg-geometries/svg-text.ts +1 -1
- package/src/renderers/svg/svg.ts +12 -14
- package/src/renderers/svg-bsp/class-names.ts +10 -0
- package/src/renderers/svg-bsp/index.ts +4 -0
- package/src/renderers/svg-bsp/svg-encoding.ts +190 -0
- package/src/renderers/svg-bsp/svg-geometries/shared.ts +88 -0
- package/src/renderers/svg-bsp/svg-geometries/svg-box.ts +76 -0
- package/src/renderers/svg-bsp/svg-geometries/svg-cone.ts +68 -0
- package/src/renderers/svg-bsp/svg-geometries/svg-cylinder.ts +82 -0
- package/src/renderers/svg-bsp/svg-geometries/svg-image.ts +56 -0
- package/src/renderers/svg-bsp/svg-geometries/svg-line.ts +21 -0
- package/src/renderers/svg-bsp/svg-geometries/svg-plane.ts +43 -0
- package/src/renderers/svg-bsp/svg-geometries/svg-polygon.ts +33 -0
- package/src/renderers/svg-bsp/svg-geometries/svg-shape.ts +34 -0
- package/src/renderers/svg-bsp/svg-geometries/svg-text.ts +40 -0
- package/src/renderers/svg-bsp/svg.ts +183 -0
- /package/src/renderers/{svg → svg-bsp}/svg-order.test.ts +0 -0
- /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
|
|
File without changes
|