// This file was generated by generate-classes.
// DO NOT EDIT THIS FILE!
#pragma once

#include "Cesium3DTiles/Library.h"

#include <CesiumUtility/ExtensibleObject.h>

#include <vector>

namespace Cesium3DTiles {
/**
 * @brief A bounding volume that encloses a tile or its content. At least one
 * bounding volume property is required. Bounding volumes include `box`,
 * `region`, or `sphere`.
 */
struct CESIUM3DTILES_API BoundingVolume final
    : public CesiumUtility::ExtensibleObject {
  static inline constexpr const char* TypeName = "BoundingVolume";

  /**
   * @brief An array of 12 numbers that define an oriented bounding box. The
   * first three elements define the x, y, and z values for the center of the
   * box. The next three elements (with indices 3, 4, and 5) define the x axis
   * direction and half-length. The next three elements (indices 6, 7, and 8)
   * define the y axis direction and half-length. The last three elements
   * (indices 9, 10, and 11) define the z axis direction and half-length.
   */
  std::vector<double> box;

  /**
   * @brief An array of six numbers that define a bounding geographic region in
   * EPSG:4979 coordinates with the order [west, south, east, north, minimum
   * height, maximum height]. Longitudes and latitudes are in radians. The range
   * for latitudes is [-PI/2,PI/2]. The range for longitudes is [-PI,PI]. The
   * value that is given as the 'south' of the region shall not be larger than
   * the value for the 'north' of the region. The heights are in meters above
   * (or below) the WGS84 ellipsoid. The 'minimum height' shall not be larger
   * than the 'maximum height'.
   */
  std::vector<double> region;

  /**
   * @brief An array of four numbers that define a bounding sphere. The first
   * three elements define the x, y, and z values for the center of the sphere.
   * The last element (with index 3) defines the radius in meters. The radius
   * shall not be negative.
   */
  std::vector<double> sphere;

  /**
   * @brief Calculates the size in bytes of this object, including the contents
   * of all collections, pointers, and strings. This will NOT include the size
   * of any extensions attached to the object. Calling this method may be slow
   * as it requires traversing the object's entire structure.
   */
  int64_t getSizeBytes() const {
    int64_t accum = 0;
    accum += int64_t(sizeof(BoundingVolume));
    accum += CesiumUtility::ExtensibleObject::getSizeBytes() -
             int64_t(sizeof(CesiumUtility::ExtensibleObject));
    accum += int64_t(sizeof(double) * this->box.capacity());
    accum += int64_t(sizeof(double) * this->region.capacity());
    accum += int64_t(sizeof(double) * this->sphere.capacity());
    return accum;
  }
};
} // namespace Cesium3DTiles
