import Check from "../Core/Check.js";
import defined from "../Core/defined.js";
/**
* Parse the bounding volume-related semantics such as
* TILE_BOUNDING_BOX
and CONTENT_BOUNDING_REGION
from
* implicit tile metadata. Results are returned as a JSON object for use when
* transcoding tiles (see {@link Implicit3DTileContent}).
*
* Bounding volumes are checked in the order box, region, then sphere. Only * the first valid bounding volume is returned. *
* * @see {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata/Semantics|3D Metadata Semantic Reference} for the various bounding volumes and minimum/maximum heights. * * @param {TileMetadata} tileMetadata The metadata object for looking up values by semantic. In practice, this will typically be a {@link ImplicitMetadataView} * @return {object} An object containing atile
property and a content
property. These contain the bounding volume, and any minimum or maximum height.
*
* @private
* @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy.
*/
function parseBoundingVolumeSemantics(tileMetadata) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.object("tileMetadata", tileMetadata);
//>>includeEnd('debug');
return {
tile: {
boundingVolume: parseBoundingVolume("TILE", tileMetadata),
minimumHeight: parseMinimumHeight("TILE", tileMetadata),
maximumHeight: parseMaximumHeight("TILE", tileMetadata),
},
content: {
boundingVolume: parseBoundingVolume("CONTENT", tileMetadata),
minimumHeight: parseMinimumHeight("CONTENT", tileMetadata),
maximumHeight: parseMaximumHeight("CONTENT", tileMetadata),
},
};
}
/**
* Parse the bounding volume from a tile metadata. If the metadata specify
* multiple bounding volumes, only the first one is returned. Bounding volumes
* are checked in the order box, region, then sphere.
*
* This handles both tile and content bounding volumes, as the only difference
* is the prefix. e.g. TILE_BOUNDING_BOX
and
* CONTENT_BOUNDING_BOX
have the same memory layout.
*
* @param {string} prefix Either "TILE" or "CONTENT"
* @param {TileMetadata} tileMetadata The tileMetadata for looking up values
* @return {object} An object representing the JSON description of the tile metadata
* @private
*/
function parseBoundingVolume(prefix, tileMetadata) {
const boundingBoxSemantic = `${prefix}_BOUNDING_BOX`;
const boundingBox = tileMetadata.getPropertyBySemantic(boundingBoxSemantic);
if (defined(boundingBox)) {
return {
box: boundingBox,
};
}
const boundingRegionSemantic = `${prefix}_BOUNDING_REGION`;
const boundingRegion = tileMetadata.getPropertyBySemantic(
boundingRegionSemantic
);
if (defined(boundingRegion)) {
return {
region: boundingRegion,
};
}
const boundingSphereSemantic = `${prefix}_BOUNDING_SPHERE`;
const boundingSphere = tileMetadata.getPropertyBySemantic(
boundingSphereSemantic
);
if (defined(boundingSphere)) {
// ARRAY with 4 elements is automatically converted to a Cartesian4
return {
sphere: boundingSphere,
};
}
return undefined;
}
/**
* Parse the minimum height from tile metadata. This is used for making tighter
* quadtree bounds for implicit tiling. This works for both
* TILE_MINIMUM_HEIGHT
and CONTENT_MINIMUM_HEIGHT
*
* @param {string} prefix Either "TILE" or "CONTENT"
* @param {TileMetadata} tileMetadata The tileMetadata for looking up values
* @return {number} The minimum height
* @private
*/
function parseMinimumHeight(prefix, tileMetadata) {
const minimumHeightSemantic = `${prefix}_MINIMUM_HEIGHT`;
return tileMetadata.getPropertyBySemantic(minimumHeightSemantic);
}
/**
* Parse the maximum height from tile metadata. This is used for making tighter
* quadtree bounds for implicit tiling. This works for both
* TILE_MAXIMUM_HEIGHT
and CONTENT_MAXIMUM_HEIGHT
*
* @param {string} prefix Either "TILE" or "CONTENT"
* @param {TileMetadata} tileMetadata The tileMetadata for looking up values
* @return {number} The maximum height
* @private
*/
function parseMaximumHeight(prefix, tileMetadata) {
const maximumHeightSemantic = `${prefix}_MAXIMUM_HEIGHT`;
return tileMetadata.getPropertyBySemantic(maximumHeightSemantic);
}
export default parseBoundingVolumeSemantics;