31 error<std::runtime_error>(
34 std::source_location::current(),
35 "MeshProcessor requires a valid BufferService");
38 auto mesh_buf = std::dynamic_pointer_cast<MeshBuffer>(buffer);
41 "MeshProcessor: attached to non-MeshBuffer — detaching");
45 if (!mesh_buf->m_mesh_data.is_valid()) {
47 "MeshProcessor: MeshData is not valid on attach — no GPU resources allocated");
60 mesh_buf->clear_vertices_dirty();
61 mesh_buf->clear_indices_dirty();
63 mesh_buf->set_vertex_layout(mesh_buf->m_mesh_data.layout);
66 "MeshProcessor: initialised — {} vertices, {} indices ({} faces), stride {}",
67 mesh_buf->get_vertex_count(),
68 mesh_buf->get_index_count(),
69 mesh_buf->get_face_count(),
70 mesh_buf->m_mesh_data.layout.stride_bytes);
92 if (!node->get_mesh_vertices().empty()) {
93 const auto& verts = node->get_mesh_vertices();
94 const auto& indices = node->get_mesh_indices();
95 m_mesh_buffer->m_mesh_data.vertex_variant = std::vector<uint8_t>(
96 reinterpret_cast<const uint8_t*
>(verts.data()),
97 reinterpret_cast<const uint8_t*
>(verts.data() + verts.size()));
99 m_mesh_buffer->m_mesh_data.layout.vertex_count =
static_cast<uint32_t
>(verts.size());
100 m_mesh_buffer->m_vertices_dirty.store(
true, std::memory_order_release);
101 m_mesh_buffer->m_indices_dirty.store(
true, std::memory_order_release);
110 "MeshProcessor: re-uploaded vertex data ({} bytes)",
120 "MeshProcessor: re-uploaded index data ({} indices)",
131 const auto* vb = std::get_if<std::vector<uint8_t>>(
132 &buf->m_mesh_data.vertex_variant);
133 const auto* ib = std::get_if<std::vector<uint32_t>>(
134 &buf->m_mesh_data.index_variant);
136 if (!vb || vb->empty() || !ib || ib->empty()) {
138 "MeshProcessor::allocate_gpu_buffers: empty vertex or index data");
142 if (!buf->is_host_visible()) {
146 const size_t idx_bytes = ib->size() *
sizeof(uint32_t);
156 "MeshProcessor: allocated vertex buffer ({} bytes) + index buffer ({} bytes)",
157 vb->size(), idx_bytes);
162 const auto* vb = std::get_if<std::vector<uint8_t>>(
163 &buf->m_mesh_data.vertex_variant);
164 if (!vb || vb->empty()) {
171 std::dynamic_pointer_cast<VKBuffer>(buf),
177 const auto* ib = std::get_if<std::vector<uint32_t>>(
178 &buf->m_mesh_data.index_variant);
185 ib->size() *
sizeof(uint32_t),
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
ProcessingToken m_processing_token
void link_index_resources()
void processing_function(const std::shared_ptr< Buffer > &buffer) override
The core processing function that must be implemented by derived classes.
std::shared_ptr< VKBuffer > m_vertex_staging
void allocate_gpu_buffers(const std::shared_ptr< MeshBuffer > &buf)
void upload_vertices(const std::shared_ptr< MeshBuffer > &buf)
std::shared_ptr< VKBuffer > m_index_staging
std::shared_ptr< MeshBuffer > m_mesh_buffer
std::shared_ptr< VKBuffer > m_gpu_index_buffer
void upload_indices(const std::shared_ptr< MeshBuffer > &buf)
void on_attach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is attached to a buffer.
void on_detach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is detached from a buffer.
void initialize_buffer_service()
Registry::Service::BufferService * m_buffer_service
void ensure_initialized(const std::shared_ptr< VKBuffer > &buffer)
Interface * get_service()
Query for a backend service.
static BackendRegistry & instance()
Get the global registry instance.
void upload_resizing(const void *data, size_t size, const std::shared_ptr< VKBuffer > &target, const std::shared_ptr< VKBuffer > &staging, float growth_factor)
Upload size bytes to target, growing both buffers first if needed.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
std::shared_ptr< VKBuffer > create_staging_buffer(size_t size)
Create staging buffer for transfers.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
@ UNKNOWN
Unknown or undefined modality.
Backend buffer management service interface.