import * as THREE from "three"; import type { PBMClipperParameter } from "../materials/pbmMaterial"; export interface SplatData { numPoints: number; packedData: Uint32Array; sh1?: Float32Array; sh2?: Float32Array; sh3?: Float32Array; shDegree?: number; /** 数据是否经过抗锯齿(Mip-Splatting)训练,来自 SPZ header flags bit0 */ antiAliased?: boolean; } export declare class PBMGaussianSplattingObject extends THREE.Points { transformChanged: boolean; selectedChanged: boolean; /** * 渲染参数(preBlurAmount / blurAmount)变化标记。 * 与 transformChanged 分开:这类参数不影响深度排序,只需重传 ObjectParamsStore, * 不必触发重排序,也不必碰 transform 纹理。 */ renderParamsChanged: boolean; numPoints: number; maxSHDegree: number; usedSHDegree: number; initAnimationEnabled: boolean; gsViewLayerKey: string; gsClippers: readonly PBMClipperParameter[]; /** 加载时在 worker 中预 pack 好的 GPU 数据(8 uint32/splat) */ packedData: Uint32Array; /** * 数据是否经过抗锯齿(Mip-Splatting)训练。来自 SPZ header flags bit0。 * 决定 preBlurAmount / blurAmount 的默认取值,即渲染端走纯 dilation * 还是「2D mip + opacity 补偿」路径。 */ readonly antiAliased: boolean; private _preBlurAmount; private _blurAmount; private _selected; private _boundingBox; lastMatrixWorld: THREE.Matrix4 | null; get sh1(): Float32Array | undefined; get sh2(): Float32Array | undefined; get sh3(): Float32Array | undefined; /** * 投影后 2D 协方差对角线上的「纯膨胀」量,单位屏幕空间方差 px²。 * 只放大 splat、**不**调整 opacity,用于让亚像素 splat 不至于消失/闪烁 * (即 Inria 原版 3DGS 的 dilation trick)。 * 默认:antiAliased 数据为 0(不需要兜底),否则为 0.3。 */ get preBlurAmount(): number; set preBlurAmount(value: number); /** * 投影后 2D 协方差对角线上的「低通核」量,单位屏幕空间方差 px²。 * 除膨胀协方差外还按 sqrt(det(Σ) / det(Σ + εI)) 补偿 opacity,使 splat 能量守恒 * —— 这就是 Mip-Splatting 在 2D 端的抗锯齿(EWA 低通近似)。 * 默认:antiAliased 数据为 0.3(须与训练一致),否则为 0(不启用)。 */ get blurAmount(): number; set blurAmount(value: number); /** 清除手动覆盖,回到由 antiAliased 推导的默认值。 */ resetBlurAmounts(): void; constructor(splatData?: SplatData); get selected(): boolean; set selected(selected: boolean); get boundingBox(): THREE.Box3; dispose(): void; /** * 从 packedData 即时解码第 index 个 splat 的 3D 协方差矩阵(half-precision → float)。 * 用于 BVH 法线拟合——只在命中点按需解码。 * packedData texel1 布局:[4]=cov00|cov01(half2), [5]=cov02|cov11(half2), [6]=cov12|cov22(half2)。 * 返回 6 个分量 [s00, s01, s02, s11, s12, s22],或 null 如果数据不足。 */ decodeCov3D(index: number): Float32Array | null; }