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

#include "Library.h"

#include <CesiumJsonReader/ExtensibleObject.h>
#include <optional>
#include <string>
#include <unordered_map>
#include <vector>

#define CODEGEN_API CESIUM3DTILES_API

namespace Cesium3DTiles {

struct CODEGEN_API Asset : public CesiumJsonReader::ExtensibleObject {
  static inline constexpr const char* TypeName = "Asset";

  Asset() : CesiumJsonReader::ExtensibleObject() {}

  std::string version;

  std::optional<std::string> tilesetVersion;
};

struct CODEGEN_API BoundingVolume : public CesiumJsonReader::ExtensibleObject {
  static inline constexpr const char* TypeName = "BoundingVolume";

  BoundingVolume() : CesiumJsonReader::ExtensibleObject() {}

  std::optional<std::vector<double>> box;

  std::optional<std::vector<double>> region;

  std::optional<std::vector<double>> sphere;
};

struct CODEGEN_API Content : public CesiumJsonReader::ExtensibleObject {
  static inline constexpr const char* TypeName = "Content";

  Content() : CesiumJsonReader::ExtensibleObject() {}

  std::optional<BoundingVolume> boundingVolume;

  std::string uri;
};

struct CODEGEN_API Tile : public CesiumJsonReader::ExtensibleObject {
  static inline constexpr const char* TypeName = "Tile";

  enum class Refine { ADD, REPLACE };

  Tile() : CesiumJsonReader::ExtensibleObject() {}

  BoundingVolume boundingVolume;

  std::optional<BoundingVolume> viewerRequestVolume;

  double geometricError;

  std::optional<Refine> refine;

  std::vector<double> transform =
      {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};

  std::optional<Content> content;

  std::optional<std::vector<Tile>> children;
};

struct CODEGEN_API TilesetProperties
    : public CesiumJsonReader::ExtensibleObject {
  static inline constexpr const char* TypeName = "TilesetProperties";

  TilesetProperties() : CesiumJsonReader::ExtensibleObject() {}

  double maximum;

  double minimum;
};

struct CODEGEN_API Tileset : public CesiumJsonReader::ExtensibleObject {
  static inline constexpr const char* TypeName = "Tileset";

  struct CODEGEN_API Properties : public CesiumJsonReader::ExtensibleObject {
    static inline constexpr const char* TypeName = "Properties";

    Properties() : CesiumJsonReader::ExtensibleObject() {}

    std::unordered_map<std::string, TilesetProperties> additionalProperties;
  };

  Tileset() : CesiumJsonReader::ExtensibleObject() {}

  Asset asset;

  std::optional<Properties> properties;

  double geometricError;

  Tile root;

  std::optional<std::vector<std::string>> extensionsUsed;

  std::optional<std::vector<std::string>> extensionsRequired;
};

} // namespace Cesium3DTiles

#undef CODEGEN_API
