Files
workinf_Blender_Wasm/web/protocol/glb-loss-report.ts
mes123456 380cbed4ff
Some checks are pending
M6 deployable RC / quick (push) Waiting to run
M6 deployable RC / chromium (push) Blocked by required conditions
M6 deployable RC / release (push) Blocked by required conditions
Checkpoint web parity through Chromium input tasks
2026-08-19 10:39:03 -04:00

64 lines
1.9 KiB
TypeScript

import type { GLBExportReport } from "./glb-export";
import type { SceneSnapshotIR } from "./scene-ir";
export const GLB_LOSS_REPORT_SCHEMA_VERSION = 1 as const;
export interface GLBLossReport {
schemaVersion: typeof GLB_LOSS_REPORT_SCHEMA_VERSION;
operation: "GLB_EXPORT_LOSS_REPORT";
sceneId: string;
sourceRevision: number;
canExport: boolean;
errorCount: number;
warningCount: number;
losses: Array<{
code: string;
severity: "warning" | "error";
message: string;
id: string | null;
}>;
surface: {
nodeCount: number;
meshCount: number;
materialCount: number;
imageCount: number;
animationCount: number;
nonMeshCount: number;
};
}
/** Convert the exporter result into a stable, machine-consumable loss report. */
export function createGLBLossReport(snapshot: SceneSnapshotIR, report: GLBExportReport): GLBLossReport {
const losses = report.warnings
.map((warning) => ({
code: warning.code,
severity: warning.severity,
message: warning.message,
id: warning.id ?? null,
}))
.sort((left, right) =>
left.code.localeCompare(right.code) ||
left.severity.localeCompare(right.severity) ||
(left.id ?? "").localeCompare(right.id ?? "") ||
left.message.localeCompare(right.message),
);
return {
schemaVersion: GLB_LOSS_REPORT_SCHEMA_VERSION,
operation: "GLB_EXPORT_LOSS_REPORT",
sceneId: snapshot.sceneId,
sourceRevision: snapshot.revision,
canExport: report.canExport,
errorCount: losses.filter((loss) => loss.severity === "error").length,
warningCount: losses.filter((loss) => loss.severity === "warning").length,
losses,
surface: {
nodeCount: snapshot.nodes.length,
meshCount: snapshot.meshes.length,
materialCount: snapshot.materials.length,
imageCount: snapshot.images.length,
animationCount: snapshot.animations.length,
nonMeshCount: snapshot.nonMeshData?.length ?? 0,
},
};
}