@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.
- package/README.md +17 -0
- package/dist/AnimationInspector.d.ts +25 -0
- package/dist/AnimationInspector.d.ts.map +1 -0
- package/dist/AnimationInspector.js +46 -0
- package/dist/AnimationInspector.js.map +1 -0
- package/dist/ChromeTraceExporter.d.ts +35 -0
- package/dist/ChromeTraceExporter.d.ts.map +1 -0
- package/dist/ChromeTraceExporter.js +110 -0
- package/dist/ChromeTraceExporter.js.map +1 -0
- package/dist/DebugLineCanvasRenderer.d.ts +24 -0
- package/dist/DebugLineCanvasRenderer.d.ts.map +1 -0
- package/dist/DebugLineCanvasRenderer.js +58 -0
- package/dist/DebugLineCanvasRenderer.js.map +1 -0
- package/dist/DebugOverlay.d.ts +18 -0
- package/dist/DebugOverlay.d.ts.map +1 -0
- package/dist/DebugOverlay.js +19 -0
- package/dist/DebugOverlay.js.map +1 -0
- package/dist/DrawCallTracker.d.ts +22 -0
- package/dist/DrawCallTracker.d.ts.map +1 -0
- package/dist/DrawCallTracker.js +28 -0
- package/dist/DrawCallTracker.js.map +1 -0
- package/dist/ECSInspector.d.ts +16 -0
- package/dist/ECSInspector.d.ts.map +1 -0
- package/dist/ECSInspector.js +12 -0
- package/dist/ECSInspector.js.map +1 -0
- package/dist/GPUProfiler.d.ts +22 -0
- package/dist/GPUProfiler.d.ts.map +1 -0
- package/dist/GPUProfiler.js +32 -0
- package/dist/GPUProfiler.js.map +1 -0
- package/dist/MaterialDiagnostics.d.ts +17 -0
- package/dist/MaterialDiagnostics.d.ts.map +1 -0
- package/dist/MaterialDiagnostics.js +43 -0
- package/dist/MaterialDiagnostics.js.map +1 -0
- package/dist/PhysicsDebugAdapter.d.ts +29 -0
- package/dist/PhysicsDebugAdapter.d.ts.map +1 -0
- package/dist/PhysicsDebugAdapter.js +57 -0
- package/dist/PhysicsDebugAdapter.js.map +1 -0
- package/dist/Profiler.d.ts +24 -0
- package/dist/Profiler.d.ts.map +1 -0
- package/dist/Profiler.js +56 -0
- package/dist/Profiler.js.map +1 -0
- package/dist/RenderStateInspector.d.ts +19 -0
- package/dist/RenderStateInspector.d.ts.map +1 -0
- package/dist/RenderStateInspector.js +33 -0
- package/dist/RenderStateInspector.js.map +1 -0
- package/dist/ReportExporter.d.ts +12 -0
- package/dist/ReportExporter.d.ts.map +1 -0
- package/dist/ReportExporter.js +27 -0
- package/dist/ReportExporter.js.map +1 -0
- package/dist/ResourceTracker.d.ts +23 -0
- package/dist/ResourceTracker.d.ts.map +1 -0
- package/dist/ResourceTracker.js +41 -0
- package/dist/ResourceTracker.js.map +1 -0
- package/dist/SceneHelpers.d.ts +46 -0
- package/dist/SceneHelpers.d.ts.map +1 -0
- package/dist/SceneHelpers.js +137 -0
- package/dist/SceneHelpers.js.map +1 -0
- package/dist/ShaderDiagnostics.d.ts +20 -0
- package/dist/ShaderDiagnostics.d.ts.map +1 -0
- package/dist/ShaderDiagnostics.js +49 -0
- package/dist/ShaderDiagnostics.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/package.json +18 -0
- package/src/AnimationInspector.ts +71 -0
- package/src/ChromeTraceExporter.ts +158 -0
- package/src/DebugLineCanvasRenderer.ts +96 -0
- package/src/DebugOverlay.ts +35 -0
- package/src/DrawCallTracker.ts +46 -0
- package/src/ECSInspector.ts +23 -0
- package/src/GPUProfiler.ts +48 -0
- package/src/MaterialDiagnostics.ts +59 -0
- package/src/PhysicsDebugAdapter.ts +86 -0
- package/src/Profiler.ts +77 -0
- package/src/RenderStateInspector.ts +45 -0
- package/src/ReportExporter.ts +32 -0
- package/src/ResourceTracker.ts +59 -0
- package/src/SceneHelpers.ts +188 -0
- package/src/ShaderDiagnostics.ts +64 -0
- package/src/index.ts +46 -0
- package/tsconfig.json +32 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaterialDiagnostics.js","sourceRoot":"","sources":["../../../../packages/debug/src/MaterialDiagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,oBAAoB,EAIrB,MAAM,mBAAmB,CAAC;AAU3B,MAAM,OAAO,mBAAmB;IAC9B,OAAO,CAAC,QAAqC,EAAE,MAA2B;QACxE,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,cAAc,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC7F,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9C,OAAO;gBACL,YAAY;gBACZ,WAAW,EAAE,MAAM,CAAC,KAAK;gBACzB,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;aACtC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;gBAC1C,OAAO;oBACL,YAAY;oBACZ,WAAW,EAAE,MAAM,CAAC,KAAK;oBACzB,KAAK,EAAE,KAAK;oBACZ,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,QAAQ,EAAE,EAAE;iBACb,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,WAAW,CAAC,MAAgC;QAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,uBAAuB,CAAC,+CAA+C,EAAE,MAAM,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAG9B;IAFlB,YACE,OAAe,EACC,MAAgC;QAEhD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,WAAM,GAAN,MAAM,CAA0B;QAGhD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type DebugLine, type PhysicsWorld } from "@aura3d/physics";
|
|
2
|
+
export type PhysicsDebugSnapshot = {
|
|
3
|
+
readonly bodyCount: number;
|
|
4
|
+
readonly colliderCount: number;
|
|
5
|
+
readonly contactCount: number;
|
|
6
|
+
readonly lines: readonly DebugLine[];
|
|
7
|
+
};
|
|
8
|
+
export type PhysicsStackEvidence = {
|
|
9
|
+
readonly bodyCount: number;
|
|
10
|
+
readonly dynamicBodyCount: number;
|
|
11
|
+
readonly contactCount: number;
|
|
12
|
+
readonly lineCount: number;
|
|
13
|
+
readonly minY: number;
|
|
14
|
+
readonly maxY: number;
|
|
15
|
+
readonly settledCount: number;
|
|
16
|
+
readonly bodyPositions: readonly {
|
|
17
|
+
readonly id: number;
|
|
18
|
+
readonly type: string;
|
|
19
|
+
readonly position: readonly [number, number, number];
|
|
20
|
+
}[];
|
|
21
|
+
readonly stableHash: string;
|
|
22
|
+
};
|
|
23
|
+
export declare class PhysicsDebugAdapter {
|
|
24
|
+
private readonly draw;
|
|
25
|
+
buildLines(world: Pick<PhysicsWorld, "colliders" | "getBody">): readonly DebugLine[];
|
|
26
|
+
snapshot(world: Pick<PhysicsWorld, "colliders" | "bodies" | "getBody" | "snapshot">): PhysicsDebugSnapshot;
|
|
27
|
+
stackEvidence(world: Pick<PhysicsWorld, "colliders" | "bodies" | "getBody" | "snapshot">, velocityEpsilon?: number): PhysicsStackEvidence;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=PhysicsDebugAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhysicsDebugAdapter.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/PhysicsDebugAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEtF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS;QAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACtD,EAAE,CAAC;IACJ,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAE/C,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,SAAS,CAAC,GAAG,SAAS,SAAS,EAAE;IAIpF,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG,oBAAoB;IAS1G,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC,EAAE,eAAe,SAAO,GAAG,oBAAoB;CA0BxI"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { PhysicsDebugDraw } from "@aura3d/physics";
|
|
2
|
+
export class PhysicsDebugAdapter {
|
|
3
|
+
draw = new PhysicsDebugDraw();
|
|
4
|
+
buildLines(world) {
|
|
5
|
+
return this.draw.buildLines(world);
|
|
6
|
+
}
|
|
7
|
+
snapshot(world) {
|
|
8
|
+
return {
|
|
9
|
+
bodyCount: world.bodies().length,
|
|
10
|
+
colliderCount: world.colliders().length,
|
|
11
|
+
contactCount: world.snapshot().contacts.length,
|
|
12
|
+
lines: this.buildLines(world)
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
stackEvidence(world, velocityEpsilon = 0.05) {
|
|
16
|
+
const snapshot = world.snapshot();
|
|
17
|
+
const lines = this.buildLines(world);
|
|
18
|
+
const bodyPositions = snapshot.bodies.map((body) => ({
|
|
19
|
+
id: body.id,
|
|
20
|
+
type: body.type,
|
|
21
|
+
position: roundVec3(body.position)
|
|
22
|
+
}));
|
|
23
|
+
const dynamicBodies = snapshot.bodies.filter((body) => body.type === "dynamic");
|
|
24
|
+
const settledCount = dynamicBodies.filter((body) => Math.hypot(body.velocity[0], body.velocity[1], body.velocity[2]) <= velocityEpsilon).length;
|
|
25
|
+
const ys = snapshot.bodies.map((body) => body.position[1]);
|
|
26
|
+
const evidenceWithoutHash = {
|
|
27
|
+
bodyCount: snapshot.stats.bodies,
|
|
28
|
+
dynamicBodyCount: dynamicBodies.length,
|
|
29
|
+
contactCount: snapshot.contacts.length,
|
|
30
|
+
lineCount: lines.length,
|
|
31
|
+
minY: roundNumber(ys.length > 0 ? Math.min(...ys) : 0),
|
|
32
|
+
maxY: roundNumber(ys.length > 0 ? Math.max(...ys) : 0),
|
|
33
|
+
settledCount,
|
|
34
|
+
bodyPositions
|
|
35
|
+
};
|
|
36
|
+
return {
|
|
37
|
+
...evidenceWithoutHash,
|
|
38
|
+
stableHash: stableHash(evidenceWithoutHash)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function roundNumber(value, places = 6) {
|
|
43
|
+
return Number(value.toFixed(places));
|
|
44
|
+
}
|
|
45
|
+
function roundVec3(value) {
|
|
46
|
+
return [roundNumber(value[0]), roundNumber(value[1]), roundNumber(value[2])];
|
|
47
|
+
}
|
|
48
|
+
function stableHash(value) {
|
|
49
|
+
const input = JSON.stringify(value);
|
|
50
|
+
let hash = 2166136261;
|
|
51
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
52
|
+
hash ^= input.charCodeAt(index);
|
|
53
|
+
hash = Math.imul(hash, 16777619);
|
|
54
|
+
}
|
|
55
|
+
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=PhysicsDebugAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhysicsDebugAdapter.js","sourceRoot":"","sources":["../../../../packages/debug/src/PhysicsDebugAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface ProfilerMarker {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
readonly startMs: number;
|
|
4
|
+
readonly endMs: number;
|
|
5
|
+
readonly durationMs: number;
|
|
6
|
+
readonly depth: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ProfilerSnapshot {
|
|
9
|
+
readonly markerCount: number;
|
|
10
|
+
readonly totalDurationMs: number;
|
|
11
|
+
readonly markers: readonly ProfilerMarker[];
|
|
12
|
+
}
|
|
13
|
+
export declare class Profiler {
|
|
14
|
+
private readonly now;
|
|
15
|
+
private readonly active;
|
|
16
|
+
private readonly markers;
|
|
17
|
+
constructor(now?: () => number);
|
|
18
|
+
begin(name: string): void;
|
|
19
|
+
end(name?: string): ProfilerMarker;
|
|
20
|
+
measure<T>(name: string, fn: () => T): T;
|
|
21
|
+
snapshot(): ProfilerSnapshot;
|
|
22
|
+
reset(): void;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=Profiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Profiler.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/Profiler.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C;AAQD,qBAAa,QAAQ;IAIP,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;gBAEnB,GAAG,GAAE,MAAM,MAAgC;IAExE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQzB,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc;IAoBlC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IASxC,QAAQ,IAAI,gBAAgB;IAS5B,KAAK,IAAI,IAAI;CAId"}
|
package/dist/Profiler.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export class Profiler {
|
|
2
|
+
now;
|
|
3
|
+
active = [];
|
|
4
|
+
markers = [];
|
|
5
|
+
constructor(now = () => performance.now()) {
|
|
6
|
+
this.now = now;
|
|
7
|
+
}
|
|
8
|
+
begin(name) {
|
|
9
|
+
const trimmed = name.trim();
|
|
10
|
+
if (trimmed.length === 0) {
|
|
11
|
+
throw new Error("Profiler marker name is required");
|
|
12
|
+
}
|
|
13
|
+
this.active.push({ name: trimmed, startMs: this.now(), depth: this.active.length });
|
|
14
|
+
}
|
|
15
|
+
end(name) {
|
|
16
|
+
const active = this.active.pop();
|
|
17
|
+
if (!active) {
|
|
18
|
+
throw new Error("Cannot end profiler marker because no marker is active");
|
|
19
|
+
}
|
|
20
|
+
if (name !== undefined && active.name !== name) {
|
|
21
|
+
throw new Error(`Profiler marker mismatch: expected ${active.name}, received ${name}`);
|
|
22
|
+
}
|
|
23
|
+
const endMs = this.now();
|
|
24
|
+
const marker = {
|
|
25
|
+
name: active.name,
|
|
26
|
+
startMs: active.startMs,
|
|
27
|
+
endMs,
|
|
28
|
+
durationMs: endMs - active.startMs,
|
|
29
|
+
depth: active.depth
|
|
30
|
+
};
|
|
31
|
+
this.markers.push(marker);
|
|
32
|
+
return marker;
|
|
33
|
+
}
|
|
34
|
+
measure(name, fn) {
|
|
35
|
+
this.begin(name);
|
|
36
|
+
try {
|
|
37
|
+
return fn();
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
this.end(name);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
snapshot() {
|
|
44
|
+
const markers = [...this.markers];
|
|
45
|
+
return Object.freeze({
|
|
46
|
+
markerCount: markers.length,
|
|
47
|
+
totalDurationMs: markers.reduce((total, marker) => total + marker.durationMs, 0),
|
|
48
|
+
markers
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
reset() {
|
|
52
|
+
this.active.length = 0;
|
|
53
|
+
this.markers.length = 0;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=Profiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Profiler.js","sourceRoot":"","sources":["../../../../packages/debug/src/Profiler.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,QAAQ;IAIU;IAHZ,MAAM,GAAmB,EAAE,CAAC;IAC5B,OAAO,GAAqB,EAAE,CAAC;IAEhD,YAA6B,MAAoB,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAA3C,QAAG,GAAH,GAAG,CAAwC;IAAG,CAAC;IAE5E,KAAK,CAAC,IAAY;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,GAAG,CAAC,IAAa;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,IAAI,cAAc,IAAI,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK;YACL,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC,OAAO;YAClC,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAI,IAAY,EAAE,EAAW;QAClC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YAChF,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type RenderStateValue = string | number | boolean | null;
|
|
2
|
+
export type RenderStateSnapshot = ReadonlyMap<string, RenderStateValue>;
|
|
3
|
+
export interface RenderStateDiff {
|
|
4
|
+
readonly key: string;
|
|
5
|
+
readonly before: RenderStateValue | undefined;
|
|
6
|
+
readonly after: RenderStateValue | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare class RenderStateInspector {
|
|
9
|
+
capture(source: {
|
|
10
|
+
captureState(): RenderStateSnapshot;
|
|
11
|
+
}): RenderStateSnapshot;
|
|
12
|
+
diff(before: RenderStateSnapshot, after: RenderStateSnapshot): readonly RenderStateDiff[];
|
|
13
|
+
assertNoLeak(before: RenderStateSnapshot, after: RenderStateSnapshot, ignoredKeys?: readonly string[]): void;
|
|
14
|
+
}
|
|
15
|
+
export declare class RenderStateLeakError extends Error {
|
|
16
|
+
readonly leaks: readonly RenderStateDiff[];
|
|
17
|
+
constructor(message: string, leaks: readonly RenderStateDiff[]);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=RenderStateInspector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderStateInspector.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/RenderStateInspector.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAChE,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC9C;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,EAAE;QAAE,YAAY,IAAI,mBAAmB,CAAA;KAAE,GAAG,mBAAmB;IAI7E,IAAI,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,mBAAmB,GAAG,SAAS,eAAe,EAAE;IAazF,YAAY,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,GAAE,SAAS,MAAM,EAAO,GAAG,IAAI;CAOjH;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aAG3B,KAAK,EAAE,SAAS,eAAe,EAAE;gBADjD,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,SAAS,eAAe,EAAE;CAKpD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export class RenderStateInspector {
|
|
2
|
+
capture(source) {
|
|
3
|
+
return new Map(source.captureState());
|
|
4
|
+
}
|
|
5
|
+
diff(before, after) {
|
|
6
|
+
const keys = new Set([...before.keys(), ...after.keys()]);
|
|
7
|
+
const diffs = [];
|
|
8
|
+
for (const key of keys) {
|
|
9
|
+
const beforeValue = before.get(key);
|
|
10
|
+
const afterValue = after.get(key);
|
|
11
|
+
if (beforeValue !== afterValue) {
|
|
12
|
+
diffs.push({ key, before: beforeValue, after: afterValue });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return diffs;
|
|
16
|
+
}
|
|
17
|
+
assertNoLeak(before, after, ignoredKeys = []) {
|
|
18
|
+
const ignored = new Set(ignoredKeys);
|
|
19
|
+
const leaks = this.diff(before, after).filter((diff) => !ignored.has(diff.key));
|
|
20
|
+
if (leaks.length > 0) {
|
|
21
|
+
throw new RenderStateLeakError("Render state leak detected", leaks);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class RenderStateLeakError extends Error {
|
|
26
|
+
leaks;
|
|
27
|
+
constructor(message, leaks) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.leaks = leaks;
|
|
30
|
+
this.name = "RenderStateLeakError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=RenderStateInspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderStateInspector.js","sourceRoot":"","sources":["../../../../packages/debug/src/RenderStateInspector.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,oBAAoB;IAC/B,OAAO,CAAC,MAA+C;QACrD,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,MAA2B,EAAE,KAA0B;QAC1D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAsB,EAAE,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY,CAAC,MAA2B,EAAE,KAA0B,EAAE,cAAiC,EAAE;QACvG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,oBAAoB,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAG3B;IAFlB,YACE,OAAe,EACC,KAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAA4B;QAGjD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface DebugReport {
|
|
2
|
+
readonly generatedAt: string;
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly data: unknown;
|
|
5
|
+
}
|
|
6
|
+
export declare class ReportExporter {
|
|
7
|
+
private readonly now;
|
|
8
|
+
constructor(now?: () => Date);
|
|
9
|
+
create(name: string, data: unknown): DebugReport;
|
|
10
|
+
toJson(report: DebugReport): string;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=ReportExporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportExporter.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/ReportExporter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,GAAE,MAAM,IAAuB;IAE/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,WAAW;IAYhD,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM;CAGpC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export class ReportExporter {
|
|
2
|
+
now;
|
|
3
|
+
constructor(now = () => new Date()) {
|
|
4
|
+
this.now = now;
|
|
5
|
+
}
|
|
6
|
+
create(name, data) {
|
|
7
|
+
const trimmed = name.trim();
|
|
8
|
+
if (trimmed.length === 0) {
|
|
9
|
+
throw new Error("Report name is required");
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
generatedAt: this.now().toISOString(),
|
|
13
|
+
name: trimmed,
|
|
14
|
+
data
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
toJson(report) {
|
|
18
|
+
return `${JSON.stringify(report, sortKeys, 2)}\n`;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function sortKeys(_key, value) {
|
|
22
|
+
if (value === null || Array.isArray(value) || typeof value !== "object") {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=ReportExporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportExporter.js","sourceRoot":"","sources":["../../../../packages/debug/src/ReportExporter.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,MAAkB,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;QAAlC,QAAG,GAAH,GAAG,CAA+B;IAAG,CAAC;IAEnE,MAAM,CAAC,IAAY,EAAE,IAAa;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;YACrC,IAAI,EAAE,OAAO;YACb,IAAI;SACL,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAAmB;QACxB,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC;IACpD,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAc;IAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnI,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface TrackedResource {
|
|
2
|
+
readonly id: string;
|
|
3
|
+
readonly type: string;
|
|
4
|
+
readonly disposed: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface ResourceLeakReport {
|
|
7
|
+
readonly total: number;
|
|
8
|
+
readonly leaked: number;
|
|
9
|
+
readonly resources: readonly TrackedResource[];
|
|
10
|
+
readonly leaks: readonly TrackedResource[];
|
|
11
|
+
}
|
|
12
|
+
export declare class ResourceTracker {
|
|
13
|
+
private readonly resources;
|
|
14
|
+
track(id: string, type: string): void;
|
|
15
|
+
dispose(id: string): void;
|
|
16
|
+
report(): ResourceLeakReport;
|
|
17
|
+
assertNoLeaks(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare class ResourceLeakError extends Error {
|
|
20
|
+
readonly report: ResourceLeakReport;
|
|
21
|
+
constructor(message: string, report: ResourceLeakReport);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ResourceTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceTracker.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/ResourceTracker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;CAC5C;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAEhE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOrC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQzB,MAAM,IAAI,kBAAkB;IAW5B,aAAa,IAAI,IAAI;CAMtB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,MAAM,EAAE,kBAAkB;gBAD1C,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,kBAAkB;CAK7C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class ResourceTracker {
|
|
2
|
+
resources = new Map();
|
|
3
|
+
track(id, type) {
|
|
4
|
+
if (this.resources.has(id)) {
|
|
5
|
+
throw new Error(`Resource already tracked: ${id}`);
|
|
6
|
+
}
|
|
7
|
+
this.resources.set(id, { id, type, disposed: false });
|
|
8
|
+
}
|
|
9
|
+
dispose(id) {
|
|
10
|
+
const resource = this.resources.get(id);
|
|
11
|
+
if (!resource) {
|
|
12
|
+
throw new Error(`Unknown resource: ${id}`);
|
|
13
|
+
}
|
|
14
|
+
this.resources.set(id, { ...resource, disposed: true });
|
|
15
|
+
}
|
|
16
|
+
report() {
|
|
17
|
+
const resources = [...this.resources.values()].sort((a, b) => a.id.localeCompare(b.id));
|
|
18
|
+
const leaks = resources.filter((resource) => !resource.disposed);
|
|
19
|
+
return {
|
|
20
|
+
total: resources.length,
|
|
21
|
+
leaked: leaks.length,
|
|
22
|
+
resources,
|
|
23
|
+
leaks
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
assertNoLeaks() {
|
|
27
|
+
const report = this.report();
|
|
28
|
+
if (report.leaked > 0) {
|
|
29
|
+
throw new ResourceLeakError("Resource leaks detected", report);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class ResourceLeakError extends Error {
|
|
34
|
+
report;
|
|
35
|
+
constructor(message, report) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.report = report;
|
|
38
|
+
this.name = "ResourceLeakError";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ResourceTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceTracker.js","sourceRoot":"","sources":["../../../../packages/debug/src/ResourceTracker.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,eAAe;IACT,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEhE,KAAK,CAAC,EAAU,EAAE,IAAY;QAC5B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM;QACJ,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjE,OAAO;YACL,KAAK,EAAE,SAAS,CAAC,MAAM;YACvB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS;YACT,KAAK;SACN,CAAC;IACJ,CAAC;IAED,aAAa;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,iBAAiB,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAGxB;IAFlB,YACE,OAAe,EACC,MAA0B;QAE1C,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,WAAM,GAAN,MAAM,CAAoB;QAG1C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { DebugRenderLine } from "./DebugLineCanvasRenderer.js";
|
|
2
|
+
export type DebugVec3 = readonly [number, number, number];
|
|
3
|
+
export type DebugColor = readonly [number, number, number, number];
|
|
4
|
+
export interface AxesHelperOptions {
|
|
5
|
+
readonly size?: number;
|
|
6
|
+
readonly origin?: DebugVec3;
|
|
7
|
+
}
|
|
8
|
+
export interface GridHelperOptions {
|
|
9
|
+
readonly size?: number;
|
|
10
|
+
readonly divisions?: number;
|
|
11
|
+
readonly y?: number;
|
|
12
|
+
readonly color?: DebugColor;
|
|
13
|
+
readonly centerColor?: DebugColor;
|
|
14
|
+
}
|
|
15
|
+
export interface BoundsHelperOptions {
|
|
16
|
+
readonly min: DebugVec3;
|
|
17
|
+
readonly max: DebugVec3;
|
|
18
|
+
readonly color?: DebugColor;
|
|
19
|
+
}
|
|
20
|
+
export interface CameraFrustumHelperOptions {
|
|
21
|
+
readonly nearHalfWidth: number;
|
|
22
|
+
readonly nearHalfHeight: number;
|
|
23
|
+
readonly farHalfWidth: number;
|
|
24
|
+
readonly farHalfHeight: number;
|
|
25
|
+
readonly nearZ?: number;
|
|
26
|
+
readonly farZ?: number;
|
|
27
|
+
readonly color?: DebugColor;
|
|
28
|
+
}
|
|
29
|
+
export interface DirectionalLightHelperOptions {
|
|
30
|
+
readonly direction: DebugVec3;
|
|
31
|
+
readonly origin?: DebugVec3;
|
|
32
|
+
readonly length?: number;
|
|
33
|
+
readonly color?: DebugColor;
|
|
34
|
+
}
|
|
35
|
+
export interface SkeletonHelperJoint {
|
|
36
|
+
readonly id: string;
|
|
37
|
+
readonly parentId?: string;
|
|
38
|
+
readonly position: DebugVec3;
|
|
39
|
+
}
|
|
40
|
+
export declare function buildAxesHelper(options?: AxesHelperOptions): readonly DebugRenderLine[];
|
|
41
|
+
export declare function buildGridHelper(options?: GridHelperOptions): readonly DebugRenderLine[];
|
|
42
|
+
export declare function buildBoundsHelper(options: BoundsHelperOptions): readonly DebugRenderLine[];
|
|
43
|
+
export declare function buildCameraFrustumHelper(options: CameraFrustumHelperOptions): readonly DebugRenderLine[];
|
|
44
|
+
export declare function buildDirectionalLightHelper(options: DirectionalLightHelperOptions): readonly DebugRenderLine[];
|
|
45
|
+
export declare function buildSkeletonHelper(joints: readonly SkeletonHelperJoint[], color?: DebugColor): readonly DebugRenderLine[];
|
|
46
|
+
//# sourceMappingURL=SceneHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneHelpers.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/SceneHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC1D,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AASD,wBAAgB,eAAe,CAAC,OAAO,GAAE,iBAAsB,GAAG,SAAS,eAAe,EAAE,CAQ3F;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,iBAAsB,GAAG,SAAS,eAAe,EAAE,CAe3F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,eAAe,EAAE,CAkB1F;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,0BAA0B,GAAG,SAAS,eAAe,EAAE,CAyBxG;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,6BAA6B,GAAG,SAAS,eAAe,EAAE,CAU9G;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,EAAE,KAAK,GAAE,UAA2B,GAAG,SAAS,eAAe,EAAE,CAe1I"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
const AXIS_X = [1, 0.18, 0.14, 1];
|
|
2
|
+
const AXIS_Y = [0.18, 0.86, 0.28, 1];
|
|
3
|
+
const AXIS_Z = [0.2, 0.48, 1, 1];
|
|
4
|
+
const DEFAULT_GRID = [0.38, 0.46, 0.58, 1];
|
|
5
|
+
const DEFAULT_CENTER = [0.72, 0.78, 0.86, 1];
|
|
6
|
+
const DEFAULT_HELPER = [1, 0.84, 0.28, 1];
|
|
7
|
+
export function buildAxesHelper(options = {}) {
|
|
8
|
+
const size = positive(options.size ?? 1, "Axes helper size");
|
|
9
|
+
const origin = options.origin ?? [0, 0, 0];
|
|
10
|
+
return [
|
|
11
|
+
{ from: origin, to: [origin[0] + size, origin[1], origin[2]], color: AXIS_X },
|
|
12
|
+
{ from: origin, to: [origin[0], origin[1] + size, origin[2]], color: AXIS_Y },
|
|
13
|
+
{ from: origin, to: [origin[0], origin[1], origin[2] + size], color: AXIS_Z }
|
|
14
|
+
];
|
|
15
|
+
}
|
|
16
|
+
export function buildGridHelper(options = {}) {
|
|
17
|
+
const size = positive(options.size ?? 10, "Grid helper size");
|
|
18
|
+
const divisions = integerAtLeast(options.divisions ?? 10, 1, "Grid helper divisions");
|
|
19
|
+
const y = finite(options.y ?? 0, "Grid helper y");
|
|
20
|
+
const half = size / 2;
|
|
21
|
+
const step = size / divisions;
|
|
22
|
+
const lines = [];
|
|
23
|
+
for (let index = 0; index <= divisions; index += 1) {
|
|
24
|
+
const offset = -half + index * step;
|
|
25
|
+
const isCenter = Math.abs(offset) < 1e-8;
|
|
26
|
+
const color = isCenter ? options.centerColor ?? DEFAULT_CENTER : options.color ?? DEFAULT_GRID;
|
|
27
|
+
lines.push({ from: [-half, y, offset], to: [half, y, offset], color });
|
|
28
|
+
lines.push({ from: [offset, y, -half], to: [offset, y, half], color });
|
|
29
|
+
}
|
|
30
|
+
return lines;
|
|
31
|
+
}
|
|
32
|
+
export function buildBoundsHelper(options) {
|
|
33
|
+
validateVec3(options.min, "Bounds helper min");
|
|
34
|
+
validateVec3(options.max, "Bounds helper max");
|
|
35
|
+
const [minX, minY, minZ] = options.min;
|
|
36
|
+
const [maxX, maxY, maxZ] = options.max;
|
|
37
|
+
if (maxX < minX || maxY < minY || maxZ < minZ) {
|
|
38
|
+
throw new RangeError("Bounds helper max must be greater than or equal to min.");
|
|
39
|
+
}
|
|
40
|
+
const color = options.color ?? DEFAULT_HELPER;
|
|
41
|
+
const p = [
|
|
42
|
+
[minX, minY, minZ], [maxX, minY, minZ], [maxX, maxY, minZ], [minX, maxY, minZ],
|
|
43
|
+
[minX, minY, maxZ], [maxX, minY, maxZ], [maxX, maxY, maxZ], [minX, maxY, maxZ]
|
|
44
|
+
];
|
|
45
|
+
return edges([
|
|
46
|
+
[0, 1], [1, 2], [2, 3], [3, 0],
|
|
47
|
+
[4, 5], [5, 6], [6, 7], [7, 4],
|
|
48
|
+
[0, 4], [1, 5], [2, 6], [3, 7]
|
|
49
|
+
], p, color);
|
|
50
|
+
}
|
|
51
|
+
export function buildCameraFrustumHelper(options) {
|
|
52
|
+
const nearHalfWidth = positive(options.nearHalfWidth, "Camera frustum nearHalfWidth");
|
|
53
|
+
const nearHalfHeight = positive(options.nearHalfHeight, "Camera frustum nearHalfHeight");
|
|
54
|
+
const farHalfWidth = positive(options.farHalfWidth, "Camera frustum farHalfWidth");
|
|
55
|
+
const farHalfHeight = positive(options.farHalfHeight, "Camera frustum farHalfHeight");
|
|
56
|
+
const nearZ = finite(options.nearZ ?? -0.1, "Camera frustum nearZ");
|
|
57
|
+
const farZ = finite(options.farZ ?? -1, "Camera frustum farZ");
|
|
58
|
+
if (Math.abs(nearZ - farZ) < 1e-8) {
|
|
59
|
+
throw new RangeError("Camera frustum nearZ and farZ must be distinct.");
|
|
60
|
+
}
|
|
61
|
+
const p = [
|
|
62
|
+
[-nearHalfWidth, -nearHalfHeight, nearZ],
|
|
63
|
+
[nearHalfWidth, -nearHalfHeight, nearZ],
|
|
64
|
+
[nearHalfWidth, nearHalfHeight, nearZ],
|
|
65
|
+
[-nearHalfWidth, nearHalfHeight, nearZ],
|
|
66
|
+
[-farHalfWidth, -farHalfHeight, farZ],
|
|
67
|
+
[farHalfWidth, -farHalfHeight, farZ],
|
|
68
|
+
[farHalfWidth, farHalfHeight, farZ],
|
|
69
|
+
[-farHalfWidth, farHalfHeight, farZ]
|
|
70
|
+
];
|
|
71
|
+
return edges([
|
|
72
|
+
[0, 1], [1, 2], [2, 3], [3, 0],
|
|
73
|
+
[4, 5], [5, 6], [6, 7], [7, 4],
|
|
74
|
+
[0, 4], [1, 5], [2, 6], [3, 7]
|
|
75
|
+
], p, options.color ?? DEFAULT_HELPER);
|
|
76
|
+
}
|
|
77
|
+
export function buildDirectionalLightHelper(options) {
|
|
78
|
+
const origin = options.origin ?? [0, 0, 0];
|
|
79
|
+
const length = positive(options.length ?? 1, "Directional light helper length");
|
|
80
|
+
const direction = normalize(options.direction, "Directional light helper direction");
|
|
81
|
+
const to = [
|
|
82
|
+
origin[0] + direction[0] * length,
|
|
83
|
+
origin[1] + direction[1] * length,
|
|
84
|
+
origin[2] + direction[2] * length
|
|
85
|
+
];
|
|
86
|
+
return [{ from: origin, to, color: options.color ?? DEFAULT_HELPER }];
|
|
87
|
+
}
|
|
88
|
+
export function buildSkeletonHelper(joints, color = DEFAULT_HELPER) {
|
|
89
|
+
const byId = new Map();
|
|
90
|
+
for (const joint of joints) {
|
|
91
|
+
if (!joint.id)
|
|
92
|
+
throw new Error("Skeleton helper joints require stable ids.");
|
|
93
|
+
validateVec3(joint.position, `Skeleton helper joint ${joint.id}`);
|
|
94
|
+
byId.set(joint.id, joint);
|
|
95
|
+
}
|
|
96
|
+
const lines = [];
|
|
97
|
+
for (const joint of joints) {
|
|
98
|
+
if (!joint.parentId)
|
|
99
|
+
continue;
|
|
100
|
+
const parent = byId.get(joint.parentId);
|
|
101
|
+
if (!parent)
|
|
102
|
+
continue;
|
|
103
|
+
lines.push({ from: parent.position, to: joint.position, color });
|
|
104
|
+
}
|
|
105
|
+
return lines;
|
|
106
|
+
}
|
|
107
|
+
function edges(indices, points, color) {
|
|
108
|
+
return indices.map(([from, to]) => ({ from: points[from], to: points[to], color }));
|
|
109
|
+
}
|
|
110
|
+
function positive(value, label) {
|
|
111
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
112
|
+
throw new RangeError(`${label} must be finite and positive.`);
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
function finite(value, label) {
|
|
116
|
+
if (!Number.isFinite(value))
|
|
117
|
+
throw new RangeError(`${label} must be finite.`);
|
|
118
|
+
return value;
|
|
119
|
+
}
|
|
120
|
+
function integerAtLeast(value, minimum, label) {
|
|
121
|
+
if (!Number.isInteger(value) || value < minimum)
|
|
122
|
+
throw new RangeError(`${label} must be an integer >= ${minimum}.`);
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
function validateVec3(value, label) {
|
|
126
|
+
if (value.length !== 3 || value.some((component) => !Number.isFinite(component))) {
|
|
127
|
+
throw new RangeError(`${label} must contain three finite values.`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function normalize(value, label) {
|
|
131
|
+
validateVec3(value, label);
|
|
132
|
+
const length = Math.hypot(value[0], value[1], value[2]);
|
|
133
|
+
if (length <= 1e-8)
|
|
134
|
+
throw new RangeError(`${label} must be non-zero.`);
|
|
135
|
+
return [value[0] / length, value[1] / length, value[2] / length];
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=SceneHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneHelpers.js","sourceRoot":"","sources":["../../../../packages/debug/src/SceneHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type RenderShaderProgram, type ShaderSources } from "@aura3d/rendering";
|
|
2
|
+
export interface ShaderDiagnosticReport {
|
|
3
|
+
readonly label: string;
|
|
4
|
+
readonly marker: string;
|
|
5
|
+
readonly markerPresentInVertex: boolean;
|
|
6
|
+
readonly markerPresentInFragment: boolean;
|
|
7
|
+
readonly attributes: readonly string[];
|
|
8
|
+
readonly uniforms: readonly string[];
|
|
9
|
+
readonly compileLog: string | null;
|
|
10
|
+
}
|
|
11
|
+
export declare class ShaderDiagnostics {
|
|
12
|
+
inspectSources(sources: ShaderSources, compileLog?: string | null): ShaderDiagnosticReport;
|
|
13
|
+
inspectProgram(program: RenderShaderProgram, compileLog?: string | null): ShaderDiagnosticReport;
|
|
14
|
+
assertMarker(report: ShaderDiagnosticReport): void;
|
|
15
|
+
}
|
|
16
|
+
export declare class ShaderDiagnosticError extends Error {
|
|
17
|
+
readonly report: ShaderDiagnosticReport;
|
|
18
|
+
constructor(message: string, report: ShaderDiagnosticReport);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ShaderDiagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShaderDiagnostics.d.ts","sourceRoot":"","sources":["../../../../packages/debug/src/ShaderDiagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,qBAAa,iBAAiB;IAC5B,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,GAAE,MAAM,GAAG,IAAW,GAAG,sBAAsB;IAYhG,cAAc,CAAC,OAAO,EAAE,mBAAmB,EAAE,UAAU,GAAE,MAAM,GAAG,IAAW,GAAG,sBAAsB;IAYtG,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;CAKnD;AAED,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,MAAM,EAAE,sBAAsB;gBAD9C,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,sBAAsB;CAKjD"}
|