1#ifndef LIBSBX_GRAPHICS_PIPELINE_MESH_HPP_
2#define LIBSBX_GRAPHICS_PIPELINE_MESH_HPP_
7#include <unordered_map>
9#include <libsbx/utility/hashed_string.hpp>
10#include <libsbx/utility/exception.hpp>
11#include <libsbx/utility/assert.hpp>
13#include <libsbx/math/volume.hpp>
15#include <libsbx/graphics/buffers/buffer.hpp>
16#include <libsbx/graphics/buffers/storage_buffer.hpp>
18#include <libsbx/graphics/commands/command_buffer.hpp>
20#include <libsbx/graphics/pipeline/vertex_input_description.hpp>
22#include <libsbx/graphics/resource_storage.hpp>
24namespace sbx::graphics {
33 std::uint32_t index_count;
34 std::uint32_t index_offset;
35 std::uint32_t vertex_offset;
41template<vertex Vertex>
46 using vertex_type = Vertex;
49 using index_type = std::uint32_t;
53 std::vector<vertex_type> vertices;
54 std::vector<index_type> indices;
55 std::vector<graphics::submesh> submeshes;
66 mesh(
const mesh& other)
noexcept =
delete;
72 auto render_submesh(graphics::command_buffer& command_buffer, std::uint32_t submesh_index, std::uint32_t instance_count = 1u) const ->
void;
74 auto address() const -> std::uint64_t;
76 auto bind(graphics::command_buffer& command_buffer) const ->
void;
78 auto render_submesh_indirect(graphics::storage_buffer& buffer, std::uint32_t offset, std::uint32_t submesh_index, std::uint32_t instance_count = 1u) const ->
void;
80 auto submeshes() const noexcept -> const std::vector<graphics::submesh>&;
82 auto submesh_index(const utility::hashed_string& name) const -> std::uint32_t {
83 const auto entry = std::ranges::find(_submeshes, name, &graphics::submesh::name);
85 if (entry == _submeshes.end()) {
89 return std::distance(_submeshes.begin(), entry);
92 auto submesh(std::uint32_t submesh_index)
const ->
const graphics::submesh& {
93 utility::assert_that(submesh_index < _submeshes.size(), fmt::format(
"Trying to access out of bounds submesh {} of mesh with {} submeshes", submesh_index, _submeshes.size()));
94 return _submeshes.at(submesh_index);
97 auto submesh(
const utility::hashed_string& name)
const ->
const graphics::submesh& {
98 return submesh(submesh_index(name));
101 auto submesh_bounds(std::uint32_t submesh_index)
const ->
const math::volume& {
102 return submesh(submesh_index).bounds;
105 auto submesh_bounds(
const utility::hashed_string& name)
const ->
const math::volume& {
106 return submesh(submesh_index(name)).bounds;
109 auto submesh_local_transform(std::uint32_t submesh_index)
const ->
const math::matrix4x4& {
110 return submesh(submesh_index).local_transform;
113 auto submesh_local_transform(
const utility::hashed_string& name)
const ->
const math::matrix4x4& {
114 return submesh(submesh_index(name)).local_transform;
117 auto submesh_names() const -> std::unordered_map<utility::hashed_string, std::uint32_t> {
118 auto names = std::unordered_map<utility::hashed_string, std::uint32_t>{};
120 for (std::size_t i = 0; i < _submeshes.size(); ++i) {
121 names.emplace(_submeshes[i].name,
static_cast<std::uint32_t
>(i));
127 auto bounds() const -> const math::volume& {
133 mesh(mesh_data&& mesh_data);
135 auto _upload_vertices(
const std::vector<vertex_type>& vertices,
const std::vector<index_type>& indices) -> void;
137 auto _upload_vertices(std::vector<vertex_type>&& vertices, std::vector<index_type>&& indices) -> void;
139 auto _calculate_bounds_from_submeshes(math::volume&& bounds)
const -> math::volume;
143 buffer_handle _vertex_buffer;
144 buffer_handle _index_buffer;
146 std::vector<graphics::submesh> _submeshes;
151 math::volume _bounds;
157#include <libsbx/graphics/pipeline/mesh.ipp>
Definition: command_buffer.hpp:14
Definition: matrix4x4.hpp:26
Definition: volume.hpp:11
Definition: hashed_string.hpp:15
Definition: exception.hpp:17