Add Chromium-only Blender WebEngine parity work
This commit is contained in:
36
tools/web/probe-topology-collapse.mjs
Normal file
36
tools/web/probe-topology-collapse.mjs
Normal file
@@ -0,0 +1,36 @@
|
||||
import fs from "node:fs";
|
||||
import factory from "../../web/app/src/vendor/blender/web_engine.js";
|
||||
|
||||
const wasmBinary = fs.readFileSync(new URL("../../web/app/src/vendor/blender/web_engine.wasm", import.meta.url));
|
||||
const blend = fs.readFileSync(new URL("../../tests/files/web/topology_scene.blend", import.meta.url));
|
||||
const engine = await factory({ wasmBinary });
|
||||
const handle = engine._web_engine_create();
|
||||
const encoder = new TextEncoder();
|
||||
function call(name, bytes) {
|
||||
const pointer = engine._malloc(bytes.byteLength);
|
||||
engine.HEAPU8.set(bytes, pointer);
|
||||
try { return engine[name](handle, pointer, bytes.byteLength); }
|
||||
finally { engine._free(pointer); }
|
||||
}
|
||||
function snapshot() {
|
||||
const dataOut = engine._malloc(4), lengthOut = engine._malloc(4);
|
||||
try {
|
||||
if (engine._web_engine_get_scene_snapshot(handle, dataOut, lengthOut) !== 0) throw new Error("snapshot failed");
|
||||
const pointer = engine.HEAPU32[dataOut >>> 2], length = engine.HEAPU32[lengthOut >>> 2];
|
||||
return JSON.parse(new TextDecoder().decode(engine.HEAPU8.slice(pointer, pointer + length)));
|
||||
} finally { engine._free(dataOut); engine._free(lengthOut); }
|
||||
}
|
||||
const openBytes = new Uint8Array(blend);
|
||||
if (call("_web_engine_open_blend", openBytes) !== 0) throw new Error(engine.UTF8ToString(engine._web_engine_last_error_message()));
|
||||
const source = snapshot();
|
||||
const results = [];
|
||||
for (const mesh of source.meshes.filter((candidate) => candidate.geometryStatus === "available")) {
|
||||
if (call("_web_engine_open_blend", openBytes) !== 0) throw new Error(engine.UTF8ToString(engine._web_engine_last_error_message()));
|
||||
const current = snapshot();
|
||||
const currentCommand = encoder.encode(JSON.stringify({ type: "decimateMesh", meshId: mesh.id, profile: { schemaVersion: 1, sourceMeshRevision: current.revision, attributePolicy: "PRESERVE", mode: "COLLAPSE", ratio: 0.5, triangulate: false, useSymmetry: false } }));
|
||||
const result = call("_web_engine_apply_command", currentCommand);
|
||||
const output = result === 0 ? snapshot().meshes.find((candidate) => candidate.id === mesh.id) : undefined;
|
||||
results.push({ meshId: mesh.id, result, message: engine.UTF8ToString(engine._web_engine_last_error_message()), vertices: output?.vertexCount ?? 0, triangles: output?.triangleCount ?? 0 });
|
||||
}
|
||||
console.log(JSON.stringify(results));
|
||||
engine._web_engine_destroy(handle);
|
||||
Reference in New Issue
Block a user