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.
44 lines
1.6 KiB
JavaScript
44 lines
1.6 KiB
JavaScript
import { SPZ_MAGIC, SPZ_VERSION, FLAG_ANTIALIASED } from './constant.js';
|
|
import { compressGzipped } from './compression.js';
|
|
import { packGaussians } from './spz-loader.js';
|
|
export async function serializePackedGaussians(packed) {
|
|
const headerSize = 16;
|
|
const totalSize = headerSize +
|
|
packed.positions.length +
|
|
packed.alphas.length +
|
|
packed.colors.length +
|
|
packed.scales.length +
|
|
packed.rotations.length +
|
|
packed.sh.length;
|
|
const buffer = new ArrayBuffer(totalSize);
|
|
const view = new DataView(buffer);
|
|
const uint8View = new Uint8Array(buffer);
|
|
// Write header
|
|
view.setUint32(0, SPZ_MAGIC, true);
|
|
view.setUint32(4, SPZ_VERSION, true);
|
|
view.setUint32(8, packed.numPoints, true);
|
|
view.setUint8(12, packed.shDegree);
|
|
view.setUint8(13, packed.fractionalBits);
|
|
view.setUint8(14, packed.antialiased ? FLAG_ANTIALIASED : 0);
|
|
view.setUint8(15, 0); // reserved
|
|
// Write data
|
|
let offset = headerSize;
|
|
uint8View.set(packed.positions, offset);
|
|
offset += packed.positions.length;
|
|
uint8View.set(packed.alphas, offset);
|
|
offset += packed.alphas.length;
|
|
uint8View.set(packed.colors, offset);
|
|
offset += packed.colors.length;
|
|
uint8View.set(packed.scales, offset);
|
|
offset += packed.scales.length;
|
|
uint8View.set(packed.rotations, offset);
|
|
offset += packed.rotations.length;
|
|
uint8View.set(packed.sh, offset);
|
|
return uint8View;
|
|
}
|
|
export async function serializeSpz(g) {
|
|
const packed = packGaussians(g);
|
|
const serialized = await serializePackedGaussians(packed);
|
|
return compressGzipped(serialized);
|
|
}
|