@playcanvas/splat-transform
Version:
Library and CLI tool for 3D Gaussian splat format conversion and transformation
69 lines (68 loc) • 2.99 kB
TypeScript
import { BlockMaskBuffer } from './block-mask-buffer';
import { type GaussianColumns } from '../data-table';
/**
* Pre-computed lookup structures for efficient voxel block queries.
*/
interface BlockLookup {
solidSet: Set<number>;
mixedMap: Map<number, number>;
masks: Uint32Array;
}
/**
* Grid parameters for block-based voxel queries.
*/
interface BlockGridParams {
gridMinX: number;
gridMinY: number;
gridMinZ: number;
blockSize: number;
voxelResolution: number;
numBlocksX: number;
numBlocksY: number;
numBlocksZ: number;
strideY: number;
strideZ: number;
}
/**
* Build block lookup structures from the buffer's linear block indices.
* The buffer's keys are already linear block indices, so this is a direct
* copy into a Set / Map for O(1) random access.
*
* @param buffer - Block mask buffer containing voxelized blocks.
* @returns Solid block set, mixed block map (linear index to masks array index), and masks.
*/
declare const buildBlockLookup: (buffer: BlockMaskBuffer) => BlockLookup;
/**
* Test whether a Gaussian's center lies inside an occupied voxel.
*
* @param px - Gaussian center x.
* @param py - Gaussian center y.
* @param pz - Gaussian center z.
* @param grid - Block grid parameters.
* @param lookup - Block lookup structures.
* @param blockFilter - Optional set of block indices to restrict the test to.
* @returns True if the center is in an occupied (and optionally filtered) voxel.
*/
declare const isCenterInOccupiedVoxel: (px: number, py: number, pz: number, grid: BlockGridParams, lookup: BlockLookup, blockFilter?: Set<number>) => boolean;
/**
* Test whether a Gaussian has meaningful contribution at occupied voxel
* centers in blocks that overlap its AABB.
*
* Iterates over blocks that overlap the Gaussian's AABB, then evaluates the
* Gaussian's opacity contribution at each occupied voxel center in those
* blocks. Returns true once `minHits` qualifying voxels are found. With the
* default `minHits = 1` this short-circuits on the first hit; larger values
* let callers reject elongated outliers (e.g. spikes) whose tails clip only
* a single cluster voxel.
*
* @param gaussianIdx - Index of the Gaussian.
* @param columns - Gaussian column data arrays.
* @param grid - Block grid parameters.
* @param lookup - Block lookup structures.
* @param minContribution - Minimum contribution threshold.
* @param blockFilter - Optional set of block indices to restrict the test to.
* @param minHits - Minimum number of qualifying voxels required. Default 1.
* @returns True if at least `minHits` qualifying voxels were found.
*/
declare const gaussianContributesToVoxels: (gaussianIdx: number, columns: GaussianColumns, grid: BlockGridParams, lookup: BlockLookup, minContribution: number, blockFilter?: Set<number>, minHits?: number) => boolean;
export { buildBlockLookup, isCenterInOccupiedVoxel, gaussianContributesToVoxels, type BlockLookup, type BlockGridParams };