import { Box3, Group as ThreeGroup, Mesh, Object3D, Raycaster, Intersection } from 'three'; import { default as Viewport } from '.'; export interface AutoInstancingOptions { /** * 同步策略。safe 保持 render 时全量兜底,signal 仅处理显式变更信号。 */ syncMode?: 'safe' | 'signal'; /** * 同一批次至少包含多少个 Mesh 时才创建 InstancedMesh。 */ minInstances?: number; /** * 单个 InstancedMesh 批次允许包含的最大实例数。 * 限制批次规模可以降低动态更新和包围体重算的成本。 */ maxInstancesPerBatch?: number; /** * 连续多少帧发生局部变换后,将对象从静态批次提升为独立代理。 */ dynamicPromotionFrames?: number; /** * 透明双面代理是否使用单通道绘制。 * 仅在代理渲染期间生效,不修改源材质的持久状态。 */ transparentSinglePass?: boolean; /** * 是否跳过 image 为空但已标记更新的纹理上传。 * 仅在代理渲染期间临时复位纹理版本,避免 WebGLRenderer 每帧重复重试和告警。 */ skipEmptyTextureUploads?: boolean; } export interface AutoInstancingStats { active: boolean; sourceObjects: number; sourceRenderables: number; instancedBatches: number; instancedObjects: number; mergedBatches: number; mergedObjects: number; batchedBatches: number; batchedObjects: number; passthroughObjects: number; unsupportedObjects: number; multiDrawSupported: boolean; } declare class AutoInstancingManager { readonly viewport: Viewport; readonly proxyRoot: ThreeGroup; private roots; private pendingRoots; private pendingRootSyncRequested; private sourceToProxy; private sourceBindings; private proxyBindings; private dynamicSources; private excludedRoots; private excludedSubtrees; private outlineIndependentSources; private outlineSources; private outlineSourceSet; private safeBeforeRenderListeners; private beforeRenderListenerBaseline; private activeEmptyTextureVersions; private autoMode; private autoModeOptions; private isRendering; constructor(viewport: Viewport); setEnabled(enabled: boolean, options?: AutoInstancingOptions): AutoInstancingStats[]; registerRoot(root: Object3D, options?: AutoInstancingOptions): AutoInstancingStats | null; unregisterRoot(root: Object3D, excludeFromAutoMode?: boolean): void; getStats(root?: Object3D): AutoInstancingStats | AutoInstancingStats[] | null; getBounds(root: Object3D): Box3 | null; requestSync(): void; markBeforeRenderListenerSafe(listener: () => void): void; unmarkBeforeRenderListenerSafe(listener: () => void): void; clearSafeBeforeRenderListeners(): void; hasUnsafeBeforeRenderListeners(numListeners: number): boolean; setOutlineSelection(sources: Mesh[]): Mesh[]; getOutlineSelection(): Mesh[]; withRenderProxies(render: () => T): T; beginRender(forceSourceSync?: boolean): void; endRender(): void; getRaycastObjects(objects: Object3D | Object3D[]): Object3D | Object3D[]; resolveIntersection(intersection: Intersection, raycaster?: Raycaster, sourceIntersections?: Map, Intersection>[]>): Intersection | null; resolveIntersections(intersections: Intersection[], raycaster?: Raycaster): Intersection[]; clear(): void; dispose(): void; restoreSignalListeners(): void; private _createBinding; private _syncRoot; private _updateRootBounds; private _updateProxyBindings; private _syncInstancedMeshBounds; private _isSourceWorldVisible; private _syncOwnedProxyMaterials; private _ensureOutlineProxy; private _removeOutlineProxy; private _promoteDynamicDescendants; private _isTrackedDescendant; private _requiresPartialRendering; private _hideManagedSources; private _restoreRoot; private _removeBinding; private _rebuildDirtyRoots; private _supportsMultiDraw; private _applyEmptyTextureGuards; private _restoreEmptyTextureVersions; private _normalizeOptions; private _registerSceneRoots; private _removeInvalidRoots; private _partitionNestedRoots; private _handleObjectAdded; private _handleObjectRemoved; private _handleSourceChanged; private _handleMaterialChanged; private _retryPendingRoots; } export default AutoInstancingManager;