mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-08 22:08:29 -05:00
346 lines
11 KiB
C++
346 lines
11 KiB
C++
#pragma once
|
|
|
|
#include "Json/JsonExtension.h"
|
|
#include <array>
|
|
#include <nlohmann/json.hpp>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace gltf
|
|
{
|
|
class JsonAsset
|
|
{
|
|
public:
|
|
std::string version;
|
|
std::optional<std::string> generator;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonAsset, version, generator);
|
|
|
|
class JsonNode
|
|
{
|
|
public:
|
|
std::optional<std::string> name;
|
|
std::optional<std::array<float, 3>> translation;
|
|
std::optional<std::array<float, 4>> rotation;
|
|
std::optional<std::array<float, 3>> scale;
|
|
std::optional<std::array<float, 16>> matrix;
|
|
std::optional<std::vector<unsigned>> children;
|
|
std::optional<unsigned> skin;
|
|
std::optional<unsigned> mesh;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonNode, name, translation, rotation, scale, matrix, children, skin, mesh);
|
|
|
|
class JsonBuffer
|
|
{
|
|
public:
|
|
unsigned byteLength;
|
|
std::optional<std::string> uri;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonBuffer, byteLength, uri);
|
|
|
|
enum class JsonAccessorComponentType
|
|
{
|
|
SIGNED_BYTE = 5120,
|
|
UNSIGNED_BYTE = 5121,
|
|
SIGNED_SHORT = 5122,
|
|
UNSIGNED_SHORT = 5123,
|
|
UNSIGNED_INT = 5125,
|
|
FLOAT = 5126
|
|
};
|
|
|
|
NLOHMANN_JSON_SERIALIZE_ENUM(JsonAccessorComponentType,
|
|
{
|
|
{JsonAccessorComponentType::SIGNED_BYTE, static_cast<unsigned>(JsonAccessorComponentType::SIGNED_BYTE) },
|
|
{JsonAccessorComponentType::UNSIGNED_BYTE, static_cast<unsigned>(JsonAccessorComponentType::UNSIGNED_BYTE) },
|
|
{JsonAccessorComponentType::SIGNED_SHORT, static_cast<unsigned>(JsonAccessorComponentType::SIGNED_SHORT) },
|
|
{JsonAccessorComponentType::UNSIGNED_SHORT, static_cast<unsigned>(JsonAccessorComponentType::UNSIGNED_SHORT)},
|
|
{JsonAccessorComponentType::UNSIGNED_INT, static_cast<unsigned>(JsonAccessorComponentType::UNSIGNED_INT) },
|
|
{JsonAccessorComponentType::FLOAT, static_cast<unsigned>(JsonAccessorComponentType::FLOAT) },
|
|
});
|
|
|
|
enum class JsonAccessorType
|
|
{
|
|
SCALAR,
|
|
VEC2,
|
|
VEC3,
|
|
VEC4,
|
|
MAT2,
|
|
MAT3,
|
|
MAT4
|
|
};
|
|
|
|
NLOHMANN_JSON_SERIALIZE_ENUM(JsonAccessorType,
|
|
{
|
|
{JsonAccessorType::SCALAR, "SCALAR"},
|
|
{JsonAccessorType::VEC2, "VEC2" },
|
|
{JsonAccessorType::VEC3, "VEC3" },
|
|
{JsonAccessorType::VEC4, "VEC4" },
|
|
{JsonAccessorType::MAT2, "MAT2" },
|
|
{JsonAccessorType::MAT3, "MAT3" },
|
|
{JsonAccessorType::MAT4, "MAT4" },
|
|
});
|
|
|
|
class JsonAccessor
|
|
{
|
|
public:
|
|
std::optional<unsigned> bufferView;
|
|
std::optional<unsigned> byteOffset;
|
|
JsonAccessorComponentType componentType;
|
|
// std::optional<boolean> normalized
|
|
unsigned count;
|
|
JsonAccessorType type;
|
|
std::optional<std::vector<float>> max;
|
|
std::optional<std::vector<float>> min;
|
|
// std::optional<JsonAccessorSparse> sparse;
|
|
// std::optional<std::string> name;
|
|
// extensions
|
|
// extras
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonAccessor, bufferView, byteOffset, componentType, count, type, min, max);
|
|
|
|
enum class JsonBufferViewTarget
|
|
{
|
|
ARRAY_BUFFER = 34962,
|
|
ELEMENT_ARRAY_BUFFER = 34963
|
|
};
|
|
|
|
NLOHMANN_JSON_SERIALIZE_ENUM(JsonBufferViewTarget,
|
|
{
|
|
{JsonBufferViewTarget::ARRAY_BUFFER, static_cast<unsigned>(JsonBufferViewTarget::ARRAY_BUFFER) },
|
|
{JsonBufferViewTarget::ELEMENT_ARRAY_BUFFER, static_cast<unsigned>(JsonBufferViewTarget::ELEMENT_ARRAY_BUFFER)},
|
|
});
|
|
|
|
class JsonBufferView
|
|
{
|
|
public:
|
|
unsigned buffer;
|
|
unsigned byteLength;
|
|
std::optional<unsigned> byteOffset;
|
|
std::optional<unsigned> byteStride;
|
|
std::optional<JsonBufferViewTarget> target;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonBufferView, buffer, byteLength, byteOffset, byteStride, target);
|
|
|
|
enum class JsonAnimationChannelTargetPath
|
|
{
|
|
TRANSLATION,
|
|
ROTATION,
|
|
SCALE,
|
|
WEIGHTS
|
|
};
|
|
|
|
NLOHMANN_JSON_SERIALIZE_ENUM(JsonAnimationChannelTargetPath,
|
|
{
|
|
{JsonAnimationChannelTargetPath::TRANSLATION, "translation"},
|
|
{JsonAnimationChannelTargetPath::ROTATION, "rotation" },
|
|
{JsonAnimationChannelTargetPath::SCALE, "scale" },
|
|
{JsonAnimationChannelTargetPath::WEIGHTS, "weights" },
|
|
});
|
|
|
|
class JsonAnimationChannelTarget
|
|
{
|
|
public:
|
|
unsigned node;
|
|
JsonAnimationChannelTargetPath path;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonAnimationChannelTarget, node, path);
|
|
|
|
class JsonAnimationChannel
|
|
{
|
|
public:
|
|
unsigned sampler;
|
|
JsonAnimationChannelTarget target;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonAnimationChannel, sampler, target);
|
|
|
|
enum class JsonAnimationSamplerInterpolation
|
|
{
|
|
LINEAR,
|
|
STEP,
|
|
CUBIC_SPLINE
|
|
};
|
|
|
|
NLOHMANN_JSON_SERIALIZE_ENUM(JsonAnimationSamplerInterpolation,
|
|
{
|
|
{JsonAnimationSamplerInterpolation::LINEAR, "LINEAR" },
|
|
{JsonAnimationSamplerInterpolation::STEP, "STEP" },
|
|
{JsonAnimationSamplerInterpolation::CUBIC_SPLINE, "CUBICSPLINE"},
|
|
});
|
|
|
|
class JsonAnimationSampler
|
|
{
|
|
public:
|
|
unsigned input;
|
|
std::optional<JsonAnimationSamplerInterpolation> interpolation;
|
|
unsigned output;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonAnimationSampler, input, interpolation, output);
|
|
|
|
class JsonAnimation
|
|
{
|
|
public:
|
|
std::vector<JsonAnimationChannel> channels;
|
|
std::vector<JsonAnimationSampler> samplers;
|
|
std::optional<std::string> name;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonAnimation, channels, samplers, name);
|
|
|
|
class JsonTextureInfo
|
|
{
|
|
public:
|
|
unsigned index;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonTextureInfo, index);
|
|
|
|
class JsonPbrMetallicRoughness
|
|
{
|
|
public:
|
|
std::optional<JsonTextureInfo> baseColorTexture;
|
|
std::optional<float> metallicFactor;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonPbrMetallicRoughness, baseColorTexture, metallicFactor);
|
|
|
|
class JsonNormalTextureInfo
|
|
{
|
|
public:
|
|
unsigned index;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonNormalTextureInfo, index);
|
|
|
|
class JsonMaterial
|
|
{
|
|
public:
|
|
std::optional<std::string> name;
|
|
std::optional<JsonPbrMetallicRoughness> pbrMetallicRoughness;
|
|
std::optional<JsonNormalTextureInfo> normalTexture;
|
|
std::optional<bool> doubleSided;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonMaterial, name, pbrMetallicRoughness, normalTexture, doubleSided);
|
|
|
|
enum class JsonMeshPrimitivesMode
|
|
{
|
|
POINTS = 0,
|
|
LINES = 1,
|
|
LINE_LOOP = 2,
|
|
LINE_STRIP = 3,
|
|
TRIANGLES = 4,
|
|
TRIANGLES_STRIP = 5,
|
|
TRIANGLE_FAN = 6
|
|
};
|
|
|
|
NLOHMANN_JSON_SERIALIZE_ENUM(JsonMeshPrimitivesMode,
|
|
{
|
|
{JsonMeshPrimitivesMode::POINTS, static_cast<unsigned>(JsonMeshPrimitivesMode::POINTS) },
|
|
{JsonMeshPrimitivesMode::LINES, static_cast<unsigned>(JsonMeshPrimitivesMode::LINES) },
|
|
{JsonMeshPrimitivesMode::LINE_LOOP, static_cast<unsigned>(JsonMeshPrimitivesMode::LINE_LOOP) },
|
|
{JsonMeshPrimitivesMode::LINE_STRIP, static_cast<unsigned>(JsonMeshPrimitivesMode::LINE_STRIP) },
|
|
{JsonMeshPrimitivesMode::TRIANGLES, static_cast<unsigned>(JsonMeshPrimitivesMode::TRIANGLES) },
|
|
{JsonMeshPrimitivesMode::TRIANGLES_STRIP, static_cast<unsigned>(JsonMeshPrimitivesMode::TRIANGLES_STRIP)},
|
|
{JsonMeshPrimitivesMode::TRIANGLE_FAN, static_cast<unsigned>(JsonMeshPrimitivesMode::TRIANGLE_FAN) },
|
|
});
|
|
|
|
// This should probably be a map, but the supported models do not have arbitrary primitives anyway
|
|
class JsonMeshPrimitivesAttributes
|
|
{
|
|
public:
|
|
std::optional<unsigned> POSITION;
|
|
std::optional<unsigned> NORMAL;
|
|
std::optional<unsigned> COLOR_0;
|
|
std::optional<unsigned> TEXCOORD_0;
|
|
std::optional<unsigned> JOINTS_0;
|
|
std::optional<unsigned> WEIGHTS_0;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonMeshPrimitivesAttributes, POSITION, NORMAL, TEXCOORD_0, JOINTS_0, WEIGHTS_0);
|
|
|
|
class JsonMeshPrimitives
|
|
{
|
|
public:
|
|
JsonMeshPrimitivesAttributes attributes;
|
|
std::optional<unsigned> indices;
|
|
std::optional<unsigned> material;
|
|
std::optional<JsonMeshPrimitivesMode> mode;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonMeshPrimitives, attributes, indices, material, mode);
|
|
|
|
class JsonMesh
|
|
{
|
|
public:
|
|
std::vector<JsonMeshPrimitives> primitives;
|
|
std::optional<std::vector<float>> weights;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonMesh, primitives, weights);
|
|
|
|
class JsonSkin
|
|
{
|
|
public:
|
|
std::optional<unsigned> inverseBindMatrices;
|
|
std::optional<unsigned> skeleton;
|
|
std::vector<unsigned> joints;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonSkin, inverseBindMatrices, skeleton, joints);
|
|
|
|
class JsonScene
|
|
{
|
|
public:
|
|
std::vector<unsigned> nodes;
|
|
std::optional<std::string> name;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonScene, nodes, name);
|
|
|
|
class JsonTexture
|
|
{
|
|
public:
|
|
unsigned source;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonTexture, source);
|
|
|
|
class JsonImage
|
|
{
|
|
public:
|
|
std::optional<std::string> uri;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonImage, uri);
|
|
|
|
class JsonRoot
|
|
{
|
|
public:
|
|
std::optional<std::vector<JsonAccessor>> accessors;
|
|
std::optional<std::vector<JsonAnimation>> animations;
|
|
JsonAsset asset;
|
|
std::optional<std::vector<JsonBuffer>> buffers;
|
|
std::optional<std::vector<JsonBufferView>> bufferViews;
|
|
std::optional<std::vector<JsonImage>> images;
|
|
std::optional<std::vector<JsonMaterial>> materials;
|
|
std::optional<std::vector<JsonMesh>> meshes;
|
|
std::optional<std::vector<JsonNode>> nodes;
|
|
std::optional<std::vector<JsonSkin>> skins;
|
|
std::optional<unsigned> scene;
|
|
std::optional<std::vector<JsonScene>> scenes;
|
|
std::optional<std::vector<JsonTexture>> textures;
|
|
};
|
|
|
|
NLOHMANN_DEFINE_TYPE_EXTENSION(
|
|
JsonRoot, accessors, animations, asset, buffers, bufferViews, images, materials, meshes, nodes, skins, scene, scenes, textures);
|
|
} // namespace gltf
|