MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ processing_function()

void MayaFlux::Buffers::NetworkGeometryProcessor::processing_function ( const std::shared_ptr< Buffer > &  buffer)
overridevirtual

BufferProcessor interface - aggregates and uploads network geometry.

Parameters
bufferThe buffer this processor is attached to

For each bound network:

  1. Extract vertices from all internal nodes
  2. Aggregate into single vertex array
  3. Upload to GPU vertex buffer

Implements MayaFlux::Buffers::BufferProcessor.

Definition at line 101 of file NetworkGeometryProcessor.cpp.

102{
103 if (m_bindings.empty()) {
104 return;
105 }
106
107 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
108 if (!vk_buffer) {
110 "NetworkGeometryProcessor requires VKBuffer, got different buffer type");
111 return;
112 }
113
114 for (auto& [name, binding] : m_bindings) {
115 if (!binding.network || !binding.network->is_enabled()) {
117 "Network '{}' disabled, skipping upload", name);
118 continue;
119 }
120
121 auto gpu_data = extract_network_gpu_data(binding.network, name);
122 if (gpu_data.vertex_data.empty()) {
123 if (binding.gpu_vertex_buffer->is_host_visible())
124 binding.gpu_vertex_buffer->clear();
125 continue;
126 }
127
128 if (gpu_data.vertex_data.empty() || gpu_data.vertex_count == 0) {
129 if (binding.gpu_vertex_buffer->is_host_visible()) {
130 binding.gpu_vertex_buffer->clear();
131 }
133 "Network '{}' has no vertices, cleared buffer", name);
134 continue;
135 }
136
137 size_t required_size = gpu_data.vertex_data.size();
138 size_t available_size = binding.gpu_vertex_buffer->get_size_bytes();
139
140 if (required_size > available_size) {
141 auto new_size = static_cast<size_t>((float)required_size * 1.5F);
142
144 "Network '{}' growing: resizing GPU buffer from {} → {} bytes",
145 name, available_size, new_size);
146
147 binding.gpu_vertex_buffer->resize(new_size, false);
148
149 if (binding.staging_buffer) {
150 binding.staging_buffer->resize(new_size, false);
152 "Resized staging buffer for '{}' to {} bytes", name, new_size);
153 }
154 }
155
157 gpu_data.vertex_data.data(),
158 gpu_data.vertex_data.size(),
159 binding.gpu_vertex_buffer,
160 binding.staging_buffer);
161
162 auto layout = gpu_data.layout;
163
164 binding.gpu_vertex_buffer->set_vertex_layout(layout.value());
165
167 "Uploaded {} vertices from network '{}' ({} bytes)",
168 gpu_data.vertex_count, name, gpu_data.vertex_data.size());
169 }
170}
#define MF_RT_ERROR(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
std::unordered_map< std::string, NetworkBinding > m_bindings
NetworkGpuData extract_network_gpu_data(const std::shared_ptr< Nodes::Network::NodeNetwork > &network, std::string_view name)
Extract GPU geometry data from a NodeNetwork via its GraphicsOperator.
void upload_to_gpu(const void *data, size_t size, const std::shared_ptr< VKBuffer > &target, const std::shared_ptr< VKBuffer > &staging)
Upload raw data to GPU buffer (auto-detects host-visible vs device-local)
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.

References MayaFlux::Journal::BufferProcessing, MayaFlux::Journal::Buffers, MayaFlux::Buffers::extract_network_gpu_data(), m_bindings, MF_RT_ERROR, MF_RT_TRACE, and MayaFlux::Buffers::upload_to_gpu().

+ Here is the call graph for this function: