abstract-3d 0.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/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +7 -0
- package/lib/abstract-3d.d.ts +317 -0
- package/lib/abstract-3d.d.ts.map +1 -0
- package/lib/abstract-3d.js +333 -0
- package/lib/abstract-3d.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +19 -0
- package/lib/index.js.map +1 -0
- package/lib/renderers/dxf/dxf-encoding.d.ts +7 -0
- package/lib/renderers/dxf/dxf-encoding.d.ts.map +1 -0
- package/lib/renderers/dxf/dxf-encoding.js +343 -0
- package/lib/renderers/dxf/dxf-encoding.js.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-box.d.ts +3 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-box.d.ts.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-box.js +52 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-box.js.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-cone.d.ts +3 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-cone.d.ts.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-cone.js +54 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-cone.js.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.d.ts +3 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.d.ts.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js +62 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-plane.d.ts +3 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-plane.d.ts.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-plane.js +38 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-plane.js.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-polygon.d.ts +3 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-polygon.d.ts.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js +61 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-shape.d.ts +3 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-shape.d.ts.map +1 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-shape.js +61 -0
- package/lib/renderers/dxf/dxf-geometries/dxf-shape.js.map +1 -0
- package/lib/renderers/dxf/dxf.d.ts +3 -0
- package/lib/renderers/dxf/dxf.d.ts.map +1 -0
- package/lib/renderers/dxf/dxf.js +64 -0
- package/lib/renderers/dxf/dxf.js.map +1 -0
- package/lib/renderers/dxf/index.d.ts +2 -0
- package/lib/renderers/dxf/index.d.ts.map +1 -0
- package/lib/renderers/dxf/index.js +18 -0
- package/lib/renderers/dxf/index.js.map +1 -0
- package/lib/renderers/index.d.ts +5 -0
- package/lib/renderers/index.d.ts.map +1 -0
- package/lib/renderers/index.js +21 -0
- package/lib/renderers/index.js.map +1 -0
- package/lib/renderers/react/index.d.ts +6 -0
- package/lib/renderers/react/index.d.ts.map +1 -0
- package/lib/renderers/react/index.js +21 -0
- package/lib/renderers/react/index.js.map +1 -0
- package/lib/renderers/react/react-camera.d.ts +60 -0
- package/lib/renderers/react/react-camera.d.ts.map +1 -0
- package/lib/renderers/react/react-camera.js +132 -0
- package/lib/renderers/react/react-camera.js.map +1 -0
- package/lib/renderers/react/react-dimension.d.ts +12 -0
- package/lib/renderers/react/react-dimension.d.ts.map +1 -0
- package/lib/renderers/react/react-dimension.js +39 -0
- package/lib/renderers/react/react-dimension.js.map +1 -0
- package/lib/renderers/react/react-group.d.ts +18 -0
- package/lib/renderers/react/react-group.d.ts.map +1 -0
- package/lib/renderers/react/react-group.js +62 -0
- package/lib/renderers/react/react-group.js.map +1 -0
- package/lib/renderers/react/react-hotspot.d.ts +30 -0
- package/lib/renderers/react/react-hotspot.d.ts.map +1 -0
- package/lib/renderers/react/react-hotspot.js +71 -0
- package/lib/renderers/react/react-hotspot.js.map +1 -0
- package/lib/renderers/react/react-material.d.ts +13 -0
- package/lib/renderers/react/react-material.d.ts.map +1 -0
- package/lib/renderers/react/react-material.js +85 -0
- package/lib/renderers/react/react-material.js.map +1 -0
- package/lib/renderers/react/react-mesh.d.ts +10 -0
- package/lib/renderers/react/react-mesh.d.ts.map +1 -0
- package/lib/renderers/react/react-mesh.js +238 -0
- package/lib/renderers/react/react-mesh.js.map +1 -0
- package/lib/renderers/react/react-scene.d.ts +20 -0
- package/lib/renderers/react/react-scene.d.ts.map +1 -0
- package/lib/renderers/react/react-scene.js +44 -0
- package/lib/renderers/react/react-scene.js.map +1 -0
- package/lib/renderers/react/react.d.ts +30 -0
- package/lib/renderers/react/react.d.ts.map +1 -0
- package/lib/renderers/react/react.js +48 -0
- package/lib/renderers/react/react.js.map +1 -0
- package/lib/renderers/shared.d.ts +6 -0
- package/lib/renderers/shared.d.ts.map +1 -0
- package/lib/renderers/shared.js +93 -0
- package/lib/renderers/shared.js.map +1 -0
- package/lib/renderers/stl/index.d.ts +2 -0
- package/lib/renderers/stl/index.d.ts.map +1 -0
- package/lib/renderers/stl/index.js +18 -0
- package/lib/renderers/stl/index.js.map +1 -0
- package/lib/renderers/stl/stl-encoding.d.ts +4 -0
- package/lib/renderers/stl/stl-encoding.d.ts.map +1 -0
- package/lib/renderers/stl/stl-encoding.js +26 -0
- package/lib/renderers/stl/stl-encoding.js.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-box.d.ts +3 -0
- package/lib/renderers/stl/stl-geometries/stl-box.d.ts.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-box.js +57 -0
- package/lib/renderers/stl/stl-geometries/stl-box.js.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-cone.d.ts +3 -0
- package/lib/renderers/stl/stl-geometries/stl-cone.d.ts.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-cone.js +54 -0
- package/lib/renderers/stl/stl-geometries/stl-cone.js.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-cylinder.d.ts +3 -0
- package/lib/renderers/stl/stl-geometries/stl-cylinder.d.ts.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-cylinder.js +62 -0
- package/lib/renderers/stl/stl-geometries/stl-cylinder.js.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-plane.d.ts +3 -0
- package/lib/renderers/stl/stl-geometries/stl-plane.d.ts.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-plane.js +44 -0
- package/lib/renderers/stl/stl-geometries/stl-plane.js.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-polygon.d.ts +3 -0
- package/lib/renderers/stl/stl-geometries/stl-polygon.d.ts.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-polygon.js +59 -0
- package/lib/renderers/stl/stl-geometries/stl-polygon.js.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-shape.d.ts +3 -0
- package/lib/renderers/stl/stl-geometries/stl-shape.d.ts.map +1 -0
- package/lib/renderers/stl/stl-geometries/stl-shape.js +59 -0
- package/lib/renderers/stl/stl-geometries/stl-shape.js.map +1 -0
- package/lib/renderers/stl/stl.d.ts +3 -0
- package/lib/renderers/stl/stl.d.ts.map +1 -0
- package/lib/renderers/stl/stl.js +57 -0
- package/lib/renderers/stl/stl.js.map +1 -0
- package/lib/renderers/svg/index.d.ts +3 -0
- package/lib/renderers/svg/index.d.ts.map +1 -0
- package/lib/renderers/svg/index.js +18 -0
- package/lib/renderers/svg/index.js.map +1 -0
- package/lib/renderers/svg/svg-encoding.d.ts +14 -0
- package/lib/renderers/svg/svg-encoding.d.ts.map +1 -0
- package/lib/renderers/svg/svg-encoding.js +27 -0
- package/lib/renderers/svg/svg-encoding.js.map +1 -0
- package/lib/renderers/svg/svg-geometries/shared.d.ts +12 -0
- package/lib/renderers/svg/svg-geometries/shared.d.ts.map +1 -0
- package/lib/renderers/svg/svg-geometries/shared.js +12 -0
- package/lib/renderers/svg/svg-geometries/shared.js.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-box.d.ts +4 -0
- package/lib/renderers/svg/svg-geometries/svg-box.d.ts.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-box.js +70 -0
- package/lib/renderers/svg/svg-geometries/svg-box.js.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-cone.d.ts +4 -0
- package/lib/renderers/svg/svg-geometries/svg-cone.d.ts.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-cone.js +64 -0
- package/lib/renderers/svg/svg-geometries/svg-cone.js.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-cylinder.d.ts +4 -0
- package/lib/renderers/svg/svg-geometries/svg-cylinder.d.ts.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-cylinder.js +69 -0
- package/lib/renderers/svg/svg-geometries/svg-cylinder.js.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-line.d.ts +4 -0
- package/lib/renderers/svg/svg-geometries/svg-line.d.ts.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-line.js +39 -0
- package/lib/renderers/svg/svg-geometries/svg-line.js.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-plane.d.ts +5 -0
- package/lib/renderers/svg/svg-geometries/svg-plane.d.ts.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-plane.js +57 -0
- package/lib/renderers/svg/svg-geometries/svg-plane.js.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-polygon.d.ts +4 -0
- package/lib/renderers/svg/svg-geometries/svg-polygon.d.ts.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-polygon.js +20 -0
- package/lib/renderers/svg/svg-geometries/svg-polygon.js.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-shape.d.ts +4 -0
- package/lib/renderers/svg/svg-geometries/svg-shape.d.ts.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-shape.js +20 -0
- package/lib/renderers/svg/svg-geometries/svg-shape.js.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-text.d.ts +4 -0
- package/lib/renderers/svg/svg-geometries/svg-text.d.ts.map +1 -0
- package/lib/renderers/svg/svg-geometries/svg-text.js +46 -0
- package/lib/renderers/svg/svg-geometries/svg-text.js.map +1 -0
- package/lib/renderers/svg/svg.d.ts +10 -0
- package/lib/renderers/svg/svg.d.ts.map +1 -0
- package/lib/renderers/svg/svg.js +98 -0
- package/lib/renderers/svg/svg.js.map +1 -0
- package/package.json +31 -0
- package/src/abstract-3d.ts +578 -0
- package/src/index.ts +2 -0
- package/src/renderers/dxf/dxf-encoding.ts +348 -0
- package/src/renderers/dxf/dxf-geometries/dxf-box.ts +27 -0
- package/src/renderers/dxf/dxf-geometries/dxf-cone.ts +31 -0
- package/src/renderers/dxf/dxf-geometries/dxf-cylinder.ts +45 -0
- package/src/renderers/dxf/dxf-geometries/dxf-plane.ts +16 -0
- package/src/renderers/dxf/dxf-geometries/dxf-polygon.ts +36 -0
- package/src/renderers/dxf/dxf-geometries/dxf-shape.ts +36 -0
- package/src/renderers/dxf/dxf.ts +38 -0
- package/src/renderers/dxf/index.ts +1 -0
- package/src/renderers/index.ts +4 -0
- package/src/renderers/react/index.ts +5 -0
- package/src/renderers/react/react-camera.tsx +208 -0
- package/src/renderers/react/react-dimension.tsx +76 -0
- package/src/renderers/react/react-group.tsx +133 -0
- package/src/renderers/react/react-hotspot.tsx +116 -0
- package/src/renderers/react/react-material.tsx +159 -0
- package/src/renderers/react/react-mesh.tsx +380 -0
- package/src/renderers/react/react-scene.tsx +137 -0
- package/src/renderers/react/react.tsx +118 -0
- package/src/renderers/shared.ts +111 -0
- package/src/renderers/stl/index.ts +1 -0
- package/src/renderers/stl/stl-encoding.ts +22 -0
- package/src/renderers/stl/stl-geometries/stl-box.ts +33 -0
- package/src/renderers/stl/stl-geometries/stl-cone.ts +37 -0
- package/src/renderers/stl/stl-geometries/stl-cylinder.ts +45 -0
- package/src/renderers/stl/stl-geometries/stl-plane.ts +16 -0
- package/src/renderers/stl/stl-geometries/stl-polygon.ts +35 -0
- package/src/renderers/stl/stl-geometries/stl-shape.ts +35 -0
- package/src/renderers/stl/stl.ts +33 -0
- package/src/renderers/svg/index.ts +2 -0
- package/src/renderers/svg/svg-encoding.ts +46 -0
- package/src/renderers/svg/svg-geometries/shared.ts +10 -0
- package/src/renderers/svg/svg-geometries/svg-box.ts +61 -0
- package/src/renderers/svg/svg-geometries/svg-cone.ts +52 -0
- package/src/renderers/svg/svg-geometries/svg-cylinder.ts +58 -0
- package/src/renderers/svg/svg-geometries/svg-line.ts +20 -0
- package/src/renderers/svg/svg-geometries/svg-plane.ts +44 -0
- package/src/renderers/svg/svg-geometries/svg-polygon.ts +25 -0
- package/src/renderers/svg/svg-geometries/svg-shape.ts +25 -0
- package/src/renderers/svg/svg-geometries/svg-text.ts +28 -0
- package/src/renderers/svg/svg.ts +201 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { gray, black, zElem, zOrderElement } from "./shared";
|
|
3
|
+
import { EmbededImage, svgImage, svgPolygon } from "../svg-encoding";
|
|
4
|
+
import { rgbGray } from "../../shared";
|
|
5
|
+
|
|
6
|
+
export function plane(
|
|
7
|
+
p: A3D.Plane,
|
|
8
|
+
point: (x: number, y: number) => A3D.Vec2,
|
|
9
|
+
color: string,
|
|
10
|
+
onlyStroke: boolean | undefined,
|
|
11
|
+
grayScale: boolean | undefined,
|
|
12
|
+
_stroke: number,
|
|
13
|
+
onlyStrokeFill: string,
|
|
14
|
+
parentPos: A3D.Vec3,
|
|
15
|
+
parentRot: A3D.Vec3,
|
|
16
|
+
view: A3D.View,
|
|
17
|
+
image?: EmbededImage | undefined
|
|
18
|
+
): ReadonlyArray<zOrderElement> {
|
|
19
|
+
const half = A3D.vec2Scale(p.size, 0.5);
|
|
20
|
+
const pos = A3D.vec3TransRot(p.pos, parentPos, parentRot);
|
|
21
|
+
const rot = A3D.vec3RotCombine(parentRot, p.rot ?? A3D.vec3Zero);
|
|
22
|
+
const vec3tr = (point: A3D.Vec3): A3D.Vec3 => A3D.vec3TransRot(point, pos, rot);
|
|
23
|
+
|
|
24
|
+
const v2 = vec3tr(A3D.vec3(half.x, -half.y, 0));
|
|
25
|
+
const v4 = vec3tr(A3D.vec3(-half.x, half.y, 0));
|
|
26
|
+
|
|
27
|
+
if (view === "front" && image) {
|
|
28
|
+
const [leftX, rightX] = v4.x > v2.x ? [v2.x, v4.x] : [v4.x, v2.x];
|
|
29
|
+
const [bottomY, topY] = v4.y > v2.y ? [v4.y, v2.y] : [v2.y, v4.y];
|
|
30
|
+
const bottomLeft = point(leftX, bottomY);
|
|
31
|
+
const topRight = point(rightX, topY);
|
|
32
|
+
const degrees = A3D.isZero(rot.z, 0.1) ? 0 : rot.z * (-180 / Math.PI);
|
|
33
|
+
const img = svgImage(bottomLeft, A3D.vec2(topRight.x - bottomLeft.x, topRight.y - bottomLeft.y), degrees, image);
|
|
34
|
+
return [zElem(img, (v2.z + v4.z) / 2)];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const v1 = vec3tr(A3D.vec3(-half.x, -half.y, 0));
|
|
38
|
+
const v3 = vec3tr(A3D.vec3(half.x, half.y, 0));
|
|
39
|
+
const points = [point(v1.x, v1.y), point(v2.x, v2.y), point(v3.x, v3.y), point(v4.x, v4.y)];
|
|
40
|
+
const [stroke, fill, strokeThickness] = onlyStroke
|
|
41
|
+
? [grayScale ? gray : color, onlyStrokeFill, _stroke]
|
|
42
|
+
: [black, grayScale ? rgbGray(color) : color, 0];
|
|
43
|
+
return [zElem(svgPolygon(points, fill, stroke, strokeThickness), A3D.vec3ZMean(v1, v2, v3, v4))];
|
|
44
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Polygon, vec3ZMean, Vec3, Vec2, vec3TransRot, vec3RotCombine, vec3Zero } from "../../../abstract-3d";
|
|
2
|
+
import { gray, zElem, zOrderElement, transparent } from "./shared";
|
|
3
|
+
import { svgPolygon } from "../svg-encoding";
|
|
4
|
+
import { rgbGray } from "../../shared";
|
|
5
|
+
|
|
6
|
+
export function polygon(
|
|
7
|
+
p: Polygon,
|
|
8
|
+
point: (x: number, y: number) => Vec2,
|
|
9
|
+
color: string,
|
|
10
|
+
onlyStroke: boolean | undefined,
|
|
11
|
+
grayScale: boolean | undefined,
|
|
12
|
+
onlyStrokeFill: string,
|
|
13
|
+
_stroke: number,
|
|
14
|
+
parentPos: Vec3,
|
|
15
|
+
parentRot: Vec3
|
|
16
|
+
): ReadonlyArray<zOrderElement> {
|
|
17
|
+
const pos = vec3TransRot(p.pos, parentPos, parentRot);
|
|
18
|
+
const rot = vec3RotCombine(parentRot, p.rot ?? vec3Zero);
|
|
19
|
+
const rotatedPoints = p.points.map((p) => vec3TransRot(p, pos, rot));
|
|
20
|
+
const points = rotatedPoints.map(({ x, y }) => point(x, y));
|
|
21
|
+
const [strokeColor, fill] = onlyStroke
|
|
22
|
+
? [grayScale ? gray : color, onlyStrokeFill]
|
|
23
|
+
: [transparent, grayScale ? rgbGray(color) : color];
|
|
24
|
+
return [zElem(svgPolygon(points, fill, strokeColor, 0), vec3ZMean(...rotatedPoints))];
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { vec3ZMean, Vec3, Vec2, vec3TransRot, vec3RotCombine, Shape, vec3, vec3Zero } from "../../../abstract-3d";
|
|
2
|
+
import { gray, zElem, zOrderElement, transparent } from "./shared";
|
|
3
|
+
import { svgPolygon } from "../svg-encoding";
|
|
4
|
+
import { rgbGray } from "../../shared";
|
|
5
|
+
|
|
6
|
+
export function shape(
|
|
7
|
+
s: Shape,
|
|
8
|
+
point: (x: number, y: number) => Vec2,
|
|
9
|
+
color: string,
|
|
10
|
+
onlyStroke: boolean | undefined,
|
|
11
|
+
grayScale: boolean | undefined,
|
|
12
|
+
onlyStrokeFill: string,
|
|
13
|
+
_stroke: number,
|
|
14
|
+
parentPos: Vec3,
|
|
15
|
+
parentRot: Vec3
|
|
16
|
+
): ReadonlyArray<zOrderElement> {
|
|
17
|
+
const pos = vec3TransRot(s.pos, parentPos, parentRot);
|
|
18
|
+
const rot = vec3RotCombine(parentRot, s.rot ?? vec3Zero);
|
|
19
|
+
const rotatedPoints = s.points.map((p) => vec3TransRot(vec3(p.x, p.y, 0), pos, rot));
|
|
20
|
+
const points = rotatedPoints.map(({ x, y }) => point(x, y));
|
|
21
|
+
const [strokeColor, fill] = onlyStroke
|
|
22
|
+
? [grayScale ? gray : color, onlyStrokeFill]
|
|
23
|
+
: [transparent, grayScale ? rgbGray(color) : color];
|
|
24
|
+
return [zElem(svgPolygon(points, fill, strokeColor, 0), vec3ZMean(...rotatedPoints))];
|
|
25
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { zElem, zOrderElement } from "./shared";
|
|
3
|
+
import { svgText } from "../svg-encoding";
|
|
4
|
+
|
|
5
|
+
export function text(
|
|
6
|
+
t: A3D.Text,
|
|
7
|
+
point: (x: number, y: number) => A3D.Vec2,
|
|
8
|
+
fill: string,
|
|
9
|
+
parentPos: A3D.Vec3,
|
|
10
|
+
parentRot: A3D.Vec3,
|
|
11
|
+
factor: number,
|
|
12
|
+
font: string
|
|
13
|
+
): ReadonlyArray<zOrderElement> {
|
|
14
|
+
const pos = A3D.vec3TransRot(t.pos, parentPos, parentRot);
|
|
15
|
+
const rot = A3D.vec3RotCombine(parentRot, t.rot ?? A3D.vec3Zero);
|
|
16
|
+
const texts = Array<zOrderElement>();
|
|
17
|
+
const degrees = A3D.isZero(rot.z, 0.1) ? 0 : rot.z * (-180 / Math.PI);
|
|
18
|
+
|
|
19
|
+
const fontSize = t.fontSize * factor;
|
|
20
|
+
const strings = t.text.split("\n");
|
|
21
|
+
let posY = strings.length === 1 ? 0 : (fontSize * strings.length - fontSize) / 2;
|
|
22
|
+
for (const s of strings) {
|
|
23
|
+
texts.push(zElem(svgText(point(pos.x, pos.y + posY), s, degrees, fill, font, fontSize), pos.z));
|
|
24
|
+
posY -= fontSize * 1.2;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return texts;
|
|
28
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { exhaustiveCheck } from "ts-exhaustive-check";
|
|
2
|
+
import {
|
|
3
|
+
vec2,
|
|
4
|
+
vec3Scale,
|
|
5
|
+
Scene,
|
|
6
|
+
View,
|
|
7
|
+
Vec3,
|
|
8
|
+
Mesh,
|
|
9
|
+
vec3Rot,
|
|
10
|
+
vec3Zero,
|
|
11
|
+
vec3RotCombine,
|
|
12
|
+
vec3,
|
|
13
|
+
Vec2,
|
|
14
|
+
Group,
|
|
15
|
+
vec3TransRot,
|
|
16
|
+
} from "../../abstract-3d";
|
|
17
|
+
import { zOrderElement } from "./svg-geometries/shared";
|
|
18
|
+
import { box } from "./svg-geometries/svg-box";
|
|
19
|
+
import { cylinder } from "./svg-geometries/svg-cylinder";
|
|
20
|
+
import { line } from "./svg-geometries/svg-line";
|
|
21
|
+
import { plane } from "./svg-geometries/svg-plane";
|
|
22
|
+
import { shape } from "./svg-geometries/svg-shape";
|
|
23
|
+
import { polygon } from "./svg-geometries/svg-polygon";
|
|
24
|
+
import { text } from "./svg-geometries/svg-text";
|
|
25
|
+
import { cone } from "./svg-geometries/svg-cone";
|
|
26
|
+
import { rotationForCameraPos, sizeCenterForCameraPos } from "../shared";
|
|
27
|
+
import { EmbededImage, svg } from "./svg-encoding";
|
|
28
|
+
|
|
29
|
+
export function toSvg(
|
|
30
|
+
scene: Scene,
|
|
31
|
+
view: View,
|
|
32
|
+
stroke: number,
|
|
33
|
+
scale?: { readonly size: number; readonly scaleByWidth: boolean },
|
|
34
|
+
onlyStroke?: boolean,
|
|
35
|
+
grayScale?: boolean,
|
|
36
|
+
onlyStrokeFill: string = "rgba(255,255,255,0)",
|
|
37
|
+
font: string = "",
|
|
38
|
+
buffers?: Record<string, string>
|
|
39
|
+
): { readonly image: string; readonly width: number; readonly height: number } {
|
|
40
|
+
const factor = scale
|
|
41
|
+
? scale.size /
|
|
42
|
+
(scale.scaleByWidth
|
|
43
|
+
? view === "right" || view === "left"
|
|
44
|
+
? scene.size.z
|
|
45
|
+
: scene.size.x
|
|
46
|
+
: view === "top" || view === "bottom"
|
|
47
|
+
? scene.size.z
|
|
48
|
+
: scene.size.y)
|
|
49
|
+
: 1;
|
|
50
|
+
const unitRot = vec3RotCombine(rotationForCameraPos(view), scene.rotation ?? vec3Zero);
|
|
51
|
+
const unitPos = vec3Rot(scene.center, vec3Zero, scene.rotation ?? vec3Zero);
|
|
52
|
+
const [size, center] = sizeCenterForCameraPos(scene.size, unitPos, scene.dimensions?.bounds, unitRot, view, factor);
|
|
53
|
+
const unitHalfSize = vec3Scale(size, 0.5);
|
|
54
|
+
const centerAdj = vec3(center.x - stroke * 0.75, center.y + stroke * 0.75, center.z);
|
|
55
|
+
const width = size.x + 1.5 * stroke;
|
|
56
|
+
const height = size.y + 1.5 * stroke;
|
|
57
|
+
const elements = Array<zOrderElement>();
|
|
58
|
+
const point = (x: number, y: number): Vec2 =>
|
|
59
|
+
vec2(-centerAdj.x + unitHalfSize.x + x * factor, centerAdj.y + unitHalfSize.y - y * factor);
|
|
60
|
+
for (const g of scene.groups) {
|
|
61
|
+
const pos = vec3Rot(g.pos, unitPos, unitRot);
|
|
62
|
+
const rot = vec3RotCombine(unitRot, g.rot ?? vec3Zero);
|
|
63
|
+
elements.push(
|
|
64
|
+
...svgGroup(g, pos, rot, point, view, factor, onlyStroke, grayScale, onlyStrokeFill, font, stroke, buffers)
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
elements.sort((a, b) => a.zOrder - b.zOrder);
|
|
68
|
+
|
|
69
|
+
for (const d of scene.dimensions?.dimensions ?? []) {
|
|
70
|
+
if (d.views[0] === view) {
|
|
71
|
+
const pos = vec3Rot(d.pos, unitPos, unitRot);
|
|
72
|
+
const rot = vec3RotCombine(unitRot, d.rot);
|
|
73
|
+
for (const m of d.meshes) {
|
|
74
|
+
elements.push(
|
|
75
|
+
...svgMesh(
|
|
76
|
+
m,
|
|
77
|
+
pos,
|
|
78
|
+
rot,
|
|
79
|
+
point,
|
|
80
|
+
view,
|
|
81
|
+
factor,
|
|
82
|
+
scene.dimensions?.material.normal ?? "",
|
|
83
|
+
false,
|
|
84
|
+
false,
|
|
85
|
+
onlyStrokeFill,
|
|
86
|
+
font,
|
|
87
|
+
stroke
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const image = svg(
|
|
95
|
+
width,
|
|
96
|
+
height,
|
|
97
|
+
elements.reduce((a, { element }) => `${a} ${element}`, "")
|
|
98
|
+
);
|
|
99
|
+
return { image, width, height };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function svgGroup(
|
|
103
|
+
g: Group,
|
|
104
|
+
pos: Vec3,
|
|
105
|
+
rot: Vec3,
|
|
106
|
+
point: (x: number, y: number) => Vec2,
|
|
107
|
+
view: View,
|
|
108
|
+
factor: number,
|
|
109
|
+
onlyStroke: boolean | undefined,
|
|
110
|
+
grayScale: boolean | undefined,
|
|
111
|
+
onlyStrokeFill: string,
|
|
112
|
+
font: string,
|
|
113
|
+
stroke: number,
|
|
114
|
+
buffers?: Record<string, string>
|
|
115
|
+
): ReadonlyArray<zOrderElement> {
|
|
116
|
+
const elements = Array<zOrderElement>();
|
|
117
|
+
|
|
118
|
+
for (const m of g.meshes ?? []) {
|
|
119
|
+
elements.push(
|
|
120
|
+
...svgMesh(
|
|
121
|
+
m,
|
|
122
|
+
pos,
|
|
123
|
+
rot,
|
|
124
|
+
point,
|
|
125
|
+
view,
|
|
126
|
+
factor,
|
|
127
|
+
m.material.normal,
|
|
128
|
+
onlyStroke,
|
|
129
|
+
grayScale,
|
|
130
|
+
onlyStrokeFill,
|
|
131
|
+
font,
|
|
132
|
+
stroke,
|
|
133
|
+
m.material.image?.type === "HashImage" && buffers?.[m.material.image.hash]
|
|
134
|
+
? { type: "svg", svg: buffers[m.material.image.hash]! }
|
|
135
|
+
: m.material.image?.type === "UrlImage"
|
|
136
|
+
? { type: "url", url: m.material.image.url }
|
|
137
|
+
: undefined
|
|
138
|
+
)
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
for (const sg of g.groups ?? []) {
|
|
142
|
+
const sPos = vec3TransRot(sg.pos, pos, rot);
|
|
143
|
+
const sRot = vec3RotCombine(rot, sg.rot ?? vec3Zero);
|
|
144
|
+
elements.push(
|
|
145
|
+
...svgGroup(sg, sPos, sRot, point, view, factor, onlyStroke, grayScale, onlyStrokeFill, font, stroke, buffers)
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
return elements;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function svgMesh(
|
|
152
|
+
mesh: Mesh,
|
|
153
|
+
parentPos: Vec3,
|
|
154
|
+
parentRot: Vec3,
|
|
155
|
+
point: (x: number, y: number) => Vec2,
|
|
156
|
+
view: View,
|
|
157
|
+
factor: number,
|
|
158
|
+
color: string,
|
|
159
|
+
onlyStroke: boolean | undefined,
|
|
160
|
+
grayScale: boolean | undefined,
|
|
161
|
+
background: string,
|
|
162
|
+
font: string,
|
|
163
|
+
stroke: number,
|
|
164
|
+
image?: EmbededImage | undefined
|
|
165
|
+
): ReadonlyArray<zOrderElement> {
|
|
166
|
+
switch (mesh.geometry.type) {
|
|
167
|
+
case "Box":
|
|
168
|
+
return box(mesh.geometry, point, color, onlyStroke, grayScale, stroke, background, parentPos, parentRot);
|
|
169
|
+
case "Plane":
|
|
170
|
+
return plane(
|
|
171
|
+
mesh.geometry,
|
|
172
|
+
point,
|
|
173
|
+
color,
|
|
174
|
+
onlyStroke,
|
|
175
|
+
grayScale,
|
|
176
|
+
stroke,
|
|
177
|
+
background,
|
|
178
|
+
parentPos,
|
|
179
|
+
parentRot,
|
|
180
|
+
view,
|
|
181
|
+
image
|
|
182
|
+
);
|
|
183
|
+
case "Cylinder":
|
|
184
|
+
return cylinder(mesh.geometry, point, color, onlyStroke, grayScale, stroke, background, parentPos, parentRot);
|
|
185
|
+
case "Cone":
|
|
186
|
+
return cone(mesh.geometry, point, color, onlyStroke, grayScale, stroke, background, parentPos, parentRot);
|
|
187
|
+
case "Line":
|
|
188
|
+
return line(mesh.geometry, point, color, grayScale, stroke, parentPos, parentRot);
|
|
189
|
+
case "Polygon":
|
|
190
|
+
return polygon(mesh.geometry, point, color, onlyStroke, grayScale, background, stroke, parentPos, parentRot);
|
|
191
|
+
case "Shape":
|
|
192
|
+
return shape(mesh.geometry, point, color, onlyStroke, grayScale, background, stroke, parentPos, parentRot);
|
|
193
|
+
case "Text":
|
|
194
|
+
return text(mesh.geometry, point, color, parentPos, parentRot, factor, font);
|
|
195
|
+
case "Tube":
|
|
196
|
+
case "Sphere":
|
|
197
|
+
return [];
|
|
198
|
+
default:
|
|
199
|
+
return exhaustiveCheck(mesh.geometry);
|
|
200
|
+
}
|
|
201
|
+
}
|