@snaptrude/plugin-core 0.3.0 → 0.5.0

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 (266) hide show
  1. package/AGENTS.md +130 -48
  2. package/CHANGELOG.md +111 -0
  3. package/api-manifest.full.json +3999 -0
  4. package/api-manifest.json +3845 -0
  5. package/dist/api/core/buildings.d.ts +427 -0
  6. package/dist/api/core/buildings.d.ts.map +1 -0
  7. package/dist/api/core/comment/index.d.ts +230 -0
  8. package/dist/api/core/comment/index.d.ts.map +1 -0
  9. package/dist/api/core/geom/create/index.d.ts +247 -0
  10. package/dist/api/core/geom/create/index.d.ts.map +1 -0
  11. package/dist/api/core/geom/delete/index.d.ts +72 -0
  12. package/dist/api/core/geom/delete/index.d.ts.map +1 -0
  13. package/dist/api/core/geom/index.d.ts +24 -23
  14. package/dist/api/core/geom/index.d.ts.map +1 -1
  15. package/dist/api/core/geom/query/arc.d.ts +169 -0
  16. package/dist/api/core/geom/query/arc.d.ts.map +1 -0
  17. package/dist/api/core/geom/query/brep.d.ts +402 -0
  18. package/dist/api/core/geom/query/brep.d.ts.map +1 -0
  19. package/dist/api/core/geom/query/circle.d.ts +378 -0
  20. package/dist/api/core/geom/query/circle.d.ts.map +1 -0
  21. package/dist/api/core/geom/query/contour.d.ts +450 -0
  22. package/dist/api/core/geom/query/contour.d.ts.map +1 -0
  23. package/dist/api/core/geom/query/curve.d.ts +918 -0
  24. package/dist/api/core/geom/query/curve.d.ts.map +1 -0
  25. package/dist/api/core/geom/query/edge.d.ts +128 -0
  26. package/dist/api/core/geom/query/edge.d.ts.map +1 -0
  27. package/dist/api/core/geom/query/face.d.ts +363 -0
  28. package/dist/api/core/geom/query/face.d.ts.map +1 -0
  29. package/dist/api/core/geom/query/halfedge.d.ts +206 -0
  30. package/dist/api/core/geom/query/halfedge.d.ts.map +1 -0
  31. package/dist/api/core/geom/query/index.d.ts +61 -0
  32. package/dist/api/core/geom/query/index.d.ts.map +1 -0
  33. package/dist/api/core/geom/query/profile.d.ts +410 -0
  34. package/dist/api/core/geom/query/profile.d.ts.map +1 -0
  35. package/dist/api/core/geom/query/vertex.d.ts +187 -0
  36. package/dist/api/core/geom/query/vertex.d.ts.map +1 -0
  37. package/dist/api/core/geom/update/contour.d.ts +272 -0
  38. package/dist/api/core/geom/update/contour.d.ts.map +1 -0
  39. package/dist/api/core/geom/update/curve.d.ts +180 -0
  40. package/dist/api/core/geom/update/curve.d.ts.map +1 -0
  41. package/dist/api/core/geom/update/index.d.ts +27 -0
  42. package/dist/api/core/geom/update/index.d.ts.map +1 -0
  43. package/dist/api/core/geom/update/profile.d.ts +329 -0
  44. package/dist/api/core/geom/update/profile.d.ts.map +1 -0
  45. package/dist/api/core/groups.d.ts +485 -0
  46. package/dist/api/core/groups.d.ts.map +1 -0
  47. package/dist/api/core/history/index.d.ts +78 -0
  48. package/dist/api/core/history/index.d.ts.map +1 -0
  49. package/dist/api/core/index.d.ts +46 -1
  50. package/dist/api/core/index.d.ts.map +1 -1
  51. package/dist/api/core/layers.d.ts +402 -0
  52. package/dist/api/core/layers.d.ts.map +1 -0
  53. package/dist/api/core/math/quat.d.ts +111 -128
  54. package/dist/api/core/math/quat.d.ts.map +1 -1
  55. package/dist/api/core/math/vec3.d.ts +120 -102
  56. package/dist/api/core/math/vec3.d.ts.map +1 -1
  57. package/dist/api/core/project/index.d.ts +399 -0
  58. package/dist/api/core/project/index.d.ts.map +1 -0
  59. package/dist/api/core/tags.d.ts +755 -0
  60. package/dist/api/core/tags.d.ts.map +1 -0
  61. package/dist/api/core/units/index.d.ts +175 -0
  62. package/dist/api/core/units/index.d.ts.map +1 -0
  63. package/dist/api/core/zoom/index.d.ts +45 -0
  64. package/dist/api/core/zoom/index.d.ts.map +1 -0
  65. package/dist/api/design/boolean/index.d.ts +168 -0
  66. package/dist/api/design/boolean/index.d.ts.map +1 -0
  67. package/dist/api/design/create/index.d.ts +828 -0
  68. package/dist/api/design/create/index.d.ts.map +1 -0
  69. package/dist/api/design/delete/index.d.ts +63 -0
  70. package/dist/api/design/delete/index.d.ts.map +1 -0
  71. package/dist/api/design/doors/index.d.ts +268 -0
  72. package/dist/api/design/doors/index.d.ts.map +1 -0
  73. package/dist/api/design/edit/index.d.ts +49 -0
  74. package/dist/api/design/edit/index.d.ts.map +1 -0
  75. package/dist/api/design/erase/index.d.ts +160 -0
  76. package/dist/api/design/erase/index.d.ts.map +1 -0
  77. package/dist/api/design/furniture/index.d.ts +123 -0
  78. package/dist/api/design/furniture/index.d.ts.map +1 -0
  79. package/dist/api/design/index.d.ts +153 -0
  80. package/dist/api/design/index.d.ts.map +1 -0
  81. package/dist/api/design/lock.d.ts +41 -0
  82. package/dist/api/design/lock.d.ts.map +1 -0
  83. package/dist/api/design/materials/index.d.ts +297 -0
  84. package/dist/api/design/materials/index.d.ts.map +1 -0
  85. package/dist/api/design/query/geometry/index.d.ts +140 -0
  86. package/dist/api/design/query/geometry/index.d.ts.map +1 -0
  87. package/dist/api/design/query/index.d.ts +1011 -0
  88. package/dist/api/design/query/index.d.ts.map +1 -0
  89. package/dist/api/design/query/spaces.d.ts +221 -0
  90. package/dist/api/design/query/spaces.d.ts.map +1 -0
  91. package/dist/api/design/selection/index.d.ts +138 -0
  92. package/dist/api/design/selection/index.d.ts.map +1 -0
  93. package/dist/api/design/shared.d.ts +38 -0
  94. package/dist/api/design/shared.d.ts.map +1 -0
  95. package/dist/api/design/transform/index.d.ts +87 -0
  96. package/dist/api/design/transform/index.d.ts.map +1 -0
  97. package/dist/api/design/update/index.d.ts +178 -0
  98. package/dist/api/design/update/index.d.ts.map +1 -0
  99. package/dist/api/design/windows/index.d.ts +189 -0
  100. package/dist/api/design/windows/index.d.ts.map +1 -0
  101. package/dist/api/entity/buildableEnvelope.d.ts +261 -0
  102. package/dist/api/entity/buildableEnvelope.d.ts.map +1 -0
  103. package/dist/api/entity/department.d.ts +0 -98
  104. package/dist/api/entity/department.d.ts.map +1 -1
  105. package/dist/api/entity/index.d.ts +9 -9
  106. package/dist/api/entity/index.d.ts.map +1 -1
  107. package/dist/api/entity/referenceLine.d.ts +49 -106
  108. package/dist/api/entity/referenceLine.d.ts.map +1 -1
  109. package/dist/api/entity/space.d.ts +482 -249
  110. package/dist/api/entity/space.d.ts.map +1 -1
  111. package/dist/api/entity/story.d.ts +49 -39
  112. package/dist/api/entity/story.d.ts.map +1 -1
  113. package/dist/api/index.d.ts +17 -12
  114. package/dist/api/index.d.ts.map +1 -1
  115. package/dist/api/presentation/aiInspiration.d.ts +440 -0
  116. package/dist/api/presentation/aiInspiration.d.ts.map +1 -0
  117. package/dist/api/presentation/diagrams.d.ts +81 -0
  118. package/dist/api/presentation/diagrams.d.ts.map +1 -0
  119. package/dist/api/presentation/import.d.ts +113 -0
  120. package/dist/api/presentation/import.d.ts.map +1 -0
  121. package/dist/api/presentation/index.d.ts +46 -0
  122. package/dist/api/presentation/index.d.ts.map +1 -0
  123. package/dist/api/presentation/sheets.d.ts +176 -0
  124. package/dist/api/presentation/sheets.d.ts.map +1 -0
  125. package/dist/api/presentation/views.d.ts +296 -0
  126. package/dist/api/presentation/views.d.ts.map +1 -0
  127. package/dist/api/program/adjacency.d.ts +155 -0
  128. package/dist/api/program/adjacency.d.ts.map +1 -0
  129. package/dist/api/program/areas.d.ts +360 -0
  130. package/dist/api/program/areas.d.ts.map +1 -0
  131. package/dist/api/program/classification.d.ts +135 -0
  132. package/dist/api/program/classification.d.ts.map +1 -0
  133. package/dist/api/program/cores.d.ts +174 -0
  134. package/dist/api/program/cores.d.ts.map +1 -0
  135. package/dist/api/program/departments.d.ts +431 -0
  136. package/dist/api/program/departments.d.ts.map +1 -0
  137. package/dist/api/program/index.d.ts +69 -0
  138. package/dist/api/program/index.d.ts.map +1 -0
  139. package/dist/api/program/layout.d.ts +63 -0
  140. package/dist/api/program/layout.d.ts.map +1 -0
  141. package/dist/api/program/metrics.d.ts +108 -0
  142. package/dist/api/program/metrics.d.ts.map +1 -0
  143. package/dist/api/program/site.d.ts +367 -0
  144. package/dist/api/program/site.d.ts.map +1 -0
  145. package/dist/api/program/spreadsheet.d.ts +2041 -0
  146. package/dist/api/program/spreadsheet.d.ts.map +1 -0
  147. package/dist/handles.d.ts +138 -0
  148. package/dist/handles.d.ts.map +1 -0
  149. package/dist/host-utils.d.ts +7 -5
  150. package/dist/host-utils.d.ts.map +1 -1
  151. package/dist/index.cjs +4001 -904
  152. package/dist/index.cjs.map +1 -1
  153. package/dist/index.d.ts +1 -0
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +3392 -870
  156. package/dist/index.js.map +1 -1
  157. package/package.json +6 -2
  158. package/scripts/generate-manifest.mjs +193 -0
  159. package/scripts/generate-manifest.test.mjs +193 -0
  160. package/src/api/core/buildings.ts +485 -0
  161. package/src/api/core/comment/index.ts +258 -0
  162. package/src/api/core/geom/create/index.ts +293 -0
  163. package/src/api/core/geom/delete/index.ts +78 -0
  164. package/src/api/core/geom/index.ts +24 -23
  165. package/src/api/core/geom/query/arc.ts +169 -0
  166. package/src/api/core/geom/query/brep.ts +444 -0
  167. package/src/api/core/geom/query/circle.ts +404 -0
  168. package/src/api/core/geom/query/contour.ts +540 -0
  169. package/src/api/core/geom/query/curve.ts +1078 -0
  170. package/src/api/core/geom/query/edge.ts +130 -0
  171. package/src/api/core/geom/query/face.ts +403 -0
  172. package/src/api/core/geom/query/halfedge.ts +210 -0
  173. package/src/api/core/geom/query/index.ts +63 -0
  174. package/src/api/core/geom/query/profile.ts +473 -0
  175. package/src/api/core/geom/query/vertex.ts +205 -0
  176. package/src/api/core/geom/update/contour.ts +315 -0
  177. package/src/api/core/geom/update/curve.ts +209 -0
  178. package/src/api/core/geom/update/index.ts +29 -0
  179. package/src/api/core/geom/update/profile.ts +377 -0
  180. package/src/api/core/groups.ts +521 -0
  181. package/src/api/core/history/index.ts +84 -0
  182. package/src/api/core/index.ts +46 -1
  183. package/src/api/core/layers.ts +333 -0
  184. package/src/api/core/math/quat.ts +112 -235
  185. package/src/api/core/math/vec3.ts +124 -159
  186. package/src/api/core/project/index.ts +418 -0
  187. package/src/api/core/tags.ts +808 -0
  188. package/src/api/core/units/index.ts +164 -0
  189. package/src/api/core/zoom/index.ts +47 -0
  190. package/src/api/design/boolean/index.ts +179 -0
  191. package/src/api/design/create/index.ts +886 -0
  192. package/src/api/design/delete/index.ts +67 -0
  193. package/src/api/design/doors/index.ts +285 -0
  194. package/src/api/design/edit/index.ts +54 -0
  195. package/src/api/design/erase/index.ts +151 -0
  196. package/src/api/design/furniture/index.ts +130 -0
  197. package/src/api/design/index.ts +162 -0
  198. package/src/api/design/lock.ts +42 -0
  199. package/src/api/design/materials/index.ts +301 -0
  200. package/src/api/design/query/geometry/index.ts +166 -0
  201. package/src/api/design/query/index.ts +937 -0
  202. package/src/api/design/query/spaces.ts +132 -0
  203. package/src/api/design/selection/index.ts +144 -0
  204. package/src/api/design/shared.ts +40 -0
  205. package/src/api/design/transform/index.ts +93 -0
  206. package/src/api/design/update/index.ts +117 -0
  207. package/src/api/design/windows/index.ts +207 -0
  208. package/src/api/entity/buildableEnvelope.ts +318 -0
  209. package/src/api/entity/department.ts +0 -113
  210. package/src/api/entity/index.ts +9 -9
  211. package/src/api/entity/referenceLine.ts +50 -38
  212. package/src/api/entity/space.ts +285 -226
  213. package/src/api/entity/story.ts +53 -42
  214. package/src/api/index.ts +17 -12
  215. package/src/api/presentation/aiInspiration.ts +362 -0
  216. package/src/api/presentation/diagrams.ts +84 -0
  217. package/src/api/presentation/import.ts +112 -0
  218. package/src/api/presentation/index.ts +48 -0
  219. package/src/api/presentation/sheets.ts +198 -0
  220. package/src/api/presentation/views.ts +303 -0
  221. package/src/api/program/adjacency.ts +164 -0
  222. package/src/api/program/areas.ts +335 -0
  223. package/src/api/program/classification.ts +138 -0
  224. package/src/api/program/cores.ts +171 -0
  225. package/src/api/program/departments.ts +465 -0
  226. package/src/api/program/index.ts +71 -0
  227. package/src/api/program/layout.ts +68 -0
  228. package/src/api/program/metrics.ts +120 -0
  229. package/src/api/program/site.ts +326 -0
  230. package/src/api/program/spreadsheet.ts +2075 -0
  231. package/src/handles.ts +148 -0
  232. package/src/host-utils.ts +10 -6
  233. package/src/index.ts +1 -0
  234. package/dist/api/core/geom/arc.d.ts +0 -81
  235. package/dist/api/core/geom/arc.d.ts.map +0 -1
  236. package/dist/api/core/geom/curve.d.ts +0 -70
  237. package/dist/api/core/geom/curve.d.ts.map +0 -1
  238. package/dist/api/core/geom/line.d.ts +0 -56
  239. package/dist/api/core/geom/line.d.ts.map +0 -1
  240. package/dist/api/core/geom/profile.d.ts +0 -121
  241. package/dist/api/core/geom/profile.d.ts.map +0 -1
  242. package/dist/api/tools/copy.d.ts +0 -59
  243. package/dist/api/tools/copy.d.ts.map +0 -1
  244. package/dist/api/tools/index.d.ts +0 -33
  245. package/dist/api/tools/index.d.ts.map +0 -1
  246. package/dist/api/tools/material.d.ts +0 -51
  247. package/dist/api/tools/material.d.ts.map +0 -1
  248. package/dist/api/tools/offset.d.ts +0 -43
  249. package/dist/api/tools/offset.d.ts.map +0 -1
  250. package/dist/api/tools/selection.d.ts +0 -48
  251. package/dist/api/tools/selection.d.ts.map +0 -1
  252. package/dist/api/tools/transform.d.ts +0 -114
  253. package/dist/api/tools/transform.d.ts.map +0 -1
  254. package/dist/api/units/index.d.ts +0 -163
  255. package/dist/api/units/index.d.ts.map +0 -1
  256. package/src/api/core/geom/arc.ts +0 -70
  257. package/src/api/core/geom/curve.ts +0 -41
  258. package/src/api/core/geom/line.ts +0 -53
  259. package/src/api/core/geom/profile.ts +0 -94
  260. package/src/api/tools/copy.ts +0 -55
  261. package/src/api/tools/index.ts +0 -39
  262. package/src/api/tools/material.ts +0 -49
  263. package/src/api/tools/offset.ts +0 -43
  264. package/src/api/tools/selection.ts +0 -51
  265. package/src/api/tools/transform.ts +0 -117
  266. package/src/api/units/index.ts +0 -163
