@giro3d/giro3d
Version:
A JS/WebGL framework for 3D geospatial data visualization
335 lines • 12.3 kB
TypeScript
import type { Box3 } from 'three';
import { Vector2 } from 'three';
import type Context from '../core/Context';
import type ColorLayer from '../core/layer/ColorLayer';
import type HasLayers from '../core/layer/HasLayers';
import type Layer from '../core/layer/Layer';
import type { GetMemoryUsageContext } from '../core/MemoryUsage';
import type PickOptions from '../core/picking/PickOptions';
import type PickResult from '../core/picking/PickResult';
import type { IntersectingVolume } from '../renderer/IntersectingVolume';
import type { Classification } from '../renderer/PointCloudMaterial';
import type { EntityPreprocessOptions, EntityUserData } from './Entity';
import type { Entity3DEventMap, Entity3DOptions } from './Entity3D';
import ColorMap from '../core/ColorMap';
import { type PointCloudAttribute, type PointCloudSource } from '../sources/PointCloudSource';
import Entity3D from './Entity3D';
export declare class UnsupportedAttributeError extends Error {
constructor(attribute: string);
}
export interface ActiveAttribute {
readonly attribute: PointCloudAttribute;
weight: number;
/** @internal */
readonly geometrySlot: 0 | 1 | 2;
}
export interface ActiveAttributeDefinition {
name: string;
weight: number;
}
/**
* Constructor options for the {@link PointCloud} entity.
*/
export interface PointCloudOptions extends Entity3DOptions {
/**
* The point cloud source.
*/
source: PointCloudSource;
/**
* The delay, in milliseconds, before unused data is freed from memory.
* The longer the delay, the longer a node's data will be kept in memory, making it possible
* to display this node immediately when it becomes visible.
*
* Conversely, reducing this value will free memory more often, leading to a reduced memory
* footprint.
*
* @defaultValue 5000
*/
cleanupDelay?: number;
}
/**
* Displays point clouds coming from a {@link PointCloudSource}.
*
* This entity supports two coloring modes: `'attribute'` and `'layer'`. In coloring mode `'attribute'`,
* points are colorized from the selected attributes (e.g color, intensity, classification...).
*
* ```ts
* pointCloud.setColoringMode('attribute');
* pointCloud.setActiveAttribute('Intensity');
* ```
*
* In coloring mode `'layer'`, points are colorized using a {@link ColorLayer} that must be set with
* {@link setColorLayer}.
*
* Note: the layer does not have to be in the same coordinate system as the point cloud.
*
* ```ts
* const colorLayer = new ColorLayer(...);
* pointCloud.setColorLayer(colorLayer);
* pointCloud.setColoringMode('layer');
* ```
*/
declare class PointCloud<TUserData extends EntityUserData = EntityUserData> extends Entity3D<Entity3DEventMap, TUserData> implements HasLayers {
/** Readonly flag to indicate that this object is a PointCloud instance. */
readonly isPointCloud: true;
readonly type: "PointCloud";
readonly hasLayers: true;
private readonly _stateMachine;
private readonly _listeners;
private readonly _tileVolumeRoot;
private readonly _pointsRoot;
private readonly _cleanupPollingInterval;
private readonly _classificationsPerAttribute;
private readonly _colorMapPerAttribute;
/** The source of this entity. */
readonly source: PointCloudSource;
readonly intersectingVolumes: IntersectingVolume[];
private _colorLayer;
private _depthTest;
private _subdivisionThreshold;
private _shaderMode;
private _activeAttributes;
private _pointSize;
private _cleanupDelay;
private _showVolume;
private _decimation;
private _showPoints;
private _showNodeDataVolumes;
private _disposed;
private _pointBudget;
private _elevationColorMap;
private _colorimetry;
private _rootNode;
private _metadata;
private _volumeHelper;
constructor(options: PointCloudOptions);
private getNodeLoadingPriority;
/**
* Enables or disables depth testing for point cloud meshes.
*
* @defaultValue true
*/
get depthTest(): boolean;
set depthTest(v: boolean);
get progress(): number;
get loading(): boolean;
get layerCount(): number;
private updateMaterials;
/**
* Gets or sets the brightness of this point cloud.
*/
get brightness(): number;
set brightness(v: number);
/**
* Gets or sets the contrast of this point cloud.
*/
get contrast(): number;
set contrast(v: number);
/**
* Gets or sets the saturation of this point cloud.
*/
get saturation(): number;
set saturation(v: number);
/**
* The colormap used to colorize cloud by elevation.
*/
get elevationColorMap(): ColorMap;
set elevationColorMap(c: ColorMap | null);
/**
* Gets the colormap used for coloring an attribute.
* @param attributeName - The name of the attribute
*/
getAttributeColorMap(attributeName: string): ColorMap;
/**
* Sets the colormap used for coloring an attribute.
* @param attributeName - The name of the attribute
* @param colorMap - The colormap to use
*/
setAttributeColorMap(attributeName: string, colorMap: ColorMap | null): void;
private updateUniforms;
/**
* The global factor that drives LOD computation. The lower this value, the
* sooner a node is subdivided. Note: changing this scale to a value less than 1 can drastically
* increase the number of nodes displayed in the scene, and can even lead to browser crashes.
*
* @defaultValue 1
*/
get subdivisionThreshold(): number;
set subdivisionThreshold(v: number);
/**
* Returns the list of supported attributes in the source.
*/
getSupportedAttributes(): PointCloudAttribute[];
/**
* The point size, in pixels.
*
* Note: a value of zero triggers automatic size computation.
*
* @defaultValue 0
*/
get pointSize(): number;
set pointSize(size: number);
/**
* Gets the active attributes.
*
* Note: to set the active attributes, use {@link setActiveAttribute} or {@link setActiveAttributes}.
*/
getActiveAttributes(): ReadonlyArray<Readonly<ActiveAttribute>>;
/**
* Sets the coloring mode of the entity:
* - `layer`: the point cloud is colorized from a color layer previously set with {@link setColorLayer}.
* - `attribute`: the point cloud is colorized from the source attributes (e.g color, classification...)
* previously set with {@link setActiveAttribute}.
*/
setColoringMode(mode: 'layer' | 'attribute'): void;
private updateColoringFromAttribute;
/**
* Sets the active attribute.
*
* Note: to enable coloring from the attribute, use {@link setColoringMode} with mode `'attribute'`.
*
* Note: To get the supported attributes, use {@link getSupportedAttributes}.
*
* @param attributeName - The active attribute.
*
* @throws {@link UnsupportedAttributeError} If the attribute is not supported by the source.
*/
setActiveAttribute(attributeName: string): void;
/**
* Sets the active attributes.
*
* Note: to enable coloring from the attributes, use {@link setColoringMode} with mode `'attribute'`.
*
* Note: To get the supported attributes, use {@link getSupportedAttributes}.
*
* @param attributes - List of attributes to set activate, with their respective weights. There cannot be more than 3;
*
* @throws {@link UnsupportedAttributeError} If the attribute is not supported by the source.
*/
setActiveAttributes(attributes: ActiveAttributeDefinition[]): void;
/**
* Toggles the visibility of the point cloud volume.
*/
get showVolume(): boolean;
set showVolume(show: boolean);
/**
* The amount of decimation to apply to currently displayed point meshes. A value of `1` means
* that all points are displayed. A value of `N` means that we display only 1 every Nth point.
*
* Note: this has no effect on the quantity of data that point cloud sources must fetch, as it
* is a purely graphical setting. This does, however, improve rendering performance by reducing
* the number of points to draw on the screen.
*/
get decimation(): number;
set decimation(v: number);
/**
* The delay, in milliseconds, to remove unused data for each node.
* Must be a positive integer greater or equal to zero.
*
* Setting it to zero will cleanup immediately after a node becomes invisible.
*/
get cleanupDelay(): number;
set cleanupDelay(delay: number);
/**
* Enables or disables the display of the point cloud.
* @defaultValue true
*/
get showPoints(): boolean;
set showPoints(v: boolean);
/**
* Toggles the visibility of invidividual node volumes.
*/
get showNodeVolumes(): boolean;
set showNodeVolumes(show: boolean);
/**
* Toggles the visibility of individual node content volumes.
*
* Note: octree-based point clouds have cube-shaped node volumes, whereas
* their node data volume is a tight bounding box around the actual points of the node.
*/
get showNodeDataVolumes(): boolean;
set showNodeDataVolumes(show: boolean);
/**
* Gets the classification array. The array contains 256 entries that can be updated,
* but the array itself may not be resized.
*
* @param attributeName - Name of the attribute
* @defaultValue `ASPRS_CLASSIFICATIONS`
*/
getAttributeClassifications(attributeName: string): Readonly<Classification[]>;
/**
* Gets the total number of points in this point cloud, or `undefined`
* if this value is not known.
*
* Note: the entity must be initialized to be able to access this property.
*/
get pointCount(): number | undefined;
/**
* Gets the number of points currently displayed.
*/
get displayedPointCount(): number;
/**
* Gets or sets the point budget. A non-null point budget will automatically compute the
* {@link decimation} property every frame, based on the number of currently displayed points.
* A value of `null` removes the point budget and stop automatic decimation computation.
*/
get pointBudget(): number | null;
set pointBudget(v: number | null);
getMemoryUsage(context: GetMemoryUsageContext): void;
updateOpacity(): void;
/**
* Forces the point cloud to reload all data.
*/
clear(): void;
getBoundingBox(): Box3 | null;
protected preprocess(_opts: EntityPreprocessOptions): Promise<void>;
private deleteNodeHierarchy;
preUpdate(context: Context): unknown[] | null;
private updateDecimation;
postUpdate(context: Context): void;
/**
* Disposes this entity and deletes unmanaged graphical resources.
*/
dispose(): void;
pick(canvasCoords: Vector2, options?: PickOptions): PickResult[];
/**
* Sets the color layer to colorize the points.
*
* Note: to enable coloring from the color layer, use {@link setColoringMode} with mode `'layer'`.
*
* @param colorLayer - The color layer.
*/
setColorLayer(colorLayer: ColorLayer): void;
removeColorLayer(): void;
forEachLayer(callback: (layer: Layer) => void): void;
getLayers(predicate?: (arg0: Layer) => boolean): Layer[];
private updateMinMaxDistance;
private traversePointCloudMaterials;
/**
* Creates a volume helper for the entire entity.
*/
private createGlobalVolumeHelper;
private getOrCreateAttributeClassifications;
private cleanup;
private testNodeSSE;
private updateGeometry;
private createGeometry;
private createMaterial;
private createMesh;
private updateMaterial;
private cleanupNodeIfNecessary;
private disposeMesh;
private traversePointCloudMeshes;
/**
* Loads data from the source for the given node.
*/
private loadNodeData;
private showNode;
private getNodeInfo;
private removeDataVolumeHelper;
private removeVolumeHelper;
private forEachNodeInfo;
private updateHelpers;
}
export default PointCloud;
//# sourceMappingURL=PointCloud.d.ts.map