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,578 @@
1
+ import * as THREE from "three";
2
+
3
+ export type Scene = {
4
+ readonly center: Vec3;
5
+ readonly size: Vec3;
6
+ readonly groups: ReadonlyArray<Group>;
7
+ readonly rotation?: Vec3;
8
+ readonly dimensions?: Dimensions;
9
+ readonly hotSpots?: ReadonlyArray<HotSpot>;
10
+ readonly data?: Record<string, string>;
11
+ };
12
+
13
+ export type Renderer = "react" | "ai_schematic" | "ai_detailed" | "dxf";
14
+
15
+ export type Dimensions = {
16
+ readonly dimensions: ReadonlyArray<Dimension>;
17
+ readonly material: Material;
18
+ readonly bounds: DimensionBounds;
19
+ };
20
+
21
+ export type Dimension = {
22
+ readonly views: ReadonlyArray<View>;
23
+ readonly pos: Vec3;
24
+ readonly rot: Vec3;
25
+ readonly meshes: ReadonlyArray<Mesh>;
26
+ };
27
+
28
+ export type DimensionBounds = {
29
+ readonly front: Bounds2;
30
+ readonly back: Bounds2;
31
+ readonly left: Bounds2;
32
+ readonly right: Bounds2;
33
+ readonly top: Bounds2;
34
+ readonly bottom: Bounds2;
35
+ readonly threeD: Bounds3;
36
+ };
37
+
38
+ export type HotSpot = {
39
+ readonly id: string;
40
+ readonly mesh: Mesh;
41
+ };
42
+
43
+ export type Group = {
44
+ readonly pos: Vec3;
45
+ readonly rot?: Vec3;
46
+ readonly groups?: ReadonlyArray<Group>;
47
+ readonly meshes?: ReadonlyArray<Mesh>;
48
+ readonly data?: Record<string, string>;
49
+ readonly animation?: Animation;
50
+ };
51
+
52
+ export type Mesh = {
53
+ readonly material: Material;
54
+ readonly geometry: Cylinder | Cone | Box | Line | Text | Polygon | Plane | Tube | Sphere | Shape;
55
+ };
56
+
57
+ export type Material = {
58
+ readonly type: MaterialType;
59
+ readonly normal: string;
60
+ readonly hover?: string;
61
+ readonly selected?: string;
62
+ readonly dxf?: string;
63
+ readonly opacity?: number;
64
+ readonly shininess?: number;
65
+ readonly image?:
66
+ | { readonly type: "HashImage"; readonly hash: string; readonly imageType?: string }
67
+ | { readonly type: "UrlImage"; readonly url: string; readonly imageType?: string };
68
+ };
69
+
70
+ export type MaterialType = "Phong" | "Lambert" | "Basic";
71
+
72
+ export type Cylinder = {
73
+ readonly type: "Cylinder";
74
+ readonly pos: Vec3;
75
+ readonly rot?: Vec3;
76
+ readonly length: number;
77
+ readonly radius: number;
78
+ readonly holes?: ReadonlyArray<Hole>;
79
+ };
80
+
81
+ export type Sphere = {
82
+ readonly type: "Sphere";
83
+ readonly pos: Vec3;
84
+ readonly radius: number;
85
+ };
86
+
87
+ export type Cone = {
88
+ readonly type: "Cone";
89
+ readonly pos: Vec3;
90
+ readonly rot?: Vec3;
91
+ readonly length: number;
92
+ readonly radius: number;
93
+ };
94
+
95
+ export type Line = {
96
+ readonly type: "Line";
97
+ readonly start: Vec3;
98
+ readonly end: Vec3;
99
+ readonly thickness: number;
100
+ };
101
+
102
+ export type Tube = {
103
+ readonly type: "Tube";
104
+ readonly pos: Vec3;
105
+ readonly rot?: Vec3;
106
+ readonly radius: number;
107
+ readonly curve: Curve;
108
+ };
109
+
110
+ export type Curve = CircleCurve | SplineCurve;
111
+
112
+ export type CircleCurve = {
113
+ readonly type: "CircleCurve";
114
+ readonly radius: number;
115
+ readonly angleStart: number;
116
+ readonly angleLength: number;
117
+ };
118
+
119
+ export type SplineCurve = { readonly type: "SplineCurve"; readonly points: ReadonlyArray<Vec3> };
120
+
121
+ export type Polygon = {
122
+ readonly type: "Polygon";
123
+ readonly points: ReadonlyArray<Vec3>;
124
+ readonly pos: Vec3;
125
+ readonly rot?: Vec3;
126
+ };
127
+
128
+ export type Shape = {
129
+ readonly type: "Shape";
130
+ readonly points: ReadonlyArray<Vec2>;
131
+ readonly pos: Vec3;
132
+ readonly rot?: Vec3;
133
+ readonly holes?: ReadonlyArray<Hole>;
134
+ readonly thickness: number;
135
+ };
136
+
137
+ export type Plane = {
138
+ readonly type: "Plane";
139
+ readonly pos: Vec3;
140
+ readonly rot?: Vec3;
141
+ readonly size: Vec2;
142
+ readonly holes?: ReadonlyArray<Hole>;
143
+ };
144
+
145
+ export type Text = {
146
+ readonly type: "Text";
147
+ readonly pos: Vec3;
148
+ readonly rot?: Vec3;
149
+ readonly text: string;
150
+ readonly fontSize: number;
151
+ };
152
+
153
+ export type Box = {
154
+ readonly type: "Box";
155
+ readonly pos: Vec3;
156
+ readonly rot?: Vec3;
157
+ readonly size: Vec3;
158
+ readonly holes?: ReadonlyArray<Hole>;
159
+ };
160
+
161
+ export type Hole = RoundHole | SquareHole;
162
+
163
+ export type RoundHole = {
164
+ readonly type: "RoundHole";
165
+ readonly pos: Vec2;
166
+ readonly radius: number;
167
+ };
168
+
169
+ export type SquareHole = {
170
+ readonly type: "SquareHole";
171
+ readonly pos: Vec2;
172
+ readonly size: Vec2;
173
+ };
174
+
175
+ export type Animation = {
176
+ readonly transform: Transform;
177
+ readonly duration: number;
178
+ };
179
+
180
+ export type Transform = {
181
+ readonly rot: Vec3;
182
+ readonly trans: Vec3;
183
+ };
184
+
185
+ export type Bounds = {
186
+ readonly min: number;
187
+ readonly max: number;
188
+ };
189
+
190
+ export type Bounds2 = {
191
+ readonly min: Vec2;
192
+ readonly max: Vec2;
193
+ };
194
+
195
+ export type Bounds3 = {
196
+ readonly min: Vec3;
197
+ readonly max: Vec3;
198
+ };
199
+
200
+ export type Vec2 = {
201
+ readonly x: number;
202
+ readonly y: number;
203
+ };
204
+
205
+ export type Vec3 = {
206
+ readonly x: number;
207
+ readonly y: number;
208
+ readonly z: number;
209
+ };
210
+
211
+ export const views = ["front", "back", "top", "bottom", "left", "right"] as const;
212
+ export type View = (typeof views)[number];
213
+
214
+ export type PlaneMesh = { readonly geometry: Plane; readonly material: Material };
215
+ export type BoxMesh = { readonly geometry: Box; readonly material: Material };
216
+ export type CylinderMesh = { readonly geometry: Cylinder; readonly material: Material };
217
+ export type ConeMesh = { readonly geometry: Cone; readonly material: Material };
218
+ export type LineMesh = { readonly geometry: Line; readonly material: Material };
219
+ export type TextMesh = { readonly geometry: Text; readonly material: Material };
220
+ export type PolygonMesh = { readonly geometry: Polygon; readonly material: Material };
221
+ export type TubeMesh = { readonly geometry: Tube; readonly material: Material };
222
+ export type SphereMesh = { readonly geometry: Sphere; readonly material: Material };
223
+ export type ShapeMesh = { readonly geometry: Shape; readonly material: Material };
224
+
225
+ export const vec3 = (x: number, y: number, z: number): Vec3 => ({ x, y, z });
226
+ export const vec2 = (x: number, y: number): Vec2 => ({ x, y });
227
+
228
+ export const vec3Zero = vec3(0, 0, 0);
229
+ export const vec3PosX = vec3(1, 0, 0);
230
+ export const vec3NegX = vec3(-1, 0, 0);
231
+ export const vec3PosY = vec3(0, 1, 0);
232
+ export const vec3NegY = vec3(0, -1, 0);
233
+ export const vec3PosZ = vec3(0, 1, 0);
234
+ export const vec3NegZ = vec3(0, -1, 0);
235
+
236
+ export const vec2Zero = vec2(0, 0);
237
+
238
+ export const vec2Flip = (v: Vec2): Vec2 => vec2(-v.x, -v.y);
239
+ export const vec3Flip = (v: Vec3): Vec3 => vec3(-v.x, -v.y, -v.z);
240
+
241
+ export const vec2Scale = (v: Vec2, s: number): Vec2 => vec2(v.x * s, v.y * s);
242
+ export const vec3Scale = (v: Vec3, s: number): Vec3 => vec3(v.x * s, v.y * s, v.z * s);
243
+
244
+ export const vec2Add = (a: Vec2, b: Vec2): Vec2 => vec2(a.x + b.x, a.y + b.y);
245
+ export const vec3Add = (a: Vec3, b: Vec3): Vec3 => vec3(a.x + b.x, a.y + b.y, a.z + b.z);
246
+
247
+ export const vec2Sub = (a: Vec2, b: Vec2): Vec2 => vec2(a.x - b.x, a.y - b.y);
248
+ export const vec3Sub = (a: Vec3, b: Vec3): Vec3 => vec3(a.x - b.x, a.y - b.y, a.z - b.z);
249
+
250
+ export const vec2Dot = (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y;
251
+ export const vec3Dot = (a: Vec3, b: Vec3): number => a.x * b.x + a.y * b.y + a.z * b.z;
252
+
253
+ export const vec2Length = (v: Vec2): number => Math.sqrt(v.x * v.x + v.y * v.y);
254
+ export const vec3Length = (v: Vec3): number => Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
255
+
256
+ export const vec2Normalize = (v: Vec2): Vec2 => vec2Scale(v, 1 / vec2Length(v));
257
+ export const vec3Normalize = (v: Vec3): Vec3 => vec3Scale(v, 1 / vec3Length(v));
258
+
259
+ export const vec2Greater = (a: Vec2, b: Vec2): Vec2 => vec2(a.x > b.x ? a.x : b.x, a.y > b.y ? a.y : b.y);
260
+
261
+ export const vec2Mult = (a: Vec2, b: Vec2): Vec2 => vec2(a.x * b.x, a.y * b.y);
262
+ export const vec3Mult = (a: Vec3, b: Vec3): Vec3 => vec3(a.x * b.x, a.y * b.y, a.z * b.z);
263
+
264
+ export const vec2Dupl = (num: number): Vec2 => vec2(num, num);
265
+ export const vec3Dupl = (num: number): Vec3 => vec3(num, num, num);
266
+
267
+ export const vec2Equals = (a: Vec2, b: Vec2): boolean => equals(a.x, b.x) && equals(a.y, b.y);
268
+ export const vec3Equals = (a: Vec3, b: Vec3): boolean => equals(a.x, b.x) && equals(a.y, b.y) && equals(a.z, b.z);
269
+
270
+ export const vec3XMean = (...v: ReadonlyArray<Vec3>): number => v.reduce((a, c) => a + c.x, 0) / v.length;
271
+ export const vec3YMean = (...v: ReadonlyArray<Vec3>): number => v.reduce((a, c) => a + c.y, 0) / v.length;
272
+ export const vec3ZMean = (...v: ReadonlyArray<Vec3>): number => v.reduce((a, c) => a + c.z, 0) / v.length;
273
+
274
+ export const vec3Greater = (a: Vec3, b: Vec3): Vec3 =>
275
+ vec3(a.x > b.x ? a.x : b.x, a.y > b.y ? a.y : b.y, a.z > b.z ? a.z : b.z);
276
+
277
+ export const equals = (num1: number, num2: number, equailty = Number.EPSILON): boolean =>
278
+ Math.abs(num1 - num2) < equailty;
279
+ export const isZero = (num: number, equailty = Number.EPSILON): boolean => Math.abs(num) <= equailty;
280
+ export const geq = (num1: number, num2: number, equailty = Number.EPSILON): boolean => num1 >= num2 - equailty;
281
+ export const greater = (num1: number, num2: number, equailty = Number.EPSILON): boolean => num1 > num2 + equailty;
282
+ export const leq = (num1: number, num2: number, equailty = Number.EPSILON): boolean => num1 <= num2 + equailty;
283
+ export const less = (num1: number, num2: number, equailty = Number.EPSILON): boolean => num1 < num2 - equailty;
284
+
285
+ // -- Bounds
286
+
287
+ export const bounds = (min: number, max: number): Bounds => ({ min, max });
288
+ export const bounds2 = (min: Vec2, max: Vec2): Bounds2 => ({ min, max });
289
+ export const bounds3 = (min: Vec3, max: Vec3): Bounds3 => ({ min, max });
290
+
291
+ export const boundsZero: Bounds = bounds(0, 0);
292
+ export const bounds2Zero: Bounds2 = bounds2(vec2Zero, vec2Zero);
293
+ export const bounds3Zero: Bounds3 = bounds3(vec3Zero, vec3Zero);
294
+
295
+ export const bounds3ToSize = (bounds: Bounds3): Vec3 =>
296
+ vec3(bounds.max.x - bounds.min.x, bounds.max.y - bounds.min.y, bounds.max.z - bounds.min.z);
297
+
298
+ export const bounds3Overlap = (a: Bounds3, b: Bounds3, equailty = Number.EPSILON): boolean =>
299
+ !leq(a.max.x, b.min.x, equailty) &&
300
+ !geq(a.min.x, b.max.x, equailty) &&
301
+ !leq(a.max.y, b.min.y, equailty) &&
302
+ !geq(a.min.y, b.max.y, equailty) &&
303
+ !leq(a.max.z, b.min.z, equailty) &&
304
+ !geq(a.min.z, b.max.z, equailty);
305
+
306
+ export const boundsOverlap = (a: Bounds, b: Bounds): boolean =>
307
+ (greater(a.max, b.min) && less(a.min, b.max)) || (greater(b.max, a.min) && less(b.min, a.max));
308
+
309
+ export const bounds2OverlapY = (a: Bounds2, b: Bounds2): boolean =>
310
+ (greater(a.max.y, b.min.y) && less(a.min.y, b.max.y)) || (greater(b.max.y, a.min.y) && less(b.min.y, a.max.y));
311
+
312
+ export const boundsXOverlapX = (a: Bounds2, b: Bounds2): boolean =>
313
+ (greater(a.max.x, b.min.x) && less(a.min.x, b.max.x)) || (greater(b.max.x, a.min.x) && less(b.min.x, a.max.x));
314
+
315
+ export const bounds3Center = (bounds: Bounds3): Vec3 =>
316
+ vec3((bounds.min.x + bounds.max.x) / 2, (bounds.min.y + bounds.max.y) / 2, (bounds.min.z + bounds.max.z) / 2);
317
+
318
+ export function bounds2FromPosAndSize(pos: Vec2, size: Vec2): Bounds2 {
319
+ const halfX = size.x * 0.5;
320
+ const halfY = size.y * 0.5;
321
+ return bounds2(vec2(pos.x - halfX, pos.y - halfY), vec2(pos.x + halfX, pos.y + halfY));
322
+ }
323
+
324
+ export function bounds3FromPosAndSize(pos: Vec3, size: Vec3): Bounds3 {
325
+ const halfX = size.x * 0.5;
326
+ const halfY = size.y * 0.5;
327
+ const halfZ = size.z * 0.5;
328
+ return bounds3(vec3(pos.x - halfX, pos.y - halfY, pos.z - halfZ), vec3(pos.x + halfX, pos.y + halfY, pos.z + halfZ));
329
+ }
330
+
331
+ export const bounds2Merge = (a: Bounds2, b: Bounds2): Bounds2 => {
332
+ return bounds2(
333
+ vec2(Math.min(a.min.x, b.min.x), Math.min(a.min.y, b.min.y)),
334
+ vec2(Math.max(a.max.x, b.max.x), Math.max(a.max.y, b.max.y))
335
+ );
336
+ };
337
+
338
+ export const bounds3Merge = (...bounds: ReadonlyArray<Bounds3>): Bounds3 => {
339
+ if (bounds.length === 0) {
340
+ return bounds3Zero;
341
+ }
342
+ const min = vec3Dupl(Number.MAX_VALUE) as { x: number; y: number; z: number };
343
+ const max = vec3Dupl(-Number.MAX_VALUE) as { x: number; y: number; z: number };
344
+ bounds.forEach((b) => {
345
+ if (b.min.x < min.x) {
346
+ min.x = b.min.x;
347
+ }
348
+ if (b.min.y < min.y) {
349
+ min.y = b.min.y;
350
+ }
351
+ if (b.min.z < min.z) {
352
+ min.z = b.min.z;
353
+ }
354
+ if (b.max.x > max.x) {
355
+ max.x = b.max.x;
356
+ }
357
+ if (b.max.y > max.y) {
358
+ max.y = b.max.y;
359
+ }
360
+ if (b.max.z > max.z) {
361
+ max.z = b.max.z;
362
+ }
363
+ });
364
+ return bounds3(min, max);
365
+ };
366
+
367
+ export function bounds3FromVec3Array(vec3Array: ReadonlyArray<Vec3>): Bounds3 {
368
+ const min = vec3Dupl(Number.MAX_VALUE) as { x: number; y: number; z: number };
369
+ const max = vec3Dupl(-Number.MAX_VALUE) as { x: number; y: number; z: number };
370
+ vec3Array.forEach((v) => {
371
+ if (v.x < min.x) {
372
+ min.x = v.x;
373
+ }
374
+ if (v.y < min.y) {
375
+ min.y = v.y;
376
+ }
377
+ if (v.z < min.z) {
378
+ min.z = v.z;
379
+ }
380
+ if (v.x > max.x) {
381
+ max.x = v.x;
382
+ }
383
+ if (v.y > max.y) {
384
+ max.y = v.y;
385
+ }
386
+ if (v.z > max.z) {
387
+ max.z = v.z;
388
+ }
389
+ });
390
+ return bounds3(min, max);
391
+ }
392
+
393
+ // -- Transformations
394
+
395
+ const quaternion1 = new THREE.Quaternion();
396
+ const quaternion2 = new THREE.Quaternion();
397
+ const euler1 = new THREE.Euler();
398
+ const euler2 = new THREE.Euler();
399
+ const vector = new THREE.Vector3();
400
+
401
+ export function vec3RotCombine(outer: Vec3, inner: Vec3): Vec3 {
402
+ euler1.set(outer.x, outer.y, outer.z);
403
+ quaternion1.setFromEuler(euler1);
404
+ euler2.set(inner.x, inner.y, inner.z);
405
+ quaternion2.setFromEuler(euler2);
406
+ quaternion1.multiply(quaternion2);
407
+ euler1.setFromQuaternion(quaternion1);
408
+ return vec3(euler1.x, euler1.y, euler1.z);
409
+ }
410
+
411
+ export function vec3Rot(point: Vec3, origin: Vec3, rotation: Vec3): Vec3 {
412
+ euler1.set(rotation.x, rotation.y, rotation.z);
413
+ quaternion1.setFromEuler(euler1);
414
+ vector.set(point.x - origin.x, point.y - origin.y, point.z - origin.z);
415
+ vector.applyQuaternion(quaternion1);
416
+ return vec3(vector.x + origin.x, vector.y + origin.y, vector.z + origin.z);
417
+ }
418
+
419
+ export const vec3TransRot = (p: Vec3, pos: Vec3, rot: Vec3): Vec3 => vec3Rot(vec3Add(p, pos), pos, rot);
420
+
421
+ export function geoRot<T extends Box | Plane | Cone | Cylinder | Text | Group>(g: T, origin: Vec3, rot: Vec3): T {
422
+ return { ...g, pos: vec3Rot(g.pos, origin, rot), rot: vec3RotCombine(rot, g.rot ?? vec3Zero) };
423
+ }
424
+ export function geoTrans<T extends Box | Plane | Cone | Cylinder | Text | Group>(g: T, translate: Vec3): T {
425
+ return { ...g, pos: vec3Add(g.pos, translate) };
426
+ }
427
+ export function geoTransRot<T extends Box | Plane | Cone | Cylinder | Text | Group | Tube>(
428
+ g: T,
429
+ origin: Vec3,
430
+ rot: Vec3
431
+ ): T {
432
+ return { ...g, pos: vec3Rot(vec3Add(g.pos, origin), origin, rot), rot: vec3RotCombine(rot, g.rot ?? vec3Zero) };
433
+ }
434
+
435
+ export function sphereRotTrans(s: Sphere, origin: Vec3, rot: Vec3): Sphere {
436
+ return { ...s, pos: vec3Rot(vec3Add(s.pos, origin), origin, rot) };
437
+ }
438
+
439
+ export const lineRot = (l: Line, origin: Vec3, rot: Vec3): Line => ({
440
+ ...l,
441
+ start: vec3Rot(l.start, origin, rot),
442
+ end: vec3Rot(l.end, origin, rot),
443
+ });
444
+ export const lineTrans = (l: Line, translation: Vec3): Line => ({
445
+ ...l,
446
+ start: vec3Add(l.start, translation),
447
+ end: vec3Add(l.end, translation),
448
+ });
449
+ export const lineRotTrans = (l: Line, origin: Vec3, rot: Vec3): Line => ({
450
+ ...l,
451
+ start: vec3TransRot(l.start, origin, rot),
452
+ end: vec3Rot(l.end, origin, rot),
453
+ });
454
+
455
+ export const polygonRot = (p: Polygon, origin: Vec3, rot: Vec3): Polygon => ({
456
+ ...p,
457
+ points: p.points.map((p) => vec3Rot(p, origin, rot)),
458
+ });
459
+ export const polygonTrans = (p: Polygon, translation: Vec3): Polygon => ({
460
+ ...p,
461
+ points: p.points.map((p) => vec3Add(p, translation)),
462
+ });
463
+ export const polygonRotTrans = (p: Polygon, origin: Vec3, rot: Vec3): Polygon => ({
464
+ ...p,
465
+ points: p.points.map((p) => vec3TransRot(p, origin, rot)),
466
+ });
467
+
468
+ // -- Constructors
469
+
470
+ export const group = (
471
+ meshes: ReadonlyArray<Mesh>,
472
+ pos = vec3Zero,
473
+ rot = vec3Zero,
474
+ groups = Array<Group>(),
475
+ data = {},
476
+ animation: Animation | undefined = undefined
477
+ ): Group => ({ meshes, pos, rot, data, groups, animation: animation! });
478
+
479
+ export const boxMesh = (box: Box, material: Material): Mesh => ({ geometry: box, material });
480
+ export const boxGeometry = (
481
+ size: Vec3,
482
+ pos: Vec3 = vec3Zero,
483
+ rot = vec3Zero,
484
+ holes: ReadonlyArray<Hole> = []
485
+ ): Box => ({
486
+ type: "Box",
487
+ pos,
488
+ rot,
489
+ size,
490
+ holes,
491
+ });
492
+ export const box = (
493
+ size: Vec3,
494
+ material: Material,
495
+ pos: Vec3 = vec3Zero,
496
+ rot = vec3Zero,
497
+ holes: ReadonlyArray<Hole> = []
498
+ ): BoxMesh => ({
499
+ geometry: { type: "Box", pos, rot, size, holes },
500
+ material,
501
+ });
502
+
503
+ export const roundHole = (pos: Vec2, radius: number): Hole => ({ type: "RoundHole", pos, radius });
504
+ export const squareHole = (pos: Vec2, size: Vec2): Hole => ({ type: "SquareHole", pos, size });
505
+
506
+ export const plane = (
507
+ pos: Vec3,
508
+ size: Vec2,
509
+ material: Material,
510
+ rot = vec3Zero,
511
+ holes: ReadonlyArray<Hole> = []
512
+ ): PlaneMesh => ({
513
+ geometry: { type: "Plane", pos, rot, size, holes },
514
+ material,
515
+ });
516
+
517
+ export const cone = (pos: Vec3, radius: number, length: number, material: Material, rot = vec3Zero): ConeMesh => ({
518
+ geometry: { type: "Cone", pos, radius, length, rot },
519
+ material,
520
+ });
521
+
522
+ export const cylinder = (
523
+ pos: Vec3,
524
+ radius: number,
525
+ length: number,
526
+ material: Material,
527
+ rot = vec3Zero,
528
+ holes: ReadonlyArray<Hole> = []
529
+ ): CylinderMesh => ({ geometry: { type: "Cylinder", pos, radius, length, rot, holes }, material });
530
+
531
+ export const sphere = (radius: number, material: Material, pos = vec3Zero): SphereMesh => ({
532
+ geometry: { type: "Sphere", pos, radius },
533
+ material,
534
+ });
535
+
536
+ export const shape = (
537
+ points: ReadonlyArray<Vec2>,
538
+ pos: Vec3,
539
+ material: Material,
540
+ thickness = 0,
541
+ rot = vec3Zero,
542
+ holes: ReadonlyArray<Hole> = []
543
+ ): ShapeMesh => ({ geometry: { type: "Shape", points, pos, rot, thickness, holes }, material });
544
+
545
+ export const polygon = (
546
+ points: ReadonlyArray<Vec3>,
547
+ material: Material,
548
+ pos = vec3Zero,
549
+ rot = vec3Zero
550
+ ): PolygonMesh => ({
551
+ geometry: { type: "Polygon", points, pos, rot },
552
+ material,
553
+ });
554
+
555
+ export const lineMesh = (line: Line, material: Material): Mesh => ({ geometry: line, material });
556
+ export const lineGeo = (start: Vec3, end: Vec3, thickness: number): Line => ({ type: "Line", start, end, thickness });
557
+ export const line = (start: Vec3, end: Vec3, thickness: number, material: Material): LineMesh => ({
558
+ geometry: { type: "Line", start, end, thickness },
559
+ material,
560
+ });
561
+
562
+ export const text = (pos: Vec3, text: string, fontSize: number, material: Material, rot = vec3Zero): TextMesh => ({
563
+ geometry: { type: "Text", pos, text, fontSize, rot },
564
+ material,
565
+ });
566
+
567
+ export const tube = (curve: Curve, radius: number, material: Material, pos: Vec3 = vec3Zero, rot = vec3Zero): Mesh => ({
568
+ geometry: { type: "Tube", curve, radius, pos, rot },
569
+ material,
570
+ });
571
+
572
+ export const circleCurve = (radius: number, angleStart: number, angleLength: number): CircleCurve => ({
573
+ type: "CircleCurve",
574
+ radius,
575
+ angleLength,
576
+ angleStart,
577
+ });
578
+ export const splineCurve = (points: ReadonlyArray<Vec3>): SplineCurve => ({ type: "SplineCurve", points });
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./renderers";
2
+ export * from "./abstract-3d";