MayaFlux 0.2.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 100 of file NetworkGeometryProcessor.cpp.

101{
102 if (m_bindings.empty()) {
103 return;
104 }
105
106 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
107 if (!vk_buffer) {
109 "NetworkGeometryProcessor requires VKBuffer, got different buffer type");
110 return;
111 }
112
113 for (auto& [name, binding] : m_bindings) {
114 if (!binding.network || !binding.network->is_enabled()) {
116 "Network '{}' disabled, skipping upload", name);
117 continue;
118 }
119
120 std::vector<Nodes::GpuSync::PointVertex> vertices;
121
122 if (auto particle_net = std::dynamic_pointer_cast<Nodes::Network::ParticleNetwork>(binding.network)) {
123 vertices = extract_particle_vertices(particle_net);
124 } else {
125 vertices = extract_network_vertices(binding.network);
126 }
127
128 if (vertices.empty()) {
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 = vertices.size() * sizeof(Nodes::GpuSync::PointVertex);
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>(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 available_size = new_size;
149
150 if (binding.staging_buffer) {
151 binding.staging_buffer->resize(new_size, false);
153 "Resized staging buffer for '{}' to {} bytes", name, new_size);
154 }
155 }
156
157 size_t upload_size = std::min<size_t>(required_size, available_size);
158
160 vertices.data(),
161 upload_size,
162 binding.gpu_vertex_buffer,
163 binding.staging_buffer);
164
165 Kakshya::VertexLayout layout;
166 layout.vertex_count = static_cast<uint32_t>(vertices.size());
167 layout.stride_bytes = sizeof(Nodes::GpuSync::PointVertex);
168
169 layout.attributes.push_back(Kakshya::VertexAttributeLayout {
170 .component_modality = Kakshya::DataModality::VERTEX_POSITIONS_3D,
171 .offset_in_vertex = 0,
172 .name = "position" });
173
174 layout.attributes.push_back(Kakshya::VertexAttributeLayout {
175 .component_modality = Kakshya::DataModality::VERTEX_COLORS_RGB,
176 .offset_in_vertex = sizeof(glm::vec3),
177 .name = "color" });
178
179 layout.attributes.push_back(Kakshya::VertexAttributeLayout {
180 .component_modality = Kakshya::DataModality::UNKNOWN,
181 .offset_in_vertex = sizeof(glm::vec3) + sizeof(glm::vec3),
182 .name = "size" });
183
184 binding.gpu_vertex_buffer->set_vertex_layout(layout);
185
187 "Uploaded {} vertices from network '{}' ({} bytes)",
188 vertices.size(), name, upload_size);
189 }
190}
#define MF_RT_ERROR(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
std::vector< Nodes::GpuSync::PointVertex > extract_particle_vertices(const std::shared_ptr< Nodes::Network::ParticleNetwork > &network)
Extract vertices from ParticleNetwork.
std::unordered_map< std::string, NetworkBinding > m_bindings
std::vector< Nodes::GpuSync::PointVertex > extract_network_vertices(const std::shared_ptr< Nodes::Network::NodeNetwork > &network)
Extract vertices from generic NodeNetwork (fallback)
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.
@ UNKNOWN
Unknown or undefined modality.

References MayaFlux::Kakshya::VertexLayout::attributes, MayaFlux::Journal::BufferProcessing, MayaFlux::Journal::Buffers, MayaFlux::Kakshya::VertexAttributeLayout::component_modality, extract_network_vertices(), extract_particle_vertices(), m_bindings, MF_RT_ERROR, MF_RT_TRACE, MayaFlux::Kakshya::VertexLayout::stride_bytes, MayaFlux::Kakshya::UNKNOWN, MayaFlux::Buffers::upload_to_gpu(), MayaFlux::Kakshya::VERTEX_COLORS_RGB, MayaFlux::Kakshya::VertexLayout::vertex_count, and MayaFlux::Kakshya::VERTEX_POSITIONS_3D.

+ Here is the call graph for this function: