UNPKG

@giro3d/giro3d

Version:

A JS/WebGL framework for 3D geospatial data visualization

76 lines (57 loc) 2.01 kB
/* * Copyright (c) 2015-2018, IGN France. * Copyright (c) 2018-2026, Giro3D team. * SPDX-License-Identifier: MIT */ import { Box3, type Matrix4, type Sphere, type Vector3 } from 'three'; import { OBB } from 'three/examples/jsm/Addons.js'; import type ElevationRange from '../../core/ElevationRange'; const tmpBox = new Box3(); /** * Provides an approximated volume taken by a {@link TileGeometry} * used for culling and LOD computation. */ export default abstract class TileVolume { protected _localBox: Box3 | null = null; public get localBox(): Readonly<Box3> { if (!this._localBox) { this._localBox = this.computeLocalBox(); } return this._localBox; } public abstract getWorldSpaceCorners(matrix: Matrix4): Vector3[]; protected abstract computeLocalBox(): Box3; public abstract setElevationRange(range: ElevationRange): void; /** * Returns the local size of this volume. */ public getLocalSize(target: Vector3): Vector3 { return this.localBox.getSize(target); } /** * Returns the local bounding box. */ public getLocalBoundingBox(target?: Box3): Box3 { const result = target ?? new Box3(); result.copy(this.localBox); return result; } /** * Gets the world bounding box, taking into account world transformation. */ public getWorldSpaceBoundingBox(target: Box3, matrix: Matrix4): Box3 { const result = target ?? new Box3(); result.copy(this.localBox); result.applyMatrix4(matrix); return result; } /** * Gets the world-space oriented bounding box of this tile volume. */ public getOBB(matrix: Matrix4): OBB { return new OBB().fromBox3(this.getWorldSpaceBoundingBox(new Box3(), matrix)); } public getWorldSpaceBoundingSphere(target: Sphere, matrix: Matrix4): Sphere { return this.getWorldSpaceBoundingBox(tmpBox, matrix).getBoundingSphere(target); } }