28 VulkanMesh() =
default;
31 std::span<const Vertex> vertices;
32 std::span<const uint32_t> indices;
33 std::span<const SkinVertex> skin_vertices;
38 uint32_t transfer_queue_family_index, std::string_view debug_name = {}
43 void bind(vk::CommandBuffer cmd)
const;
45 void bindPosed(vk::CommandBuffer cmd, vk::Buffer posed_vertices, uint32_t posed_vertex_offset)
const;
48 auto getVertexCount() const noexcept -> uint32_t {
49 return m_vertex_count;
53 auto getVertexBuffer() const -> vk::Buffer {
54 return m_vertex_buffer.has_value() ? **m_vertex_buffer : vk::Buffer {};
58 auto getSkinVertexBuffer() const -> vk::Buffer {
59 return m_skin_vertex_buffer.has_value() ? **m_skin_vertex_buffer : vk::Buffer {};
63 auto getIndexBuffer() const -> vk::Buffer {
64 return m_index_buffer.has_value() ? **m_index_buffer : vk::Buffer {};
68 auto getIndexCount() const noexcept -> uint32_t {
72 void draw(vk::CommandBuffer cmd, uint32_t instance_count = 1)
const;
75 auto isSkinned() const noexcept ->
bool {
76 return m_skin_vertex_buffer.has_value();
80 vk::CommandBuffer cmd, vk::Buffer staging_buffer, vk::DeviceSize vertex_offset, vk::DeviceSize index_offset,
81 vk::DeviceSize skin_vertex_offset
84 auto createAccelerationStructure(
const VulkanCore& core) -> std::optional<vma::raii::Buffer>;
86 void recordBuildAccelerationStructure(vk::CommandBuffer cmd)
const;
89 auto hasAccelerationStructure() const noexcept ->
bool {
90 return m_blas_address != 0;
94 auto getAccelerationStructureAddress() const noexcept -> vk::DeviceAddress {
95 return m_blas_address;
99 std::optional<vma::raii::Buffer> m_vertex_buffer;
100 std::optional<vma::raii::Buffer> m_index_buffer;
101 std::optional<vma::raii::Buffer> m_skin_vertex_buffer;
103 vk::DeviceSize m_vertex_size = 0;
104 vk::DeviceSize m_index_size = 0;
105 vk::DeviceSize m_skin_vertex_size = 0;
107 uint32_t m_vertex_count = 0;
108 uint32_t m_index_count = 0;
110 std::optional<vma::raii::Buffer> m_blas_buffer;
111 vk::raii::AccelerationStructureKHR m_blas =
nullptr;
112 vk::DeviceAddress m_blas_address = 0;
113 vk::AccelerationStructureBuildGeometryInfoKHR m_blas_build_info {};
114 vk::AccelerationStructureGeometryKHR m_blas_geometry {};
115 uint32_t m_blas_primitive_count = 0;
117 mutable vk::DeviceAddress m_blas_scratch_address = 0;
120 PFN_vkCmdBuildAccelerationStructuresKHR m_build_acceleration_structures =
nullptr;
122 friend class MeshUpload;