2#ifndef LIBSBX_MODELS_MESH_HPP_
3#define LIBSBX_MODELS_MESH_HPP_
8#include <libsbx/utility/enum.hpp>
9#include <libsbx/utility/crc32.hpp>
11#include <libsbx/math/volume.hpp>
12#include <libsbx/math/sphere.hpp>
14#include <libsbx/io/loader_factory.hpp>
16#include <libsbx/graphics/pipeline/mesh.hpp>
18#include <libsbx/models/vertex3d.hpp>
20namespace sbx::models {
32 mesh(
const std::filesystem::path& path);
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"};
42 enum class file_flags : std::uint16_t {
44 compressed = utility::bit_v<0>,
45 quantized = utility::bit_v<1>,
48 struct alignas(8) file_header {
50 std::uint16_t version;
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;
61 static_assert(
sizeof(file_header) == 40u,
"file_header layout changed");
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;
70 static_assert(
sizeof(file_bounds) == 40u,
"file_bounds layout changed");
72 struct alignas(8) file_submesh {
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];
84 static_assert(
sizeof(file_submesh) == 176u,
"file_submesh layout changed");
86 struct alignas(2) file_vertex {
87 std::int16_t position[3];
88 std::int16_t normal[2];
90 std::int16_t tangent[2];
91 std::int8_t tangent_w;
95 static_assert(
sizeof(file_vertex) == 20u,
"file_vertex layout changed");
97 static auto _load(
const std::filesystem::path& path) ->
mesh_data;
99 static auto _load_binary(
const std::filesystem::path& path) ->
mesh_data;
101 static auto _process(
const std::filesystem::path& path,
const mesh_data& data) -> void;
Definition: loader_factory.hpp:13