@aura3d/engine 1.5.0 → 1.5.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.
- package/README.md +111 -46
- package/dist/engine/agent-api/ApplicationKits.d.ts +307 -0
- package/dist/engine/agent-api/ApplicationKits.d.ts.map +1 -0
- package/dist/engine/agent-api/ApplicationKits.js +650 -0
- package/dist/engine/agent-api/ApplicationKits.js.map +1 -0
- package/dist/engine/agent-api/CombatFrameData.d.ts +210 -0
- package/dist/engine/agent-api/CombatFrameData.d.ts.map +1 -0
- package/dist/engine/agent-api/CombatFrameData.js +324 -0
- package/dist/engine/agent-api/CombatFrameData.js.map +1 -0
- package/dist/engine/agent-api/FocusSelection.d.ts +186 -0
- package/dist/engine/agent-api/FocusSelection.d.ts.map +1 -0
- package/dist/engine/agent-api/FocusSelection.js +436 -0
- package/dist/engine/agent-api/FocusSelection.js.map +1 -0
- package/dist/engine/agent-api/GameGenreKits.d.ts +32 -1
- package/dist/engine/agent-api/GameGenreKits.d.ts.map +1 -1
- package/dist/engine/agent-api/GameGenreKits.js +51 -7
- package/dist/engine/agent-api/GameGenreKits.js.map +1 -1
- package/dist/engine/agent-api/GameSceneGeometryBindings.d.ts +10 -0
- package/dist/engine/agent-api/GameSceneGeometryBindings.d.ts.map +1 -1
- package/dist/engine/agent-api/GameSceneGeometryBindings.js +7 -0
- package/dist/engine/agent-api/GameSceneGeometryBindings.js.map +1 -1
- package/dist/engine/agent-api/PlatformerMotion.d.ts +177 -0
- package/dist/engine/agent-api/PlatformerMotion.d.ts.map +1 -0
- package/dist/engine/agent-api/PlatformerMotion.js +207 -0
- package/dist/engine/agent-api/PlatformerMotion.js.map +1 -0
- package/dist/engine/agent-api/SceneQueries.d.ts +124 -0
- package/dist/engine/agent-api/SceneQueries.d.ts.map +1 -0
- package/dist/engine/agent-api/SceneQueries.js +221 -0
- package/dist/engine/agent-api/SceneQueries.js.map +1 -0
- package/dist/engine/agent-api/SpatialAnchoring.d.ts +279 -0
- package/dist/engine/agent-api/SpatialAnchoring.d.ts.map +1 -0
- package/dist/engine/agent-api/SpatialAnchoring.js +394 -0
- package/dist/engine/agent-api/SpatialAnchoring.js.map +1 -0
- package/dist/engine/agent-api/VehicleChassis.d.ts +192 -0
- package/dist/engine/agent-api/VehicleChassis.d.ts.map +1 -0
- package/dist/engine/agent-api/VehicleChassis.js +322 -0
- package/dist/engine/agent-api/VehicleChassis.js.map +1 -0
- package/dist/engine/agent-api/VehicleDriverAi.d.ts +123 -0
- package/dist/engine/agent-api/VehicleDriverAi.d.ts.map +1 -0
- package/dist/engine/agent-api/VehicleDriverAi.js +217 -0
- package/dist/engine/agent-api/VehicleDriverAi.js.map +1 -0
- package/dist/engine/agent-api/WorldLabelRenderer.d.ts +146 -0
- package/dist/engine/agent-api/WorldLabelRenderer.d.ts.map +1 -0
- package/dist/engine/agent-api/WorldLabelRenderer.js +331 -0
- package/dist/engine/agent-api/WorldLabelRenderer.js.map +1 -0
- package/dist/engine/agent-api/index.d.ts +64 -1
- package/dist/engine/agent-api/index.d.ts.map +1 -1
- package/dist/engine/agent-api/index.js +148 -2
- package/dist/engine/agent-api/index.js.map +1 -1
- package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
- package/dist/rendering/CameraFraming.d.ts +77 -0
- package/dist/rendering/CameraFraming.d.ts.map +1 -1
- package/dist/rendering/CameraFraming.js +176 -1
- package/dist/rendering/CameraFraming.js.map +1 -1
- package/dist/rendering/Renderer.d.ts +25 -2
- package/dist/rendering/Renderer.d.ts.map +1 -1
- package/dist/rendering/Renderer.js +11 -3
- package/dist/rendering/Renderer.js.map +1 -1
- package/dist/rendering/index.d.ts +3 -3
- package/dist/rendering/index.d.ts.map +1 -1
- package/dist/rendering/index.js +1 -1
- package/dist/rendering/index.js.map +1 -1
- package/package.json +120 -115
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* World-anchored label rendering.
|
|
3
|
+
*
|
|
4
|
+
* ## The defect this fixes
|
|
5
|
+
*
|
|
6
|
+
* `labels.callout(...)` built a valid label node, the node reached the scene
|
|
7
|
+
* snapshot, and evidence counted it -- but nothing drew it. Labels were rendered
|
|
8
|
+
* only by `drawLabelNode`, which lives in the **canvas2d fallback** path. Every
|
|
9
|
+
* public route with a typed GLB takes the **production WebGL2** path, where
|
|
10
|
+
* `createProductionRuntimeRendererInput` collects model and primitive render
|
|
11
|
+
* items and ignores `kind: "label"` entirely.
|
|
12
|
+
*
|
|
13
|
+
* So the API was not partially implemented or mis-projected: it was implemented
|
|
14
|
+
* in the wrong render path. Every callout in every production route was silently
|
|
15
|
+
* dropped. The evidence collector counted label *nodes*, which is why reports
|
|
16
|
+
* showed labels present while the screen showed none.
|
|
17
|
+
*
|
|
18
|
+
* The fix is a real screen-space label layer: labels are world-anchored, projected
|
|
19
|
+
* with the scene's own view-projection matrix each frame, and drawn into a DOM
|
|
20
|
+
* overlay above the canvas. DOM is the right medium for text -- it is legible,
|
|
21
|
+
* accessible, and responsive -- but the *placement* is driven entirely by the 3D
|
|
22
|
+
* projection, so a label tracks its anchor while the camera moves. This is not a
|
|
23
|
+
* route-local DOM overlay: it is one reusable layer owned by the runtime.
|
|
24
|
+
*
|
|
25
|
+
* The projection math here is pure and unit-testable; only `mount` touches the DOM.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Project a world point through a column-major 4x4 view-projection matrix.
|
|
29
|
+
*
|
|
30
|
+
* Returns clip-space w alongside NDC so callers can detect points behind the
|
|
31
|
+
* camera (`w <= 0`) rather than silently drawing a mirrored label.
|
|
32
|
+
*/
|
|
33
|
+
export function projectWorldPoint(viewProjection, point) {
|
|
34
|
+
const m = viewProjection;
|
|
35
|
+
const [x, y, z] = point;
|
|
36
|
+
// Column-major: element (row r, col c) is m[c * 4 + r], matching the matrices
|
|
37
|
+
// produced by `multiply4`/`perspective` in the agent API renderer.
|
|
38
|
+
const cx = m[0] * x + m[4] * y + m[8] * z + m[12];
|
|
39
|
+
const cy = m[1] * x + m[5] * y + m[9] * z + m[13];
|
|
40
|
+
const cz = m[2] * x + m[6] * y + m[10] * z + m[14];
|
|
41
|
+
const cw = m[3] * x + m[7] * y + m[11] * z + m[15];
|
|
42
|
+
if (cw === 0)
|
|
43
|
+
return { ndc: [0, 0, 0], w: 0 };
|
|
44
|
+
return { ndc: [cx / cw, cy / cw, cz / cw], w: cw };
|
|
45
|
+
}
|
|
46
|
+
/** Convert NDC to CSS-pixel screen coordinates for a viewport. */
|
|
47
|
+
export function ndcToScreen(ndc, viewport) {
|
|
48
|
+
return [
|
|
49
|
+
(ndc[0] * 0.5 + 0.5) * viewport.width,
|
|
50
|
+
(1 - (ndc[1] * 0.5 + 0.5)) * viewport.height
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
const SCREEN_ANCHOR_MARGIN = 14;
|
|
54
|
+
/**
|
|
55
|
+
* Project a set of world labels into screen space.
|
|
56
|
+
*
|
|
57
|
+
* Pure: no DOM. This is the function tests assert on, so label placement is
|
|
58
|
+
* verified by arithmetic rather than by looking at a screenshot.
|
|
59
|
+
*/
|
|
60
|
+
export function projectWorldLabels(labels, viewProjection, viewport) {
|
|
61
|
+
const compactScale = viewport.compact === true ? 0.86 : 1;
|
|
62
|
+
return labels.map((label) => {
|
|
63
|
+
const fontSize = Math.max(11, Math.round((label.fontSize ?? 14) * compactScale));
|
|
64
|
+
const color = label.color ?? "#f8fafc";
|
|
65
|
+
const background = label.background ?? "rgba(17,24,39,0.88)";
|
|
66
|
+
const leader = label.leader ?? false;
|
|
67
|
+
if (label.screenAnchor) {
|
|
68
|
+
const [x, y] = screenAnchorPosition(label.screenAnchor, viewport, fontSize);
|
|
69
|
+
return {
|
|
70
|
+
id: label.id,
|
|
71
|
+
text: label.text,
|
|
72
|
+
x,
|
|
73
|
+
y,
|
|
74
|
+
anchorX: x,
|
|
75
|
+
anchorY: y,
|
|
76
|
+
visible: true,
|
|
77
|
+
clamped: false,
|
|
78
|
+
behindCamera: false,
|
|
79
|
+
fontSize,
|
|
80
|
+
color,
|
|
81
|
+
background,
|
|
82
|
+
leader: false,
|
|
83
|
+
depth: 0
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const projected = projectWorldPoint(viewProjection, label.anchor);
|
|
87
|
+
const behindCamera = projected.w <= 0;
|
|
88
|
+
const [boxAnchorX, boxAnchorY] = ndcToScreen(projected.ndc, viewport);
|
|
89
|
+
// The leader endpoint is projected separately so it lands on the subject, not
|
|
90
|
+
// on the label. Falls back to the label's own anchor when none is given.
|
|
91
|
+
const leaderTarget = label.leaderAnchor
|
|
92
|
+
? ndcToScreen(projectWorldPoint(viewProjection, label.leaderAnchor).ndc, viewport)
|
|
93
|
+
: [boxAnchorX, boxAnchorY];
|
|
94
|
+
const anchorX = leaderTarget[0];
|
|
95
|
+
const anchorY = leaderTarget[1];
|
|
96
|
+
const offset = label.screenOffset ?? [0, -28];
|
|
97
|
+
let x = boxAnchorX + offset[0] * compactScale;
|
|
98
|
+
let y = boxAnchorY + offset[1] * compactScale;
|
|
99
|
+
const policy = label.offscreenPolicy ?? "clamp";
|
|
100
|
+
const hideBehind = label.hideWhenBehindCamera ?? true;
|
|
101
|
+
// Estimated half-width from character count: the exact box is measured by the
|
|
102
|
+
// DOM, but clamping needs a bound before layout.
|
|
103
|
+
const halfWidth = Math.max(24, label.text.length * fontSize * 0.31);
|
|
104
|
+
const halfHeight = fontSize * 0.9;
|
|
105
|
+
const withinViewport = x >= -halfWidth && x <= viewport.width + halfWidth
|
|
106
|
+
&& y >= -halfHeight && y <= viewport.height + halfHeight;
|
|
107
|
+
let clamped = false;
|
|
108
|
+
let visible = true;
|
|
109
|
+
if (behindCamera && hideBehind) {
|
|
110
|
+
visible = false;
|
|
111
|
+
}
|
|
112
|
+
else if (!withinViewport) {
|
|
113
|
+
if (policy === "hide") {
|
|
114
|
+
visible = false;
|
|
115
|
+
}
|
|
116
|
+
else if (policy === "clamp") {
|
|
117
|
+
const clampedX = Math.min(Math.max(x, halfWidth + SCREEN_ANCHOR_MARGIN), viewport.width - halfWidth - SCREEN_ANCHOR_MARGIN);
|
|
118
|
+
const clampedY = Math.min(Math.max(y, halfHeight + SCREEN_ANCHOR_MARGIN), viewport.height - halfHeight - SCREEN_ANCHOR_MARGIN);
|
|
119
|
+
clamped = clampedX !== x || clampedY !== y;
|
|
120
|
+
x = clampedX;
|
|
121
|
+
y = clampedY;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
id: label.id,
|
|
126
|
+
text: label.text,
|
|
127
|
+
x: round(x),
|
|
128
|
+
y: round(y),
|
|
129
|
+
anchorX: round(anchorX),
|
|
130
|
+
anchorY: round(anchorY),
|
|
131
|
+
visible,
|
|
132
|
+
clamped,
|
|
133
|
+
behindCamera,
|
|
134
|
+
fontSize,
|
|
135
|
+
color,
|
|
136
|
+
background,
|
|
137
|
+
leader,
|
|
138
|
+
depth: round(projected.ndc[2])
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Resolve overlapping labels by nudging later ones vertically.
|
|
144
|
+
*
|
|
145
|
+
* Collision avoidance is a documented option on the label API, so it must
|
|
146
|
+
* actually happen. Labels are sorted front-to-back so nearer labels keep their
|
|
147
|
+
* requested position and farther ones move.
|
|
148
|
+
*/
|
|
149
|
+
export function resolveLabelCollisions(labels, options = {}) {
|
|
150
|
+
const minGap = options.minGap ?? 4;
|
|
151
|
+
const ordered = [...labels].sort((a, b) => a.depth - b.depth);
|
|
152
|
+
const placed = [];
|
|
153
|
+
for (const label of ordered) {
|
|
154
|
+
if (!label.visible) {
|
|
155
|
+
placed.push(label);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
let y = label.y;
|
|
159
|
+
const halfHeight = label.fontSize * 0.9;
|
|
160
|
+
const halfWidth = Math.max(24, label.text.length * label.fontSize * 0.31);
|
|
161
|
+
let moved = true;
|
|
162
|
+
let guard = 0;
|
|
163
|
+
while (moved && guard < 32) {
|
|
164
|
+
moved = false;
|
|
165
|
+
guard += 1;
|
|
166
|
+
for (const other of placed) {
|
|
167
|
+
if (!other.visible)
|
|
168
|
+
continue;
|
|
169
|
+
const otherHalfHeight = other.fontSize * 0.9;
|
|
170
|
+
const otherHalfWidth = Math.max(24, other.text.length * other.fontSize * 0.31);
|
|
171
|
+
const overlapsX = Math.abs(label.x - other.x) < halfWidth + otherHalfWidth;
|
|
172
|
+
const overlapsY = Math.abs(y - other.y) < halfHeight + otherHalfHeight + minGap;
|
|
173
|
+
if (overlapsX && overlapsY) {
|
|
174
|
+
y = other.y - (otherHalfHeight + halfHeight + minGap);
|
|
175
|
+
moved = true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
placed.push(y === label.y ? label : { ...label, y: round(y) });
|
|
180
|
+
}
|
|
181
|
+
// Restore the caller's ordering so ids stay stable for tests and evidence.
|
|
182
|
+
const byId = new Map(placed.map((label) => [label.id, label]));
|
|
183
|
+
return labels.map((label) => byId.get(label.id) ?? label);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Mount the screen-space label layer.
|
|
187
|
+
*
|
|
188
|
+
* Uses `pointer-events: none` so labels never intercept scene interaction, and
|
|
189
|
+
* `aria-live="off"` with per-label `role="note"` so a screen reader can read the
|
|
190
|
+
* annotations without announcing every camera-driven reposition.
|
|
191
|
+
*/
|
|
192
|
+
export function createWorldLabelLayer(host) {
|
|
193
|
+
const root = document.createElement("div");
|
|
194
|
+
root.className = "aura-world-label-layer";
|
|
195
|
+
root.setAttribute("data-aura-world-labels", "");
|
|
196
|
+
root.style.cssText = [
|
|
197
|
+
"position:absolute",
|
|
198
|
+
"inset:0",
|
|
199
|
+
"overflow:hidden",
|
|
200
|
+
"pointer-events:none",
|
|
201
|
+
"z-index:6"
|
|
202
|
+
].join(";");
|
|
203
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
204
|
+
svg.setAttribute("width", "100%");
|
|
205
|
+
svg.setAttribute("height", "100%");
|
|
206
|
+
svg.style.cssText = "position:absolute;inset:0;overflow:visible";
|
|
207
|
+
root.append(svg);
|
|
208
|
+
const parentStyle = getComputedStyle(host.container);
|
|
209
|
+
if (parentStyle.position === "static")
|
|
210
|
+
host.container.style.position = "relative";
|
|
211
|
+
host.container.append(root);
|
|
212
|
+
let labels = [];
|
|
213
|
+
let projected = [];
|
|
214
|
+
const elements = new Map();
|
|
215
|
+
const leaders = new Map();
|
|
216
|
+
const viewport = () => {
|
|
217
|
+
const rect = host.canvas.getBoundingClientRect();
|
|
218
|
+
const width = rect.width || host.canvas.clientWidth || host.canvas.width;
|
|
219
|
+
const height = rect.height || host.canvas.clientHeight || host.canvas.height;
|
|
220
|
+
return { width, height, compact: width < 560 };
|
|
221
|
+
};
|
|
222
|
+
const ensureElement = (label) => {
|
|
223
|
+
let element = elements.get(label.id);
|
|
224
|
+
if (!element) {
|
|
225
|
+
element = document.createElement("div");
|
|
226
|
+
element.className = "aura-world-label";
|
|
227
|
+
element.setAttribute("role", "note");
|
|
228
|
+
element.setAttribute("data-aura-label-id", label.id);
|
|
229
|
+
element.style.cssText = [
|
|
230
|
+
"position:absolute",
|
|
231
|
+
"transform:translate(-50%,-50%)",
|
|
232
|
+
"white-space:nowrap",
|
|
233
|
+
"border-radius:6px",
|
|
234
|
+
"padding:4px 8px",
|
|
235
|
+
"font:600 14px/1.2 system-ui,-apple-system,BlinkMacSystemFont,sans-serif",
|
|
236
|
+
"border:1px solid rgba(148,163,184,0.5)",
|
|
237
|
+
"pointer-events:none"
|
|
238
|
+
].join(";");
|
|
239
|
+
root.append(element);
|
|
240
|
+
elements.set(label.id, element);
|
|
241
|
+
}
|
|
242
|
+
return element;
|
|
243
|
+
};
|
|
244
|
+
const ensureLeader = (id) => {
|
|
245
|
+
let line = leaders.get(id);
|
|
246
|
+
if (!line) {
|
|
247
|
+
line = document.createElementNS("http://www.w3.org/2000/svg", "line");
|
|
248
|
+
line.setAttribute("stroke-width", "1.2");
|
|
249
|
+
line.setAttribute("stroke-linecap", "round");
|
|
250
|
+
svg.append(line);
|
|
251
|
+
leaders.set(id, line);
|
|
252
|
+
}
|
|
253
|
+
return line;
|
|
254
|
+
};
|
|
255
|
+
const draw = () => {
|
|
256
|
+
const seen = new Set();
|
|
257
|
+
for (const label of projected) {
|
|
258
|
+
seen.add(label.id);
|
|
259
|
+
const element = ensureElement(label);
|
|
260
|
+
if (!label.visible) {
|
|
261
|
+
element.style.display = "none";
|
|
262
|
+
leaders.get(label.id)?.setAttribute("stroke", "transparent");
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
element.style.display = "block";
|
|
266
|
+
element.style.left = `${label.x}px`;
|
|
267
|
+
element.style.top = `${label.y}px`;
|
|
268
|
+
element.style.color = label.color;
|
|
269
|
+
element.style.background = label.background;
|
|
270
|
+
element.style.fontSize = `${label.fontSize}px`;
|
|
271
|
+
if (element.textContent !== label.text)
|
|
272
|
+
element.textContent = label.text;
|
|
273
|
+
if (label.leader) {
|
|
274
|
+
const line = ensureLeader(label.id);
|
|
275
|
+
line.setAttribute("x1", String(label.x));
|
|
276
|
+
line.setAttribute("y1", String(label.y));
|
|
277
|
+
line.setAttribute("x2", String(label.anchorX));
|
|
278
|
+
line.setAttribute("y2", String(label.anchorY));
|
|
279
|
+
line.setAttribute("stroke", label.color);
|
|
280
|
+
line.setAttribute("stroke-opacity", "0.72");
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
leaders.get(label.id)?.setAttribute("stroke", "transparent");
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// Clean up labels whose target was removed.
|
|
287
|
+
for (const [id, element] of elements) {
|
|
288
|
+
if (seen.has(id))
|
|
289
|
+
continue;
|
|
290
|
+
element.remove();
|
|
291
|
+
elements.delete(id);
|
|
292
|
+
leaders.get(id)?.remove();
|
|
293
|
+
leaders.delete(id);
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
return {
|
|
297
|
+
setLabels(next) {
|
|
298
|
+
labels = next;
|
|
299
|
+
},
|
|
300
|
+
update(viewProjection) {
|
|
301
|
+
projected = resolveLabelCollisions(projectWorldLabels(labels, viewProjection, viewport()));
|
|
302
|
+
draw();
|
|
303
|
+
},
|
|
304
|
+
snapshot() {
|
|
305
|
+
return projected;
|
|
306
|
+
},
|
|
307
|
+
dispose() {
|
|
308
|
+
for (const element of elements.values())
|
|
309
|
+
element.remove();
|
|
310
|
+
elements.clear();
|
|
311
|
+
for (const line of leaders.values())
|
|
312
|
+
line.remove();
|
|
313
|
+
leaders.clear();
|
|
314
|
+
root.remove();
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function screenAnchorPosition(anchor, viewport, fontSize) {
|
|
319
|
+
const margin = SCREEN_ANCHOR_MARGIN + fontSize;
|
|
320
|
+
if (anchor === "top-left")
|
|
321
|
+
return [margin * 2.4, margin];
|
|
322
|
+
if (anchor === "top-right")
|
|
323
|
+
return [viewport.width - margin * 2.4, margin];
|
|
324
|
+
if (anchor === "bottom-left")
|
|
325
|
+
return [margin * 2.4, viewport.height - margin];
|
|
326
|
+
return [viewport.width - margin * 2.4, viewport.height - margin];
|
|
327
|
+
}
|
|
328
|
+
function round(value) {
|
|
329
|
+
return Math.round(value * 100) / 100;
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=WorldLabelRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorldLabelRenderer.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/WorldLabelRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { type Collider, type ColliderDescriptor, type CollisionEvent, type Constraint, type ConstraintDescriptor, type Contact, type DebugLine, type PhysicsBackendSelection, type PhysicsShape, type PhysicsSnapshot, type PhysicsWorldDescriptor, type RaycastHit, type RaycastOptions, type RigidBody, type RigidBodyDescriptor, type RigidBodyType, type ScenePhysicsNode, type SphereCastHit } from "@aura3d/physics";
|
|
2
|
+
import { type ProjectedLabel } from "./WorldLabelRenderer.js";
|
|
3
|
+
export * from "./SpatialAnchoring.js";
|
|
4
|
+
export * from "./FocusSelection.js";
|
|
5
|
+
export * from "./WorldLabelRenderer.js";
|
|
6
|
+
export * from "./VehicleChassis.js";
|
|
7
|
+
export * from "./VehicleDriverAi.js";
|
|
8
|
+
export * from "./PlatformerMotion.js";
|
|
9
|
+
export * from "./CombatFrameData.js";
|
|
10
|
+
export * from "./SceneQueries.js";
|
|
11
|
+
export * from "./ApplicationKits.js";
|
|
2
12
|
export * from "./FrameEncoder.js";
|
|
3
13
|
export * from "./BrowserFrameCaptureAdapter.js";
|
|
4
14
|
export * from "./MediaRecorderFrameEncoder.js";
|
|
@@ -521,6 +531,17 @@ export interface AuraLabelNode extends AuraTransformSpec {
|
|
|
521
531
|
readonly name?: string;
|
|
522
532
|
readonly text: string;
|
|
523
533
|
readonly target?: string;
|
|
534
|
+
/**
|
|
535
|
+
* World point the label is attached to.
|
|
536
|
+
*
|
|
537
|
+
* `position` is where the label box sits; `anchorWorldPosition` is what a
|
|
538
|
+
* leader line points at. When omitted the label anchors to its own position.
|
|
539
|
+
* Both are projected every frame by the world-label layer, so a label tracks
|
|
540
|
+
* its subject as the camera moves.
|
|
541
|
+
*/
|
|
542
|
+
readonly anchorWorldPosition?: AuraVec3;
|
|
543
|
+
/** Behaviour when the anchor projects outside the viewport. Defaults to "clamp". */
|
|
544
|
+
readonly offscreenPolicy?: "hide" | "clamp" | "draw";
|
|
524
545
|
readonly color?: AuraColor;
|
|
525
546
|
readonly background?: AuraColor;
|
|
526
547
|
readonly size?: number;
|
|
@@ -887,7 +908,7 @@ export declare const lights: {
|
|
|
887
908
|
readonly intensity?: number;
|
|
888
909
|
}) => AuraNodeBuilder<AuraLightNode>;
|
|
889
910
|
};
|
|
890
|
-
export type AuraCameraMode = "perspective" | "orbit" | "dolly" | "follow" | "path" | "flythrough";
|
|
911
|
+
export type AuraCameraMode = "perspective" | "orbit" | "dolly" | "follow" | "path" | "flythrough" | "orthographic" | "isometric";
|
|
891
912
|
export interface AuraCameraSpec {
|
|
892
913
|
readonly mode: AuraCameraMode;
|
|
893
914
|
readonly position?: AuraVec3;
|
|
@@ -905,6 +926,16 @@ export interface AuraCameraSpec {
|
|
|
905
926
|
readonly captureTime?: number;
|
|
906
927
|
readonly smoothing?: number;
|
|
907
928
|
readonly subjectEmphasis?: number;
|
|
929
|
+
/**
|
|
930
|
+
* Half-height of the orthographic frustum, in world units.
|
|
931
|
+
*
|
|
932
|
+
* Orthographic projection has no field of view, so this is what sets image
|
|
933
|
+
* scale: the camera sees `orthographicSize` units above and below its target
|
|
934
|
+
* regardless of how far away it sits. Horizontal extent follows from the
|
|
935
|
+
* viewport aspect, which keeps the image square-on rather than stretched.
|
|
936
|
+
* Ignored by every perspective mode.
|
|
937
|
+
*/
|
|
938
|
+
readonly orthographicSize?: number;
|
|
908
939
|
}
|
|
909
940
|
export interface AuraBoundsSpec {
|
|
910
941
|
readonly min: AuraVec3;
|
|
@@ -941,6 +972,28 @@ export declare const camera: {
|
|
|
941
972
|
readonly from?: AuraVec3;
|
|
942
973
|
readonly to?: AuraVec3;
|
|
943
974
|
}) => AuraCameraSpec;
|
|
975
|
+
/**
|
|
976
|
+
* A parallel-projection camera: no foreshortening, so equal world lengths
|
|
977
|
+
* occupy equal screen lengths wherever they sit in depth.
|
|
978
|
+
*
|
|
979
|
+
* Reach for this when the projection is part of the meaning rather than a
|
|
980
|
+
* stylistic choice — CAD and engineering views, floor plans, technical
|
|
981
|
+
* diagrams, sprite and texture bakes, chart axes, and product shots that must
|
|
982
|
+
* read as measurable. A long-lens perspective camera approximates it but
|
|
983
|
+
* still converges, which is visible on long straight edges.
|
|
984
|
+
*/
|
|
985
|
+
readonly orthographic: (options?: Omit<AuraCameraSpec, "mode">) => AuraCameraSpec;
|
|
986
|
+
/**
|
|
987
|
+
* The conventional isometric view: an orthographic camera on a 45-degree
|
|
988
|
+
* azimuth and a ~35.264-degree elevation.
|
|
989
|
+
*
|
|
990
|
+
* That elevation is `atan(1 / sqrt(2))`, the angle at which the three world
|
|
991
|
+
* axes project to equal screen lengths and 120 degrees apart. Authoring it as
|
|
992
|
+
* a preset matters because the value is not memorable and an approximation
|
|
993
|
+
* such as 30 or 45 degrees produces the subtly-wrong grid alignment that
|
|
994
|
+
* isometric tile art immediately reveals.
|
|
995
|
+
*/
|
|
996
|
+
readonly isometric: (options?: Omit<AuraCameraSpec, "mode">) => AuraCameraSpec;
|
|
944
997
|
readonly autoFrame: (options?: {
|
|
945
998
|
readonly bounds?: AuraBoundsSpec;
|
|
946
999
|
readonly target?: AuraVec3;
|
|
@@ -2233,6 +2286,15 @@ export interface AuraDiagnostics {
|
|
|
2233
2286
|
readonly renderer?: AuraRendererDiagnosticReport;
|
|
2234
2287
|
readonly warnings: readonly string[];
|
|
2235
2288
|
readonly errors: readonly string[];
|
|
2289
|
+
/**
|
|
2290
|
+
* Labels the world-label layer actually placed on screen this frame, with their
|
|
2291
|
+
* projected pixel positions and visibility.
|
|
2292
|
+
*
|
|
2293
|
+
* This distinguishes "a label node exists in the scene" from "a label is drawn
|
|
2294
|
+
* where the user can read it". Every production callout was silently dropped
|
|
2295
|
+
* while evidence counted the nodes, so the counted-node signal is not enough.
|
|
2296
|
+
*/
|
|
2297
|
+
readonly labels?: readonly ProjectedLabel[];
|
|
2236
2298
|
}
|
|
2237
2299
|
export interface AuraAssetProvenance {
|
|
2238
2300
|
readonly source: "typed-aura-assets-manifest" | "unsafe-url" | "inline-definition";
|
|
@@ -2508,4 +2570,5 @@ interface ProductionBoundsProbe {
|
|
|
2508
2570
|
* silently producing mismatched framing.
|
|
2509
2571
|
*/
|
|
2510
2572
|
export declare function auraProductionBoundsProbes(): readonly ProductionBoundsProbe[];
|
|
2573
|
+
export declare function isOrthographicCameraMode(mode: AuraCameraMode): boolean;
|
|
2511
2574
|
//# sourceMappingURL=index.d.ts.map
|