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;
}
