function getTileBoundingVolume(
  implicitTileset,
  implicitCoordinates,
  childIndex,
  parentIsPlaceholderTile,
  parentTile,
  tileBounds,
) {
  let boundingVolume;

  if (
    !defined(tileBounds) ||
    !defined(tileBounds.boundingVolume) ||
    (!canUpdateHeights(tileBounds.boundingVolume, tileBounds) &&
      canUpdateHeights(implicitTileset.boundingVolume, tileBounds))
  ) {
    boundingVolume = deriveBoundingVolume(
      implicitTileset,
      implicitCoordinates,
      childIndex,
      parentIsPlaceholderTile ?? false,
      parentTile,
    );
  } else {
    boundingVolume = tileBounds.boundingVolume;
  }

  // The TILE_MINIMUM_HEIGHT and TILE_MAXIMUM_HEIGHT metadata semantics
  // can be used to tighten the bounding volume
  updateHeights(boundingVolume, tileBounds);

  return boundingVolume;
}
Gets the tile's bounding volume, which may be specified via
metadata semantics such as TILE_BOUNDING_BOX or implicitly
derived from the implicit root tile's bounding volume.
<p>
Priority of bounding volume types:
<ol>
<li>Explicit min/max height
  <ol>
    <li>With explicit region</li>
    <li>With implicit S2</li>
    <li>With implicit region</li>
  </ol>
</li>
<li>Explicit box</li>
<li>Explicit region</li>
<li>Explicit sphere</li>
<li>Implicit S2</li>
<li>Implicit box</li>
<li>Implicit region</li>
</ol>
</p>

@param {ImplicitTileset} implicitTileset The implicit tileset struct which holds the root bounding volume
@param {ImplicitTileCoordinates} implicitCoordinates The coordinates of the child tile
@param {number} childIndex The morton index of the child tile relative to its parent
@param {boolean} parentIsPlaceholderTile True if parentTile is a placeholder tile. This is true for the root of each subtree.
@param {Cesium3DTile} parentTile The parent of the new child tile
@param {object} [tileBounds] The tile bounds
@returns {object} An object containing the JSON for a bounding volume
@private