@@ -1,214 +1,179 @@
1
- import * as z from "zod"
1
+ import { PluginApiReturn } from "../../../types"
2
+ import { Vec3Handle, Vec3Components } from "../../../handles"
2
3
 
3
4
  /**
4
- * 3D vector operations for positions, directions, and displacements.
5
+ * 3D vector operations (all-handle model, §11).
5
6
  *
6
- * All methods are **pure** — they return new {@linkcode PVec3} values
7
- * without mutating the inputs.
8
- *
9
- * Accessed via `snaptrude.core.math.vec3`.
7
+ * Vectors are opaque {@linkcode Vec3Handle}s; every operation is a host call
8
+ * returning a new handle (vectors are immutable). Read primitive components back
9
+ * with {@linkcode PluginVec3Api.components}. Accessed via `snaptrude.core.math.vec3`.
10
10
  */
11
11
  export abstract class PluginVec3Api {
12
12
  constructor() {}
13
13
 
14
14
  /**
15
- * Create a new 3D vector.
16
- *
17
- * @param x - The X component
18
- * @param y - The Y component
19
- * @param z - The Z component
20
- * @returns A new {@linkcode PVec3}
15
+ * Create a vector from primitive components.
21
16
  *
22
17
  * # Example
23
18
  * ```ts
24
- * const position = snaptrude.core.math.vec3.new(1, 2, 3)
25
- * // { x: 1, y: 2, z: 3 }
19
+ * const v = await snaptrude.core.math.vec3.new(10, 0, 5)
20
+ * const { x, y, z } = await snaptrude.core.math.vec3.components(v)
26
21
  * ```
27
22
  */
28
- new(x: number, y: number, z: number): PVec3 {
29
- return { x, y, z }
30
- }
31
-
23
+ abstract new(x: number, y: number, z: number): PluginApiReturn<Vec3Handle>
32
24
  /**
33
- * Add two vectors component-wise.
25
+ * Add two vectors component-wise (`a + b`).
34
26
  *
35
- * @param a - First vector
36
- * @param b - Second vector
37
- * @returns A new {@linkcode PVec3} where each component is `a[i] + b[i]`
27
+ * # Example
28
+ * ```ts
29
+ * const a = await snaptrude.core.math.vec3.new(1, 0, 0)
30
+ * const b = await snaptrude.core.math.vec3.new(0, 1, 0)
31
+ * const sum = await snaptrude.core.math.vec3.add(a, b)
32
+ * ```
38
33
  */
39
- add(a: PVec3, b: PVec3): PVec3 {
40
- return { x: a.x + b.x, y: a.y + b.y, z: a.z + b.z }
41
- }
42
-
34
+ abstract add(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<Vec3Handle>
43
35
  /**
44
- * Subtract vector {@linkcode b} from vector {@linkcode a} component-wise.
36
+ * Subtract vector `b` from `a` component-wise (`a - b`).
45
37
  *
46
- * @param a - Vector to subtract from
47
- * @param b - Vector to subtract
48
- * @returns A new {@linkcode PVec3} where each component is `a[i] - b[i]`
38
+ * # Example
39
+ * ```ts
40
+ * const a = await snaptrude.core.math.vec3.new(3, 2, 1)
41
+ * const b = await snaptrude.core.math.vec3.new(1, 1, 1)
42
+ * const diff = await snaptrude.core.math.vec3.subtract(a, b)
43
+ * ```
49
44
  */
50
- subtract(a: PVec3, b: PVec3): PVec3 {
51
- return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z }
52
- }
53
-
45
+ abstract subtract(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<Vec3Handle>
54
46
  /**
55
- * Scale a vector by a scalar value.
47
+ * Scale `v` by a scalar.
56
48
  *
57
- * @param v - The vector to scale
58
- * @param scalar - The scalar multiplier
59
- * @returns A new {@linkcode PVec3} where each component is `v[i] * scalar`
49
+ * # Example
50
+ * ```ts
51
+ * const v = await snaptrude.core.math.vec3.new(1, 2, 3)
52
+ * const doubled = await snaptrude.core.math.vec3.scale(v, 2)
53
+ * ```
60
54
  */
61
- scale(v: PVec3, scalar: number): PVec3 {
62
- return { x: v.x * scalar, y: v.y * scalar, z: v.z * scalar }
63
- }
64
-
55
+ abstract scale(v: Vec3Handle, scalar: number): PluginApiReturn<Vec3Handle>
65
56
  /**
66
57
  * Compute the dot product of two vectors.
67
58
  *
68
- * The dot product equals `|a| * |b| * cos(θ)` where `θ` is the angle
69
- * between the vectors. Useful for checking orthogonality (result = 0)
70
- * or projection.
71
- *
72
- * @param a - First vector
73
- * @param b - Second vector
74
- * @returns The scalar dot product
59
+ * # Example
60
+ * ```ts
61
+ * const a = await snaptrude.core.math.vec3.new(1, 0, 0)
62
+ * const b = await snaptrude.core.math.vec3.new(0.5, 0.5, 0)
63
+ * const d = await snaptrude.core.math.vec3.dot(a, b) // 0.5
64
+ * ```
75
65
  */
76
- dot(a: PVec3, b: PVec3): number {
77
- return a.x * b.x + a.y * b.y + a.z * b.z
78
- }
79
-
66
+ abstract dot(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<number>
80
67
  /**
81
- * Compute the cross product of two vectors.
68
+ * Compute the cross product `a × b` — the vector perpendicular to both.
82
69
  *
83
- * The result is a vector perpendicular to both inputs, with magnitude
84
- * equal to the area of the parallelogram they span. Useful for computing
85
- * surface normals.
86
- *
87
- * @param a - First vector
88
- * @param b - Second vector
89
- * @returns A new {@linkcode PVec3} perpendicular to both {@linkcode a} and {@linkcode b}
70
+ * # Example
71
+ * ```ts
72
+ * const a = await snaptrude.core.math.vec3.new(1, 0, 0)
73
+ * const b = await snaptrude.core.math.vec3.new(0, 1, 0)
74
+ * const perpendicular = await snaptrude.core.math.vec3.cross(a, b)
75
+ * ```
90
76
  */
91
- cross(a: PVec3, b: PVec3): PVec3 {
92
- return {
93
- x: a.y * b.z - a.z * b.y,
94
- y: a.z * b.x - a.x * b.z,
95
- z: a.x * b.y - a.y * b.x,
96
- }
97
- }
98
-
77
+ abstract cross(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<Vec3Handle>
99
78
  /**
100
- * Compute the length (magnitude) of a vector.
79
+ * Compute the Euclidean length (magnitude) of a vector.
101
80
  *
102
- * @param v - The vector
103
- * @returns The Euclidean length `√(x² + y² + z²)`
81
+ * # Example
82
+ * ```ts
83
+ * const v = await snaptrude.core.math.vec3.new(3, 4, 0)
84
+ * const len = await snaptrude.core.math.vec3.length(v) // 5
85
+ * ```
104
86
  */
105
- length(v: PVec3): number {
106
- return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)
107
- }
108
-
87
+ abstract length(v: Vec3Handle): PluginApiReturn<number>
109
88
  /**
110
- * Compute the squared length of a vector.
111
- *
112
- * Avoids the `sqrt` call — prefer this over {@linkcode PluginVec3Api.length}
113
- * when comparing relative magnitudes.
89
+ * Compute the squared Euclidean length of a vector (avoids the sqrt).
114
90
  *
115
- * @param v - The vector
116
- * @returns The squared length `x² + y² + z²`
91
+ * # Example
92
+ * ```ts
93
+ * const v = await snaptrude.core.math.vec3.new(3, 4, 0)
94
+ * const sq = await snaptrude.core.math.vec3.lengthSquared(v) // 25
95
+ * ```
117
96
  */
118
- lengthSquared(v: PVec3): number {
119
- return v.x * v.x + v.y * v.y + v.z * v.z
120
- }
121
-
97
+ abstract lengthSquared(v: Vec3Handle): PluginApiReturn<number>
122
98
  /**
123
- * Normalize a vector to unit length.
99
+ * Return the unit vector in the same direction (the zero vector if length is 0).
124
100
  *
125
- * @param v - The vector to normalize
126
- * @returns A new unit-length {@linkcode PVec3} in the same direction,
127
- * or a zero vector `(0, 0, 0)` if the input has zero length
101
+ * # Example
102
+ * ```ts
103
+ * const v = await snaptrude.core.math.vec3.new(0, 0, 10)
104
+ * const unit = await snaptrude.core.math.vec3.normalize(v) // (0, 0, 1)
105
+ * ```
128
106
  */
129
- normalize(v: PVec3): PVec3 {
130
- const len = this.length(v)
131
- if (len === 0) return { x: 0, y: 0, z: 0 }
132
- return { x: v.x / len, y: v.y / len, z: v.z / len }
133
- }
134
-
107
+ abstract normalize(v: Vec3Handle): PluginApiReturn<Vec3Handle>
135
108
  /**
136
- * Compute the Euclidean distance between two points.
109
+ * Measure the straight-line (Euclidean) distance between two points.
110
+ *
111
+ * @examplePrompt What is the distance between these two points?
112
+ * @examplePrompt Measure how far apart these two points are
137
113
  *
138
- * @param a - First point
139
- * @param b - Second point
140
- * @returns The distance `|a - b|`
114
+ * # Example
115
+ * ```ts
116
+ * const a = await snaptrude.core.math.vec3.new(0, 0, 0)
117
+ * const b = await snaptrude.core.math.vec3.new(3, 4, 0)
118
+ * const dist = await snaptrude.core.math.vec3.distance(a, b) // 5
119
+ * ```
141
120
  */
142
- distance(a: PVec3, b: PVec3): number {
143
- return this.length(this.subtract(a, b))
144
- }
145
-
121
+ abstract distance(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<number>
146
122
  /**
147
- * Linearly interpolate between two vectors.
123
+ * Linearly interpolate between two vectors: `a + (b - a) * t`.
148
124
  *
149
- * @param a - Start vector (returned when `t = 0`)
150
- * @param b - End vector (returned when `t = 1`)
151
- * @param t - Interpolation factor, typically in `[0, 1]`
152
- * @returns A new {@linkcode PVec3} at `a + (b - a) * t`
125
+ * # Example
126
+ * ```ts
127
+ * const a = await snaptrude.core.math.vec3.new(0, 0, 0)
128
+ * const b = await snaptrude.core.math.vec3.new(10, 0, 0)
129
+ * const midpoint = await snaptrude.core.math.vec3.lerp(a, b, 0.5)
130
+ * ```
153
131
  */
154
- lerp(a: PVec3, b: PVec3, t: number): PVec3 {
155
- return {
156
- x: a.x + (b.x - a.x) * t,
157
- y: a.y + (b.y - a.y) * t,
158
- z: a.z + (b.z - a.z) * t,
159
- }
160
- }
161
-
132
+ abstract lerp(a: Vec3Handle, b: Vec3Handle, t: number): PluginApiReturn<Vec3Handle>
162
133
  /**
163
- * Negate a vector (reverse its direction).
134
+ * Negate a vector, reversing its direction.
164
135
  *
165
- * @param v - The vector to negate
166
- * @returns A new {@linkcode PVec3} with all components negated
136
+ * # Example
137
+ * ```ts
138
+ * const v = await snaptrude.core.math.vec3.new(1, -2, 3)
139
+ * const reversed = await snaptrude.core.math.vec3.negate(v) // (-1, 2, -3)
140
+ * ```
167
141
  */
168
- negate(v: PVec3): PVec3 {
169
- return { x: -v.x, y: -v.y, z: -v.z }
170
- }
171
-
142
+ abstract negate(v: Vec3Handle): PluginApiReturn<Vec3Handle>
172
143
  /**
173
- * Check if two vectors are exactly equal (strict equality per component).
144
+ * Test whether two vectors have exactly equal components.
174
145
  *
175
- * For floating-point comparisons, prefer {@linkcode PluginVec3Api.equalsApprox}.
146
+ * # Example
147
+ * ```ts
148
+ * const a = await snaptrude.core.math.vec3.new(1, 2, 3)
149
+ * const b = await snaptrude.core.math.vec3.new(1, 2, 3)
150
+ * const same = await snaptrude.core.math.vec3.equals(a, b) // true
151
+ * ```
152
+ */
153
+ abstract equals(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<boolean>
154
+ /**
155
+ * Test whether two vectors are equal within a tolerance `epsilon` (default `1e-6`).
176
156
  *
177
- * @param a - First vector
178
- * @param b - Second vector
179
- * @returns `true` if all components match exactly
157
+ * # Example
158
+ * ```ts
159
+ * const a = await snaptrude.core.math.vec3.new(1, 2, 3)
160
+ * const b = await snaptrude.core.math.vec3.new(1.0004, 2, 3)
161
+ * const close = await snaptrude.core.math.vec3.equalsApprox(a, b, 1e-3) // true
162
+ * ```
180
163
  */
181
- equals(a: PVec3, b: PVec3): boolean {
182
- return a.x === b.x && a.y === b.y && a.z === b.z
183
- }
184
-
164
+ abstract equalsApprox(
165
+ a: Vec3Handle,
166
+ b: Vec3Handle,
167
+ epsilon?: number,
168
+ ): PluginApiReturn<boolean>
185
169
  /**
186
- * Check if two vectors are approximately equal within a tolerance.
170
+ * Read the primitive `{ x, y, z }` components of a vector handle.
187
171
  *
188
- * @param a - First vector
189
- * @param b - Second vector
190
- * @param epsilon - Maximum allowed difference per component (default `1e-6`)
191
- * @returns `true` if `|a[i] - b[i]| < epsilon` for all components
172
+ * # Example
173
+ * ```ts
174
+ * const v = await snaptrude.core.math.vec3.new(1, 2, 3)
175
+ * const { x, y, z } = await snaptrude.core.math.vec3.components(v)
176
+ * ```
192
177
  */
193
- equalsApprox(a: PVec3, b: PVec3, epsilon: number = 1e-6): boolean {
194
- return (
195
- Math.abs(a.x - b.x) < epsilon &&
196
- Math.abs(a.y - b.y) < epsilon &&
197
- Math.abs(a.z - b.z) < epsilon
198
- )
199
- }
178
+ abstract components(v: Vec3Handle): PluginApiReturn<Vec3Components>
200
179
  }
201
-
202
- /**
203
- * A 3D vector with `x`, `y`, and `z` components.
204
- *
205
- * Used throughout the plugin API for positions, directions, displacements,
206
- * and Euler rotation angles. Equivalent to `BABYLON.Vector3`.
207
- */
208
- export const PVec3 = z.object({
209
- x: z.number(),
210
- y: z.number(),
211
- z: z.number(),
212
- })
213
-
214
- export type PVec3 = z.infer<typeof PVec3>