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.
Files changed (219) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +7 -0
  4. package/lib/abstract-3d.d.ts +317 -0
  5. package/lib/abstract-3d.d.ts.map +1 -0
  6. package/lib/abstract-3d.js +333 -0
  7. package/lib/abstract-3d.js.map +1 -0
  8. package/lib/index.d.ts +3 -0
  9. package/lib/index.d.ts.map +1 -0
  10. package/lib/index.js +19 -0
  11. package/lib/index.js.map +1 -0
  12. package/lib/renderers/dxf/dxf-encoding.d.ts +7 -0
  13. package/lib/renderers/dxf/dxf-encoding.d.ts.map +1 -0
  14. package/lib/renderers/dxf/dxf-encoding.js +343 -0
  15. package/lib/renderers/dxf/dxf-encoding.js.map +1 -0
  16. package/lib/renderers/dxf/dxf-geometries/dxf-box.d.ts +3 -0
  17. package/lib/renderers/dxf/dxf-geometries/dxf-box.d.ts.map +1 -0
  18. package/lib/renderers/dxf/dxf-geometries/dxf-box.js +52 -0
  19. package/lib/renderers/dxf/dxf-geometries/dxf-box.js.map +1 -0
  20. package/lib/renderers/dxf/dxf-geometries/dxf-cone.d.ts +3 -0
  21. package/lib/renderers/dxf/dxf-geometries/dxf-cone.d.ts.map +1 -0
  22. package/lib/renderers/dxf/dxf-geometries/dxf-cone.js +54 -0
  23. package/lib/renderers/dxf/dxf-geometries/dxf-cone.js.map +1 -0
  24. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.d.ts +3 -0
  25. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.d.ts.map +1 -0
  26. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js +62 -0
  27. package/lib/renderers/dxf/dxf-geometries/dxf-cylinder.js.map +1 -0
  28. package/lib/renderers/dxf/dxf-geometries/dxf-plane.d.ts +3 -0
  29. package/lib/renderers/dxf/dxf-geometries/dxf-plane.d.ts.map +1 -0
  30. package/lib/renderers/dxf/dxf-geometries/dxf-plane.js +38 -0
  31. package/lib/renderers/dxf/dxf-geometries/dxf-plane.js.map +1 -0
  32. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.d.ts +3 -0
  33. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.d.ts.map +1 -0
  34. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js +61 -0
  35. package/lib/renderers/dxf/dxf-geometries/dxf-polygon.js.map +1 -0
  36. package/lib/renderers/dxf/dxf-geometries/dxf-shape.d.ts +3 -0
  37. package/lib/renderers/dxf/dxf-geometries/dxf-shape.d.ts.map +1 -0
  38. package/lib/renderers/dxf/dxf-geometries/dxf-shape.js +61 -0
  39. package/lib/renderers/dxf/dxf-geometries/dxf-shape.js.map +1 -0
  40. package/lib/renderers/dxf/dxf.d.ts +3 -0
  41. package/lib/renderers/dxf/dxf.d.ts.map +1 -0
  42. package/lib/renderers/dxf/dxf.js +64 -0
  43. package/lib/renderers/dxf/dxf.js.map +1 -0
  44. package/lib/renderers/dxf/index.d.ts +2 -0
  45. package/lib/renderers/dxf/index.d.ts.map +1 -0
  46. package/lib/renderers/dxf/index.js +18 -0
  47. package/lib/renderers/dxf/index.js.map +1 -0
  48. package/lib/renderers/index.d.ts +5 -0
  49. package/lib/renderers/index.d.ts.map +1 -0
  50. package/lib/renderers/index.js +21 -0
  51. package/lib/renderers/index.js.map +1 -0
  52. package/lib/renderers/react/index.d.ts +6 -0
  53. package/lib/renderers/react/index.d.ts.map +1 -0
  54. package/lib/renderers/react/index.js +21 -0
  55. package/lib/renderers/react/index.js.map +1 -0
  56. package/lib/renderers/react/react-camera.d.ts +60 -0
  57. package/lib/renderers/react/react-camera.d.ts.map +1 -0
  58. package/lib/renderers/react/react-camera.js +132 -0
  59. package/lib/renderers/react/react-camera.js.map +1 -0
  60. package/lib/renderers/react/react-dimension.d.ts +12 -0
  61. package/lib/renderers/react/react-dimension.d.ts.map +1 -0
  62. package/lib/renderers/react/react-dimension.js +39 -0
  63. package/lib/renderers/react/react-dimension.js.map +1 -0
  64. package/lib/renderers/react/react-group.d.ts +18 -0
  65. package/lib/renderers/react/react-group.d.ts.map +1 -0
  66. package/lib/renderers/react/react-group.js +62 -0
  67. package/lib/renderers/react/react-group.js.map +1 -0
  68. package/lib/renderers/react/react-hotspot.d.ts +30 -0
  69. package/lib/renderers/react/react-hotspot.d.ts.map +1 -0
  70. package/lib/renderers/react/react-hotspot.js +71 -0
  71. package/lib/renderers/react/react-hotspot.js.map +1 -0
  72. package/lib/renderers/react/react-material.d.ts +13 -0
  73. package/lib/renderers/react/react-material.d.ts.map +1 -0
  74. package/lib/renderers/react/react-material.js +85 -0
  75. package/lib/renderers/react/react-material.js.map +1 -0
  76. package/lib/renderers/react/react-mesh.d.ts +10 -0
  77. package/lib/renderers/react/react-mesh.d.ts.map +1 -0
  78. package/lib/renderers/react/react-mesh.js +238 -0
  79. package/lib/renderers/react/react-mesh.js.map +1 -0
  80. package/lib/renderers/react/react-scene.d.ts +20 -0
  81. package/lib/renderers/react/react-scene.d.ts.map +1 -0
  82. package/lib/renderers/react/react-scene.js +44 -0
  83. package/lib/renderers/react/react-scene.js.map +1 -0
  84. package/lib/renderers/react/react.d.ts +30 -0
  85. package/lib/renderers/react/react.d.ts.map +1 -0
  86. package/lib/renderers/react/react.js +48 -0
  87. package/lib/renderers/react/react.js.map +1 -0
  88. package/lib/renderers/shared.d.ts +6 -0
  89. package/lib/renderers/shared.d.ts.map +1 -0
  90. package/lib/renderers/shared.js +93 -0
  91. package/lib/renderers/shared.js.map +1 -0
  92. package/lib/renderers/stl/index.d.ts +2 -0
  93. package/lib/renderers/stl/index.d.ts.map +1 -0
  94. package/lib/renderers/stl/index.js +18 -0
  95. package/lib/renderers/stl/index.js.map +1 -0
  96. package/lib/renderers/stl/stl-encoding.d.ts +4 -0
  97. package/lib/renderers/stl/stl-encoding.d.ts.map +1 -0
  98. package/lib/renderers/stl/stl-encoding.js +26 -0
  99. package/lib/renderers/stl/stl-encoding.js.map +1 -0
  100. package/lib/renderers/stl/stl-geometries/stl-box.d.ts +3 -0
  101. package/lib/renderers/stl/stl-geometries/stl-box.d.ts.map +1 -0
  102. package/lib/renderers/stl/stl-geometries/stl-box.js +57 -0
  103. package/lib/renderers/stl/stl-geometries/stl-box.js.map +1 -0
  104. package/lib/renderers/stl/stl-geometries/stl-cone.d.ts +3 -0
  105. package/lib/renderers/stl/stl-geometries/stl-cone.d.ts.map +1 -0
  106. package/lib/renderers/stl/stl-geometries/stl-cone.js +54 -0
  107. package/lib/renderers/stl/stl-geometries/stl-cone.js.map +1 -0
  108. package/lib/renderers/stl/stl-geometries/stl-cylinder.d.ts +3 -0
  109. package/lib/renderers/stl/stl-geometries/stl-cylinder.d.ts.map +1 -0
  110. package/lib/renderers/stl/stl-geometries/stl-cylinder.js +62 -0
  111. package/lib/renderers/stl/stl-geometries/stl-cylinder.js.map +1 -0
  112. package/lib/renderers/stl/stl-geometries/stl-plane.d.ts +3 -0
  113. package/lib/renderers/stl/stl-geometries/stl-plane.d.ts.map +1 -0
  114. package/lib/renderers/stl/stl-geometries/stl-plane.js +44 -0
  115. package/lib/renderers/stl/stl-geometries/stl-plane.js.map +1 -0
  116. package/lib/renderers/stl/stl-geometries/stl-polygon.d.ts +3 -0
  117. package/lib/renderers/stl/stl-geometries/stl-polygon.d.ts.map +1 -0
  118. package/lib/renderers/stl/stl-geometries/stl-polygon.js +59 -0
  119. package/lib/renderers/stl/stl-geometries/stl-polygon.js.map +1 -0
  120. package/lib/renderers/stl/stl-geometries/stl-shape.d.ts +3 -0
  121. package/lib/renderers/stl/stl-geometries/stl-shape.d.ts.map +1 -0
  122. package/lib/renderers/stl/stl-geometries/stl-shape.js +59 -0
  123. package/lib/renderers/stl/stl-geometries/stl-shape.js.map +1 -0
  124. package/lib/renderers/stl/stl.d.ts +3 -0
  125. package/lib/renderers/stl/stl.d.ts.map +1 -0
  126. package/lib/renderers/stl/stl.js +57 -0
  127. package/lib/renderers/stl/stl.js.map +1 -0
  128. package/lib/renderers/svg/index.d.ts +3 -0
  129. package/lib/renderers/svg/index.d.ts.map +1 -0
  130. package/lib/renderers/svg/index.js +18 -0
  131. package/lib/renderers/svg/index.js.map +1 -0
  132. package/lib/renderers/svg/svg-encoding.d.ts +14 -0
  133. package/lib/renderers/svg/svg-encoding.d.ts.map +1 -0
  134. package/lib/renderers/svg/svg-encoding.js +27 -0
  135. package/lib/renderers/svg/svg-encoding.js.map +1 -0
  136. package/lib/renderers/svg/svg-geometries/shared.d.ts +12 -0
  137. package/lib/renderers/svg/svg-geometries/shared.d.ts.map +1 -0
  138. package/lib/renderers/svg/svg-geometries/shared.js +12 -0
  139. package/lib/renderers/svg/svg-geometries/shared.js.map +1 -0
  140. package/lib/renderers/svg/svg-geometries/svg-box.d.ts +4 -0
  141. package/lib/renderers/svg/svg-geometries/svg-box.d.ts.map +1 -0
  142. package/lib/renderers/svg/svg-geometries/svg-box.js +70 -0
  143. package/lib/renderers/svg/svg-geometries/svg-box.js.map +1 -0
  144. package/lib/renderers/svg/svg-geometries/svg-cone.d.ts +4 -0
  145. package/lib/renderers/svg/svg-geometries/svg-cone.d.ts.map +1 -0
  146. package/lib/renderers/svg/svg-geometries/svg-cone.js +64 -0
  147. package/lib/renderers/svg/svg-geometries/svg-cone.js.map +1 -0
  148. package/lib/renderers/svg/svg-geometries/svg-cylinder.d.ts +4 -0
  149. package/lib/renderers/svg/svg-geometries/svg-cylinder.d.ts.map +1 -0
  150. package/lib/renderers/svg/svg-geometries/svg-cylinder.js +69 -0
  151. package/lib/renderers/svg/svg-geometries/svg-cylinder.js.map +1 -0
  152. package/lib/renderers/svg/svg-geometries/svg-line.d.ts +4 -0
  153. package/lib/renderers/svg/svg-geometries/svg-line.d.ts.map +1 -0
  154. package/lib/renderers/svg/svg-geometries/svg-line.js +39 -0
  155. package/lib/renderers/svg/svg-geometries/svg-line.js.map +1 -0
  156. package/lib/renderers/svg/svg-geometries/svg-plane.d.ts +5 -0
  157. package/lib/renderers/svg/svg-geometries/svg-plane.d.ts.map +1 -0
  158. package/lib/renderers/svg/svg-geometries/svg-plane.js +57 -0
  159. package/lib/renderers/svg/svg-geometries/svg-plane.js.map +1 -0
  160. package/lib/renderers/svg/svg-geometries/svg-polygon.d.ts +4 -0
  161. package/lib/renderers/svg/svg-geometries/svg-polygon.d.ts.map +1 -0
  162. package/lib/renderers/svg/svg-geometries/svg-polygon.js +20 -0
  163. package/lib/renderers/svg/svg-geometries/svg-polygon.js.map +1 -0
  164. package/lib/renderers/svg/svg-geometries/svg-shape.d.ts +4 -0
  165. package/lib/renderers/svg/svg-geometries/svg-shape.d.ts.map +1 -0
  166. package/lib/renderers/svg/svg-geometries/svg-shape.js +20 -0
  167. package/lib/renderers/svg/svg-geometries/svg-shape.js.map +1 -0
  168. package/lib/renderers/svg/svg-geometries/svg-text.d.ts +4 -0
  169. package/lib/renderers/svg/svg-geometries/svg-text.d.ts.map +1 -0
  170. package/lib/renderers/svg/svg-geometries/svg-text.js +46 -0
  171. package/lib/renderers/svg/svg-geometries/svg-text.js.map +1 -0
  172. package/lib/renderers/svg/svg.d.ts +10 -0
  173. package/lib/renderers/svg/svg.d.ts.map +1 -0
  174. package/lib/renderers/svg/svg.js +98 -0
  175. package/lib/renderers/svg/svg.js.map +1 -0
  176. package/package.json +31 -0
  177. package/src/abstract-3d.ts +578 -0
  178. package/src/index.ts +2 -0
  179. package/src/renderers/dxf/dxf-encoding.ts +348 -0
  180. package/src/renderers/dxf/dxf-geometries/dxf-box.ts +27 -0
  181. package/src/renderers/dxf/dxf-geometries/dxf-cone.ts +31 -0
  182. package/src/renderers/dxf/dxf-geometries/dxf-cylinder.ts +45 -0
  183. package/src/renderers/dxf/dxf-geometries/dxf-plane.ts +16 -0
  184. package/src/renderers/dxf/dxf-geometries/dxf-polygon.ts +36 -0
  185. package/src/renderers/dxf/dxf-geometries/dxf-shape.ts +36 -0
  186. package/src/renderers/dxf/dxf.ts +38 -0
  187. package/src/renderers/dxf/index.ts +1 -0
  188. package/src/renderers/index.ts +4 -0
  189. package/src/renderers/react/index.ts +5 -0
  190. package/src/renderers/react/react-camera.tsx +208 -0
  191. package/src/renderers/react/react-dimension.tsx +76 -0
  192. package/src/renderers/react/react-group.tsx +133 -0
  193. package/src/renderers/react/react-hotspot.tsx +116 -0
  194. package/src/renderers/react/react-material.tsx +159 -0
  195. package/src/renderers/react/react-mesh.tsx +380 -0
  196. package/src/renderers/react/react-scene.tsx +137 -0
  197. package/src/renderers/react/react.tsx +118 -0
  198. package/src/renderers/shared.ts +111 -0
  199. package/src/renderers/stl/index.ts +1 -0
  200. package/src/renderers/stl/stl-encoding.ts +22 -0
  201. package/src/renderers/stl/stl-geometries/stl-box.ts +33 -0
  202. package/src/renderers/stl/stl-geometries/stl-cone.ts +37 -0
  203. package/src/renderers/stl/stl-geometries/stl-cylinder.ts +45 -0
  204. package/src/renderers/stl/stl-geometries/stl-plane.ts +16 -0
  205. package/src/renderers/stl/stl-geometries/stl-polygon.ts +35 -0
  206. package/src/renderers/stl/stl-geometries/stl-shape.ts +35 -0
  207. package/src/renderers/stl/stl.ts +33 -0
  208. package/src/renderers/svg/index.ts +2 -0
  209. package/src/renderers/svg/svg-encoding.ts +46 -0
  210. package/src/renderers/svg/svg-geometries/shared.ts +10 -0
  211. package/src/renderers/svg/svg-geometries/svg-box.ts +61 -0
  212. package/src/renderers/svg/svg-geometries/svg-cone.ts +52 -0
  213. package/src/renderers/svg/svg-geometries/svg-cylinder.ts +58 -0
  214. package/src/renderers/svg/svg-geometries/svg-line.ts +20 -0
  215. package/src/renderers/svg/svg-geometries/svg-plane.ts +44 -0
  216. package/src/renderers/svg/svg-geometries/svg-polygon.ts +25 -0
  217. package/src/renderers/svg/svg-geometries/svg-shape.ts +25 -0
  218. package/src/renderers/svg/svg-geometries/svg-text.ts +28 -0
  219. 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,2 @@
1
+ export * from "./svg";
2
+ export type { EmbededImage } from "./svg-encoding";
@@ -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
+ }