92 lines
3.3 KiB
C++
92 lines
3.3 KiB
C++
#ifndef MESH_H
|
|
#define MESH_H
|
|
|
|
#include <cstdint>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include <glm/vec2.hpp>
|
|
#include <glm/vec3.hpp>
|
|
#include <glm/vec4.hpp>
|
|
#include <glm/mat4x4.hpp>
|
|
|
|
#include <destrum/Graphics/Resources/Buffer.h>
|
|
#include <destrum/Graphics/Resources/CPUMesh.h>
|
|
#include <destrum/Graphics/Frustum.h>
|
|
|
|
// ─── GPU Mesh ─────────────────────────────────────────────────────────────────
|
|
|
|
struct GPUMesh {
|
|
GPUBuffer vertexBuffer;
|
|
GPUBuffer indexBuffer;
|
|
|
|
std::uint32_t numVertices{0};
|
|
std::uint32_t numIndices{0};
|
|
|
|
// AABB
|
|
glm::vec3 minPos;
|
|
glm::vec3 maxPos;
|
|
Sphere boundingSphere;
|
|
|
|
bool hasSkeleton{false};
|
|
GPUBuffer skinningDataBuffer; // valid only when hasSkeleton == true
|
|
};
|
|
|
|
// ─── Skinned output buffer (one per entity, not per mesh asset) ───────────────
|
|
|
|
struct SkinnedMesh {
|
|
GPUBuffer skinnedVertexBuffer;
|
|
};
|
|
|
|
// ─── Cube geometry (dev / test asset) ─────────────────────────────────────────
|
|
|
|
namespace CubeMesh {
|
|
|
|
inline std::vector<CPUMesh::Vertex> vertices = {
|
|
// +Z (Front)
|
|
{{-0.5f, -0.5f, 0.5f}, 0.0f, {0, 0, 1}, 0.0f, {1, 0, 0, 1}},
|
|
{{ 0.5f, -0.5f, 0.5f}, 1.0f, {0, 0, 1}, 0.0f, {1, 0, 0, 1}},
|
|
{{ 0.5f, 0.5f, 0.5f}, 1.0f, {0, 0, 1}, 1.0f, {1, 0, 0, 1}},
|
|
{{-0.5f, 0.5f, 0.5f}, 0.0f, {0, 0, 1}, 1.0f, {1, 0, 0, 1}},
|
|
// -Z (Back)
|
|
{{ 0.5f, -0.5f, -0.5f}, 0.0f, {0, 0, -1}, 0.0f, {-1, 0, 0, 1}},
|
|
{{-0.5f, -0.5f, -0.5f}, 1.0f, {0, 0, -1}, 0.0f, {-1, 0, 0, 1}},
|
|
{{-0.5f, 0.5f, -0.5f}, 1.0f, {0, 0, -1}, 1.0f, {-1, 0, 0, 1}},
|
|
{{ 0.5f, 0.5f, -0.5f}, 0.0f, {0, 0, -1}, 1.0f, {-1, 0, 0, 1}},
|
|
// +X (Right)
|
|
{{ 0.5f, -0.5f, 0.5f}, 0.0f, {1, 0, 0}, 0.0f, {0, 0, -1, 1}},
|
|
{{ 0.5f, -0.5f, -0.5f}, 1.0f, {1, 0, 0}, 0.0f, {0, 0, -1, 1}},
|
|
{{ 0.5f, 0.5f, -0.5f}, 1.0f, {1, 0, 0}, 1.0f, {0, 0, -1, 1}},
|
|
{{ 0.5f, 0.5f, 0.5f}, 0.0f, {1, 0, 0}, 1.0f, {0, 0, -1, 1}},
|
|
// -X (Left)
|
|
{{-0.5f, -0.5f, -0.5f}, 0.0f, {-1, 0, 0}, 0.0f, {0, 0, 1, 1}},
|
|
{{-0.5f, -0.5f, 0.5f}, 1.0f, {-1, 0, 0}, 0.0f, {0, 0, 1, 1}},
|
|
{{-0.5f, 0.5f, 0.5f}, 1.0f, {-1, 0, 0}, 1.0f, {0, 0, 1, 1}},
|
|
{{-0.5f, 0.5f, -0.5f}, 0.0f, {-1, 0, 0}, 1.0f, {0, 0, 1, 1}},
|
|
// +Y (Top)
|
|
{{-0.5f, 0.5f, 0.5f}, 0.0f, {0, 1, 0}, 0.0f, {1, 0, 0, 1}},
|
|
{{ 0.5f, 0.5f, 0.5f}, 1.0f, {0, 1, 0}, 0.0f, {1, 0, 0, 1}},
|
|
{{ 0.5f, 0.5f, -0.5f}, 1.0f, {0, 1, 0}, 1.0f, {1, 0, 0, 1}},
|
|
{{-0.5f, 0.5f, -0.5f}, 0.0f, {0, 1, 0}, 1.0f, {1, 0, 0, 1}},
|
|
// -Y (Bottom)
|
|
{{-0.5f, -0.5f, -0.5f}, 0.0f, {0, -1, 0}, 0.0f, {1, 0, 0, 1}},
|
|
{{ 0.5f, -0.5f, -0.5f}, 1.0f, {0, -1, 0}, 0.0f, {1, 0, 0, 1}},
|
|
{{ 0.5f, -0.5f, 0.5f}, 1.0f, {0, -1, 0}, 1.0f, {1, 0, 0, 1}},
|
|
{{-0.5f, -0.5f, 0.5f}, 0.0f, {0, -1, 0}, 1.0f, {1, 0, 0, 1}},
|
|
};
|
|
|
|
inline std::vector<std::uint32_t> indices = {
|
|
0, 2, 1, 0, 3, 2, // Front
|
|
4, 6, 5, 4, 7, 6, // Back
|
|
8,10, 9, 8,11,10, // Right
|
|
12,14,13, 12,15,14, // Left
|
|
16,18,17, 16,19,18, // Top
|
|
20,22,21, 20,23,22, // Bottom
|
|
};
|
|
|
|
} // namespace CubeMesh
|
|
|
|
#endif // MESH_H
|