123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- import Cartesian3 from "../Core/Cartesian3.js";
- import Check from "../Core/Check.js";
- import Cesium3DTileOptimizationHint from "./Cesium3DTileOptimizationHint.js";
- import TileBoundingRegion from "./TileBoundingRegion.js";
- import TileOrientedBoundingBox from "./TileOrientedBoundingBox.js";
- var Cesium3DTileOptimizations = {};
- var scratchAxis = new Cartesian3();
- Cesium3DTileOptimizations.checkChildrenWithinParent = function (tile) {
-
- Check.typeOf.object("tile", tile);
-
- var children = tile.children;
- var length = children.length;
-
- var boundingVolume = tile.boundingVolume;
- if (
- boundingVolume instanceof TileOrientedBoundingBox ||
- boundingVolume instanceof TileBoundingRegion
- ) {
- var orientedBoundingBox = boundingVolume._orientedBoundingBox;
- tile._optimChildrenWithinParent =
- Cesium3DTileOptimizationHint.USE_OPTIMIZATION;
- for (var i = 0; i < length; ++i) {
- var child = children[i];
-
- var childBoundingVolume = child.boundingVolume;
- if (
- !(
- childBoundingVolume instanceof TileOrientedBoundingBox ||
- childBoundingVolume instanceof TileBoundingRegion
- )
- ) {
-
- tile._optimChildrenWithinParent =
- Cesium3DTileOptimizationHint.SKIP_OPTIMIZATION;
- break;
- }
- var childOrientedBoundingBox = childBoundingVolume._orientedBoundingBox;
-
- var axis = Cartesian3.subtract(
- childOrientedBoundingBox.center,
- orientedBoundingBox.center,
- scratchAxis
- );
- var axisLength = Cartesian3.magnitude(axis);
- Cartesian3.divideByScalar(axis, axisLength, axis);
-
-
- var proj1 =
- Math.abs(orientedBoundingBox.halfAxes[0] * axis.x) +
- Math.abs(orientedBoundingBox.halfAxes[1] * axis.y) +
- Math.abs(orientedBoundingBox.halfAxes[2] * axis.z) +
- Math.abs(orientedBoundingBox.halfAxes[3] * axis.x) +
- Math.abs(orientedBoundingBox.halfAxes[4] * axis.y) +
- Math.abs(orientedBoundingBox.halfAxes[5] * axis.z) +
- Math.abs(orientedBoundingBox.halfAxes[6] * axis.x) +
- Math.abs(orientedBoundingBox.halfAxes[7] * axis.y) +
- Math.abs(orientedBoundingBox.halfAxes[8] * axis.z);
-
-
- var proj2 =
- Math.abs(childOrientedBoundingBox.halfAxes[0] * axis.x) +
- Math.abs(childOrientedBoundingBox.halfAxes[1] * axis.y) +
- Math.abs(childOrientedBoundingBox.halfAxes[2] * axis.z) +
- Math.abs(childOrientedBoundingBox.halfAxes[3] * axis.x) +
- Math.abs(childOrientedBoundingBox.halfAxes[4] * axis.y) +
- Math.abs(childOrientedBoundingBox.halfAxes[5] * axis.z) +
- Math.abs(childOrientedBoundingBox.halfAxes[6] * axis.x) +
- Math.abs(childOrientedBoundingBox.halfAxes[7] * axis.y) +
- Math.abs(childOrientedBoundingBox.halfAxes[8] * axis.z);
-
- if (proj1 <= proj2 + axisLength) {
- tile._optimChildrenWithinParent =
- Cesium3DTileOptimizationHint.SKIP_OPTIMIZATION;
- break;
- }
- }
- }
- return (
- tile._optimChildrenWithinParent ===
- Cesium3DTileOptimizationHint.USE_OPTIMIZATION
- );
- };
- export default Cesium3DTileOptimizations;
|