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,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
+ }