UNPKG

mapbox-3d-tiles

Version:

Integrate threejs with mapbox-gl to enable 3dtiles / 3dgs / gltf rendering.

726 lines (661 loc) 23 kB
import { AnimationAction } from 'three'; import { AnimationMixer } from 'three'; import { ColorRepresentation } from 'three'; import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js'; import { CustomLayerInterface } from 'mapbox-gl'; import { Feature } from 'geojson'; import { GeoJSON as GeoJSON_2 } from 'geojson'; import { Geometry } from 'geojson'; import { Group } from 'three'; import { Intersection } from 'three'; import { LineString } from 'geojson'; import { LngLatLike } from 'mapbox-gl'; import { Map as Map_2 } from 'mapbox-gl'; import { Material } from 'three'; import { MercatorCoordinate } from 'mapbox-gl'; import { Mesh } from 'three'; import { MeshBasicMaterialParameters } from 'three'; import { Object3D } from 'three'; import { Object3DEventMap } from 'three'; import { PerspectiveCamera } from 'three'; import { Point } from 'mapbox-gl'; import { Point as Point_2 } from 'geojson'; import { Polygon } from 'geojson'; import { Position as Position_2 } from 'geojson'; import { Scene } from 'three'; import { Side } from 'three'; import { Texture } from 'three'; import { TilesRenderer } from '3d-tiles-renderer'; import { UnionToIntersection } from 'utility-types'; import { Vector2 } from 'three'; import { Vector3 } from 'three'; import { WebGLRenderer } from 'three'; declare type AlongPathControlsOptions = { path?: Position[]; points?: Vector3[]; pathClose?: boolean; duration?: number; cameraPitch?: number; cameraBearing?: number; cameraDistance?: number; }; declare type Anchor = 'center' | 'top' | 'bottom' | 'left' | 'right' | 'front' | 'back'; declare type AroundPointControlsOptions = { position?: Position; point?: Vector3; duration?: number; isClockwise?: boolean; cameraBearing?: number; cameraPitch?: number; cameraDistance?: number; }; /** * Similar to the WorkerPool class except it creates and destroys workers automatically with a maximum of `maxWorkers` workers. * Workers are terminated when it is idle for at least `idleTimeElapsedBeforeRelease` milliseconds. */ export declare class AutoReleaseWorkerPool extends WorkerPool { /** * Default options for the constructor. * Override to change the defaults. */ static DefaultOptions: AutoReleaseWorkerPoolOptions; private readonly _maxWorkers; private readonly _createWorkerAsync; private readonly _options; constructor(maxWorkers: number, createWorkerAsync: () => Promise<Worker>, options?: AutoReleaseWorkerPoolOptions); push(action: (worker: Worker, onComplete: () => void) => void): string; protected _execute(workerInfo: WorkerInfo, actionId: string, action: (worker: Worker, onComplete: () => void) => void): void; } /** * Options for AutoReleaseWorkerPool */ export declare interface AutoReleaseWorkerPoolOptions { /** * Idle time elapsed before workers are terminated. */ idleTimeElapsedBeforeRelease: number; } /** * Given an array of member function names as strings, replace all of them * with bound versions that will always refer to `context` as `this`. This * is useful for classes where otherwise event bindings would reassign * `this` to the evented object or some other value: this lets you ensure * the `this` value always. * * @param fns list of member function names * @param context the context value * @example * function MyClass() { * bindAll(['ontimer'], this); * this.name = 'Tom'; * } * MyClass.prototype.ontimer = function() { * alert(this.name); * }; * var myClass = new MyClass(); * setTimeout(myClass.ontimer, 100); * @private */ export declare function bindAll(fns: Array<string>, context: unknown): void; declare type BuildingMeshOptions = { type: 'building'; } & BuildingOptions; declare type BuildingOptions = { color?: ColorRepresentation | undefined; opacity?: number | undefined; getElevation?: (feature: Feature) => number | number | undefined; getElevationBase?: (feature: Feature) => number | number | undefined; baseMaterial?: string | undefined; enableEdge?: boolean | undefined; gradient?: boolean | undefined; gradientColor?: ColorRepresentation | ColorRepresentation[] | undefined; gradientHeightMax?: number | undefined; gradientHeightMin?: number | undefined; lightColor?: ColorRepresentation | undefined; lightCircleTime?: number | undefined; lightBorderWidth?: number | undefined; lightMixRate?: number | undefined; material?: { top?: { color?: ColorRepresentation | undefined; opacity?: number | undefined; texture?: Texture | undefined; transparent?: boolean | undefined; }; wall?: { color?: ColorRepresentation | undefined; opacity?: number | undefined; texture?: Texture | undefined; transparent?: boolean | undefined; }; edge?: { color?: ColorRepresentation | undefined; opacity?: number | undefined; width?: number | undefined; }; }; }; declare type CircleMaterialType = 'ripple' | 'spread' | 'radar'; declare type CircleMeshOptions = { type: 'circle'; } & CircleOptions; declare type CircleOptions = { material?: Material | CircleMaterialType | undefined; color?: ColorRepresentation | undefined; opacity?: number | undefined; radius?: number | undefined; segments?: number | undefined; num?: number | undefined; speed?: number | undefined; followWidth?: number | undefined; getCircleRadius?: (feature: Feature) => number | number | undefined; }; declare type ControlsOptions = { type: any; } & (FirstPersonControlsOptions | AlongPathControlsOptions | AroundPointControlsOptions | undefined); /** * Given a destination object and optionally many source objects, * copy all properties from the source objects into the destination. * The last source object given overrides properties from previous * source objects. * * @param dest destination object * @param sources sources from which properties are pulled * @private */ export declare function extend<T extends object, U extends Array<object | null | undefined>>(dest: T, ...sources: U): T & UnionToIntersection<U[number]>; declare type FeatureData = { features: Feature[]; centroid: Position_2; geometries: SeparatedGeometries; }; declare type FenceMeshOptions = { type: 'fence'; } & FenceOptions; declare type FenceOptions = { material?: Material | string | undefined; color?: ColorRepresentation | undefined; opacity?: number | undefined; num?: number | undefined; speed?: number | undefined; height?: number | undefined; getElevation?: (feature: Feature) => number | number | undefined; }; declare type FirstPersonControlsOptions = { model?: Object3D; mixer?: AnimationMixer; idleAnimationAction?: AnimationAction; walkAnimationAction?: AnimationAction; runAnimationAction?: AnimationAction; runVelocity?: number; walkVelocity?: number; upVelocity?: number; rotateVeclocity?: number; scaleVeclocity?: number; fadeDuration?: number; modelRotateOffset?: boolean; modelRotateAxis?: Vector3; objectHeight?: number; cameraPitch?: number; cameraBearing?: number; cameraDistance?: number; cameraMaxDistance?: number; cameraMinDistance?: number; cameraMaxPitch?: number; cameraMinPitch?: number; cameraMaxBearing?: number; cameraMinBearing?: number; }; declare class HeatmapObject extends SceneObject { _options: HeatmapOptions; _meshObject: Mesh | undefined; _heatmap: any | undefined; _heatmapCanvas: HTMLElement | undefined; _boundVertices: Vector3[]; _dataVertices: Vector3[]; constructor(options: HeatmapOptions); updateSceneTransform(): void; buildHeatmap(): void; updateSceneTime(time: number, delta: number): void; addToScene(scene: ThreejsSceneLayer): this; removeFromScene(): this; } declare type HeatmapOptions = { id: string; data: Position[]; coordinates?: Position[]; width?: number; height?: number; radius?: number; blur?: number; gradient?: any; widthSegments?: number; heightSegments?: number; heightRatio?: number; depthTest?: boolean; opacity?: number; }; export declare interface IDisposable { /** * Releases all held resources */ dispose(): void; } declare class LabelObject extends SceneObject { _object: Object3D; _options: LabelOptions; _label: CSS2DObject | null; constructor(obejct: Object3D, options: LabelOptions); updateSceneTransform(): void; addToScene(scene: ThreejsSceneLayer): this; removeFromScene(): this; private _getAnchor; } declare type LabelOptions = { id: string; element?: HTMLElement; offset?: [number, number]; anchor?: Anchor; color?: string; scale?: number; draggable?: boolean; clickTolerance?: number; rotation?: number; rotationAlignment?: string; pitchAlignment?: string; occludedOpacity?: number; className?: string; }; declare type LineMeshOptions = { type: 'line'; } & LineOptions; declare type LineOptions = { lineWidth?: number | undefined; map?: { value: null; }; useMap?: number | undefined; alphaMap?: { value: null; }; useAlphaMap?: number | undefined; color?: ColorRepresentation | undefined; opacity?: number | undefined; resolution?: Vector2 | undefined; sizeAttenuation?: number | undefined; dashArray?: number | undefined; dashOffset?: number | undefined; dashRatio?: number | undefined; useDash?: number | undefined; visibility?: number | undefined; alphaTest?: number | undefined; repeat?: Vector2 | undefined; offset?: Vector2 | undefined; getLineWidth?: (feature: Feature) => number | number | undefined; }; declare class MarkerObject extends SceneObject { _options: MarkerOptions; _markers: CSS2DObject[]; constructor(options: MarkerOptions); updateSceneTransform(): void; addToScene(scene: ThreejsSceneLayer): this; removeFromScene(): this; } declare type MarkerOptions = { id: string; data: { element?: HTMLElement; position?: Position; point?: Vector3; }[]; }; declare type MeshBaseOptions = { id: string; data: string | GeoJSON_2 | Geometry[]; callback?: (object: Object3D, featureData: FeatureData) => void; }; declare class MeshObject extends SceneObject { _options: MeshOptions; _featrueData: FeatureData | undefined; _meshObject: Object3D | undefined; constructor(options: MeshOptions); updateSceneTransform(): void; updateSceneTime(time: number, delta: number): void; addToScene(scene: ThreejsSceneLayer): this; removeFromScene(): this; } declare type MeshOptions = MeshBaseOptions & (WaterMeshOptions | LineMeshOptions | PolygonMeshOptions | BuildingMeshOptions | FenceMeshOptions | CircleMeshOptions | TubeMeshOptions); export declare class Model extends SceneObject { _options: ModelOptions; _animGroup: Group | undefined; constructor(options: ModelOptions); addToScene(scene: ThreejsSceneLayer): this; removeFromScene(): this; private onLoadModel; private loadAssetContainer; updateSceneTransform(): void; setPosition(position: number[]): void; updateModelTransform(model: Group): void; } export declare type ModelOptions = { id: string; rootUrl?: string; fileName?: string | null | undefined; fileNames?: string | readonly string[] | null | undefined; position: number[]; offset?: number[]; rotation?: number[]; scale?: number; ifcWasmPath?: string; dracoLoaderPath?: string; ktx2LoaderPath?: string; callback?: (model: Group) => void; }; declare class PathObject extends SceneObject { private _object; private _options; private _path; private _time; constructor(object: Object3D, options: PathOptions); updateSceneTransform(): void; updateSceneTime(time: number, delta: number): void; } declare type PathOptions = { id: string; path?: Position[]; points?: Vector3[]; duration: number; callback?: () => void; }; declare type PolygonMeshOptions = { type: 'polygon'; } & PolygonOptions; declare type PolygonOptions = { color?: ColorRepresentation | undefined; opacity?: number | undefined; }; declare type Position = number[]; export declare class SceneObject extends Object3D { readonly isSceneObject: true; _parentObjectName: string; _parentObject: Object3D | undefined; _scene: ThreejsSceneLayer | undefined; onSceneUpdate: (event: SceneUpdateEvent) => void; onSceneRecenter: (event: SceneRecenterEvent) => void; constructor(); getOrAddParentObject(): Object3D; addToScene(scene: ThreejsSceneLayer): this; removeFromScene(): this; updateSceneTime(time: number, delta: number): void; updateSceneTransform(): void; remove(...object: Object3D[]): this; remove(): this; } export declare type SceneRecenterEvent = {}; export declare const SceneRecenterEventType = "scene-recenter"; export declare type SceneUpdateEvent = { time: number; delta: number; }; export declare const SceneUpdateEventType = "scene-update"; declare type SeparatedGeometries = { pointFeatures: { geometry: Point_2; __source: SourceInfo; }[]; lineFeatures: { geometry: LineString; __source: SourceInfo; }[]; polygonFeatures: { geometry: Polygon; __source: SourceInfo; }[]; polygonOutlineFeatures: { geometry: LineString; __source: SourceInfo; }[]; }; declare type SourceInfo = { object: Feature; index: number; }; export declare class ThreejsSceneLayer implements CustomLayerInterface { readonly id: string; readonly type: 'custom'; readonly slot?: string; readonly renderingMode: '3d'; private _helper; private _map?; private _refCenter; private _worldMatrix; private _worldMatrixInv; private _options; private _renderer; private _scene; private _sceneRoot; private _camera; private _startTime; private _lastTime; private _sceneControls; private static _GetDefaultOptions; constructor(options: ThreejsSceneLayerProps); onAdd: (map: Map_2, gl: WebGL2RenderingContext) => void; onRemove: (map: Map_2, gl: WebGL2RenderingContext) => void; render: (gl: WebGL2RenderingContext, matrix: number[]) => void; private _update; addEventListener(type: any, listener: any): void; removeEventListener(type: any, listener: any): void; dispatchEvent(event: any): void; update(): void; getSceneRoot(): Group; getRenderer(): ThreejsSceneRenderer; getWebGLRenderer(): WebGLRenderer; getCamera(): PerspectiveCamera; getScene(): Scene; getMap(): Map_2; getRefCenter(): LngLatLike; setRefCenter(center: LngLatLike): void; toScenePosition(position: LngLatLike | Position, altitude?: number): Vector3; toMapPosition(position: Vector3): Position; toMercatorCoordinate(position: Vector3): MercatorCoordinate; setEnvTexture(envTexture: string): void; setEnvIntensity(intensity: number): void; compileAsync(model: Object3D): Promise<Object3D>; findObjectByName(name: string, root?: Object3D): Object3D | undefined; intersectObjects(point: Point, objects?: Object3D[] | Object3D | null): Intersection<Object3D<Object3DEventMap>>[]; setControls(controlsOptions: ControlsOptions): any; addTileset(tilesetOptions: TilesetOptions): Tileset; addModel(modelOptions: ModelOptions): Model; addMesh(meshOptions: MeshOptions): MeshObject; addLabel(object: Object3D, options: LabelOptions): LabelObject; addPath(object: Object3D, options: PathOptions): PathObject; addMarker(options: MarkerOptions): MarkerObject; addHeatmap(options: HeatmapOptions): HeatmapObject; } export declare type ThreejsSceneLayerProps = { id: string; slot?: string; refCenter?: LngLatLike; envTexture?: string; envIntensity?: number; createLight?: boolean; }; declare class ThreejsSceneRenderer { private _map; private _renderer; private _labelRenderer; constructor(map: Map_2, gl: WebGL2RenderingContext); getRenderer(): WebGLRenderer; render(scene: any, camera: any): void; } export declare class Tileset extends SceneObject { group: Group | undefined; tiles: TilesRendererEx | undefined; options: TilesetOptions; static getColorModes(): Readonly<{ NONE: 0; SCREEN_ERROR: 1; GEOMETRIC_ERROR: 2; DISTANCE: 3; DEPTH: 4; RELATIVE_DEPTH: 5; IS_LEAF: 6; RANDOM_COLOR: 7; RANDOM_NODE_COLOR: 8; CUSTOM_COLOR: 9; LOAD_ORDER: 10; }>; private centerLngLat; constructor(options: TilesetOptions); addToScene(scene: ThreejsSceneLayer): this; removeFromScene(): this; updateSceneTime(time: number, delta: number): void; getCenterLngLat(): LngLatLike; updateTilesetTransform(): void; setDebugParams(debugParams: TilesetDebugParams): void; setDisplayParams(displayParams: TilesetDisplayParams): void; } export declare type TilesetDebugParams = { enableDebug: boolean; displayBoxBounds: boolean; displaySphereBounds: boolean; displayRegionBounds: boolean; colorMode: number; }; export declare type TilesetDisplayParams = { errorTarget: number; displayActiveTiles: boolean; autoDisableRendererCulling: boolean; maxDepth: number; optimizeRaycast: boolean; }; export declare type TilesetOptions = { id: string; url: string; dracoLoaderPath?: string; ktx2LoaderPath?: string; meshoptDecoder?: any; debug?: TilesetDebugParams; display?: TilesetDisplayParams; downloadMaxJobs?: number; parseMaxJobs?: number; isGaussianSplatting?: boolean; maxGaussianSplatingCount?: number; onLoadTileset?: (tileset: Tileset) => void; }; declare class TilesRendererEx extends TilesRenderer { dynamicScreenSpaceError: boolean; calculateTileViewError(tile: any, target: any): void; private _calculateDynamicScreenSpaceDistance; private _intersectsFrustum; } declare type TubeMeshOptions = { type: 'tube'; } & TubeOptions; declare type TubeOptions = { material?: MeshBasicMaterialParameters | undefined; speed?: number | undefined; tubeRadius?: number | undefined; tubularSegments?: number | undefined; radialSegments?: number | undefined; getTubeRadius?: (feature: Feature) => number | number | undefined; }; declare type WaterMeshOptions = { type: 'water'; } & WaterOptions; declare type WaterOptions = { color?: ColorRepresentation | undefined; textureWidth?: number | undefined; textureHeight?: number | undefined; clipBias?: number | undefined; flowDirection?: Vector2 | undefined; flowSpeed?: number | undefined; reflectivity?: number | undefined; scale?: number | undefined; shader?: object | undefined; flowMap?: Texture | undefined; normalMap0?: Texture | undefined; normalMap1?: Texture | undefined; up?: Vector3 | undefined; alpha?: number | undefined; waterColor?: ColorRepresentation | undefined; eye?: Vector3 | undefined; distortionScale?: number | undefined; side?: Side | undefined; fog?: boolean | undefined; sunColor?: ColorRepresentation | undefined; sunDirection?: Vector3 | undefined; waterNormals?: Texture | undefined; time?: number | undefined; }; declare interface WorkerInfo { workerPromise: Promise<Worker>; idle: boolean; timeoutId?: ReturnType<typeof setTimeout>; actionId: string; cancelAction: boolean; } /** * Helper class to push actions to a pool of workers. */ export declare class WorkerPool implements IDisposable { protected _workerInfos: Array<WorkerInfo>; protected _pendingActions: Map<string, (worker: Worker, onComplete: () => void) => void>; protected _actionIdCounter: number; /** * Constructor * @param workers Array of workers to use for actions */ constructor(workers: Array<Worker>); /** * Terminates all workers and clears any pending actions. */ dispose(): void; /** * Pushes an action to the worker pool. If all the workers are active, the action will be * pended until a worker has completed its action. * @param action The action to perform. Call onComplete when the action is complete. * @returns A unique actionId that can be used to cancel the action. */ push(action: (worker: Worker, onComplete: () => void) => void): string; /** * Cancels an action by its actionId. * @param actionId The unique actionId returned by the push method. */ cancel(actionId: string): void; /** * Generates a unique actionId. * @returns A unique actionId. */ protected _generateActionId(): string; /** * Executes an action on an idle worker. * @param actionId The unique actionId for the action. * @param action The action to perform. * @returns True if an idle worker was found and the action was executed, false otherwise. */ protected _executeOnIdleWorker(actionId: string, action: (worker: Worker, onComplete: () => void) => void): boolean; /** * Executes an action on a worker. * @param workerInfo The worker info. * @param actionId The unique actionId for the action. * @param action The action to perform. */ protected _execute(workerInfo: WorkerInfo, actionId: string, action: (worker: Worker, onComplete: () => void) => void): void; } export { } declare module 'three' { export interface Object3D { userData: { structuralMetadata?: StructuralMetadata; }; } } declare module 'three' { export interface Object3D { userData: { meshFeatures?: MeshFeatures; }; } }