@aura3d/debug 1.0.6

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 (83) hide show
  1. package/README.md +17 -0
  2. package/dist/AnimationInspector.d.ts +25 -0
  3. package/dist/AnimationInspector.d.ts.map +1 -0
  4. package/dist/AnimationInspector.js +46 -0
  5. package/dist/AnimationInspector.js.map +1 -0
  6. package/dist/ChromeTraceExporter.d.ts +35 -0
  7. package/dist/ChromeTraceExporter.d.ts.map +1 -0
  8. package/dist/ChromeTraceExporter.js +110 -0
  9. package/dist/ChromeTraceExporter.js.map +1 -0
  10. package/dist/DebugLineCanvasRenderer.d.ts +24 -0
  11. package/dist/DebugLineCanvasRenderer.d.ts.map +1 -0
  12. package/dist/DebugLineCanvasRenderer.js +58 -0
  13. package/dist/DebugLineCanvasRenderer.js.map +1 -0
  14. package/dist/DebugOverlay.d.ts +18 -0
  15. package/dist/DebugOverlay.d.ts.map +1 -0
  16. package/dist/DebugOverlay.js +19 -0
  17. package/dist/DebugOverlay.js.map +1 -0
  18. package/dist/DrawCallTracker.d.ts +22 -0
  19. package/dist/DrawCallTracker.d.ts.map +1 -0
  20. package/dist/DrawCallTracker.js +28 -0
  21. package/dist/DrawCallTracker.js.map +1 -0
  22. package/dist/ECSInspector.d.ts +16 -0
  23. package/dist/ECSInspector.d.ts.map +1 -0
  24. package/dist/ECSInspector.js +12 -0
  25. package/dist/ECSInspector.js.map +1 -0
  26. package/dist/GPUProfiler.d.ts +22 -0
  27. package/dist/GPUProfiler.d.ts.map +1 -0
  28. package/dist/GPUProfiler.js +32 -0
  29. package/dist/GPUProfiler.js.map +1 -0
  30. package/dist/MaterialDiagnostics.d.ts +17 -0
  31. package/dist/MaterialDiagnostics.d.ts.map +1 -0
  32. package/dist/MaterialDiagnostics.js +43 -0
  33. package/dist/MaterialDiagnostics.js.map +1 -0
  34. package/dist/PhysicsDebugAdapter.d.ts +29 -0
  35. package/dist/PhysicsDebugAdapter.d.ts.map +1 -0
  36. package/dist/PhysicsDebugAdapter.js +57 -0
  37. package/dist/PhysicsDebugAdapter.js.map +1 -0
  38. package/dist/Profiler.d.ts +24 -0
  39. package/dist/Profiler.d.ts.map +1 -0
  40. package/dist/Profiler.js +56 -0
  41. package/dist/Profiler.js.map +1 -0
  42. package/dist/RenderStateInspector.d.ts +19 -0
  43. package/dist/RenderStateInspector.d.ts.map +1 -0
  44. package/dist/RenderStateInspector.js +33 -0
  45. package/dist/RenderStateInspector.js.map +1 -0
  46. package/dist/ReportExporter.d.ts +12 -0
  47. package/dist/ReportExporter.d.ts.map +1 -0
  48. package/dist/ReportExporter.js +27 -0
  49. package/dist/ReportExporter.js.map +1 -0
  50. package/dist/ResourceTracker.d.ts +23 -0
  51. package/dist/ResourceTracker.d.ts.map +1 -0
  52. package/dist/ResourceTracker.js +41 -0
  53. package/dist/ResourceTracker.js.map +1 -0
  54. package/dist/SceneHelpers.d.ts +46 -0
  55. package/dist/SceneHelpers.d.ts.map +1 -0
  56. package/dist/SceneHelpers.js +137 -0
  57. package/dist/SceneHelpers.js.map +1 -0
  58. package/dist/ShaderDiagnostics.d.ts +20 -0
  59. package/dist/ShaderDiagnostics.d.ts.map +1 -0
  60. package/dist/ShaderDiagnostics.js +49 -0
  61. package/dist/ShaderDiagnostics.js.map +1 -0
  62. package/dist/index.d.ts +31 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +16 -0
  65. package/dist/index.js.map +1 -0
  66. package/package.json +18 -0
  67. package/src/AnimationInspector.ts +71 -0
  68. package/src/ChromeTraceExporter.ts +158 -0
  69. package/src/DebugLineCanvasRenderer.ts +96 -0
  70. package/src/DebugOverlay.ts +35 -0
  71. package/src/DrawCallTracker.ts +46 -0
  72. package/src/ECSInspector.ts +23 -0
  73. package/src/GPUProfiler.ts +48 -0
  74. package/src/MaterialDiagnostics.ts +59 -0
  75. package/src/PhysicsDebugAdapter.ts +86 -0
  76. package/src/Profiler.ts +77 -0
  77. package/src/RenderStateInspector.ts +45 -0
  78. package/src/ReportExporter.ts +32 -0
  79. package/src/ResourceTracker.ts +59 -0
  80. package/src/SceneHelpers.ts +188 -0
  81. package/src/ShaderDiagnostics.ts +64 -0
  82. package/src/index.ts +46 -0
  83. package/tsconfig.json +32 -0
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # @aura3d/debug
2
+
3
+ `@aura3d/debug` owns diagnostics helpers for rendering, materials, shaders, physics, animation, ECS, profiling, resource leaks, overlays, line rendering, and report export.
4
+
5
+ ## Public API
6
+
7
+ - `DrawCallTracker`, `RenderStateInspector`: draw-call recording and render-state leak detection.
8
+ - `ShaderDiagnostics`, `MaterialDiagnostics`: shader-source and material-binding validation with structured errors.
9
+ - `PhysicsDebugAdapter`, `AnimationInspector`, `ECSInspector`: snapshot and evidence adapters for runtime subsystems.
10
+ - `Profiler`, `GPUProfiler`, `ChromeTraceExporter`: CPU marker snapshots, GPU timer abstractions, and deterministic Chrome trace export for bounded local profiling evidence.
11
+ - `ResourceTracker`: leak detection for tracked runtime resources.
12
+ - `DebugOverlay`, `DebugLineCanvasRenderer`: browser-visible overlay rows and debug line drawing.
13
+ - `ReportExporter`: deterministic debug report serialization.
14
+
15
+ ## Verification
16
+
17
+ Debug runtime behavior, render diagnostics, shader/material validation, physics/animation evidence, Chrome trace export, overlay rendering, and browser debug pixels are covered by `tests/unit/debug/debug-runtime.test.ts`, `tests/unit/debug/rendering-diagnostics.test.ts`, `tests/unit/workstream4.physics-animation.test.ts`, and `tests/browser/debug-browser.spec.ts`. Export and import consistency is covered by `pnpm verify:exports` and `pnpm verify:imports`.
@@ -0,0 +1,25 @@
1
+ import type { AnimationMixer, AnimationMixerSnapshot, Skeleton } from "@aura3d/animation";
2
+ export type SkeletonDebugSnapshot = {
3
+ readonly boneCount: number;
4
+ readonly boneNames: readonly string[];
5
+ readonly paletteMatrixCount: number;
6
+ };
7
+ export type AnimationDebugSnapshot = {
8
+ readonly mixer: AnimationMixerSnapshot;
9
+ readonly skeleton?: SkeletonDebugSnapshot;
10
+ };
11
+ export type AnimationVisualEvidence = {
12
+ readonly actionCount: number;
13
+ readonly playingActionCount: number;
14
+ readonly sampledTargetCount: number;
15
+ readonly sampledTargets: readonly string[];
16
+ readonly skeletonBoneCount: number;
17
+ readonly paletteMatrixCount: number;
18
+ readonly paletteHash?: string;
19
+ readonly stableHash: string;
20
+ };
21
+ export declare class AnimationInspector {
22
+ snapshot(mixer: Pick<AnimationMixer, "snapshot">, skeleton?: Skeleton): AnimationDebugSnapshot;
23
+ visualEvidence(mixer: Pick<AnimationMixer, "snapshot">, skeleton?: Skeleton): AnimationVisualEvidence;
24
+ }
25
+ //# sourceMappingURL=AnimationInspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationInspector.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/AnimationInspector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE1F,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,sBAAsB;IAiB9F,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,uBAAuB;CAkBtG"}
@@ -0,0 +1,46 @@
1
+ export class AnimationInspector {
2
+ snapshot(mixer, skeleton) {
3
+ const snapshot = {
4
+ mixer: mixer.snapshot()
5
+ };
6
+ if (skeleton) {
7
+ return {
8
+ ...snapshot,
9
+ skeleton: {
10
+ boneCount: skeleton.bones.length,
11
+ boneNames: skeleton.bones.map((bone) => bone.name),
12
+ paletteMatrixCount: skeleton.matrixPalette().length
13
+ }
14
+ };
15
+ }
16
+ return snapshot;
17
+ }
18
+ visualEvidence(mixer, skeleton) {
19
+ const snapshot = mixer.snapshot();
20
+ const sampledTargets = Object.keys(snapshot.values).sort();
21
+ const palette = skeleton?.matrixPalette();
22
+ const evidenceWithoutHash = {
23
+ actionCount: snapshot.actionCount,
24
+ playingActionCount: snapshot.actions.filter((action) => action.playing).length,
25
+ sampledTargetCount: sampledTargets.length,
26
+ sampledTargets,
27
+ skeletonBoneCount: skeleton?.bones.length ?? 0,
28
+ paletteMatrixCount: palette?.length ?? 0,
29
+ ...(palette ? { paletteHash: stableHash(palette.map((matrix) => matrix.map((value) => Number(value.toFixed(6))))) } : {})
30
+ };
31
+ return {
32
+ ...evidenceWithoutHash,
33
+ stableHash: stableHash(evidenceWithoutHash)
34
+ };
35
+ }
36
+ }
37
+ function stableHash(value) {
38
+ const input = JSON.stringify(value);
39
+ let hash = 2166136261;
40
+ for (let index = 0; index < input.length; index += 1) {
41
+ hash ^= input.charCodeAt(index);
42
+ hash = Math.imul(hash, 16777619);
43
+ }
44
+ return (hash >>> 0).toString(16).padStart(8, "0");
45
+ }
46
+ //# sourceMappingURL=AnimationInspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationInspector.js","sourceRoot":"","sources":["../../../../packages/debug/src/AnimationInspector.ts"],"names":[],"mappings":"AAwBA,MAAM,OAAO,kBAAkB;IAC7B,QAAQ,CAAC,KAAuC,EAAE,QAAmB;QACnE,MAAM,QAAQ,GAA2B;YACvC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;SACxB,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;gBACL,GAAG,QAAQ;gBACX,QAAQ,EAAE;oBACV,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;oBAChC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;oBAClD,kBAAkB,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM;iBAClD;aACF,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,cAAc,CAAC,KAAuC,EAAE,QAAmB;QACzE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,QAAQ,EAAE,aAAa,EAAE,CAAC;QAC1C,MAAM,mBAAmB,GAAG;YAC1B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,kBAAkB,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM;YAC9E,kBAAkB,EAAE,cAAc,CAAC,MAAM;YACzC,cAAc;YACd,iBAAiB,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC;YAC9C,kBAAkB,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;YACxC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1H,CAAC;QACF,OAAO;YACL,GAAG,mBAAmB;YACtB,UAAU,EAAE,UAAU,CAAC,mBAAmB,CAAC;SAC5C,CAAC;IACJ,CAAC;CACF;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { ProfilerSnapshot } from "./Profiler.js";
2
+ import type { GPUProfilerSnapshot } from "./GPUProfiler.js";
3
+ export interface ChromeTraceEvent {
4
+ readonly name: string;
5
+ readonly cat: string;
6
+ readonly ph: "M" | "X" | "C" | "i";
7
+ readonly ts: number;
8
+ readonly pid: number;
9
+ readonly tid: number;
10
+ readonly dur?: number;
11
+ readonly args?: Record<string, number | string | boolean | null>;
12
+ }
13
+ export interface ChromeTrace {
14
+ readonly traceEvents: readonly ChromeTraceEvent[];
15
+ readonly displayTimeUnit: "ms";
16
+ readonly metadata: {
17
+ readonly source: "aura3d-debug-chrome-trace-exporter";
18
+ readonly profileName: string;
19
+ readonly cpuMarkerCount: number;
20
+ readonly gpuSampleCount: number;
21
+ readonly claimBoundary: string;
22
+ };
23
+ }
24
+ export interface ChromeTraceExportOptions {
25
+ readonly profileName?: string;
26
+ readonly processId?: number;
27
+ readonly cpuThreadId?: number;
28
+ readonly gpuThreadId?: number;
29
+ readonly includeCounters?: boolean;
30
+ }
31
+ export declare class ChromeTraceExporter {
32
+ static create(cpu: ProfilerSnapshot, gpu?: GPUProfilerSnapshot, options?: ChromeTraceExportOptions): ChromeTrace;
33
+ static toJson(trace: ChromeTrace): string;
34
+ }
35
+ //# sourceMappingURL=ChromeTraceExporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChromeTraceExporter.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/ChromeTraceExporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EAAa,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,MAAM,EAAE,oCAAoC,CAAC;QACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,gBAAgB,EACrB,GAAG,CAAC,EAAE,mBAAmB,EACzB,OAAO,GAAE,wBAA6B,GACrC,WAAW;IA8Dd,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;CAG1C"}
@@ -0,0 +1,110 @@
1
+ export class ChromeTraceExporter {
2
+ static create(cpu, gpu, options = {}) {
3
+ const profileName = options.profileName?.trim() || "Aura3D profile";
4
+ const processId = positiveInteger(options.processId, 1);
5
+ const cpuThreadId = positiveInteger(options.cpuThreadId, 1);
6
+ const gpuThreadId = positiveInteger(options.gpuThreadId, 2);
7
+ const events = [
8
+ metadataEvent("process_name", processId, cpuThreadId, { name: "Aura3D" }),
9
+ metadataEvent("thread_name", processId, cpuThreadId, { name: "CPU" }),
10
+ metadataEvent("thread_name", processId, gpuThreadId, { name: "GPU" })
11
+ ];
12
+ for (const marker of cpu.markers) {
13
+ events.push(cpuMarkerEvent(marker, processId, cpuThreadId));
14
+ }
15
+ if (gpu) {
16
+ for (const sample of gpu.samples) {
17
+ events.push(gpuSampleEvent(sample, processId, gpuThreadId));
18
+ }
19
+ if (gpu.supported === false) {
20
+ events.push({
21
+ name: "gpu_timing_unavailable",
22
+ cat: "gpu",
23
+ ph: "i",
24
+ ts: 0,
25
+ pid: processId,
26
+ tid: gpuThreadId,
27
+ args: { reason: gpu.unavailableReason ?? "GPU timing unavailable" }
28
+ });
29
+ }
30
+ }
31
+ if (options.includeCounters !== false) {
32
+ events.push({
33
+ name: "profile_counters",
34
+ cat: "counters",
35
+ ph: "C",
36
+ ts: 0,
37
+ pid: processId,
38
+ tid: cpuThreadId,
39
+ args: {
40
+ cpuMarkerCount: cpu.markerCount,
41
+ cpuTotalDurationMs: fixed(cpu.totalDurationMs),
42
+ gpuSampleCount: gpu?.sampleCount ?? 0,
43
+ gpuSupported: gpu?.supported ?? false
44
+ }
45
+ });
46
+ }
47
+ return {
48
+ traceEvents: events,
49
+ displayTimeUnit: "ms",
50
+ metadata: {
51
+ source: "aura3d-debug-chrome-trace-exporter",
52
+ profileName,
53
+ cpuMarkerCount: cpu.markerCount,
54
+ gpuSampleCount: gpu?.sampleCount ?? 0,
55
+ claimBoundary: "Chrome trace export is bounded local profiling evidence; it is not Unity/Unreal profiler parity."
56
+ }
57
+ };
58
+ }
59
+ static toJson(trace) {
60
+ return `${JSON.stringify(trace, null, 2)}\n`;
61
+ }
62
+ }
63
+ function metadataEvent(name, pid, tid, args) {
64
+ return {
65
+ name,
66
+ cat: "__metadata",
67
+ ph: "M",
68
+ ts: 0,
69
+ pid,
70
+ tid,
71
+ args
72
+ };
73
+ }
74
+ function cpuMarkerEvent(marker, pid, tid) {
75
+ return {
76
+ name: marker.name,
77
+ cat: "cpu",
78
+ ph: "X",
79
+ ts: millisecondsToMicroseconds(marker.startMs),
80
+ dur: millisecondsToMicroseconds(marker.durationMs),
81
+ pid,
82
+ tid,
83
+ args: {
84
+ depth: marker.depth,
85
+ endMs: fixed(marker.endMs)
86
+ }
87
+ };
88
+ }
89
+ function gpuSampleEvent(sample, pid, tid) {
90
+ return {
91
+ name: sample.label,
92
+ cat: "gpu",
93
+ ph: "X",
94
+ ts: 0,
95
+ dur: millisecondsToMicroseconds(sample.durationMs),
96
+ pid,
97
+ tid,
98
+ args: { durationMs: fixed(sample.durationMs) }
99
+ };
100
+ }
101
+ function millisecondsToMicroseconds(value) {
102
+ return Math.max(0, Math.round(value * 1_000));
103
+ }
104
+ function positiveInteger(value, fallback) {
105
+ return Number.isInteger(value) && Number(value) > 0 ? Number(value) : fallback;
106
+ }
107
+ function fixed(value) {
108
+ return Number(value.toFixed(4));
109
+ }
110
+ //# sourceMappingURL=ChromeTraceExporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChromeTraceExporter.js","sourceRoot":"","sources":["../../../../packages/debug/src/ChromeTraceExporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface DebugRenderLine {
2
+ readonly from: readonly [number, number, number];
3
+ readonly to: readonly [number, number, number];
4
+ readonly color: readonly [number, number, number, number];
5
+ }
6
+ export interface DebugLineCanvasRendererOptions {
7
+ readonly scale?: number;
8
+ readonly origin?: readonly [number, number];
9
+ readonly axis?: "xy" | "xz";
10
+ readonly lineWidth?: number;
11
+ }
12
+ export interface DebugLineCanvasRenderResult {
13
+ readonly lineCount: number;
14
+ readonly bounds: {
15
+ readonly minX: number;
16
+ readonly minY: number;
17
+ readonly maxX: number;
18
+ readonly maxY: number;
19
+ };
20
+ }
21
+ export declare class DebugLineCanvasRenderer {
22
+ render(context: CanvasRenderingContext2D, lines: readonly DebugRenderLine[], options?: DebugLineCanvasRendererOptions): DebugLineCanvasRenderResult;
23
+ }
24
+ //# sourceMappingURL=DebugLineCanvasRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugLineCanvasRenderer.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/DebugLineCanvasRenderer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,qBAAa,uBAAuB;IAClC,MAAM,CACJ,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,OAAO,GAAE,8BAAmC,GAC3C,2BAA2B;CAuC/B"}
@@ -0,0 +1,58 @@
1
+ export class DebugLineCanvasRenderer {
2
+ render(context, lines, options = {}) {
3
+ const scale = options.scale ?? 1;
4
+ if (!Number.isFinite(scale) || scale <= 0) {
5
+ throw new RangeError("Debug line canvas scale must be a finite positive number.");
6
+ }
7
+ const origin = options.origin ?? [0, 0];
8
+ const axis = options.axis ?? "xy";
9
+ const lineWidth = options.lineWidth ?? 1;
10
+ if (!Number.isFinite(lineWidth) || lineWidth <= 0) {
11
+ throw new RangeError("Debug line canvas width must be a finite positive number.");
12
+ }
13
+ const bounds = {
14
+ minX: Number.POSITIVE_INFINITY,
15
+ minY: Number.POSITIVE_INFINITY,
16
+ maxX: Number.NEGATIVE_INFINITY,
17
+ maxY: Number.NEGATIVE_INFINITY
18
+ };
19
+ context.save();
20
+ context.lineWidth = lineWidth;
21
+ for (const line of lines) {
22
+ const from = project(line.from, axis, scale, origin);
23
+ const to = project(line.to, axis, scale, origin);
24
+ include(bounds, from);
25
+ include(bounds, to);
26
+ context.strokeStyle = rgba(line.color);
27
+ context.beginPath();
28
+ context.moveTo(from[0], from[1]);
29
+ context.lineTo(to[0], to[1]);
30
+ context.stroke();
31
+ }
32
+ context.restore();
33
+ if (lines.length === 0) {
34
+ return { lineCount: 0, bounds: { minX: 0, minY: 0, maxX: 0, maxY: 0 } };
35
+ }
36
+ return { lineCount: lines.length, bounds };
37
+ }
38
+ }
39
+ function project(point, axis, scale, origin) {
40
+ const y = axis === "xy" ? point[1] : point[2];
41
+ return [origin[0] + point[0] * scale, origin[1] - y * scale];
42
+ }
43
+ function include(bounds, point) {
44
+ bounds.minX = Math.min(bounds.minX, point[0]);
45
+ bounds.minY = Math.min(bounds.minY, point[1]);
46
+ bounds.maxX = Math.max(bounds.maxX, point[0]);
47
+ bounds.maxY = Math.max(bounds.maxY, point[1]);
48
+ }
49
+ function rgba(color) {
50
+ const r = Math.round(clamp01(color[0]) * 255);
51
+ const g = Math.round(clamp01(color[1]) * 255);
52
+ const b = Math.round(clamp01(color[2]) * 255);
53
+ return `rgba(${r}, ${g}, ${b}, ${clamp01(color[3])})`;
54
+ }
55
+ function clamp01(value) {
56
+ return Math.min(1, Math.max(0, Number.isFinite(value) ? value : 0));
57
+ }
58
+ //# sourceMappingURL=DebugLineCanvasRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugLineCanvasRenderer.js","sourceRoot":"","sources":["../../../../packages/debug/src/DebugLineCanvasRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface DebugOverlaySection {
2
+ readonly title: string;
3
+ readonly rows: readonly DebugOverlayRow[];
4
+ }
5
+ export interface DebugOverlayRow {
6
+ readonly label: string;
7
+ readonly value: string | number | boolean | null;
8
+ }
9
+ export interface DebugOverlaySnapshot {
10
+ readonly sections: readonly DebugOverlaySection[];
11
+ }
12
+ export declare class DebugOverlay {
13
+ private readonly sections;
14
+ setSection(title: string, rows: readonly DebugOverlayRow[]): void;
15
+ removeSection(title: string): void;
16
+ snapshot(): DebugOverlaySnapshot;
17
+ }
18
+ //# sourceMappingURL=DebugOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugOverlay.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/DebugOverlay.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,eAAe,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACnD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IAEjE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,eAAe,EAAE,GAAG,IAAI;IAQjE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIlC,QAAQ,IAAI,oBAAoB;CAKjC"}
@@ -0,0 +1,19 @@
1
+ export class DebugOverlay {
2
+ sections = new Map();
3
+ setSection(title, rows) {
4
+ const trimmed = title.trim();
5
+ if (trimmed.length === 0) {
6
+ throw new Error("Debug overlay section title is required");
7
+ }
8
+ this.sections.set(trimmed, rows.map((row) => ({ ...row })));
9
+ }
10
+ removeSection(title) {
11
+ this.sections.delete(title);
12
+ }
13
+ snapshot() {
14
+ return {
15
+ sections: [...this.sections.entries()].map(([title, rows]) => ({ title, rows: [...rows] }))
16
+ };
17
+ }
18
+ }
19
+ //# sourceMappingURL=DebugOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugOverlay.js","sourceRoot":"","sources":["../../../../packages/debug/src/DebugOverlay.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,YAAY;IACN,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAEjE,UAAU,CAAC,KAAa,EAAE,IAAgC;QACxD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,QAAQ;QACN,OAAO;YACL,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;SAC5F,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import { type DrawCommand, type RenderDeviceDiagnostics } from "@aura3d/rendering";
2
+ export interface DrawCallRecord {
3
+ readonly label: string;
4
+ readonly topology: string;
5
+ readonly indexed: boolean;
6
+ readonly count: number;
7
+ readonly shader: string | null;
8
+ }
9
+ export interface DrawCallSnapshot {
10
+ readonly frame: number;
11
+ readonly total: number;
12
+ readonly records: readonly DrawCallRecord[];
13
+ readonly zeroDrawCallFailure: boolean;
14
+ }
15
+ export declare class DrawCallTracker {
16
+ private frame;
17
+ private readonly records;
18
+ beginFrame(): void;
19
+ record(command: DrawCommand): void;
20
+ capture(deviceDiagnostics?: RenderDeviceDiagnostics): DrawCallSnapshot;
21
+ }
22
+ //# sourceMappingURL=DrawCallTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrawCallTracker.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/DrawCallTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEnF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAEhD,UAAU,IAAI,IAAI;IAKlB,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAUlC,OAAO,CAAC,iBAAiB,CAAC,EAAE,uBAAuB,GAAG,gBAAgB;CASvE"}
@@ -0,0 +1,28 @@
1
+ import {} from "@aura3d/rendering";
2
+ export class DrawCallTracker {
3
+ frame = 0;
4
+ records = [];
5
+ beginFrame() {
6
+ this.frame += 1;
7
+ this.records.length = 0;
8
+ }
9
+ record(command) {
10
+ this.records.push({
11
+ label: command.label ?? "draw",
12
+ topology: command.topology,
13
+ indexed: command.indexBuffer !== undefined,
14
+ count: command.indexCount ?? command.vertexCount,
15
+ shader: command.shader?.label ?? null
16
+ });
17
+ }
18
+ capture(deviceDiagnostics) {
19
+ const total = deviceDiagnostics?.drawCalls ?? this.records.length;
20
+ return {
21
+ frame: this.frame,
22
+ total,
23
+ records: [...this.records],
24
+ zeroDrawCallFailure: total === 0
25
+ };
26
+ }
27
+ }
28
+ //# sourceMappingURL=DrawCallTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrawCallTracker.js","sourceRoot":"","sources":["../../../../packages/debug/src/DrawCallTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkD,MAAM,mBAAmB,CAAC;AAiBnF,MAAM,OAAO,eAAe;IAClB,KAAK,GAAG,CAAC,CAAC;IACD,OAAO,GAAqB,EAAE,CAAC;IAEhD,UAAU;QACR,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,OAAoB;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM;YAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,WAAW,KAAK,SAAS;YAC1C,KAAK,EAAE,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,WAAW;YAChD,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI;SACtC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,iBAA2C;QACjD,MAAM,KAAK,GAAG,iBAAiB,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAClE,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK;YACL,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAC1B,mBAAmB,EAAE,KAAK,KAAK,CAAC;SACjC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ export interface ECSWorldLike {
2
+ entities?(): readonly unknown[];
3
+ query?(...args: unknown[]): Iterable<unknown>;
4
+ readonly entityCount?: number;
5
+ profiler?: {
6
+ snapshot(): unknown;
7
+ };
8
+ }
9
+ export interface ECSInspectorSnapshot {
10
+ readonly entityCount: number;
11
+ readonly profiler?: unknown;
12
+ }
13
+ export declare class ECSInspector {
14
+ snapshot(world: ECSWorldLike): ECSInspectorSnapshot;
15
+ }
16
+ //# sourceMappingURL=ECSInspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSInspector.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/ECSInspector.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,SAAS,OAAO,EAAE,CAAC;IAChC,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE;QAAE,QAAQ,IAAI,OAAO,CAAA;KAAE,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,oBAAoB;CASpD"}
@@ -0,0 +1,12 @@
1
+ export class ECSInspector {
2
+ snapshot(world) {
3
+ const entityCount = typeof world.entityCount === "number"
4
+ ? world.entityCount
5
+ : world.entities?.().length ?? 0;
6
+ return {
7
+ entityCount,
8
+ ...(world.profiler ? { profiler: world.profiler.snapshot() } : {})
9
+ };
10
+ }
11
+ }
12
+ //# sourceMappingURL=ECSInspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSInspector.js","sourceRoot":"","sources":["../../../../packages/debug/src/ECSInspector.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,YAAY;IACvB,QAAQ,CAAC,KAAmB;QAC1B,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;YACvD,CAAC,CAAC,KAAK,CAAC,WAAW;YACnB,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;QACnC,OAAO;YACL,WAAW;YACX,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ export interface GPUProfilerSnapshot {
2
+ readonly supported: boolean;
3
+ readonly sampleCount: number;
4
+ readonly samples: readonly GPUSample[];
5
+ readonly unavailableReason?: string;
6
+ }
7
+ export interface GPUSample {
8
+ readonly label: string;
9
+ readonly durationMs: number;
10
+ }
11
+ export interface GPUProfilerTimer {
12
+ end(durationMs?: number): GPUSample;
13
+ }
14
+ export declare class GPUProfiler {
15
+ private readonly supported;
16
+ private readonly unavailableReason;
17
+ private readonly samples;
18
+ constructor(supported?: boolean, unavailableReason?: string);
19
+ begin(label: string): GPUProfilerTimer;
20
+ snapshot(): GPUProfilerSnapshot;
21
+ }
22
+ //# sourceMappingURL=GPUProfiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GPUProfiler.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/GPUProfiler.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAJpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;gBAGxB,SAAS,UAAQ,EACjB,iBAAiB,SAAqC;IAGzE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB;IAetC,QAAQ,IAAI,mBAAmB;CAQhC"}
@@ -0,0 +1,32 @@
1
+ export class GPUProfiler {
2
+ supported;
3
+ unavailableReason;
4
+ samples = [];
5
+ constructor(supported = false, unavailableReason = "GPU timing extension unavailable") {
6
+ this.supported = supported;
7
+ this.unavailableReason = unavailableReason;
8
+ }
9
+ begin(label) {
10
+ const trimmed = label.trim();
11
+ if (trimmed.length === 0) {
12
+ throw new Error("GPU profiler sample label is required");
13
+ }
14
+ const start = performance.now();
15
+ return {
16
+ end: (durationMs = performance.now() - start) => {
17
+ const sample = { label: trimmed, durationMs };
18
+ this.samples.push(sample);
19
+ return sample;
20
+ }
21
+ };
22
+ }
23
+ snapshot() {
24
+ return {
25
+ supported: this.supported,
26
+ sampleCount: this.samples.length,
27
+ samples: [...this.samples],
28
+ ...(this.supported ? {} : { unavailableReason: this.unavailableReason })
29
+ };
30
+ }
31
+ }
32
+ //# sourceMappingURL=GPUProfiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GPUProfiler.js","sourceRoot":"","sources":["../../../../packages/debug/src/GPUProfiler.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,WAAW;IAIH;IACA;IAJF,OAAO,GAAgB,EAAE,CAAC;IAE3C,YACmB,YAAY,KAAK,EACjB,oBAAoB,kCAAkC;QADtD,cAAS,GAAT,SAAS,CAAQ;QACjB,sBAAiB,GAAjB,iBAAiB,CAAqC;IACtE,CAAC;IAEJ,KAAK,CAAC,KAAa;QACjB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,OAAO;YACL,GAAG,EAAE,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE;gBAC9C,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;gBAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1B,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAChC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;SACzE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ import { type Material, type MaterialInstance, type RenderShaderProgram } from "@aura3d/rendering";
2
+ export interface MaterialDiagnosticReport {
3
+ readonly materialName: string;
4
+ readonly shaderLabel: string;
5
+ readonly valid: boolean;
6
+ readonly diagnostics: readonly string[];
7
+ readonly uniforms: readonly string[];
8
+ }
9
+ export declare class MaterialDiagnostics {
10
+ inspect(material: Material | MaterialInstance, shader: RenderShaderProgram): MaterialDiagnosticReport;
11
+ assertValid(report: MaterialDiagnosticReport): void;
12
+ }
13
+ export declare class MaterialDiagnosticError extends Error {
14
+ readonly report: MaterialDiagnosticReport;
15
+ constructor(message: string, report: MaterialDiagnosticReport);
16
+ }
17
+ //# sourceMappingURL=MaterialDiagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaterialDiagnostics.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/MaterialDiagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,EAAE,MAAM,EAAE,mBAAmB,GAAG,wBAAwB;IA0BrG,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI;CAKpD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;aAG9B,MAAM,EAAE,wBAAwB;gBADhD,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,wBAAwB;CAKnD"}
@@ -0,0 +1,43 @@
1
+ import { MaterialBinding, MaterialBindingError } from "@aura3d/rendering";
2
+ export class MaterialDiagnostics {
3
+ inspect(material, shader) {
4
+ const binding = new MaterialBinding();
5
+ const materialName = "baseMaterial" in material ? material.baseMaterial.name : material.name;
6
+ try {
7
+ const result = binding.bind(material, shader);
8
+ return {
9
+ materialName,
10
+ shaderLabel: shader.label,
11
+ valid: true,
12
+ diagnostics: [],
13
+ uniforms: [...result.uniforms.keys()]
14
+ };
15
+ }
16
+ catch (error) {
17
+ if (error instanceof MaterialBindingError) {
18
+ return {
19
+ materialName,
20
+ shaderLabel: shader.label,
21
+ valid: false,
22
+ diagnostics: error.diagnostics,
23
+ uniforms: []
24
+ };
25
+ }
26
+ throw error;
27
+ }
28
+ }
29
+ assertValid(report) {
30
+ if (!report.valid) {
31
+ throw new MaterialDiagnosticError("Material diagnostics reported invalid binding", report);
32
+ }
33
+ }
34
+ }
35
+ export class MaterialDiagnosticError extends Error {
36
+ report;
37
+ constructor(message, report) {
38
+ super(message);
39
+ this.report = report;
40
+ this.name = "MaterialDiagnosticError";
41
+ }
42
+ }
43
+ //# sourceMappingURL=MaterialDiagnostics.js.map