import * as THREE from 'three'; import type { PBMGaussianSplattingObject } from '../model/objects/pbmGaussianSplattingObject'; import { TileTexture } from './tileTexture'; export interface AssembledRegion { object: PBMGaussianSplattingObject; tile: TileTexture; start: number; count: number; transformIndex: number; layerIndex: number; } export declare class SplatAssembler { readonly width: number; private target; private targetHeight; private regionMap; private regionList; private material; private scene; private camera; private mesh; constructor(width?: number); get texture(): THREE.Texture | null; get totalPoints(): number; get regions(): readonly AssembledRegion[]; has(object: PBMGaussianSplattingObject): boolean; add(object: PBMGaussianSplattingObject, tile: TileTexture, transformIndex: number, layerIndex: number): void; /** * 按有序对象列表增量同步(per-tile 纹理缓存): * - 存活对象:保留其 TileTexture(GPU 常驻,不重传),仅更新 transformIndex/layerIndex; * - 新增对象:新建 TileTexture(CPU→GPU 一次); * - 移除对象:dispose 其 TileTexture。 * regionList 顺序严格按传入 objects 顺序(须与 RenderData 布局一致)。 */ sync(objects: readonly PBMGaussianSplattingObject[], resolveIndices: (obj: PBMGaussianSplattingObject) => { transformIndex: number; layerIndex: number; }): void; remove(object: PBMGaussianSplattingObject): void; clear(): void; /** 按当前 tile 顺序算连续偏移;render pass 从各 TileTexture 组装大纹理。 */ assemble(renderer: THREE.WebGLRenderer): void; snapshot(): AssembledRegion[]; /** * 提取排序输入(不依赖 RenderData): * - positions:每点世界坐标(从各 tile packedData 的 texel0 float32),按当前布局全局点索引排布; * - transformIndices:每点所属对象的 transformIndex; * 顺序与大纹理点索引一致(region.start + local)。 */ extractSortInputs(): { positions: Float32Array; transformIndices: Uint32Array; count: number; }; /** 回读组装后的大纹理(RGBA32UI)。供 spike 校验与 P4 排序取世界坐标使用。 */ readback(renderer: THREE.WebGLRenderer): Uint32Array; dispose(): void; private static readonly VERTEX; private static readonly FRAGMENT; }