@pnext/three-loader
Version:
Potree loader for ThreeJS, converted and adapted to Typescript.
83 lines (64 loc) • 1.98 kB
text/typescript
import { Box3, BufferGeometry, EventDispatcher, Object3D, Points, Sphere } from 'three';
import { IPointCloudGeometryNode, IPointCloudTreeNode } from './types';
export class PointCloudOctreeNode extends EventDispatcher implements IPointCloudTreeNode {
geometryNode: IPointCloudGeometryNode;
sceneNode: Points;
pcIndex: number | undefined = undefined;
boundingBoxNode: Object3D | null = null;
readonly children: (IPointCloudTreeNode | null)[];
readonly loaded = true;
readonly isTreeNode: boolean = true;
readonly isGeometryNode: boolean = false;
constructor(geometryNode: IPointCloudGeometryNode, sceneNode: Points) {
super();
this.geometryNode = geometryNode;
this.sceneNode = sceneNode;
this.children = geometryNode.children.slice();
}
dispose(): void {
this.geometryNode.dispose();
}
disposeSceneNode(): void {
const node = this.sceneNode;
if (node.geometry instanceof BufferGeometry) {
const attributes = node.geometry.attributes;
// tslint:disable-next-line:forin
for (const key in attributes) {
delete (attributes[key] as any).array;
delete attributes[key];
}
node.geometry.dispose();
node.geometry = undefined as any;
}
}
traverse(cb: (node: IPointCloudTreeNode) => void, includeSelf?: boolean): void {
this.geometryNode.traverse(cb, includeSelf);
}
get id() {
return this.geometryNode.id;
}
get name() {
return this.geometryNode.name;
}
get level(): number {
return this.geometryNode.level;
}
get isLeafNode(): boolean {
return this.geometryNode.isLeafNode;
}
get numPoints(): number {
return this.geometryNode.numPoints;
}
get index() {
return this.geometryNode.index;
}
get boundingSphere(): Sphere {
return this.geometryNode.boundingSphere;
}
get boundingBox(): Box3 {
return this.geometryNode.boundingBox;
}
get spacing() {
return this.geometryNode.spacing;
}
}