UNPKG

@playcanvas/splat-transform

Version:

Library and CLI tool for 3D Gaussian splat format conversion and transformation

69 lines (68 loc) 2.99 kB
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 };