UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

55 lines (53 loc) 2.2 kB
/** * @import { GSplatPlacement } from './gsplat-placement.js' */ /** * Tracks placement state changes for a GSplatManager. * Detects changes in format version, modifier hash, numSplats, and centersVersion. * * @ignore */ class GSplatPlacementStateTracker { /** * Checks if any placements have changed state. Updates internal tracking. * * @param {Iterable<GSplatPlacement>} placements - Iterable of placements to check. * @returns {boolean} True if any placement's state changed. */ hasChanges(placements) { let changed = false; for (const p of placements){ if (!p.resource) continue; const formatVersion = p.resource.format?.extraStreamsVersion ?? 0; const modifierHash = p.workBufferModifier?.hash ?? 0; const numSplats = p.resource.numSplats ?? 0; const centersVersion = p.resource.centersVersion; const state = this._states.get(p); if (!state) { // First time seeing this placement this._states.set(p, { formatVersion, modifierHash, numSplats, centersVersion }); changed = true; } else if (state.formatVersion !== formatVersion || state.modifierHash !== modifierHash || state.numSplats !== numSplats || state.centersVersion !== centersVersion) { // Reuse existing object, just update values state.formatVersion = formatVersion; state.modifierHash = modifierHash; state.numSplats = numSplats; state.centersVersion = centersVersion; changed = true; } } return changed; } constructor(){ /** * WeakMap of placement to last seen state. * Using WeakMap allows automatic cleanup when placements are garbage collected. * * @type {WeakMap<GSplatPlacement, { formatVersion: number, modifierHash: number, numSplats: number, centersVersion: number }>} * @private */ this._states = new WeakMap(); } } export { GSplatPlacementStateTracker };