@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.
Files changed (63) hide show
  1. package/README.md +111 -46
  2. package/dist/engine/agent-api/ApplicationKits.d.ts +307 -0
  3. package/dist/engine/agent-api/ApplicationKits.d.ts.map +1 -0
  4. package/dist/engine/agent-api/ApplicationKits.js +650 -0
  5. package/dist/engine/agent-api/ApplicationKits.js.map +1 -0
  6. package/dist/engine/agent-api/CombatFrameData.d.ts +210 -0
  7. package/dist/engine/agent-api/CombatFrameData.d.ts.map +1 -0
  8. package/dist/engine/agent-api/CombatFrameData.js +324 -0
  9. package/dist/engine/agent-api/CombatFrameData.js.map +1 -0
  10. package/dist/engine/agent-api/FocusSelection.d.ts +186 -0
  11. package/dist/engine/agent-api/FocusSelection.d.ts.map +1 -0
  12. package/dist/engine/agent-api/FocusSelection.js +436 -0
  13. package/dist/engine/agent-api/FocusSelection.js.map +1 -0
  14. package/dist/engine/agent-api/GameGenreKits.d.ts +32 -1
  15. package/dist/engine/agent-api/GameGenreKits.d.ts.map +1 -1
  16. package/dist/engine/agent-api/GameGenreKits.js +51 -7
  17. package/dist/engine/agent-api/GameGenreKits.js.map +1 -1
  18. package/dist/engine/agent-api/GameSceneGeometryBindings.d.ts +10 -0
  19. package/dist/engine/agent-api/GameSceneGeometryBindings.d.ts.map +1 -1
  20. package/dist/engine/agent-api/GameSceneGeometryBindings.js +7 -0
  21. package/dist/engine/agent-api/GameSceneGeometryBindings.js.map +1 -1
  22. package/dist/engine/agent-api/PlatformerMotion.d.ts +177 -0
  23. package/dist/engine/agent-api/PlatformerMotion.d.ts.map +1 -0
  24. package/dist/engine/agent-api/PlatformerMotion.js +207 -0
  25. package/dist/engine/agent-api/PlatformerMotion.js.map +1 -0
  26. package/dist/engine/agent-api/SceneQueries.d.ts +124 -0
  27. package/dist/engine/agent-api/SceneQueries.d.ts.map +1 -0
  28. package/dist/engine/agent-api/SceneQueries.js +221 -0
  29. package/dist/engine/agent-api/SceneQueries.js.map +1 -0
  30. package/dist/engine/agent-api/SpatialAnchoring.d.ts +279 -0
  31. package/dist/engine/agent-api/SpatialAnchoring.d.ts.map +1 -0
  32. package/dist/engine/agent-api/SpatialAnchoring.js +394 -0
  33. package/dist/engine/agent-api/SpatialAnchoring.js.map +1 -0
  34. package/dist/engine/agent-api/VehicleChassis.d.ts +192 -0
  35. package/dist/engine/agent-api/VehicleChassis.d.ts.map +1 -0
  36. package/dist/engine/agent-api/VehicleChassis.js +322 -0
  37. package/dist/engine/agent-api/VehicleChassis.js.map +1 -0
  38. package/dist/engine/agent-api/VehicleDriverAi.d.ts +123 -0
  39. package/dist/engine/agent-api/VehicleDriverAi.d.ts.map +1 -0
  40. package/dist/engine/agent-api/VehicleDriverAi.js +217 -0
  41. package/dist/engine/agent-api/VehicleDriverAi.js.map +1 -0
  42. package/dist/engine/agent-api/WorldLabelRenderer.d.ts +146 -0
  43. package/dist/engine/agent-api/WorldLabelRenderer.d.ts.map +1 -0
  44. package/dist/engine/agent-api/WorldLabelRenderer.js +331 -0
  45. package/dist/engine/agent-api/WorldLabelRenderer.js.map +1 -0
  46. package/dist/engine/agent-api/index.d.ts +64 -1
  47. package/dist/engine/agent-api/index.d.ts.map +1 -1
  48. package/dist/engine/agent-api/index.js +148 -2
  49. package/dist/engine/agent-api/index.js.map +1 -1
  50. package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
  51. package/dist/rendering/CameraFraming.d.ts +77 -0
  52. package/dist/rendering/CameraFraming.d.ts.map +1 -1
  53. package/dist/rendering/CameraFraming.js +176 -1
  54. package/dist/rendering/CameraFraming.js.map +1 -1
  55. package/dist/rendering/Renderer.d.ts +25 -2
  56. package/dist/rendering/Renderer.d.ts.map +1 -1
  57. package/dist/rendering/Renderer.js +11 -3
  58. package/dist/rendering/Renderer.js.map +1 -1
  59. package/dist/rendering/index.d.ts +3 -3
  60. package/dist/rendering/index.d.ts.map +1 -1
  61. package/dist/rendering/index.js +1 -1
  62. package/dist/rendering/index.js.map +1 -1
  63. 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