import type { Mesh, Renderer, Texture, Engine, math, CameraOptionsEx } from '@galacean/effects';
import { spec } from '@galacean/effects';
import { PMesh } from './mesh';
import type { PCamera } from './camera';
import { PCameraManager } from './camera';
import { PLight, PLightManager } from './light';
import type { Vector3 } from './math';
import { Matrix4, Box3 } from './math';
import { PSkybox } from './skybox';
import type { CompositionCache } from './cache';
import type { PEntity } from './object';
import { TwoStatesSet } from '../utility/ts-helper';
type Box3 = math.Box3;
type Vector2 = math.Vector2;
/**
 * 场景参数接口，初始化场景对象时使用
 */
export interface PSceneOptions {
    /**
     * 合成名称
     */
    componentName: string;
    /**
     * 渲染器
     */
    renderer: Renderer;
    /**
     * 场景缓存
     */
    sceneCache: CompositionCache;
    /**
     * 是否只渲染线框
     */
    wireframeOnly?: boolean;
    /**
     * 运行时环境
     */
    runtimeEnv?: string;
    /**
     * 兼容模式
     */
    compatibleMode?: string;
    /**
     * 是否可视化包围盒
     */
    visBoundingBox?: boolean;
    /**
     * 是否动态排序
     */
    enableDynamicSort?: boolean;
    /**
     * 3D 渲染模式
     */
    renderMode3D?: spec.RenderMode3D;
    /**
     * 3D 渲染模式中棋盘格大小
     */
    renderMode3DUVGridSize?: number;
    /**
     * 是否渲染天空盒
     */
    renderSkybox: boolean;
    /**
     * 灯光元素数目
     */
    lightItemCount: number;
    /**
     * 最大骨骼数目
     */
    maxJointCount: number;
}
/**
 * 场景状态接口，每次场景管理器 Tick 时都会生成
 */
export interface PSceneStates {
    /**
     * 时间间隔
     */
    deltaSeconds: number;
    /**
     * 相机对象
     */
    camera: PCamera;
    /**
     * 相机位置
     */
    cameraPosition: Vector3;
    /**
     * 相机矩阵
     */
    viewMatrix: Matrix4;
    /**
     * 逆相机矩阵
     */
    inverseViewMatrix: Matrix4;
    /**
     * 投影矩阵
     */
    projectionMatrix: Matrix4;
    /**
     * 相机投影矩阵
     */
    viewProjectionMatrix: Matrix4;
    /**
     * 画布大小
     */
    winSize: Vector2;
    /**
     * 场景半径
     */
    sceneRadius: number;
    shadowMapSizeInv?: Vector2;
    lightViewMatrix?: Matrix4;
    lightProjectionMatrix?: Matrix4;
    lightViewProjectionMatrix?: Matrix4;
    /**
     * 灯光对象列表
     */
    lightList: PLight[];
    /**
     * 最大灯光数目
     */
    maxLightCount: number;
    /**
     * 最大骨骼数目
     */
    maxJointCount: number;
    /**
     * 天空盒对象
     */
    skybox?: PSkybox;
}
/**
 * 场景管理类，如果存在 Model 插件中的元素才会创建
 */
export declare class PSceneManager {
    /**
     * 合成名称
     */
    compName: string;
    /**
     * 实体列表
     */
    itemList: PEntity[];
    /**
     * Mesh 列表
     */
    meshList: PMesh[];
    /**
     * 灯光管理器
     */
    lightManager: PLightManager;
    /**
     * 相机管理器
     */
    cameraManager: PCameraManager;
    /**
     * 是否动态排序 Mesh 渲染优先级
     * 默认 false，需要和 Tiny 对齐时为 true
     */
    enableDynamicSort: boolean;
    /**
     * IBL 渲染时的 BRDF 查询纹理
     */
    brdfLUT?: Texture;
    /**
     * 天空盒
     */
    skybox?: PSkybox;
    /**
     * Tick 次数
     */
    tickCount: number;
    /**
     * 最近 Tick 时间
     */
    lastTickSecond: number;
    /**
     * 当前场景包围盒缓存，在阴影渲染中使用
     */
    sceneAABBCache: Box3;
    /**
     * 场景前帧和当前帧渲染的 Mesh 集合
     */
    renderedMeshSet: TwoStatesSet<Mesh>;
    /**
     * 最多灯光数目
     */
    maxLightCount: number;
    /**
     * 最大骨骼数目
     */
    maxJointCount: number;
    /**
     * 场景状态
     */
    sceneStates: PSceneStates;
    private renderer?;
    private sceneCache?;
    private parentId2Mesh;
    private renderSkybox;
    private engine;
    constructor(engine: Engine);
    /**
     * 初始化场景管理器，设置全局状态
     * @param opts - 场景参数
     */
    initial(opts: PSceneOptions): void;
    private initGlobalState;
    private clean;
    /**
     * 销毁，需要销毁各种管理器和创建的 WebGL 资源
     */
    dispose(): void;
    /**
     * 添加插件元素到场景中
     * @param item - 插件元素
     */
    addItem(item: PMesh | PCamera | PLight | PSkybox): void;
    /**
     * 从场景中删除插件元素
     * @param item - 插件元素
     */
    removeItem(item: PMesh | PCamera | PLight | PSkybox): void;
    /**
     * 更新默认相机状态，根据传入的相机参数
     * @param camera - 相机参数
     */
    updateDefaultCamera(camera: CameraOptionsEx, viewportMatrix: Matrix4): void;
    /**
     * 更新插件场景，需要更新内部的相关的插件对象，特别是 Mesh 对象的骨骼动画
     * 并将需要渲染的对象添加到渲染对象集合中
     * @param deltaTime - 更新间隔
     */
    tick(deltaTime: number): void;
    /**
     * 动态调整 Mesh 渲染优先级
     * 主要是为了和 Tiny 渲染对齐，正常渲染不进行调整
     * @param states - 场景中的状态数据
     */
    dynamicSortMeshes(states: PSceneStates): void;
    /**
     * 查询场景中的 Mesh
     * 通过 parentId 查询 Mesh 对象，可能找不到 Mesh 对象
     * @param parentId - Item 中定义的 parentId
     * @returns 查询到的 PMesh，或者是没找到。如果 Mesh 不可见，也是没找到。
     */
    queryMesh(parentId: string): PMesh | undefined;
    /**
     * 获取场景的包围盒
     * @param box - 包围盒
     * @returns 场景的包围盒
     */
    getSceneAABB(box?: Box3): Box3;
    printDebugInfo(): void;
    /**
     * 获取渲染器
     * @returns
     */
    getRenderer(): Renderer;
    /**
     * 获取场景中缓存
     * @returns
     */
    getSceneCache(): CompositionCache;
    /**
     * 获取激活的相机
     */
    get activeCamera(): PCamera;
    /**
     * 获取灯光数目
     */
    get lightCount(): number;
    /**
     * 获取着色器灯光数目，最小是 10
     */
    get shaderLightCount(): number;
}
export {};
