UNPKG

threepipe

Version:

A modern 3D viewer framework built on top of three.js, written in TypeScript, designed to make creating high-quality, modular, and extensible 3D experiences on the web simple and enjoyable.

225 lines (190 loc) 7.83 kB
import {Camera, Vector3} from 'three' import {IObject3D, IObject3DEventMap, IObject3DUserData, IObjectSetDirtyOptions} from './IObject' import {IShaderPropertiesUpdater} from '../materials' import {ICameraControls, TControlsCtor} from './camera/ICameraControls' import {CameraView, ICameraView} from './camera/CameraView' /** * Available modes for {@link ICamera.controlsMode} property. * This is defined just for autocomplete, these and any other control type can be added by plugins */ export type TCameraControlsMode = '' | 'orbit' | 'deviceOrientation' | 'threeFirstPerson' | 'pointerLock' | string export interface ICameraUserData extends IObject3DUserData { /** * Automatically calculate near and far planes based on the scene bounding box. */ autoNearFar?: boolean /** * Minimum near plane distance. (when {@link autoNearFar} is true) * Or the near plane distance when {@link autoNearFar} is false. * @default 0.2 */ minNearPlane?: number /** * Maximum far plane distance. (when {@link autoNearFar} is true) * Or the far plane distance when {@link autoNearFar} is false. * @default 1000 */ maxFarPlane?: number /** * Automatically rotate camera to look at(lookAt) the target. * Only for when controls and interactions are disabled. * @default false */ autoLookAtTarget?: boolean /** * Automatically move the camera(dolly) based on the scene size when the field of view(fov) changes. * Works when controls are enabled or autoLookAtTarget is true. * * Note - The camera must be added to RootScene for this to work */ dollyFov?: boolean /** * Disable jitter for this camera. (for {@link SSAAPlugin}) * @default false */ disableJitter?: boolean __lastScale?: Vector3, __isMainCamera?: boolean, __cameraSetup?: boolean, // [key: string]: any // commented for noe } export interface ICamera<TE extends ICameraEventMap = ICameraEventMap> extends Camera<TE>, IObject3D<TE>, IShaderPropertiesUpdater { assetType: 'camera' readonly isCamera: true setDirty(options?: ICameraSetDirtyOptions): void; readonly isMainCamera: boolean; readonly isPerspectiveCamera?: boolean; readonly isOrthographicCamera?: boolean; activateMain(options?: Omit<ICameraEventMap['activateMain'], 'bubbleToParent'>, _internal?: boolean, _refresh?: boolean): void; deactivateMain(options?: Omit<ICameraEventMap['activateMain'], 'bubbleToParent'>, _internal?: boolean, _refresh?: boolean): void; /** * @deprecated use `this` instead */ cameraObject: this readonly controls: ICameraControls|undefined; // getControls<T extends TControls>(): T|undefined; refreshTarget(): void; refreshAspect(setDirty?: boolean): void; /** * Target of camera, in world(global) coordinates. */ target: Vector3, /** * Local position of camera. */ position: Vector3, /** * If interactions are enabled for this camera. It can be disabled by some code or plugin. * see also {@link setInteractions} * @deprecated use {@link canUserInteract} to check if the user can interact with this camera * @readonly */ readonly interactionsEnabled: boolean; setInteractions(enabled: boolean, by: string, setDirty?: boolean): void; /** * Check whether user can interact with this camera. * Interactions can be enabled/disabled in a variety of ways, * like {@link setInteractions}, {@link controlsMode}, {@link isMainCamera} property */ readonly canUserInteract: boolean; zoom: number; /** * Camera frustum aspect ratio, window width divided by window height. * It can be managed internally if {@link autoAspect} is true. * @default 1 */ aspect: number; /** * Automatically manage aspect ratio based on window/canvas size. */ autoAspect: boolean; controlsMode?: TCameraControlsMode; // todo add more. // controlsEnabled: boolean; // use controlsMode = '' instead /** * Automatically managed when {@link autoNearFar} is `true`. See also {@link minNearPlane} */ near: number; /** * Automatically managed when {@link autoNearFar} is `true`. See also {@link maxFarPlane} */ far: number; // also in userData autoNearFar: boolean // default = true minNearPlane: number // default = 0.2 maxFarPlane: number // default = 1000 // todo // Note: for userData: add _ in front of for private use, which is preserved while cloning but not serialisation, and __ for private use, which is not preserved while cloning and serialisation userData: ICameraUserData /** * @deprecated use {@link isMainCamera} instead */ isActiveCamera: boolean; setControlsCtor(key: string, ctor: TControlsCtor, replace?: boolean): void; removeControlsCtor(key: string): void; refreshCameraControls(setDirty?: boolean): void updateProjectionMatrix(): void fov?: number /** * Refresh the camera frustum planes from frustumSize. Only for orthographic cameras. * @param setDirty */ refreshFrustum?(setDirty?: boolean): void getView<T extends ICameraView = CameraView>(worldSpace?: boolean, cameraView?: T): T setView(view: ICameraView): void /** * Set camera view from another camera. * @param camera * @param distanceFromTarget - default = 4 * @param worldSpace - default = true */ setViewFromCamera(camera: ICamera|Camera, distanceFromTarget?: number, worldSpace?: boolean): void /** * Dispatches the `setView` event which triggers the main camera to set its view to this camera's view. * @param eventOptions */ setViewToMain(eventOptions: Pick<ICameraEventMap['setView'], 'ui'>): void /** * Set the canvas which is used as dom element in controls, etc. * This is done by the viewer/scene when main camera is changed * @param canvas * @param refresh */ setCanvas(canvas: HTMLCanvasElement|undefined, refresh?: boolean): void; // todo make optional // region inherited type fixes // re-declaring from IObject3D because: https://github.com/microsoft/TypeScript/issues/16936 traverse(callback: (object: IObject3D) => void): void traverseVisible(callback: (object: IObject3D) => void): void traverseAncestors(callback: (object: IObject3D) => void): void getObjectById<T extends IObject3D = IObject3D>(id: number): T | undefined getObjectByName<T extends IObject3D = IObject3D>(name: string): T | undefined getObjectByProperty<T extends IObject3D = IObject3D>(name: string, value: string): T | undefined copy(source: ICamera|Camera, recursive?: boolean, distanceFromTarget?: number, worldSpace?: boolean, ...args: any[]): this clone(recursive?: boolean): this add(...object: IObject3D[]): this remove(...object: IObject3D[]): this parent: IObject3D | null children: IObject3D[] // endregion /** * @internal world position cache for shader updates and other purposes */ _positionWorld: Vector3 /** * @internal reference to the canvas element used for rendering. (for aspect ratio, etc.) */ _canvas?: HTMLCanvasElement } // export type ICameraEventTypes = IObject3DEventTypes | 'update'// | string // export type ICameraEvent = Omit<IObject3DEvent, 'type'> & { // type: ICameraEventTypes // camera?: ICamera | null // // change?: string // } export type ICameraSetDirtyOptions = IObjectSetDirtyOptions export interface ICameraEventMap extends IObject3DEventMap { update: { camera: ICamera bubbleToParent: false // todo } & ICameraSetDirtyOptions }