@snaptrude/plugin-core 0.0.0-dev-20260708130115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +227 -0
- package/CHANGELOG.md +119 -0
- package/CLAUDE.md +11 -0
- package/api-manifest.json +5004 -0
- package/dist/api/core/buildings.d.ts +427 -0
- package/dist/api/core/buildings.d.ts.map +1 -0
- package/dist/api/core/comment/index.d.ts +230 -0
- package/dist/api/core/comment/index.d.ts.map +1 -0
- package/dist/api/core/geom/create/index.d.ts +247 -0
- package/dist/api/core/geom/create/index.d.ts.map +1 -0
- package/dist/api/core/geom/delete/index.d.ts +72 -0
- package/dist/api/core/geom/delete/index.d.ts.map +1 -0
- package/dist/api/core/geom/index.d.ts +33 -0
- package/dist/api/core/geom/index.d.ts.map +1 -0
- package/dist/api/core/geom/query/arc.d.ts +169 -0
- package/dist/api/core/geom/query/arc.d.ts.map +1 -0
- package/dist/api/core/geom/query/brep.d.ts +402 -0
- package/dist/api/core/geom/query/brep.d.ts.map +1 -0
- package/dist/api/core/geom/query/circle.d.ts +378 -0
- package/dist/api/core/geom/query/circle.d.ts.map +1 -0
- package/dist/api/core/geom/query/contour.d.ts +450 -0
- package/dist/api/core/geom/query/contour.d.ts.map +1 -0
- package/dist/api/core/geom/query/curve.d.ts +918 -0
- package/dist/api/core/geom/query/curve.d.ts.map +1 -0
- package/dist/api/core/geom/query/edge.d.ts +128 -0
- package/dist/api/core/geom/query/edge.d.ts.map +1 -0
- package/dist/api/core/geom/query/face.d.ts +363 -0
- package/dist/api/core/geom/query/face.d.ts.map +1 -0
- package/dist/api/core/geom/query/halfedge.d.ts +206 -0
- package/dist/api/core/geom/query/halfedge.d.ts.map +1 -0
- package/dist/api/core/geom/query/index.d.ts +61 -0
- package/dist/api/core/geom/query/index.d.ts.map +1 -0
- package/dist/api/core/geom/query/profile.d.ts +410 -0
- package/dist/api/core/geom/query/profile.d.ts.map +1 -0
- package/dist/api/core/geom/query/vertex.d.ts +187 -0
- package/dist/api/core/geom/query/vertex.d.ts.map +1 -0
- package/dist/api/core/geom/update/contour.d.ts +272 -0
- package/dist/api/core/geom/update/contour.d.ts.map +1 -0
- package/dist/api/core/geom/update/curve.d.ts +180 -0
- package/dist/api/core/geom/update/curve.d.ts.map +1 -0
- package/dist/api/core/geom/update/index.d.ts +27 -0
- package/dist/api/core/geom/update/index.d.ts.map +1 -0
- package/dist/api/core/geom/update/profile.d.ts +329 -0
- package/dist/api/core/geom/update/profile.d.ts.map +1 -0
- package/dist/api/core/groups.d.ts +485 -0
- package/dist/api/core/groups.d.ts.map +1 -0
- package/dist/api/core/history/index.d.ts +78 -0
- package/dist/api/core/history/index.d.ts.map +1 -0
- package/dist/api/core/index.d.ts +63 -0
- package/dist/api/core/index.d.ts.map +1 -0
- package/dist/api/core/layers.d.ts +402 -0
- package/dist/api/core/layers.d.ts.map +1 -0
- package/dist/api/core/math/index.d.ts +18 -0
- package/dist/api/core/math/index.d.ts.map +1 -0
- package/dist/api/core/math/quat.d.ts +170 -0
- package/dist/api/core/math/quat.d.ts.map +1 -0
- package/dist/api/core/math/vec3.d.ts +174 -0
- package/dist/api/core/math/vec3.d.ts.map +1 -0
- package/dist/api/core/project/index.d.ts +399 -0
- package/dist/api/core/project/index.d.ts.map +1 -0
- package/dist/api/core/tags.d.ts +755 -0
- package/dist/api/core/tags.d.ts.map +1 -0
- package/dist/api/core/units/index.d.ts +175 -0
- package/dist/api/core/units/index.d.ts.map +1 -0
- package/dist/api/core/zoom/index.d.ts +45 -0
- package/dist/api/core/zoom/index.d.ts.map +1 -0
- package/dist/api/design/boolean/index.d.ts +168 -0
- package/dist/api/design/boolean/index.d.ts.map +1 -0
- package/dist/api/design/create/index.d.ts +828 -0
- package/dist/api/design/create/index.d.ts.map +1 -0
- package/dist/api/design/delete/index.d.ts +63 -0
- package/dist/api/design/delete/index.d.ts.map +1 -0
- package/dist/api/design/doors/index.d.ts +268 -0
- package/dist/api/design/doors/index.d.ts.map +1 -0
- package/dist/api/design/edit/index.d.ts +49 -0
- package/dist/api/design/edit/index.d.ts.map +1 -0
- package/dist/api/design/erase/index.d.ts +160 -0
- package/dist/api/design/erase/index.d.ts.map +1 -0
- package/dist/api/design/furniture/index.d.ts +123 -0
- package/dist/api/design/furniture/index.d.ts.map +1 -0
- package/dist/api/design/index.d.ts +153 -0
- package/dist/api/design/index.d.ts.map +1 -0
- package/dist/api/design/lock.d.ts +41 -0
- package/dist/api/design/lock.d.ts.map +1 -0
- package/dist/api/design/materials/index.d.ts +297 -0
- package/dist/api/design/materials/index.d.ts.map +1 -0
- package/dist/api/design/query/geometry/index.d.ts +140 -0
- package/dist/api/design/query/geometry/index.d.ts.map +1 -0
- package/dist/api/design/query/index.d.ts +1011 -0
- package/dist/api/design/query/index.d.ts.map +1 -0
- package/dist/api/design/query/spaces.d.ts +221 -0
- package/dist/api/design/query/spaces.d.ts.map +1 -0
- package/dist/api/design/selection/index.d.ts +138 -0
- package/dist/api/design/selection/index.d.ts.map +1 -0
- package/dist/api/design/shared.d.ts +38 -0
- package/dist/api/design/shared.d.ts.map +1 -0
- package/dist/api/design/transform/index.d.ts +87 -0
- package/dist/api/design/transform/index.d.ts.map +1 -0
- package/dist/api/design/update/index.d.ts +178 -0
- package/dist/api/design/update/index.d.ts.map +1 -0
- package/dist/api/design/windows/index.d.ts +189 -0
- package/dist/api/design/windows/index.d.ts.map +1 -0
- package/dist/api/entity/buildableEnvelope.d.ts +261 -0
- package/dist/api/entity/buildableEnvelope.d.ts.map +1 -0
- package/dist/api/entity/department.d.ts +1 -0
- package/dist/api/entity/department.d.ts.map +1 -0
- package/dist/api/entity/index.d.ts +28 -0
- package/dist/api/entity/index.d.ts.map +1 -0
- package/dist/api/entity/referenceLine.d.ts +202 -0
- package/dist/api/entity/referenceLine.d.ts.map +1 -0
- package/dist/api/entity/space.d.ts +846 -0
- package/dist/api/entity/space.d.ts.map +1 -0
- package/dist/api/entity/story.d.ts +249 -0
- package/dist/api/entity/story.d.ts.map +1 -0
- package/dist/api/index.d.ts +35 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/presentation/aiInspiration.d.ts +2400 -0
- package/dist/api/presentation/aiInspiration.d.ts.map +1 -0
- package/dist/api/presentation/diagrams.d.ts +81 -0
- package/dist/api/presentation/diagrams.d.ts.map +1 -0
- package/dist/api/presentation/import.d.ts +113 -0
- package/dist/api/presentation/import.d.ts.map +1 -0
- package/dist/api/presentation/index.d.ts +45 -0
- package/dist/api/presentation/index.d.ts.map +1 -0
- package/dist/api/presentation/sheets.d.ts +176 -0
- package/dist/api/presentation/sheets.d.ts.map +1 -0
- package/dist/api/presentation/views.d.ts +296 -0
- package/dist/api/presentation/views.d.ts.map +1 -0
- package/dist/api/program/adjacency.d.ts +155 -0
- package/dist/api/program/adjacency.d.ts.map +1 -0
- package/dist/api/program/areas.d.ts +360 -0
- package/dist/api/program/areas.d.ts.map +1 -0
- package/dist/api/program/classification.d.ts +135 -0
- package/dist/api/program/classification.d.ts.map +1 -0
- package/dist/api/program/cores.d.ts +174 -0
- package/dist/api/program/cores.d.ts.map +1 -0
- package/dist/api/program/departments.d.ts +431 -0
- package/dist/api/program/departments.d.ts.map +1 -0
- package/dist/api/program/index.d.ts +69 -0
- package/dist/api/program/index.d.ts.map +1 -0
- package/dist/api/program/layout.d.ts +63 -0
- package/dist/api/program/layout.d.ts.map +1 -0
- package/dist/api/program/metrics.d.ts +108 -0
- package/dist/api/program/metrics.d.ts.map +1 -0
- package/dist/api/program/site.d.ts +367 -0
- package/dist/api/program/site.d.ts.map +1 -0
- package/dist/api/program/spreadsheet.d.ts +2041 -0
- package/dist/api/program/spreadsheet.d.ts.map +1 -0
- package/dist/handles.d.ts +138 -0
- package/dist/handles.d.ts.map +1 -0
- package/dist/host-utils.d.ts +43 -0
- package/dist/host-utils.d.ts.map +1 -0
- package/dist/index.cjs +4597 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3870 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +39 -0
- package/scripts/generate-manifest.mjs +193 -0
- package/scripts/generate-manifest.test.mjs +193 -0
- package/src/api/core/buildings.ts +485 -0
- package/src/api/core/comment/index.ts +258 -0
- package/src/api/core/geom/create/index.ts +293 -0
- package/src/api/core/geom/delete/index.ts +78 -0
- package/src/api/core/geom/index.ts +35 -0
- package/src/api/core/geom/query/arc.ts +169 -0
- package/src/api/core/geom/query/brep.ts +444 -0
- package/src/api/core/geom/query/circle.ts +404 -0
- package/src/api/core/geom/query/contour.ts +540 -0
- package/src/api/core/geom/query/curve.ts +1078 -0
- package/src/api/core/geom/query/edge.ts +130 -0
- package/src/api/core/geom/query/face.ts +403 -0
- package/src/api/core/geom/query/halfedge.ts +210 -0
- package/src/api/core/geom/query/index.ts +63 -0
- package/src/api/core/geom/query/profile.ts +473 -0
- package/src/api/core/geom/query/vertex.ts +205 -0
- package/src/api/core/geom/update/contour.ts +315 -0
- package/src/api/core/geom/update/curve.ts +209 -0
- package/src/api/core/geom/update/index.ts +29 -0
- package/src/api/core/geom/update/profile.ts +377 -0
- package/src/api/core/groups.ts +521 -0
- package/src/api/core/history/index.ts +84 -0
- package/src/api/core/index.ts +65 -0
- package/src/api/core/layers.ts +333 -0
- package/src/api/core/math/index.ts +20 -0
- package/src/api/core/math/quat.ts +172 -0
- package/src/api/core/math/vec3.ts +179 -0
- package/src/api/core/project/index.ts +418 -0
- package/src/api/core/tags.ts +808 -0
- package/src/api/core/units/index.ts +164 -0
- package/src/api/core/zoom/index.ts +47 -0
- package/src/api/design/boolean/index.ts +179 -0
- package/src/api/design/create/index.ts +886 -0
- package/src/api/design/delete/index.ts +67 -0
- package/src/api/design/doors/index.ts +285 -0
- package/src/api/design/edit/index.ts +54 -0
- package/src/api/design/erase/index.ts +151 -0
- package/src/api/design/furniture/index.ts +130 -0
- package/src/api/design/index.ts +162 -0
- package/src/api/design/lock.ts +42 -0
- package/src/api/design/materials/index.ts +301 -0
- package/src/api/design/query/geometry/index.ts +166 -0
- package/src/api/design/query/index.ts +937 -0
- package/src/api/design/query/spaces.ts +132 -0
- package/src/api/design/selection/index.ts +144 -0
- package/src/api/design/shared.ts +40 -0
- package/src/api/design/transform/index.ts +93 -0
- package/src/api/design/update/index.ts +117 -0
- package/src/api/design/windows/index.ts +207 -0
- package/src/api/entity/buildableEnvelope.ts +318 -0
- package/src/api/entity/department.ts +0 -0
- package/src/api/entity/index.ts +30 -0
- package/src/api/entity/referenceLine.ts +227 -0
- package/src/api/entity/space.ts +612 -0
- package/src/api/entity/story.ts +273 -0
- package/src/api/index.ts +37 -0
- package/src/api/presentation/aiInspiration.ts +1116 -0
- package/src/api/presentation/diagrams.ts +84 -0
- package/src/api/presentation/import.ts +112 -0
- package/src/api/presentation/index.ts +47 -0
- package/src/api/presentation/sheets.ts +198 -0
- package/src/api/presentation/views.ts +303 -0
- package/src/api/program/adjacency.ts +164 -0
- package/src/api/program/areas.ts +335 -0
- package/src/api/program/classification.ts +138 -0
- package/src/api/program/cores.ts +171 -0
- package/src/api/program/departments.ts +465 -0
- package/src/api/program/index.ts +71 -0
- package/src/api/program/layout.ts +68 -0
- package/src/api/program/metrics.ts +120 -0
- package/src/api/program/site.ts +326 -0
- package/src/api/program/spreadsheet.ts +2075 -0
- package/src/handles.ts +148 -0
- package/src/host-utils.ts +64 -0
- package/src/index.ts +4 -0
- package/src/types.ts +16 -0
- package/tsconfig.json +17 -0
- package/tsup.config.ts +12 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import * as z from "zod"
|
|
2
|
+
import { PluginApiReturn } from "../../types"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Layers — read and toggle the drawing/reference layers of a storey.
|
|
6
|
+
*
|
|
7
|
+
* These are the **drawing/reference** layers shown in the storey's Layers panel —
|
|
8
|
+
* the surfaces you sketch on and the imported underlays (CAD, PDF, images,
|
|
9
|
+
* terrain). They are **not** wall/floor construction-assembly material layers,
|
|
10
|
+
* which are a property of the built element, not this namespace.
|
|
11
|
+
*
|
|
12
|
+
* Reads return plain records and never throw for a missing layer (`get` and
|
|
13
|
+
* `getActive` return `null`, `list` returns `[]`).
|
|
14
|
+
*
|
|
15
|
+
* v1 exposes reads plus visibility edits and the active-layer switch.
|
|
16
|
+
* Creating and deleting layers are intentionally not part of this contract yet.
|
|
17
|
+
*
|
|
18
|
+
* Sub-namespace members typed as optional (`?`) are **authored ahead of the
|
|
19
|
+
* host** — declared so plugins and codegen can see the shape, but kept out of the
|
|
20
|
+
* discovery manifest until the host lands them (at which point they are promoted
|
|
21
|
+
* to required `abstract` members).
|
|
22
|
+
*
|
|
23
|
+
* Accessed via `snaptrude.core.layers`.
|
|
24
|
+
*/
|
|
25
|
+
export abstract class PluginCoreLayersApi {
|
|
26
|
+
constructor() {}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* List the drawing layers of a storey.
|
|
30
|
+
*
|
|
31
|
+
* Optionally filter to a single {@linkcode PluginCoreLayerType}.
|
|
32
|
+
*
|
|
33
|
+
* @param storeyId - The storey whose layers to read.
|
|
34
|
+
* @param layerType - Optional {@linkcode PluginCoreLayerType} filter.
|
|
35
|
+
* @returns A {@linkcode PluginCoreLayersListResult} with a `layers` array
|
|
36
|
+
* (empty when the storey is missing or has no matching layers).
|
|
37
|
+
*
|
|
38
|
+
* @examplePrompt List the drawing layers on this storey
|
|
39
|
+
* @examplePrompt Show all the PDF underlays on storey st_2
|
|
40
|
+
* @examplePrompt What CAD layers are on the ground floor?
|
|
41
|
+
*
|
|
42
|
+
* # Example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const { layers } = await snaptrude.core.layers.list("st_2")
|
|
45
|
+
* for (const l of layers) console.log(l.name, l.layerType, l.hidden)
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
public abstract list(
|
|
49
|
+
storeyId: string,
|
|
50
|
+
layerType?: PluginCoreLayerType,
|
|
51
|
+
): PluginApiReturn<PluginCoreLayersListResult>
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get a single drawing layer by id.
|
|
55
|
+
*
|
|
56
|
+
* @param layerId - The id of the layer to read.
|
|
57
|
+
* @returns The matching {@linkcode PluginCoreLayer}, or `null` if no layer has
|
|
58
|
+
* that id.
|
|
59
|
+
*
|
|
60
|
+
* @examplePrompt Get the drawing layer with id ly_5
|
|
61
|
+
* @examplePrompt Is layer ly_5 hidden or locked?
|
|
62
|
+
* @examplePrompt Look up a single drawing layer by its id
|
|
63
|
+
*
|
|
64
|
+
* # Example
|
|
65
|
+
* ```ts
|
|
66
|
+
* const layer = await snaptrude.core.layers.get("ly_5")
|
|
67
|
+
* if (layer) console.log(layer.name, layer.hidden, layer.locked)
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
public abstract get(
|
|
71
|
+
layerId: string,
|
|
72
|
+
): PluginApiReturn<PluginCoreLayersGetResult>
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get the active drawing layer of a storey.
|
|
76
|
+
*
|
|
77
|
+
* The active layer is the one new sketch geometry is drawn onto. Paired with
|
|
78
|
+
* {@linkcode PluginCoreLayersApi.setActive}.
|
|
79
|
+
*
|
|
80
|
+
* @param storeyId - The storey whose active layer to read.
|
|
81
|
+
* @returns The active {@linkcode PluginCoreLayer}, or `null` if the storey is
|
|
82
|
+
* missing or has no active layer.
|
|
83
|
+
*
|
|
84
|
+
* @examplePrompt Which drawing layer is active on this storey?
|
|
85
|
+
* @examplePrompt Get the current layer on storey st_2
|
|
86
|
+
* @examplePrompt What layer am I drawing on?
|
|
87
|
+
*
|
|
88
|
+
* # Example
|
|
89
|
+
* ```ts
|
|
90
|
+
* const active = await snaptrude.core.layers.getActive("st_2")
|
|
91
|
+
* if (active) console.log(active.name)
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
public abstract getActive(
|
|
95
|
+
storeyId: string,
|
|
96
|
+
): PluginApiReturn<PluginCoreLayersGetActiveResult>
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Make a drawing layer the active layer of its storey.
|
|
100
|
+
*
|
|
101
|
+
* Paired with {@linkcode PluginCoreLayersApi.getActive}.
|
|
102
|
+
*
|
|
103
|
+
* @param layerId - The id of the layer to activate.
|
|
104
|
+
* @returns The id of the now-active layer.
|
|
105
|
+
* @throws If no layer has the given id.
|
|
106
|
+
*
|
|
107
|
+
* @examplePrompt Draw on layer ly_5
|
|
108
|
+
* @examplePrompt Make this the active layer
|
|
109
|
+
* @examplePrompt Switch the active layer to the CAD underlay
|
|
110
|
+
*
|
|
111
|
+
* # Example
|
|
112
|
+
* ```ts
|
|
113
|
+
* await snaptrude.core.layers.setActive("ly_5")
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
public abstract setActive(
|
|
117
|
+
layerId: string,
|
|
118
|
+
): PluginApiReturn<PluginCoreLayersSetActiveResult>
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Update a drawing layer's visibility.
|
|
122
|
+
*
|
|
123
|
+
* A **sparse** update: omit `hidden` to leave it unchanged. This edit is **not
|
|
124
|
+
* undoable**. Locking and renaming are not exposed — layer `locked` is a
|
|
125
|
+
* read-only status here (setting it at runtime does not lock the live meshes or
|
|
126
|
+
* flip the panel padlock until a reload), and a rename cascades to every member
|
|
127
|
+
* mesh's `layerName`, a corruption hazard.
|
|
128
|
+
*
|
|
129
|
+
* @param layerId - The id of the layer to update.
|
|
130
|
+
* @param hidden - New hidden state (unchanged if omitted).
|
|
131
|
+
* @returns The updated {@linkcode PluginCoreLayer}.
|
|
132
|
+
* @throws If no layer has the given id.
|
|
133
|
+
*
|
|
134
|
+
* @examplePrompt Hide the PDF underlay layer
|
|
135
|
+
* @examplePrompt Show the CAD layer again
|
|
136
|
+
* @examplePrompt Hide layer ly_5
|
|
137
|
+
*
|
|
138
|
+
* # Example
|
|
139
|
+
* ```ts
|
|
140
|
+
* const layer = await snaptrude.core.layers.update("ly_5", true)
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
public abstract update(
|
|
144
|
+
layerId: string,
|
|
145
|
+
hidden?: boolean,
|
|
146
|
+
): PluginApiReturn<PluginCoreLayersUpdateResult>
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* The kind of a drawing layer.
|
|
151
|
+
*
|
|
152
|
+
* Author-drawable kinds (`floor`, `wall`, `ceiling`, `rough`, `default`) plus
|
|
153
|
+
* read-only imported underlays (`image`, `cad`, `pdf`, `terrain`, `buildings`).
|
|
154
|
+
*/
|
|
155
|
+
export const PluginCoreLayerType = z.enum([
|
|
156
|
+
"floor",
|
|
157
|
+
"wall",
|
|
158
|
+
"ceiling",
|
|
159
|
+
"rough",
|
|
160
|
+
"default",
|
|
161
|
+
"image",
|
|
162
|
+
"cad",
|
|
163
|
+
"pdf",
|
|
164
|
+
"terrain",
|
|
165
|
+
"buildings",
|
|
166
|
+
])
|
|
167
|
+
export type PluginCoreLayerType = z.infer<typeof PluginCoreLayerType>
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* A drawing/reference layer on a storey.
|
|
171
|
+
*
|
|
172
|
+
* | Property | Type | Description |
|
|
173
|
+
* |---|---|---|
|
|
174
|
+
* | `id` | `string` | Stable public layer id (e.g. `"ly_5"`) |
|
|
175
|
+
* | `name` | `string` | Display name |
|
|
176
|
+
* | `layerType` | {@linkcode PluginCoreLayerType} | The layer's kind |
|
|
177
|
+
* | `storeyId` | `string` | The stable id of the storey this layer belongs to |
|
|
178
|
+
* | `buildingId` | `string` | The stable id of the building this layer belongs to |
|
|
179
|
+
* | `hidden` | `boolean` | Whether the layer is hidden |
|
|
180
|
+
* | `locked` | `boolean` | Whether the layer is locked against edits |
|
|
181
|
+
* | `contentSummary` | `object` | A summary of what the layer holds (see below) |
|
|
182
|
+
*
|
|
183
|
+
* `contentSummary`:
|
|
184
|
+
*
|
|
185
|
+
* | Property | Type | Description |
|
|
186
|
+
* |---|---|---|
|
|
187
|
+
* | `hasFloorplan` | `boolean` | Whether the layer holds drawn floorplan geometry |
|
|
188
|
+
* | `pdfCount` | `number` | Number of PDF underlays on the layer |
|
|
189
|
+
* | `hasTerrain` | `boolean` | Whether the layer holds terrain |
|
|
190
|
+
*/
|
|
191
|
+
export const PluginCoreLayer = z.object({
|
|
192
|
+
id: z.string(),
|
|
193
|
+
name: z.string(),
|
|
194
|
+
layerType: PluginCoreLayerType,
|
|
195
|
+
storeyId: z.string(),
|
|
196
|
+
buildingId: z.string(),
|
|
197
|
+
hidden: z.boolean(),
|
|
198
|
+
locked: z.boolean(),
|
|
199
|
+
contentSummary: z.object({
|
|
200
|
+
hasFloorplan: z.boolean(),
|
|
201
|
+
pdfCount: z.number().int(),
|
|
202
|
+
hasTerrain: z.boolean(),
|
|
203
|
+
}),
|
|
204
|
+
})
|
|
205
|
+
export type PluginCoreLayer = z.infer<typeof PluginCoreLayer>
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Arguments for {@linkcode PluginCoreLayersApi.list}.
|
|
209
|
+
*
|
|
210
|
+
* | Property | Type | Description |
|
|
211
|
+
* |---|---|---|
|
|
212
|
+
* | `storeyId` | `string` | The storey whose layers to read |
|
|
213
|
+
* | `layerType` | {@linkcode PluginCoreLayerType}` \| undefined` | Optional layer-type filter |
|
|
214
|
+
*/
|
|
215
|
+
export const PluginCoreLayersListArgs = z.object({
|
|
216
|
+
storeyId: z.string(),
|
|
217
|
+
layerType: PluginCoreLayerType.optional(),
|
|
218
|
+
})
|
|
219
|
+
export type PluginCoreLayersListArgs = z.infer<
|
|
220
|
+
typeof PluginCoreLayersListArgs
|
|
221
|
+
>
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Result of {@linkcode PluginCoreLayersApi.list}.
|
|
225
|
+
*
|
|
226
|
+
* | Property | Type | Description |
|
|
227
|
+
* |---|---|---|
|
|
228
|
+
* | `layers` | {@linkcode PluginCoreLayer}`[]` | The storey's drawing layers (empty when missing or none match) |
|
|
229
|
+
*/
|
|
230
|
+
export const PluginCoreLayersListResult = z.object({
|
|
231
|
+
layers: z.array(PluginCoreLayer),
|
|
232
|
+
})
|
|
233
|
+
export type PluginCoreLayersListResult = z.infer<
|
|
234
|
+
typeof PluginCoreLayersListResult
|
|
235
|
+
>
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Arguments for {@linkcode PluginCoreLayersApi.get}.
|
|
239
|
+
*
|
|
240
|
+
* | Property | Type | Description |
|
|
241
|
+
* |---|---|---|
|
|
242
|
+
* | `layerId` | `string` | The id of the layer to read |
|
|
243
|
+
*/
|
|
244
|
+
export const PluginCoreLayersGetArgs = z.object({
|
|
245
|
+
layerId: z.string(),
|
|
246
|
+
})
|
|
247
|
+
export type PluginCoreLayersGetArgs = z.infer<
|
|
248
|
+
typeof PluginCoreLayersGetArgs
|
|
249
|
+
>
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Result of {@linkcode PluginCoreLayersApi.get} — the layer, or `null`
|
|
253
|
+
* when no layer has the given id.
|
|
254
|
+
*/
|
|
255
|
+
export const PluginCoreLayersGetResult = PluginCoreLayer.nullable()
|
|
256
|
+
export type PluginCoreLayersGetResult = z.infer<
|
|
257
|
+
typeof PluginCoreLayersGetResult
|
|
258
|
+
>
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Arguments for {@linkcode PluginCoreLayersApi.getActive}.
|
|
262
|
+
*
|
|
263
|
+
* | Property | Type | Description |
|
|
264
|
+
* |---|---|---|
|
|
265
|
+
* | `storeyId` | `string` | The storey whose active layer to read |
|
|
266
|
+
*/
|
|
267
|
+
export const PluginCoreLayersGetActiveArgs = z.object({
|
|
268
|
+
storeyId: z.string(),
|
|
269
|
+
})
|
|
270
|
+
export type PluginCoreLayersGetActiveArgs = z.infer<
|
|
271
|
+
typeof PluginCoreLayersGetActiveArgs
|
|
272
|
+
>
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Result of {@linkcode PluginCoreLayersApi.getActive} — the active layer,
|
|
276
|
+
* or `null` when the storey is missing or has no active layer.
|
|
277
|
+
*/
|
|
278
|
+
export const PluginCoreLayersGetActiveResult = PluginCoreLayer.nullable()
|
|
279
|
+
export type PluginCoreLayersGetActiveResult = z.infer<
|
|
280
|
+
typeof PluginCoreLayersGetActiveResult
|
|
281
|
+
>
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Arguments for {@linkcode PluginCoreLayersApi.setActive}.
|
|
285
|
+
*
|
|
286
|
+
* | Property | Type | Description |
|
|
287
|
+
* |---|---|---|
|
|
288
|
+
* | `layerId` | `string` | The id of the layer to activate |
|
|
289
|
+
*/
|
|
290
|
+
export const PluginCoreLayersSetActiveArgs = z.object({
|
|
291
|
+
layerId: z.string(),
|
|
292
|
+
})
|
|
293
|
+
export type PluginCoreLayersSetActiveArgs = z.infer<
|
|
294
|
+
typeof PluginCoreLayersSetActiveArgs
|
|
295
|
+
>
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Result of {@linkcode PluginCoreLayersApi.setActive} — the now-active
|
|
299
|
+
* layer's id.
|
|
300
|
+
*
|
|
301
|
+
* | Property | Type | Description |
|
|
302
|
+
* |---|---|---|
|
|
303
|
+
* | `layerId` | `string` | The id of the now-active layer |
|
|
304
|
+
*/
|
|
305
|
+
export const PluginCoreLayersSetActiveResult = z.object({
|
|
306
|
+
layerId: z.string(),
|
|
307
|
+
})
|
|
308
|
+
export type PluginCoreLayersSetActiveResult = z.infer<
|
|
309
|
+
typeof PluginCoreLayersSetActiveResult
|
|
310
|
+
>
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Arguments for {@linkcode PluginCoreLayersApi.update}. Sparse — only the
|
|
314
|
+
* provided fields are changed.
|
|
315
|
+
*
|
|
316
|
+
* | Property | Type | Description |
|
|
317
|
+
* |---|---|---|
|
|
318
|
+
* | `layerId` | `string` | The id of the layer to update |
|
|
319
|
+
* | `hidden` | `boolean \| undefined` | New hidden state (unchanged if omitted) |
|
|
320
|
+
*/
|
|
321
|
+
export const PluginCoreLayersUpdateArgs = z.object({
|
|
322
|
+
layerId: z.string(),
|
|
323
|
+
hidden: z.boolean().optional(),
|
|
324
|
+
})
|
|
325
|
+
export type PluginCoreLayersUpdateArgs = z.infer<
|
|
326
|
+
typeof PluginCoreLayersUpdateArgs
|
|
327
|
+
>
|
|
328
|
+
|
|
329
|
+
/** Result of {@linkcode PluginCoreLayersApi.update} — the updated layer. */
|
|
330
|
+
export const PluginCoreLayersUpdateResult = PluginCoreLayer
|
|
331
|
+
export type PluginCoreLayersUpdateResult = z.infer<
|
|
332
|
+
typeof PluginCoreLayersUpdateResult
|
|
333
|
+
>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PluginVec3Api } from "./vec3"
|
|
2
|
+
import { PluginQuatApi } from "./quat"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Math primitives for 3D vector and quaternion operations.
|
|
6
|
+
*
|
|
7
|
+
* - {@linkcode PluginMathApi.vec3} — 3D vector creation and arithmetic
|
|
8
|
+
* - {@linkcode PluginMathApi.quat} — Quaternion creation and rotation operations
|
|
9
|
+
*/
|
|
10
|
+
export abstract class PluginMathApi {
|
|
11
|
+
/** 3D vector operations. See {@linkcode PluginVec3Api}. */
|
|
12
|
+
public abstract vec3: PluginVec3Api
|
|
13
|
+
/** Quaternion operations. See {@linkcode PluginQuatApi}. */
|
|
14
|
+
public abstract quat: PluginQuatApi
|
|
15
|
+
|
|
16
|
+
constructor() {}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export * from "./vec3"
|
|
20
|
+
export * from "./quat"
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { PluginApiReturn } from "../../../types"
|
|
2
|
+
import { Vec3Handle, QuatHandle, QuatComponents } from "../../../handles"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Quaternion operations (all-handle model, §11).
|
|
6
|
+
*
|
|
7
|
+
* Quaternions are opaque {@linkcode QuatHandle}s; every operation is a host call
|
|
8
|
+
* returning a new handle. Read primitive components back with
|
|
9
|
+
* {@linkcode PluginQuatApi.components}. Accessed via `snaptrude.core.math.quat`.
|
|
10
|
+
*/
|
|
11
|
+
export abstract class PluginQuatApi {
|
|
12
|
+
constructor() {}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Create a quaternion from primitive components.
|
|
16
|
+
*
|
|
17
|
+
* # Example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const q = await snaptrude.core.math.quat.new(0, 0, 0, 1)
|
|
20
|
+
* const { x, y, z, w } = await snaptrude.core.math.quat.components(q)
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
abstract new(x: number, y: number, z: number, w: number): PluginApiReturn<QuatHandle>
|
|
24
|
+
/**
|
|
25
|
+
* Return the identity quaternion (no rotation).
|
|
26
|
+
*
|
|
27
|
+
* # Example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const noRotation = await snaptrude.core.math.quat.identity()
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
abstract identity(): PluginApiReturn<QuatHandle>
|
|
33
|
+
/**
|
|
34
|
+
* Build a quaternion from a rotation axis and an angle in radians.
|
|
35
|
+
*
|
|
36
|
+
* # Example
|
|
37
|
+
* ```ts
|
|
38
|
+
* const axis = await snaptrude.core.math.vec3.new(0, 0, 1)
|
|
39
|
+
* const quarterTurn = await snaptrude.core.math.quat.fromAxisAngle(axis, Math.PI / 2)
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
abstract fromAxisAngle(axis: Vec3Handle, angle: number): PluginApiReturn<QuatHandle>
|
|
43
|
+
/**
|
|
44
|
+
* Build a quaternion from Euler angles in radians.
|
|
45
|
+
*
|
|
46
|
+
* # Example
|
|
47
|
+
* ```ts
|
|
48
|
+
* const q = await snaptrude.core.math.quat.fromEuler(0, Math.PI / 2, 0)
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
abstract fromEuler(x: number, y: number, z: number): PluginApiReturn<QuatHandle>
|
|
52
|
+
/**
|
|
53
|
+
* Compose two rotations with the Hamilton product `a * b` (apply `b` then `a`).
|
|
54
|
+
*
|
|
55
|
+
* # Example
|
|
56
|
+
* ```ts
|
|
57
|
+
* const a = await snaptrude.core.math.quat.fromEuler(0, Math.PI / 2, 0)
|
|
58
|
+
* const b = await snaptrude.core.math.quat.fromEuler(Math.PI / 4, 0, 0)
|
|
59
|
+
* const combined = await snaptrude.core.math.quat.multiply(a, b) // b first, then a
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
abstract multiply(a: QuatHandle, b: QuatHandle): PluginApiReturn<QuatHandle>
|
|
63
|
+
/**
|
|
64
|
+
* Compute the conjugate of a quaternion (negated vector part).
|
|
65
|
+
*
|
|
66
|
+
* # Example
|
|
67
|
+
* ```ts
|
|
68
|
+
* const q = await snaptrude.core.math.quat.fromEuler(0, Math.PI / 4, 0)
|
|
69
|
+
* const conj = await snaptrude.core.math.quat.conjugate(q)
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
abstract conjugate(q: QuatHandle): PluginApiReturn<QuatHandle>
|
|
73
|
+
/**
|
|
74
|
+
* Compute the magnitude (norm) of a quaternion.
|
|
75
|
+
*
|
|
76
|
+
* # Example
|
|
77
|
+
* ```ts
|
|
78
|
+
* const q = await snaptrude.core.math.quat.new(0, 0, 0, 1)
|
|
79
|
+
* const len = await snaptrude.core.math.quat.length(q) // 1
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
abstract length(q: QuatHandle): PluginApiReturn<number>
|
|
83
|
+
/**
|
|
84
|
+
* Normalize a quaternion to unit length.
|
|
85
|
+
*
|
|
86
|
+
* # Example
|
|
87
|
+
* ```ts
|
|
88
|
+
* const q = await snaptrude.core.math.quat.new(0, 0, 1, 1)
|
|
89
|
+
* const unit = await snaptrude.core.math.quat.normalize(q)
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
abstract normalize(q: QuatHandle): PluginApiReturn<QuatHandle>
|
|
93
|
+
/**
|
|
94
|
+
* Compute the inverse quaternion — the rotation that undoes `q`.
|
|
95
|
+
*
|
|
96
|
+
* # Example
|
|
97
|
+
* ```ts
|
|
98
|
+
* const q = await snaptrude.core.math.quat.fromEuler(0, Math.PI / 2, 0)
|
|
99
|
+
* const undo = await snaptrude.core.math.quat.inverse(q)
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
abstract inverse(q: QuatHandle): PluginApiReturn<QuatHandle>
|
|
103
|
+
/**
|
|
104
|
+
* Decompose a quaternion into its rotation axis and angle (radians).
|
|
105
|
+
*
|
|
106
|
+
* # Example
|
|
107
|
+
* ```ts
|
|
108
|
+
* const q = await snaptrude.core.math.quat.fromEuler(0, Math.PI / 3, 0)
|
|
109
|
+
* const { axis, angle } = await snaptrude.core.math.quat.toAxisAngle(q)
|
|
110
|
+
* const { x, y, z } = await snaptrude.core.math.vec3.components(axis)
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
abstract toAxisAngle(q: QuatHandle): PluginApiReturn<{ axis: Vec3Handle; angle: number }>
|
|
114
|
+
/**
|
|
115
|
+
* Spherically interpolate (slerp) between two rotations by factor `t`.
|
|
116
|
+
*
|
|
117
|
+
* # Example
|
|
118
|
+
* ```ts
|
|
119
|
+
* const start = await snaptrude.core.math.quat.identity()
|
|
120
|
+
* const end = await snaptrude.core.math.quat.fromEuler(0, Math.PI, 0)
|
|
121
|
+
* const halfway = await snaptrude.core.math.quat.slerp(start, end, 0.5)
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
abstract slerp(a: QuatHandle, b: QuatHandle, t: number): PluginApiReturn<QuatHandle>
|
|
125
|
+
/**
|
|
126
|
+
* Compute the dot product of two quaternions.
|
|
127
|
+
*
|
|
128
|
+
* # Example
|
|
129
|
+
* ```ts
|
|
130
|
+
* const a = await snaptrude.core.math.quat.identity()
|
|
131
|
+
* const b = await snaptrude.core.math.quat.fromEuler(0, Math.PI / 2, 0)
|
|
132
|
+
* const d = await snaptrude.core.math.quat.dot(a, b)
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
abstract dot(a: QuatHandle, b: QuatHandle): PluginApiReturn<number>
|
|
136
|
+
/**
|
|
137
|
+
* Test whether two quaternions have exactly equal components.
|
|
138
|
+
*
|
|
139
|
+
* # Example
|
|
140
|
+
* ```ts
|
|
141
|
+
* const a = await snaptrude.core.math.quat.new(0, 0, 0, 1)
|
|
142
|
+
* const b = await snaptrude.core.math.quat.identity()
|
|
143
|
+
* const same = await snaptrude.core.math.quat.equals(a, b) // true
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
abstract equals(a: QuatHandle, b: QuatHandle): PluginApiReturn<boolean>
|
|
147
|
+
/**
|
|
148
|
+
* Test whether two quaternions are equal within a tolerance `epsilon` (default `1e-6`).
|
|
149
|
+
*
|
|
150
|
+
* # Example
|
|
151
|
+
* ```ts
|
|
152
|
+
* const a = await snaptrude.core.math.quat.fromEuler(0, Math.PI / 2, 0)
|
|
153
|
+
* const b = await snaptrude.core.math.quat.fromEuler(0, 1.5711, 0)
|
|
154
|
+
* const close = await snaptrude.core.math.quat.equalsApprox(a, b, 1e-3) // true
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
abstract equalsApprox(
|
|
158
|
+
a: QuatHandle,
|
|
159
|
+
b: QuatHandle,
|
|
160
|
+
epsilon?: number,
|
|
161
|
+
): PluginApiReturn<boolean>
|
|
162
|
+
/**
|
|
163
|
+
* Read the primitive `{ x, y, z, w }` components of a quaternion handle.
|
|
164
|
+
*
|
|
165
|
+
* # Example
|
|
166
|
+
* ```ts
|
|
167
|
+
* const q = await snaptrude.core.math.quat.fromEuler(0, Math.PI / 2, 0)
|
|
168
|
+
* const { x, y, z, w } = await snaptrude.core.math.quat.components(q)
|
|
169
|
+
* ```
|
|
170
|
+
*/
|
|
171
|
+
abstract components(q: QuatHandle): PluginApiReturn<QuatComponents>
|
|
172
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { PluginApiReturn } from "../../../types"
|
|
2
|
+
import { Vec3Handle, Vec3Components } from "../../../handles"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 3D vector operations (all-handle model, §11).
|
|
6
|
+
*
|
|
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
|
+
*/
|
|
11
|
+
export abstract class PluginVec3Api {
|
|
12
|
+
constructor() {}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Create a vector from primitive components.
|
|
16
|
+
*
|
|
17
|
+
* # Example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const v = await snaptrude.core.math.vec3.new(10, 0, 5)
|
|
20
|
+
* const { x, y, z } = await snaptrude.core.math.vec3.components(v)
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
abstract new(x: number, y: number, z: number): PluginApiReturn<Vec3Handle>
|
|
24
|
+
/**
|
|
25
|
+
* Add two vectors component-wise (`a + b`).
|
|
26
|
+
*
|
|
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
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
abstract add(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<Vec3Handle>
|
|
35
|
+
/**
|
|
36
|
+
* Subtract vector `b` from `a` component-wise (`a - b`).
|
|
37
|
+
*
|
|
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
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
abstract subtract(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<Vec3Handle>
|
|
46
|
+
/**
|
|
47
|
+
* Scale `v` by a scalar.
|
|
48
|
+
*
|
|
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
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
abstract scale(v: Vec3Handle, scalar: number): PluginApiReturn<Vec3Handle>
|
|
56
|
+
/**
|
|
57
|
+
* Compute the dot product of two vectors.
|
|
58
|
+
*
|
|
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
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
abstract dot(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<number>
|
|
67
|
+
/**
|
|
68
|
+
* Compute the cross product `a × b` — the vector perpendicular to both.
|
|
69
|
+
*
|
|
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
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
abstract cross(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<Vec3Handle>
|
|
78
|
+
/**
|
|
79
|
+
* Compute the Euclidean length (magnitude) of a vector.
|
|
80
|
+
*
|
|
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
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
abstract length(v: Vec3Handle): PluginApiReturn<number>
|
|
88
|
+
/**
|
|
89
|
+
* Compute the squared Euclidean length of a vector (avoids the sqrt).
|
|
90
|
+
*
|
|
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
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
abstract lengthSquared(v: Vec3Handle): PluginApiReturn<number>
|
|
98
|
+
/**
|
|
99
|
+
* Return the unit vector in the same direction (the zero vector if length is 0).
|
|
100
|
+
*
|
|
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
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
abstract normalize(v: Vec3Handle): PluginApiReturn<Vec3Handle>
|
|
108
|
+
/**
|
|
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
|
|
113
|
+
*
|
|
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
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
abstract distance(a: Vec3Handle, b: Vec3Handle): PluginApiReturn<number>
|
|
122
|
+
/**
|
|
123
|
+
* Linearly interpolate between two vectors: `a + (b - a) * t`.
|
|
124
|
+
*
|
|
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
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
abstract lerp(a: Vec3Handle, b: Vec3Handle, t: number): PluginApiReturn<Vec3Handle>
|
|
133
|
+
/**
|
|
134
|
+
* Negate a vector, reversing its direction.
|
|
135
|
+
*
|
|
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
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
abstract negate(v: Vec3Handle): PluginApiReturn<Vec3Handle>
|
|
143
|
+
/**
|
|
144
|
+
* Test whether two vectors have exactly equal components.
|
|
145
|
+
*
|
|
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`).
|
|
156
|
+
*
|
|
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
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
abstract equalsApprox(
|
|
165
|
+
a: Vec3Handle,
|
|
166
|
+
b: Vec3Handle,
|
|
167
|
+
epsilon?: number,
|
|
168
|
+
): PluginApiReturn<boolean>
|
|
169
|
+
/**
|
|
170
|
+
* Read the primitive `{ x, y, z }` components of a vector handle.
|
|
171
|
+
*
|
|
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
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
abstract components(v: Vec3Handle): PluginApiReturn<Vec3Components>
|
|
179
|
+
}
|