import type { Camera, Color, Intersection, ToneMapping } from 'three'; import { AmbientLight, Fog, FogExp2, PerspectiveCamera, Scene as TScene, Vector3, WebGLRenderer } from 'three'; import type { EffectPass } from 'postprocessing'; import type { ColorRepresentation } from '../../type'; import { FogEnum } from '../../type'; import Cssrenderer from '../cssRenderer'; import { SceneContext } from '../global/SceneContext'; import { EControlMode, UniversalControls } from '../control/UniversalControls'; import type { ControlsType } from '../control/UniversalControls'; import type { ISpawnPoint } from '../control/CharacterControls'; import PostProcess from './postProcess'; interface SceneOptions { /** renderer options */ rendererOps?: { antialias?: boolean; logarithmicDepthBuffer?: boolean; alpha?: boolean; shadowMap?: boolean; toneMapping?: ToneMapping; toneMappingExposure?: number; size?: { width: number; height: number; }; }; /** window reset */ reset?: boolean; fog?: FogEnum; /** default camera options */ defCameraOps?: { position?: Vector3; fov?: number; aspect?: number; near?: number; far?: number; }; /** default ambient light options */ defAmbientLightOps?: { color?: Color; intensity?: number; }; /** 默认射线检测配置 */ defRaycasterOps?: { recursive?: boolean; }; /** controls */ orbitControls?: { use?: boolean; mode?: { type: EControlMode; }; characterModelUrl?: string; spawnPoint?: ISpawnPoint; limit?: { pitch?: [number, number]; yaw?: [number, number]; distance?: [number, number]; }; target?: [number, number, number]; }; useBvh?: boolean; /** 是否需要默认环境光 */ ambientLight?: boolean; /** on demand render scene, 按需渲染 */ onDemand?: boolean; /** 是否开启css2d渲染 */ css2DRenderer?: boolean; /** 是否开启css3d渲染 */ css3DRenderer?: boolean; /** 是否启用后期效果 */ postEffects?: boolean; /** 是否开启裁剪 */ cutout?: boolean; /** 场景背景相关 */ background?: { imgs?: Tuple; color?: Color; panorama?: string; alpha?: number; }; enableEvents?: boolean; /** 是否开启后期效果 */ postProcess?: boolean; /** 允许传入自定义事件总线 */ emitter?: any; } type Tuple = [TItem, ...TItem[]] & { length: 6; }; interface CutoutAreaType { x: number; y: number; width: number; height: number; } declare class SceneControl { readonly context: SceneContext; private opts; private container; private _postProcess; private postProcessManager; private interactionManager; cutout: boolean; scene: TScene; ambientLight: AmbientLight; camera: PerspectiveCamera; renderer: WebGLRenderer; cssRenderer: Cssrenderer | null; css3DRenderer: Cssrenderer | null; controls: ControlsType; universalControls: UniversalControls; domElement: HTMLElement; fog: Fog | FogExp2 | null; /** 裁剪相关 */ cutoutCamera: PerspectiveCamera | null; cutoutBackground: ColorRepresentation | null; cutoutBackgroundAlpha: number; cutoutArea: CutoutAreaType; /** 雾相关 */ fogColor: ColorRepresentation; fogNear: number; fogFar: number; fogDensity: number; intersectObjects: Intersection[]; private clock; private perspectiveMap; get postProcess(): boolean; set postProcess(value: boolean); constructor(opts?: SceneOptions); /** * enable events * @param flag */ enableEvents(flag: boolean): void; /** * todo: 待优化 * init default scene components */ private defaultInit; /** * set main camera * @param camera */ setMainCamera(camera: PerspectiveCamera): void; /** * init fog * @returns */ initFog(): Fog | FogExp2 | null; /** * init scene * @param camera * @param renderer */ resetScene(camera: PerspectiveCamera, renderer: WebGLRenderer): void; /** * init renderer */ private initRenderer; /** * main view cut * @param renderer */ cutMain(renderer: WebGLRenderer): void; /** * mini view cut * @param renderer */ private cutSub; private initCssRenderer; /** * init skybox * @param imgs */ private initSkyBox; /** * init default camera */ private initDefaultPerspectiveCamera; /** * init ambient light * @param position * @param color * @param intensity * @returns */ private initAmbientLight; /** * frame render * @param frameAnimate */ private startFrameAnimate; /** * scene add object3d * @param object3d */ add(object3d: any): void; /** * 处理对象添加逻辑 * @param object3d */ private handleAdd; remove(object3d: any): void; /** * 处理对象移除逻辑 * @param object3d */ private handleRemove; /** * add pass * @param pass * @returns */ addPass(pass: EffectPass): PostProcess | undefined; /** * remove pass * @param pass * @returns */ removePass(pass: EffectPass): void | undefined; /** * get active passes * @returns */ getActivePasses(): EffectPass[] | undefined; /** * render scene * @param target */ render(target: HTMLElement): void; /** * init controls */ private initControls; private initEnvironment; private updateRenderForCut; /** * todo: Not implemented temporarily */ destroy(): void; setCustomPerspective(camera: Camera): () => void; private registerLoadingEvents; addEventListener(event: string, callback: (args: any) => void): void; removeEventListener(event: string, callback: (args: any) => void): void; dispatchEvent(opts: { type: string; args?: any; }): void; } export default SceneControl;