Files
PozzettiAndrea a342f20402 Serve frontend JS from javascript/, keep vendor bundles out of the main realm
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.
2026-08-22 20:56:09 +02:00

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);
}