import * as THREE from 'three';
import { Parameter, ParameterValue } from './parameter';
import { Model } from './model';
import { type ViewLayer } from './view-layer';
import { type ParameterTilesetValue } from './parameter';
import { type TextureOptions } from "../types/imageOptions";
import { type Works } from '../work';
import { type Camera } from '../core/camera';
import { type Intersection } from './intersection';
import { type BoundingVolume, type BoundingVolumeJson } from '../utils/volume';
import { BoundingMesh } from "../meshes/boundingMesh";
export interface ModelOptions {
    /** 模型是否感光 */
    light?: boolean;
    /** 模型 3d-tile 参数 */
    "3d-tiles"?: (Partial<ParameterTilesetValue> & {
        viewerRequestVolume?: BoundingVolume | BoundingVolumeJson;
        showLayers?: boolean | string[];
    }) | ((viewLayer: ViewLayer, model: Model) => void | (Partial<ParameterTilesetValue> & {
        viewerRequestVolume?: BoundingVolume | BoundingVolumeJson;
        showLayers?: boolean | string[];
    }));
    /**
     * 模型贴图的配置参数
     * @description
     * 可以动态对配置在 `work` 数据中的模型贴图在 runtime 做 url 调整。
     * 平衡加载时间和图片质量
     */
    textureOptions?: TextureOptions;
    /** 强制显示模型，不等待加载完 */
    forceReplaceImmediately?: boolean;
}
export type Models = Model[] & {
    /**
     * @deprecated
     * use `modelScene.autoRefine` instead
     */
    autoUpdate: boolean;
    /**
     * @deprecated
     * use `modelScene.boundingBox` instead
     */
    bounding: THREE.Box3;
    /**
     * @deprecated
     * use `modelScene.loaded` instead
     */
    loaded: boolean;
    /**
     * @deprecated
     * use `modelScene.refined` instead
     */
    refined: boolean;
    /**
     * @deprecated
     * use `modelScene.refineProgress` instead
     */
    refineProgress: [number, number];
    /**
     * @deprecated
     * use `modelScene.parameter.cacheCameras` `modelScene.parameter.set('cacheCameras', cacheCameras)` instead
     */
    cacheCameras: readonly (THREE.PerspectiveCamera | Camera)[];
    /**
     * @deprecated
     * use `modelScene.intersectRaycaster` instead
     */
    intersectRaycaster(raycaster: THREE.Raycaster): Intersection[];
    /**
     * @deprecated
     * Use `.parameter.set` instead
     */
    setMaterial(values: Partial<ParameterValue>): void;
    /**
     * @deprecated
     * Use `.parameter.get` instead
     */
    getMaterial(): ParameterValue;
    /**
     * @deprecated
     * Use `.parameter.reset('brightness')` instead
     */
    resetBrightness(): void;
};
export interface ModelScene {
    dispatchEvent(event: {
        type: 'model.create';
        model: Model;
    }): void;
    dispatchEvent(event: {
        type: 'model.dispose';
        model: Model;
    }): void;
    dispatchEvent(event: {
        type: string;
        [attachment: string]: any;
    }): void;
    addEventListener(type: 'model.create', listener: (event: THREE.Event & {
        type: 'model.create';
        model: Model;
    }) => void): void;
    addEventListener(type: 'model.dispose', listener: (event: THREE.Event & {
        type: 'model.dispose';
        model: Model;
    }) => void): void;
    addEventListener(type: string, listener: (event: THREE.Event) => void): void;
    removeEventListener(type: 'model.create', listener: (event: THREE.Event & {
        type: 'model.create';
        model: Model;
    }) => void): void;
    removeEventListener(type: 'model.dispose', listener: (event: THREE.Event & {
        type: 'model.dispose';
        model: Model;
    }) => void): void;
    removeEventListener(type: string, listener: (event: THREE.Event) => void): void;
}
export declare class ModelScene extends THREE.Scene {
    fiveId: string;
    needsRender: boolean;
    /** 自动细化 */
    autoRefine: boolean;
    /** 包围盒 */
    boundingBox: THREE.Box3;
    /** 包围盒 Mesh */
    boundingMesh: BoundingMesh;
    /** 加载完成 */
    loaded: boolean;
    /** 细化完成 */
    refined: boolean;
    /** 细化进度 */
    refineProgress: [number, number];
    /** 参数 */
    parameter: Parameter;
    /** 模型列表 */
    readonly models: Models;
    private readonly shownModels;
    private updateModelMap;
    constructor(options: {
        fiveId: string;
    });
    setModels(works: Works, options: ModelOptions): Model[];
    get empty(): boolean;
    /**
     * 计算模型射线碰撞检测
     * @param raycaster - THREE 射线对象
     * @param target - 返回碰撞点
     * @returns 返回碰撞点
     */
    intersectRaycaster(raycaster: THREE.Raycaster, target?: Intersection[]): Intersection[];
    update(renderer: THREE.WebGLRenderer, camera: Camera): boolean;
    /**
     * @deprecated
     * Use `.boundingBox` instead
     */
    get bounding(): THREE.Box3;
    /**
     * @deprecated
     * Use `.parameter.set` instead
     */
    setMaterial(parameter: Partial<ParameterValue>): void;
    /**
     * @deprecated
     * Use `.parameter.get` instead
     */
    getMaterial(): ParameterValue;
    /**
     * @deprecated
     * Use `.parameter.reset('brightness')` instead
     */
    resetBrightness(): void;
    dispose(): void;
}
