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,111 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Vec3,
|
|
3
|
+
View,
|
|
4
|
+
DimensionBounds,
|
|
5
|
+
vec3Add,
|
|
6
|
+
vec3,
|
|
7
|
+
vec3Sub,
|
|
8
|
+
vec3Scale,
|
|
9
|
+
vec3Rot,
|
|
10
|
+
bounds3FromVec3Array,
|
|
11
|
+
bounds3ToSize,
|
|
12
|
+
vec3Zero,
|
|
13
|
+
bounds3Zero,
|
|
14
|
+
} from "../abstract-3d";
|
|
15
|
+
|
|
16
|
+
export function sizeCenterForCameraPos(
|
|
17
|
+
size: Vec3,
|
|
18
|
+
center: Vec3,
|
|
19
|
+
_dimBound: DimensionBounds | undefined,
|
|
20
|
+
rotation: Vec3,
|
|
21
|
+
_view: View,
|
|
22
|
+
factor: number
|
|
23
|
+
): readonly [Vec3, Vec3] {
|
|
24
|
+
// const [sizeAdj, centerAdj] = (() => {
|
|
25
|
+
// switch (view) {
|
|
26
|
+
// case "front":
|
|
27
|
+
// default:
|
|
28
|
+
// return [
|
|
29
|
+
// vec3Add(size, vec3(dimBound.front.min.x + dimBound.front.max.x, dimBound.front.min.y + dimBound.front.max.y, 0)),
|
|
30
|
+
// vec3Add(center, vec3((dimBound.front.max.x - dimBound.front.min.x) / 2, (dimBound.front.max.y - dimBound.front.min.y) / 2, 0)),
|
|
31
|
+
// ];
|
|
32
|
+
// case "back":
|
|
33
|
+
// return [
|
|
34
|
+
// vec3Add(size, vec3(dimBound.back.min.x + dimBound.back.max.x, dimBound.back.min.y + dimBound.back.max.y, 0)),
|
|
35
|
+
// vec3Add(center, vec3((dimBound.back.max.x - dimBound.back.min.x) / 2, (dimBound.back.max.y - dimBound.back.min.y) / 2, 0)),
|
|
36
|
+
// ];
|
|
37
|
+
// case "top":
|
|
38
|
+
// return [
|
|
39
|
+
// vec3Add(size, vec3(dimBound.top.min.x + dimBound.top.max.x, 0, dimBound.top.min.y + dimBound.top.max.y)),
|
|
40
|
+
// vec3Add(center, vec3((dimBound.top.max.x - dimBound.top.min.x) / 2, (dimBound.top.max.y - dimBound.top.min.y) / 2, 0)),
|
|
41
|
+
// ];
|
|
42
|
+
// case "bottom":
|
|
43
|
+
// return [
|
|
44
|
+
// vec3Add(size, vec3(dimBound.bottom.min.x + dimBound.bottom.max.x, 0, dimBound.bottom.min.y + dimBound.bottom.max.y)),
|
|
45
|
+
// vec3Add(center, vec3((dimBound.bottom.max.x - dimBound.bottom.min.x) / 2, (dimBound.bottom.max.y - dimBound.bottom.min.y) / 2, 0)),
|
|
46
|
+
// ];
|
|
47
|
+
// case "right":
|
|
48
|
+
// return [
|
|
49
|
+
// vec3Add(size, vec3(0, dimBound.right.min.y + dimBound.right.max.y, dimBound.right.min.x + dimBound.right.max.x)),
|
|
50
|
+
// vec3Add(center, vec3((dimBound.right.max.x - dimBound.right.min.x) / 2, (dimBound.right.max.y - dimBound.right.min.y) / 2, 0)),
|
|
51
|
+
// ];
|
|
52
|
+
// case "left":
|
|
53
|
+
// return [
|
|
54
|
+
// vec3Add(size, vec3(0, dimBound.left.min.y + dimBound.left.max.y, dimBound.left.min.x + dimBound.left.max.x)),
|
|
55
|
+
// vec3Add(center, vec3((dimBound.left.max.x - dimBound.left.min.x) / 2, (dimBound.left.max.y - dimBound.left.min.y) / 2, 0)),
|
|
56
|
+
// ];
|
|
57
|
+
// }
|
|
58
|
+
// })();
|
|
59
|
+
|
|
60
|
+
const [sizeAdj, centerAdj] = (() => {
|
|
61
|
+
return [size, center];
|
|
62
|
+
})();
|
|
63
|
+
|
|
64
|
+
const half = vec3Scale(sizeAdj, 0.5);
|
|
65
|
+
const min = vec3Sub(centerAdj, half);
|
|
66
|
+
const max = vec3Add(centerAdj, half);
|
|
67
|
+
const v1 = vec3Rot(vec3(min.x, min.y, max.z), centerAdj, rotation);
|
|
68
|
+
const v2 = vec3Rot(vec3(max.x, min.y, max.z), centerAdj, rotation);
|
|
69
|
+
const v3 = vec3Rot(vec3(max.x, max.y, max.z), centerAdj, rotation);
|
|
70
|
+
const v4 = vec3Rot(vec3(min.x, max.y, max.z), centerAdj, rotation);
|
|
71
|
+
const v5 = vec3Rot(vec3(min.x, min.y, min.z), centerAdj, rotation);
|
|
72
|
+
const v6 = vec3Rot(vec3(max.x, min.y, min.z), centerAdj, rotation);
|
|
73
|
+
const v7 = vec3Rot(vec3(max.x, max.y, min.z), centerAdj, rotation);
|
|
74
|
+
const v8 = vec3Rot(vec3(min.x, max.y, min.z), centerAdj, rotation);
|
|
75
|
+
const bounds = bounds3FromVec3Array([v1, v2, v3, v4, v5, v6, v7, v8]);
|
|
76
|
+
return [vec3Scale(bounds3ToSize(bounds), factor), vec3Scale(centerAdj, factor)];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function rotationForCameraPos(view: View): Vec3 {
|
|
80
|
+
switch (view) {
|
|
81
|
+
default:
|
|
82
|
+
case "front":
|
|
83
|
+
return vec3Zero;
|
|
84
|
+
case "back":
|
|
85
|
+
return vec3(-Math.PI, 0, -Math.PI);
|
|
86
|
+
case "top":
|
|
87
|
+
return vec3(Math.PI / 2, 0, 0);
|
|
88
|
+
case "bottom":
|
|
89
|
+
return vec3(-Math.PI / 2, 0, 0);
|
|
90
|
+
case "right":
|
|
91
|
+
return vec3(0, -Math.PI / 2, 0);
|
|
92
|
+
case "left":
|
|
93
|
+
return vec3(0, Math.PI / 2, 0);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export const dimBoundZero: DimensionBounds = {
|
|
98
|
+
front: bounds3Zero,
|
|
99
|
+
back: bounds3Zero,
|
|
100
|
+
top: bounds3Zero,
|
|
101
|
+
bottom: bounds3Zero,
|
|
102
|
+
right: bounds3Zero,
|
|
103
|
+
left: bounds3Zero,
|
|
104
|
+
threeD: bounds3Zero,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export function rgbGray(color: string): string {
|
|
108
|
+
const parts = color.split("(")[1]?.slice(0, -1).split(",");
|
|
109
|
+
const c = Number(parts?.[0] ?? 416) * 0.3 + Number(parts?.[1] ?? 212) * 0.587 + Number(parts?.[2] ?? 1100) * 0.114;
|
|
110
|
+
return `rgb(${c},${c},${c})`;
|
|
111
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./stl";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Vec3, vec3Sub } from "../../abstract-3d";
|
|
2
|
+
|
|
3
|
+
export const stlTriangle = (vec1: Vec3, vec2: Vec3, vec3: Vec3): string => {
|
|
4
|
+
const v = vec3Sub(vec2, vec1);
|
|
5
|
+
const w = vec3Sub(vec3, vec1);
|
|
6
|
+
const nx = v.y * w.z - v.z * w.y;
|
|
7
|
+
const ny = v.z * w.x - v.x * w.z;
|
|
8
|
+
const nz = v.x * w.y - v.y * w.x;
|
|
9
|
+
const sum = Math.sqrt(nx * nx + ny * ny + nz * nz);
|
|
10
|
+
return `facet normal ${nx / sum} ${ny / sum} ${nz / sum}
|
|
11
|
+
outer loop
|
|
12
|
+
vertex ${vec1.x} ${vec1.y} ${vec1.z}
|
|
13
|
+
vertex ${vec2.x} ${vec2.y} ${vec2.z}
|
|
14
|
+
vertex ${vec3.x} ${vec3.y} ${vec3.z}
|
|
15
|
+
endloop
|
|
16
|
+
endfacet
|
|
17
|
+
`;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export function stlPlaneOfVertices(v1: Vec3, v2: Vec3, v3: Vec3, v4: Vec3): string {
|
|
21
|
+
return stlTriangle(v1, v2, v3) + stlTriangle(v3, v4, v1);
|
|
22
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { stlTriangle } from "../stl-encoding";
|
|
3
|
+
|
|
4
|
+
export function stlBox(b: A3D.Box, _m: A3D.Material, parentPos: A3D.Vec3, parentRot: A3D.Vec3): string {
|
|
5
|
+
const half = A3D.vec3Scale(b.size, 0.5);
|
|
6
|
+
const pos = A3D.vec3TransRot(b.pos, parentPos, parentRot);
|
|
7
|
+
const rot = A3D.vec3RotCombine(parentRot, b.rot ?? A3D.vec3Zero);
|
|
8
|
+
const vec3tr = (x: number, y: number, z: number): A3D.Vec3 => A3D.vec3TransRot(A3D.vec3(x, y, z), pos, rot);
|
|
9
|
+
|
|
10
|
+
const v1 = vec3tr(-half.x, -half.y, half.z);
|
|
11
|
+
const v2 = vec3tr(half.x, -half.y, half.z);
|
|
12
|
+
const v3 = vec3tr(half.x, half.y, half.z);
|
|
13
|
+
const v4 = vec3tr(-half.x, half.y, half.z);
|
|
14
|
+
const v5 = vec3tr(-half.x, -half.y, -half.z);
|
|
15
|
+
const v6 = vec3tr(half.x, -half.y, -half.z);
|
|
16
|
+
const v7 = vec3tr(half.x, half.y, -half.z);
|
|
17
|
+
const v8 = vec3tr(-half.x, half.y, -half.z);
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
stlTriangle(v1, v2, v3) + // front
|
|
21
|
+
stlTriangle(v3, v4, v1) +
|
|
22
|
+
stlTriangle(v5, v6, v7) + // Back
|
|
23
|
+
stlTriangle(v7, v8, v5) +
|
|
24
|
+
stlTriangle(v5, v1, v4) + // Left
|
|
25
|
+
stlTriangle(v8, v4, v5) +
|
|
26
|
+
stlTriangle(v6, v2, v3) + // Right
|
|
27
|
+
stlTriangle(v3, v7, v6) +
|
|
28
|
+
stlTriangle(v8, v7, v3) + // Top
|
|
29
|
+
stlTriangle(v3, v4, v8) +
|
|
30
|
+
stlTriangle(v5, v6, v2) + // Bottom
|
|
31
|
+
stlTriangle(v2, v1, v5)
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { stlPlaneOfVertices } from "../stl-encoding";
|
|
3
|
+
|
|
4
|
+
export function stlCone(
|
|
5
|
+
c: A3D.Cone,
|
|
6
|
+
_m: A3D.Material,
|
|
7
|
+
sides: number,
|
|
8
|
+
parentPos: A3D.Vec3,
|
|
9
|
+
parentRot: A3D.Vec3
|
|
10
|
+
): string {
|
|
11
|
+
let dxfString = "";
|
|
12
|
+
const pos = A3D.vec3TransRot(c.pos, parentPos, parentRot);
|
|
13
|
+
const rot = A3D.vec3RotCombine(parentRot, c.rot ?? A3D.vec3Zero);
|
|
14
|
+
const vec3tr = (x: number, y: number, z: number): A3D.Vec3 => A3D.vec3TransRot(A3D.vec3(x, y, z), pos, rot);
|
|
15
|
+
|
|
16
|
+
const angleStep = (2 * Math.PI) / sides;
|
|
17
|
+
let currentAngle = 0;
|
|
18
|
+
|
|
19
|
+
const half = c.length / 2;
|
|
20
|
+
const botPos = vec3tr(0, -half, 0);
|
|
21
|
+
const topPos = vec3tr(0, half, 0);
|
|
22
|
+
|
|
23
|
+
const botVec3Array = Array<A3D.Vec3>();
|
|
24
|
+
for (let i = 0; i <= sides; i++) {
|
|
25
|
+
const currBot = vec3tr(Math.sin(currentAngle) * c.radius, -half, Math.cos(currentAngle) * c.radius);
|
|
26
|
+
botVec3Array.push(currBot);
|
|
27
|
+
|
|
28
|
+
if (i !== 0) {
|
|
29
|
+
const prevBot = botVec3Array[i - 1]!;
|
|
30
|
+
dxfString +=
|
|
31
|
+
stlPlaneOfVertices(botPos, prevBot, currBot, currBot) + stlPlaneOfVertices(currBot, prevBot, topPos, topPos);
|
|
32
|
+
}
|
|
33
|
+
currentAngle += angleStep;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return dxfString;
|
|
37
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { stlPlaneOfVertices } from "../stl-encoding";
|
|
3
|
+
|
|
4
|
+
export function stlCylinder(
|
|
5
|
+
c: A3D.Cylinder,
|
|
6
|
+
_m: A3D.Material,
|
|
7
|
+
sides: number,
|
|
8
|
+
parentPos: A3D.Vec3,
|
|
9
|
+
parentRot: A3D.Vec3
|
|
10
|
+
): string {
|
|
11
|
+
let dxfString = "";
|
|
12
|
+
const pos = A3D.vec3TransRot(c.pos, parentPos, parentRot);
|
|
13
|
+
const rot = A3D.vec3RotCombine(parentRot, c.rot ?? A3D.vec3Zero);
|
|
14
|
+
const vec3tr = (x: number, y: number, z: number): A3D.Vec3 => A3D.vec3TransRot(A3D.vec3(x, y, z), pos, rot);
|
|
15
|
+
|
|
16
|
+
const angleStep = (2 * Math.PI) / sides;
|
|
17
|
+
let currentAngle = 0;
|
|
18
|
+
|
|
19
|
+
const half = c.length / 2;
|
|
20
|
+
const topPos = vec3tr(0, half, 0);
|
|
21
|
+
const botPos = vec3tr(0, -half, 0);
|
|
22
|
+
|
|
23
|
+
const botVec3Array = Array<A3D.Vec3>();
|
|
24
|
+
const topVec3Array = Array<A3D.Vec3>();
|
|
25
|
+
|
|
26
|
+
for (let i = 0; i <= sides; i++) {
|
|
27
|
+
const x = Math.sin(currentAngle) * c.radius;
|
|
28
|
+
const z = Math.cos(currentAngle) * c.radius;
|
|
29
|
+
const currBot = vec3tr(x, -half, z);
|
|
30
|
+
const currTop = vec3tr(x, half, z);
|
|
31
|
+
botVec3Array.push(currBot);
|
|
32
|
+
topVec3Array.push(currTop);
|
|
33
|
+
if (i !== 0) {
|
|
34
|
+
const prevBot = botVec3Array[i - 1]!;
|
|
35
|
+
const prevTop = topVec3Array[i - 1]!;
|
|
36
|
+
dxfString +=
|
|
37
|
+
stlPlaneOfVertices(botPos, prevBot, currBot, currBot) +
|
|
38
|
+
stlPlaneOfVertices(topPos, prevTop, currTop, currTop) +
|
|
39
|
+
stlPlaneOfVertices(currBot, prevBot, prevTop, currTop);
|
|
40
|
+
}
|
|
41
|
+
currentAngle += angleStep;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return dxfString;
|
|
45
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { stlTriangle } from "../stl-encoding";
|
|
3
|
+
|
|
4
|
+
export function stlPlane(p: A3D.Plane, _m: A3D.Material, parentPos: A3D.Vec3, parentRot: A3D.Vec3): string {
|
|
5
|
+
const half = A3D.vec2Scale(p.size, 0.5);
|
|
6
|
+
const pos = A3D.vec3TransRot(p.pos, parentPos, parentRot);
|
|
7
|
+
const rot = A3D.vec3RotCombine(parentRot, p.rot ?? A3D.vec3Zero);
|
|
8
|
+
const vec3tr = (x: number, y: number): A3D.Vec3 => A3D.vec3TransRot(A3D.vec3(x, y, 0), pos, rot);
|
|
9
|
+
const [v1, v2, v3, v4] = [
|
|
10
|
+
vec3tr(-half.x, -half.y),
|
|
11
|
+
vec3tr(half.x, -half.y),
|
|
12
|
+
vec3tr(half.x, half.y),
|
|
13
|
+
vec3tr(-half.x, half.y),
|
|
14
|
+
];
|
|
15
|
+
return stlTriangle(v1, v2, v3) + stlTriangle(v3, v4, v1);
|
|
16
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { stlTriangle } from "../stl-encoding";
|
|
3
|
+
|
|
4
|
+
const chunkSize = 3;
|
|
5
|
+
|
|
6
|
+
export function stlPolygon(p: A3D.Polygon, _m: A3D.Material, parentPos: A3D.Vec3, parentRot: A3D.Vec3): string {
|
|
7
|
+
let polygonString = "";
|
|
8
|
+
const pos = A3D.vec3TransRot(p.pos, parentPos, parentRot);
|
|
9
|
+
const rot = A3D.vec3RotCombine(parentRot, p.rot ?? A3D.vec3Zero);
|
|
10
|
+
const points = p.points.map((p) => A3D.vec3TransRot(p, pos, rot));
|
|
11
|
+
let i = 0;
|
|
12
|
+
const nbrIterations = Math.floor(points.length / chunkSize);
|
|
13
|
+
for (i; i < nbrIterations; i++) {
|
|
14
|
+
const start = i * chunkSize;
|
|
15
|
+
polygonString += stlTriangle(points[start]!, points[start + 1]!, points[start + 2]!);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const usedPoints = i * chunkSize;
|
|
19
|
+
|
|
20
|
+
if (usedPoints <= points.length && chunkSize - 1 <= points.length) {
|
|
21
|
+
const lastArrayLength = points.length - usedPoints;
|
|
22
|
+
switch (lastArrayLength) {
|
|
23
|
+
case 1:
|
|
24
|
+
polygonString += stlTriangle(points[usedPoints - 1]!, points[usedPoints]!, points[0]!);
|
|
25
|
+
break;
|
|
26
|
+
case 2:
|
|
27
|
+
polygonString += stlTriangle(points[usedPoints]!, points[usedPoints + 1]!, points[0]!);
|
|
28
|
+
break;
|
|
29
|
+
default:
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return polygonString;
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { stlTriangle } from "../stl-encoding";
|
|
3
|
+
|
|
4
|
+
const chunkSize = 3;
|
|
5
|
+
|
|
6
|
+
export function stlShape(s: A3D.Shape, _m: A3D.Material, parentPos: A3D.Vec3, parentRot: A3D.Vec3): string {
|
|
7
|
+
let polygonString = "";
|
|
8
|
+
const pos = A3D.vec3TransRot(s.pos, parentPos, parentRot);
|
|
9
|
+
const rot = A3D.vec3RotCombine(parentRot, s.rot ?? A3D.vec3Zero);
|
|
10
|
+
const points = s.points.map((p) => A3D.vec3TransRot(A3D.vec3(p.x, p.y, 0), pos, rot));
|
|
11
|
+
let i = 0;
|
|
12
|
+
const nbrIterations = Math.floor(points.length / chunkSize);
|
|
13
|
+
for (i; i < nbrIterations; i++) {
|
|
14
|
+
const start = i * chunkSize;
|
|
15
|
+
polygonString += stlTriangle(points[start]!, points[start + 1]!, points[start + 2]!);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const usedPoints = i * chunkSize;
|
|
19
|
+
|
|
20
|
+
if (usedPoints <= points.length && chunkSize - 1 <= points.length) {
|
|
21
|
+
const lastArrayLength = points.length - usedPoints;
|
|
22
|
+
switch (lastArrayLength) {
|
|
23
|
+
case 1:
|
|
24
|
+
polygonString += stlTriangle(points[usedPoints - 1]!, points[usedPoints]!, points[0]!);
|
|
25
|
+
break;
|
|
26
|
+
case 2:
|
|
27
|
+
polygonString += stlTriangle(points[usedPoints]!, points[usedPoints + 1]!, points[0]!);
|
|
28
|
+
break;
|
|
29
|
+
default:
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return polygonString;
|
|
35
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as A3D from "../../abstract-3d";
|
|
2
|
+
import { stlPlane } from "./stl-geometries/stl-plane";
|
|
3
|
+
import { stlBox } from "./stl-geometries/stl-box";
|
|
4
|
+
import { stlCylinder } from "./stl-geometries/stl-cylinder";
|
|
5
|
+
import { stlCone } from "./stl-geometries/stl-cone";
|
|
6
|
+
import { stlPolygon } from "./stl-geometries/stl-polygon";
|
|
7
|
+
|
|
8
|
+
export const toStl = (scene: A3D.Scene): string =>
|
|
9
|
+
`solid
|
|
10
|
+
` + scene.groups.reduce((a, c) => a + stlGroup(c, scene.center, scene.rotation ?? A3D.vec3Zero), "");
|
|
11
|
+
|
|
12
|
+
function stlGroup(g: A3D.Group, parentPos: A3D.Vec3, parentRot: A3D.Vec3): string {
|
|
13
|
+
const pos = A3D.vec3TransRot(g.pos, parentPos, parentRot);
|
|
14
|
+
const rot = A3D.vec3RotCombine(parentRot, g.rot ?? A3D.vec3Zero);
|
|
15
|
+
return (
|
|
16
|
+
(g.meshes?.reduce((a, m) => {
|
|
17
|
+
switch (m.geometry.type) {
|
|
18
|
+
case "Plane":
|
|
19
|
+
return a + stlPlane(m.geometry, m.material, pos, rot);
|
|
20
|
+
case "Box":
|
|
21
|
+
return a + stlBox(m.geometry, m.material, pos, rot);
|
|
22
|
+
case "Cylinder":
|
|
23
|
+
return a + stlCylinder(m.geometry, m.material, 18, pos, rot);
|
|
24
|
+
case "Cone":
|
|
25
|
+
return a + stlCone(m.geometry, m.material, 18, pos, rot);
|
|
26
|
+
case "Polygon":
|
|
27
|
+
return a + stlPolygon(m.geometry, m.material, pos, rot);
|
|
28
|
+
default:
|
|
29
|
+
return a;
|
|
30
|
+
}
|
|
31
|
+
}, "") ?? "") + (g.groups?.reduce((a, c) => a + stlGroup(c, pos, rot), "") ?? "")
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Vec2, vec2Add, vec2Scale } from "../../abstract-3d";
|
|
2
|
+
|
|
3
|
+
export const svg = (width: number, height: number, children: string): string =>
|
|
4
|
+
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width.toFixed(0)} ${height.toFixed(
|
|
5
|
+
0
|
|
6
|
+
)}" width="${width.toFixed(0)}px" height="${height.toFixed(0)}px">${children} </svg>`;
|
|
7
|
+
|
|
8
|
+
export const svgLine = (p1: Vec2, p2: Vec2, stroke: string, strokeWidth: number): string =>
|
|
9
|
+
`<line x1="${p1.x.toFixed(0)}" y1="${p1.y.toFixed(0)}" x2="${p2.x.toFixed(0)}" y2="${p2.y.toFixed(
|
|
10
|
+
0
|
|
11
|
+
)}" stroke="${stroke}" stroke-width="${strokeWidth}" />`;
|
|
12
|
+
|
|
13
|
+
export const svgPolygon = (points: ReadonlyArray<Vec2>, fill: string, stroke: string, strokeWidth: number): string =>
|
|
14
|
+
`<polygon points="${points
|
|
15
|
+
.reduce((a, c) => (a += `${c.x.toFixed(0)},${c.y.toFixed(0)} `), "")
|
|
16
|
+
.slice(0, -1)}" fill="${fill}" stroke="${stroke}" stroke-width="${strokeWidth}" />`;
|
|
17
|
+
|
|
18
|
+
export const svgText = (p: Vec2, text: string, rot: number, color: string, font: string, fontSize: number): string =>
|
|
19
|
+
`<text font-family="${font}" font-size="${fontSize}px" text-anchor="middle" alignment-baseline="middle" fill="${color}" transform="${translate(
|
|
20
|
+
p
|
|
21
|
+
)} ${rotate(rot)}">${text}</text>`;
|
|
22
|
+
|
|
23
|
+
export type EmbededImage =
|
|
24
|
+
| { readonly type: "url"; readonly url: string }
|
|
25
|
+
| { readonly type: "svg"; readonly svg: string };
|
|
26
|
+
|
|
27
|
+
export const svgImage = (p: Vec2, size: Vec2, rot: number, data: EmbededImage): string => {
|
|
28
|
+
const half = vec2Scale(size, 0.5);
|
|
29
|
+
return data.type === "url"
|
|
30
|
+
? `<image x="${p.x.toFixed(0)}" y="${p.y.toFixed(0)}" transform="${rotate(rot)}" ${transformOrigin(
|
|
31
|
+
p,
|
|
32
|
+
half
|
|
33
|
+
)} width="${size.x.toFixed(0)}" height="${size.y.toFixed(0)}" href="${data.url}" />`
|
|
34
|
+
: `<svg width="${size.x.toFixed(0)}" height="${size.y.toFixed(0)}" transform="${translate(
|
|
35
|
+
vec2Add(p, half)
|
|
36
|
+
)} ${rotate(rot)} ${translate(vec2Scale(half, -1))}">${data.svg}</svg>
|
|
37
|
+
|
|
38
|
+
`;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const transformOrigin = (p: Vec2, half: Vec2): string =>
|
|
42
|
+
`transform-origin="${(p.x + half.x).toFixed(0)}px ${(p.y + half.y).toFixed(0)}px"`;
|
|
43
|
+
|
|
44
|
+
const rotate = (rot: number): string => `rotate(${rot.toFixed(0)})`;
|
|
45
|
+
|
|
46
|
+
const translate = (p: Vec2): string => `translate(${p.x.toFixed(0)}, ${p.y.toFixed(0)})`;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type zOrderElement = { readonly element: string; readonly zOrder: number };
|
|
2
|
+
export const zElem = (element: string, zOrder: number): zOrderElement => ({ element, zOrder });
|
|
3
|
+
|
|
4
|
+
export const stBW = 0.7;
|
|
5
|
+
export const stN = 0.1;
|
|
6
|
+
|
|
7
|
+
export const gray = "rgb(85, 85, 85)";
|
|
8
|
+
export const white = "rgb(255, 255, 255)";
|
|
9
|
+
export const transparent = "rgba(255, 255, 255, 0)";
|
|
10
|
+
export const black = "rgb(15, 15, 15)";
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { gray, black, zElem, zOrderElement } from "./shared";
|
|
3
|
+
import { svgPolygon } from "../svg-encoding";
|
|
4
|
+
import { rgbGray } from "../../shared";
|
|
5
|
+
|
|
6
|
+
export function box(
|
|
7
|
+
b: A3D.Box,
|
|
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
|
+
): ReadonlyArray<zOrderElement> {
|
|
17
|
+
const half = A3D.vec3Scale(b.size, 0.5);
|
|
18
|
+
const pos = A3D.vec3TransRot(b.pos, parentPos, parentRot);
|
|
19
|
+
const rot = A3D.vec3RotCombine(parentRot, b.rot ?? A3D.vec3Zero);
|
|
20
|
+
const vec3tr = (p: A3D.Vec3): A3D.Vec3 => A3D.vec3TransRot(p, pos, rot);
|
|
21
|
+
|
|
22
|
+
const v1 = vec3tr(A3D.vec3(-half.x, -half.y, half.z));
|
|
23
|
+
const v2 = vec3tr(A3D.vec3(half.x, -half.y, half.z));
|
|
24
|
+
const v3 = vec3tr(A3D.vec3(half.x, half.y, half.z));
|
|
25
|
+
const v4 = vec3tr(A3D.vec3(-half.x, half.y, half.z));
|
|
26
|
+
const v5 = vec3tr(A3D.vec3(-half.x, -half.y, -half.z));
|
|
27
|
+
const v6 = vec3tr(A3D.vec3(half.x, -half.y, -half.z));
|
|
28
|
+
const v7 = vec3tr(A3D.vec3(half.x, half.y, -half.z));
|
|
29
|
+
const v8 = vec3tr(A3D.vec3(-half.x, half.y, -half.z));
|
|
30
|
+
|
|
31
|
+
const frontMean = A3D.vec3ZMean(v1, v2, v3, v4);
|
|
32
|
+
const backMean = A3D.vec3ZMean(v5, v6, v7, v8);
|
|
33
|
+
const [frontBackPoints, frontBackMean] =
|
|
34
|
+
frontMean > backMean
|
|
35
|
+
? [[point(v1.x, v1.y), point(v2.x, v2.y), point(v3.x, v3.y), point(v4.x, v4.y)], frontMean]
|
|
36
|
+
: [[point(v5.x, v5.y), point(v6.x, v6.y), point(v7.x, v7.y), point(v8.x, v8.y)], backMean];
|
|
37
|
+
|
|
38
|
+
const topMean = A3D.vec3ZMean(v8, v7, v3, v4);
|
|
39
|
+
const botMean = A3D.vec3ZMean(v5, v6, v2, v1);
|
|
40
|
+
const [topBotPoints, topBotMean] =
|
|
41
|
+
topMean > botMean
|
|
42
|
+
? [[point(v8.x, v8.y), point(v7.x, v7.y), point(v3.x, v3.y), point(v4.x, v4.y)], topMean]
|
|
43
|
+
: [[point(v5.x, v5.y), point(v6.x, v6.y), point(v2.x, v2.y), point(v1.x, v1.y)], botMean];
|
|
44
|
+
|
|
45
|
+
const rightMean = A3D.vec3ZMean(v6, v2, v3, v7);
|
|
46
|
+
const leftMean = A3D.vec3ZMean(v5, v1, v4, v8);
|
|
47
|
+
const [rightLeftPoints, rightLeftMean] =
|
|
48
|
+
rightMean > leftMean
|
|
49
|
+
? [[point(v6.x, v6.y), point(v2.x, v2.y), point(v3.x, v3.y), point(v7.x, v7.y)], rightMean]
|
|
50
|
+
: [[point(v5.x, v5.y), point(v1.x, v1.y), point(v4.x, v4.y), point(v8.x, v8.y)], leftMean];
|
|
51
|
+
|
|
52
|
+
const [strokeColor, fill, strokeUse] = onlyStroke
|
|
53
|
+
? [grayScale ? gray : color, onlyStrokeFill, stroke]
|
|
54
|
+
: [black, grayScale ? rgbGray(color) : color, 0];
|
|
55
|
+
|
|
56
|
+
return [
|
|
57
|
+
zElem(svgPolygon(frontBackPoints, fill, strokeColor, strokeUse), frontBackMean),
|
|
58
|
+
zElem(svgPolygon(topBotPoints, fill, strokeColor, strokeUse), topBotMean),
|
|
59
|
+
zElem(svgPolygon(rightLeftPoints, fill, strokeColor, strokeUse), rightLeftMean),
|
|
60
|
+
];
|
|
61
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { gray, stBW, zElem, zOrderElement, transparent } from "./shared";
|
|
3
|
+
import { svgPolygon } from "../svg-encoding";
|
|
4
|
+
import { rgbGray } from "../../shared";
|
|
5
|
+
|
|
6
|
+
export function cone(
|
|
7
|
+
c: A3D.Cone,
|
|
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
|
+
): ReadonlyArray<zOrderElement> {
|
|
17
|
+
const half = A3D.vec3(c.radius, c.length / 2, c.radius);
|
|
18
|
+
const pos = A3D.vec3TransRot(c.pos, parentPos, parentRot);
|
|
19
|
+
const rot = A3D.vec3RotCombine(parentRot, c.rot ?? A3D.vec3Zero);
|
|
20
|
+
const vec3tr = (p: A3D.Vec3): A3D.Vec3 => A3D.vec3TransRot(p, pos, rot);
|
|
21
|
+
|
|
22
|
+
const [stroke, fill] = onlyStroke
|
|
23
|
+
? [grayScale ? gray : color, onlyStrokeFill]
|
|
24
|
+
: [transparent, grayScale ? rgbGray(color) : color];
|
|
25
|
+
const zOrderComponents = Array<zOrderElement>();
|
|
26
|
+
|
|
27
|
+
const sides = 8;
|
|
28
|
+
const angleStep = (2 * Math.PI) / sides;
|
|
29
|
+
let currentAngle = 0;
|
|
30
|
+
|
|
31
|
+
const topPos = vec3tr(A3D.vec3(0, half.y, 0));
|
|
32
|
+
const botVec3Array = Array<A3D.Vec3>();
|
|
33
|
+
for (let i = 0; i <= sides; i++) {
|
|
34
|
+
const currBot = vec3tr(
|
|
35
|
+
A3D.vec3(0 + Math.sin(currentAngle) * c.radius, -half.y, 0 + Math.cos(currentAngle) * c.radius)
|
|
36
|
+
);
|
|
37
|
+
botVec3Array.push(currBot);
|
|
38
|
+
if (i !== 0) {
|
|
39
|
+
const prevBot = botVec3Array[i - 1]!;
|
|
40
|
+
const points = [
|
|
41
|
+
point(currBot.x, currBot.y),
|
|
42
|
+
point(prevBot.x, prevBot.y),
|
|
43
|
+
point(topPos.x, topPos.y),
|
|
44
|
+
point(topPos.x, topPos.y),
|
|
45
|
+
];
|
|
46
|
+
zOrderComponents.push(zElem(svgPolygon(points, fill, stroke, stBW), A3D.vec3ZMean(currBot, prevBot, topPos)));
|
|
47
|
+
}
|
|
48
|
+
currentAngle += angleStep;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return zOrderComponents;
|
|
52
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { gray, stBW, transparent, zElem, zOrderElement } from "./shared";
|
|
3
|
+
import { svgPolygon } from "../svg-encoding";
|
|
4
|
+
import { rgbGray } from "../../shared";
|
|
5
|
+
|
|
6
|
+
export function cylinder(
|
|
7
|
+
c: A3D.Cylinder,
|
|
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
|
+
): ReadonlyArray<zOrderElement> {
|
|
17
|
+
const half = A3D.vec3(c.radius, c.length / 2, c.radius);
|
|
18
|
+
const pos = A3D.vec3TransRot(c.pos, parentPos, parentRot);
|
|
19
|
+
const rot = A3D.vec3RotCombine(parentRot, c.rot ?? A3D.vec3Zero);
|
|
20
|
+
const vec3tr = (p: A3D.Vec3): A3D.Vec3 => A3D.vec3TransRot(p, pos, rot);
|
|
21
|
+
|
|
22
|
+
const [stroke, fill] = onlyStroke
|
|
23
|
+
? [grayScale ? gray : color, onlyStrokeFill]
|
|
24
|
+
: [transparent, grayScale ? rgbGray(color) : color];
|
|
25
|
+
const zOrderComponents = Array<zOrderElement>();
|
|
26
|
+
|
|
27
|
+
const sides = 8;
|
|
28
|
+
const angleStep = (2 * Math.PI) / sides;
|
|
29
|
+
let currentAngle = 0;
|
|
30
|
+
|
|
31
|
+
const botVec3Array = Array<A3D.Vec3>();
|
|
32
|
+
const topVec3Array = Array<A3D.Vec3>();
|
|
33
|
+
for (let i = 0; i <= sides; i++) {
|
|
34
|
+
const x = Math.sin(currentAngle) * c.radius;
|
|
35
|
+
const z = Math.cos(currentAngle) * c.radius;
|
|
36
|
+
const currBot = vec3tr(A3D.vec3(x, -half.y, z));
|
|
37
|
+
const currTop = vec3tr(A3D.vec3(x, half.y, z));
|
|
38
|
+
botVec3Array.push(currBot);
|
|
39
|
+
topVec3Array.push(currTop);
|
|
40
|
+
if (i !== 0) {
|
|
41
|
+
const prevBot = botVec3Array[i - 1]!;
|
|
42
|
+
const prevTop = topVec3Array[i - 1]!;
|
|
43
|
+
|
|
44
|
+
const points = [
|
|
45
|
+
point(currBot.x, currBot.y),
|
|
46
|
+
point(prevBot.x, prevBot.y),
|
|
47
|
+
point(prevTop.x, prevTop.y),
|
|
48
|
+
point(currTop.x, currTop.y),
|
|
49
|
+
];
|
|
50
|
+
zOrderComponents.push(
|
|
51
|
+
zElem(svgPolygon(points, fill, stroke, stBW), A3D.vec3ZMean(currBot, prevBot, currTop, prevTop))
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
currentAngle += angleStep;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return zOrderComponents;
|
|
58
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as A3D from "../../../abstract-3d";
|
|
2
|
+
import { zElem, zOrderElement } from "./shared";
|
|
3
|
+
import { svgLine } from "../svg-encoding";
|
|
4
|
+
import { rgbGray } from "../../shared";
|
|
5
|
+
|
|
6
|
+
export function line(
|
|
7
|
+
l: A3D.Line,
|
|
8
|
+
point: (x: number, y: number) => A3D.Vec2,
|
|
9
|
+
fill: string,
|
|
10
|
+
grayScale: boolean | undefined,
|
|
11
|
+
_stroke: number,
|
|
12
|
+
parentPos: A3D.Vec3,
|
|
13
|
+
parentRot: A3D.Vec3
|
|
14
|
+
): ReadonlyArray<zOrderElement> {
|
|
15
|
+
const v1 = A3D.vec3TransRot(l.start, parentPos, parentRot);
|
|
16
|
+
const v2 = A3D.vec3TransRot(l.end, parentPos, parentRot);
|
|
17
|
+
return [
|
|
18
|
+
zElem(svgLine(point(v1.x, v1.y), point(v2.x, v2.y), grayScale ? rgbGray(fill) : fill, 0.5), A3D.vec3ZMean(v1, v2)),
|
|
19
|
+
];
|
|
20
|
+
}
|