///
export class LumaSplatsLoader {
/**
* @param {string | {
* captureUrl?: string | null,
* src?: string | null,
* uuid?: string | null,
* artifacts?: object | null,
* fetchOptions?: RequestInit, // optional fetch request options
* }} sourceOptions - either the uuid of the capture or the capture artifacts
* @param {boolean} streaming - if true, the loader will download data
*/
constructor(sourceOptions: string | {
captureUrl?: string | null;
src?: string | null;
uuid?: string | null;
artifacts?: object | null;
fetchOptions?: RequestInit;
}, streaming?: boolean);
dataset: {
captureUrl?: string | null | undefined;
src?: string | null | undefined;
uuid?: string | null | undefined;
artifacts?: object | null | undefined;
fetchOptions?: RequestInit | undefined;
};
streaming: boolean;
fetchOptions: RequestInit | undefined;
metaVersion: number;
numSplats: number;
totalSplats: number;
totalBytes: number;
currentBytes: number;
initialPose: Float32Array;
scaleToWorld: number;
/** @type {Array} */
animFrames: Array;
animFps: number;
cpuPoints: Uint16Array;
sceneCenter: number[];
radiusList: Float32Array | null;
radiusStep: number;
minRadius: number;
loadedRadius: number;
isComplete: boolean;
antialias: number;
haveSH: boolean;
haveSemantics: boolean;
haveSkybox: boolean;
skybox: {
type: string;
distance: number;
origin: number[];
};
events: {
/** @type {EventEmitter} */
partialUpdate: EventEmitter;
/** @type {EventEmitter<{bytesReady: number, totalBytes: number, progress: number}>} */
progress: EventEmitter<{
bytesReady: number;
totalBytes: number;
progress: number;
}>;
/** @type {EventEmitter} */
showProgress: EventEmitter;
/** @type {EventEmitter} */
hideProgress: EventEmitter;
/** @type {EventEmitter>} */
updateGauss1Texture: EventEmitter>;
/** @type {EventEmitter>} */
updateGauss2Texture: EventEmitter>;
/** @type {EventEmitter>} */
updateSHTexture: EventEmitter>;
/** @type {EventEmitter>} */
updateSkyboxTexture: EventEmitter>;
/** @type {EventEmitter<{start: number, end: number, cpuPoints: Uint16Array}>} */
updateCpuPoints: EventEmitter<{
start: number;
end: number;
cpuPoints: Uint16Array;
}>;
/** @type {EventEmitter} */
complete: EventEmitter;
};
blocksDowloaded: number;
gauss1Data: Uint32Array | null;
gauss2Data: Uint32Array | null;
gauss1Count: number;
gauss2Count: number;
gauss1Height: number;
gauss2Height: number;
cpuPtsCount: number;
bytesReady: number;
/** @type {Promise<{ artifacts: Awaited< ReturnType > } & Awaited> & Awaited> >} */
metaReady: Promise<{
artifacts: Awaited>;
} & Awaited> & Awaited>>;
/** @type {Promise} */
allReady: Promise;
/** @type {Promise>} */
coreBinReady: Promise>;
/** @type {Promise>} */
gauss1Ready: Promise>;
/** @type {Promise>} */
gauss2Ready: Promise>;
/** @type {Promise | null>} */
shReady: Promise | null>;
/** @type {Promise} */
semanticsReady: Promise;
/** @type {Promise> | null>} */
skyboxReady: Promise> | null>;
sceneRadius(): number;
/**
* @param {number} byteLength
*/
addProgress(byteLength: number): void;
showProgress(): void;
hideProgress(): void;
/**
* Convert artifact array to object.
* @param {Array<{url: string, type: string}>} renderRunArray
* @returns {Object}
*/
convertArtifactArray(renderRunArray: Array<{
url: string;
type: string;
}>): Object;
/**
* @returns {Promise<{
* gs_web_webmeta?: string,
* gs_web_meta?: string,
* gs_web_gauss1?: string,
* gs_web_gauss2?: string,
* gs_web_sh?: string,
* gs_compressed_meta?: string,
* gs_compressed?: string,
* with_background_gs_camera_params?: string,
* semantics?: string,
* skybox?: string,
* skybox_meta?: string,
* }>}
*/
getArtifacts(): Promise<{
gs_web_webmeta?: string;
gs_web_meta?: string;
gs_web_gauss1?: string;
gs_web_gauss2?: string;
gs_web_sh?: string;
gs_compressed_meta?: string;
gs_compressed?: string;
with_background_gs_camera_params?: string;
semantics?: string;
skybox?: string;
skybox_meta?: string;
}>;
/**
* Downloads all metadata files, then all data files.
*/
downloadAllFiles(): void;
coreReady: Promise | undefined;
/**
* Downloads a file, returns a Uint8Array with the content upon completion.
*
* 'partialCallback', if defined, gets called with partial buffer every time
* at least 'updateBytes' is received.
*
* @param {string} url
* @param {(function(Uint8Array, boolean): void) | undefined} partialCallback
* @param {number} updateBytes
* @returns {Promise}
*/
fetchFile(url: string, partialCallback?: ((arg0: Uint8Array, arg1: boolean) => void) | undefined, updateBytes?: number): Promise;
/**
* Interprets 'data' as JSON text, parses it into object.
* @param {Uint8Array} data
* @returns {Object}
*/
parseJSON(data: Uint8Array): Object;
/** @param {string} url */
downloadMeta(url: string): Promise<{
metaVersion: number;
totalSplats: number;
totalBytes: number;
sceneCenter: number[];
radiusList: Float32Array;
radiusStep: number;
minRadius: number;
antialias: number;
haveSH: boolean;
scaleToWorld: number;
initialPose: Float32Array;
}>;
/**
* Download and parse the 'gs_web_meta' artifact, used in v1 format to get scale_to_world and initial pose.
* @param {string} url
*/
downloadMeta2(url: string): {};
/**
* Download and parse the 'with_background_gs_camera_params', to get camera animation frames.
* @param {string} url
*/
downloadMeta3(url: string): Promise;
/**
* @param {Uint32Array} data
* @param {number} texelSize
*/
partialSizes(data: Uint32Array, texelSize: number): number[];
/** @param {string} url */
downloadCoreBin(url: string): Promise;
/**
* Dispatch decoded texture blocks for GPU upload.
* @param {number} size - number of decoded Gaussians
* @param {Uint32Array} tex1 - first (2-channel) texture data
* @param {Uint32Array} tex2 - second (4-channel) texture data
* @param {Uint16Array} xyz - splat centers as 3x half-floats
*/
updateCoreBlock(size: number, tex1: Uint32Array, tex2: Uint32Array, xyz: Uint16Array): void;
/** @param {string} url */
downloadGauss1(url: string): Promise>;
/** @param {string} url */
downloadGauss2(url: string): Promise>;
partialUpdate(): void;
/** @param {string} url */
downloadSHTexture(url: string): Promise>;
/**
* @param {{
* skybox: string,
* skybox_meta: string,
* }} artifacts
*/
downloadSkybox(artifacts: {
skybox: string;
skybox_meta: string;
}): Promise[]>;
/**
* @param {Uint8Array} data
* @param {number} width
* @param {number} count
* @returns {void}
*/
extractCpuPoints(data: Uint8Array, width: number, count: number): void;
/**
* Start the decoding worker.
*/
initWorker(): void;
worker: DecoderWorker | undefined;
/**
* Send one core.bin block for decoding
* @param {Uint8Array} block
* @param {number} maxSize - max number of gaussians in the encoded block
* @param {number} seed - obfuscation seed
*/
decodeBlock(block: Uint8Array, maxSize: number, seed: number): void;
/**
* Receives decoded blocks, and worker events.
* @param {MessageEvent} evt
*/
onWorkerMessage(evt: MessageEvent): void;
}
export type LoaderTexturePayload = {
target: number;
width: number;
height: number;
channels: number;
currentHeight: number;
data: T;
internalFormat: number;
format: number;
type: number;
unpackAlignment: number;
minMagFilter: number;
complete: boolean;
};
import { EventEmitter } from './util/EventEmitter.js';
import DecoderWorker from 'inline-worker!./decoder.worker.js';