Move web/ to javascript/ and declare it via [tool.comfy] web. Rename the seven third-party bundles (playcanvas, spark, three.js, gsplat, OrbitControls, TrackballControls) to .mjs. Every reference to them is inside the HTML viewers, but ComfyUI auto-imports **/*.js under the web dir into the shared browser realm, so ~8MB of vendor code was being evaluated in the main page on every startup -- and with it 36 collision errors: document.body injection, document-level listeners, unguarded message listeners and self.onmessage writes. The importmap values, script srcs and three.module's internal ./three.core ref are rewritten to match. DisplayName becomes "GaussianPack": the namespace enforced on registerExtension names is derived from it, and "ComfyUI-GaussianPack" made that prefix invalid. The analysis extension is renamed to match. js/gaussian_preview.js hooked "PlyPreviewLoadGaussianPLYEnhance", a node id that appears nowhere in this repo, so the PLY dropdown auto-refresh had never run; it now targets LoadPLY and LoadPLYOutput, the two nodes that actually carry the ply_file widget. Guard its message listener on event.source. Asset seeding resolves the input directory through folder_paths.get_input_directory(), so it follows ComfyUI Desktop and --input-directory instead of writing into the code tree. comfy-test.toml moves to the current schema: [test.workflows] cuda (there is no "gpu" key -- the accelerator is named by backend, and the old spelling parsed to an empty list, so CUDA runners silently ran the full unfiltered set), an explicit [test.platforms] platforms allowlist (per-platform booleans are no longer supported), and the javascript level.
50 lines
1.6 KiB
JavaScript
50 lines
1.6 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Convert a 3DGS PLY to SPZ (v2, gzipped — mkkellogg-compatible).
|
|
*
|
|
* usage: node ply_to_spz.mjs <input.ply> <output.spz>
|
|
*
|
|
* Uses the vendored spz-js library; no external npm install needed.
|
|
*/
|
|
import { createReadStream, writeFileSync, statSync } from "node:fs";
|
|
import { Readable } from "node:stream";
|
|
import { fileURLToPath } from "node:url";
|
|
import { dirname, resolve } from "node:path";
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
|
|
// Import the sub-modules directly so we don't trip the `playcanvas`
|
|
// dep that the `compressed-ply-*` modules pull in (we don't need them).
|
|
const { loadPly } = await import(resolve(__dirname, "spz-js/dist/ply-loader.js"));
|
|
const { serializeSpz } = await import(resolve(__dirname, "spz-js/dist/spz-serializer.js"));
|
|
|
|
const [, , inPath, outPath] = process.argv;
|
|
if (!inPath || !outPath) {
|
|
console.error("usage: node ply_to_spz.mjs <input.ply> <output.spz>");
|
|
process.exit(2);
|
|
}
|
|
|
|
const t0 = Date.now();
|
|
const stream = createReadStream(inPath);
|
|
const web = Readable.toWeb(stream);
|
|
const gs = await loadPly(web);
|
|
const tLoad = (Date.now() - t0) / 1000;
|
|
|
|
const t1 = Date.now();
|
|
const buf = await serializeSpz(gs);
|
|
const tSer = (Date.now() - t1) / 1000;
|
|
|
|
writeFileSync(outPath, Buffer.from(buf));
|
|
|
|
const inMB = statSync(inPath).size / (1024 * 1024);
|
|
const outMB = statSync(outPath).size / (1024 * 1024);
|
|
console.log(JSON.stringify({
|
|
numPoints: gs.numPoints,
|
|
plyMB: +inMB.toFixed(2),
|
|
spzMB: +outMB.toFixed(2),
|
|
ratio: +(inMB / outMB).toFixed(2),
|
|
loadSec: +tLoad.toFixed(2),
|
|
serSec: +tSer.toFixed(2),
|
|
}));
|