sandbox
Loading...
Searching...
No Matches
mesh.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_MODELS_MESH_HPP_
3#define LIBSBX_MODELS_MESH_HPP_
4
5#include <filesystem>
6
8#include <libsbx/utility/enum.hpp>
9#include <libsbx/utility/crc32.hpp>
10
11#include <libsbx/math/volume.hpp>
12#include <libsbx/math/sphere.hpp>
13
14#include <libsbx/io/loader_factory.hpp>
15
16#include <libsbx/graphics/pipeline/mesh.hpp>
17
18#include <libsbx/models/vertex3d.hpp>
19
20namespace sbx::models {
21
22class mesh : public graphics::mesh<vertex3d>, public io::loader_factory<mesh, graphics::mesh<vertex3d>::mesh_data> {
23
25
26public:
27
29
30 using base::mesh;
31
32 mesh(const std::filesystem::path& path);
33
34 ~mesh() override;
35
36private:
37
38 static constexpr auto file_magic = utility::make_magic<std::uint64_t>("SBXSTMSH");
39 static constexpr auto file_version = std::uint16_t{1u};
40 static constexpr auto binary_file_extention = std::string_view{".sbxstmsh"};
41
42 enum class file_flags : std::uint16_t {
43 none = 0,
44 compressed = utility::bit_v<0>, // reserved for future zstd block compression
45 quantized = utility::bit_v<1>, // reserved for future vertex quantization
46 }; // enum class file_flags
47
48 struct alignas(8) file_header {
49 std::uint64_t magic;
50 std::uint16_t version;
51 std::uint16_t flags;
52 std::uint32_t vertex_count;
53 std::uint32_t index_count;
54 std::uint32_t submesh_count;
55 std::uint32_t vertex_stride;
56 std::uint32_t index_stride;
57 std::uint32_t uncompressed_size;
58 std::uint32_t compressed_size;
59 }; // struct file_header
60
61 static_assert(sizeof(file_header) == 40u, "file_header layout changed");
62
63 struct alignas(4) file_bounds {
64 std::float_t aabb_min[3];
65 std::float_t aabb_max[3];
66 std::float_t sphere_center[3];
67 std::float_t sphere_radius;
68 }; // struct file_bounds
69
70 static_assert(sizeof(file_bounds) == 40u, "file_bounds layout changed");
71
72 struct alignas(8) file_submesh {
73 char name[64];
74 std::uint32_t material_index;
75 std::uint32_t vertex_offset;
76 std::uint32_t vertex_count;
77 std::uint32_t index_offset;
78 std::uint32_t index_count;
79 std::float_t aabb_min[3];
80 std::float_t aabb_max[3];
81 std::float_t local_transform[16];
82 }; // struct file_submesh
83
84 static_assert(sizeof(file_submesh) == 176u, "file_submesh layout changed");
85
86 struct alignas(2) file_vertex {
87 std::int16_t position[3];
88 std::int16_t normal[2];
89 std::int16_t uv[2];
90 std::int16_t tangent[2];
91 std::int8_t tangent_w;
92 std::uint8_t _pad;
93 }; // struct file_vertex
94
95 static_assert(sizeof(file_vertex) == 20u, "file_vertex layout changed");
96
97 static auto _load(const std::filesystem::path& path) -> mesh_data;
98
99 static auto _load_binary(const std::filesystem::path& path) -> mesh_data;
100
101 static auto _process(const std::filesystem::path& path, const mesh_data& data) -> void;
102
103}; // class mesh
104
105} // namespace sbx::models
106
107#endif // LIBSBX_MODELS_MESH_HPP_
Definition: mesh.hpp:39
Definition: loader_factory.hpp:13
Definition: mesh.hpp:22
Definition: mesh.hpp:47