feat: add basic format for models

This commit is contained in:
2026-10-11 11:07:43 +02:00
parent 170af2a4e9
commit fa98bf08e8
9 changed files with 739 additions and 42 deletions
@@ -0,0 +1,23 @@
#ifndef DESTRUM_MODELFILE_H
#define DESTRUM_MODELFILE_H
#include <cstdint>
#include <filesystem>
#include <span>
#include <string_view>
#include <vector>
#include <destrum/Util/ModelDoc.h>
namespace ModelFile {
inline constexpr std::uint32_t Version = 1;
inline constexpr std::string_view Extension = ".dmodel";
[[nodiscard]] std::vector<std::uint8_t> Write(const ModelDoc::ModelAsset& model);
[[nodiscard]] ModelDoc::ModelAsset Read(std::span<const std::uint8_t> bytes);
void WriteToFile(const ModelDoc::ModelAsset& model, const std::filesystem::path& path);
[[nodiscard]] ModelDoc::ModelAsset ReadFromFile(const std::filesystem::path& path);
}
#endif // DESTRUM_MODELFILE_H
@@ -0,0 +1,43 @@
#ifndef CPUMESH_H
#define CPUMESH_H
#include <cstdint>
#include <optional>
#include <string>
#include <vector>
#include <glm/vec3.hpp>
#include <glm/vec4.hpp>
#include <destrum/Graphics/Skeleton.h>
#include <destrum/Assets/AssetReference.h>
// ─── CPU Mesh ─────────────────────────────────────────────────────────────────
struct CPUMesh {
struct Vertex {
glm::vec3 position;
float uv_x{};
glm::vec3 normal;
float uv_y{};
glm::vec4 tangent;
};
struct SkinningData {
glm::vec<4, std::uint32_t> jointIds;
glm::vec4 weights;
};
std::vector<std::uint32_t> indices;
std::vector<Vertex> vertices;
std::vector<SkinningData> skinningData; // empty if no skeleton
std::string name;
AssetReference assetReference;
glm::vec3 minPos;
glm::vec3 maxPos;
std::optional<Skeleton> skeleton; // present only for skinned meshes
};
#endif // CPUMESH_H
@@ -13,37 +13,8 @@
#include <glm/mat4x4.hpp>
#include <destrum/Graphics/Resources/Buffer.h>
#include <destrum/Graphics/Resources/CPUMesh.h>
#include <destrum/Graphics/Frustum.h>
#include <destrum/Graphics/Skeleton.h>
#include <destrum/Assets/AssetReference.h>
// ─── CPU Mesh ─────────────────────────────────────────────────────────────────
struct CPUMesh {
struct Vertex {
glm::vec3 position;
float uv_x{};
glm::vec3 normal;
float uv_y{};
glm::vec4 tangent;
};
struct SkinningData {
glm::vec<4, std::uint32_t> jointIds;
glm::vec4 weights;
};
std::vector<std::uint32_t> indices;
std::vector<Vertex> vertices;
std::vector<SkinningData> skinningData; // empty if no skeleton
std::string name;
AssetReference assetReference;
glm::vec3 minPos;
glm::vec3 maxPos;
std::optional<Skeleton> skeleton; // present only for skinned meshes
};
// ─── GPU Mesh ─────────────────────────────────────────────────────────────────
+3 -1
View File
@@ -30,7 +30,9 @@
#include <glm/gtc/quaternion.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <destrum/Graphics/Resources/Mesh.h>
#include <spdlog/spdlog.h>
#include <destrum/Graphics/Resources/CPUMesh.h>
#include <destrum/Assets/AssetReference.h>
#include <destrum/Graphics/SkeletalAnimation.h>
#include <destrum/Graphics/Skeleton.h>