MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
CompositeGeometryProcessor.cpp
Go to the documentation of this file.
2
6
8
9namespace MayaFlux::Buffers {
10
16
18 const std::string& name,
19 const std::shared_ptr<Nodes::GpuSync::GeometryWriterNode>& node,
21{
22 if (!node) {
23 error<std::invalid_argument>(
26 std::source_location::current(),
27 "Cannot add null geometry node '{}'", name);
28 }
29
30 auto it = std::ranges::find_if(m_collections,
31 [&name](const auto& c) { return c.name == name; });
32
33 if (it != m_collections.end()) {
35 "Collection '{}' already exists, replacing", name);
36 it->node = node;
37 it->topology = topology;
38 it->vertex_layout.reset();
39 return;
40 }
41
43 .name = name,
44 .node = node,
45 .topology = topology,
46 .vertex_offset = 0,
47 .vertex_count = 0 });
48
50 "Added geometry collection '{}' with topology {}",
51 name, static_cast<int>(topology));
52}
53
55{
56 auto it = std::ranges::find_if(m_collections,
57 [&name](const auto& c) { return c.name == name; });
58
59 if (it == m_collections.end()) {
61 "Attempted to remove non-existent collection '{}'", name);
62 return;
63 }
64
65 m_collections.erase(it);
66
68 "Removed geometry collection '{}'", name);
69}
70
71std::optional<CompositeGeometryProcessor::GeometryCollection>
72CompositeGeometryProcessor::get_collection(const std::string& name) const
73{
74 auto it = std::ranges::find_if(m_collections,
75 [&name](const auto& c) { return c.name == name; });
76
77 if (it == m_collections.end())
78 return std::nullopt;
79 return *it;
80}
81
82void CompositeGeometryProcessor::processing_function(const std::shared_ptr<Buffer>& buffer)
83{
84 if (m_collections.empty())
85 return;
86
87 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
88 if (!vk_buffer) {
90 "CompositeGeometryProcessor requires VKBuffer");
91 return;
92 }
93
94 size_t total_bytes = 0;
95 for (const auto& col : m_collections) {
96 total_bytes += col.node->get_vertex_buffer_size_bytes();
97 }
98
99 if (total_bytes == 0) {
100 if (vk_buffer->is_host_visible())
101 vk_buffer->clear();
102 return;
103 }
104
105 size_t available_size = vk_buffer->get_size_bytes();
106 if (total_bytes > available_size) {
107 auto new_size = static_cast<size_t>(static_cast<float>(total_bytes) * 1.5F);
108 vk_buffer->resize(new_size, false);
109 available_size = new_size;
110 }
111
112 m_staging_aggregate.resize(total_bytes);
113 size_t current_byte_offset = 0;
114
115 for (auto& col : m_collections) {
116 auto vertex_data = col.node->get_vertex_data();
117
118 if (vertex_data.empty()) {
119 col.vertex_offset = 0;
120 col.vertex_count = 0;
121 continue;
122 }
123
124 std::memcpy(
125 m_staging_aggregate.data() + current_byte_offset,
126 vertex_data.data(),
127 vertex_data.size_bytes());
128
129 size_t stride = col.node->get_vertex_stride();
130 if (stride == 0) {
132 "Collection '{}' has zero vertex stride", col.name);
133 continue;
134 }
135
136 col.vertex_offset = static_cast<uint32_t>(current_byte_offset / stride);
137 col.vertex_count = col.node->get_vertex_count();
138 // col.vertex_count = static_cast<uint32_t>(vertex_data.size_bytes() / stride);
139
140 if (auto layout = col.node->get_vertex_layout()) {
141 layout->vertex_count = col.vertex_count;
142 layout->stride_bytes = static_cast<uint32_t>(stride);
143 col.vertex_layout = std::move(layout);
144 }
145
147 "Collection '{}': {} vertices at offset {} (stride: {})",
148 col.name, col.vertex_count, col.vertex_offset, stride);
149
150 current_byte_offset += vertex_data.size_bytes();
151 }
152
153 auto composite_buffer = std::dynamic_pointer_cast<CompositeGeometryBuffer>(buffer);
154 if (composite_buffer) {
155 for (const auto& col : m_collections) {
156 composite_buffer->update_collection_render_range(
157 col.name, col.vertex_offset, col.vertex_count);
158
159 if (col.vertex_layout) {
160 composite_buffer->update_collection_vertex_layout(
161 col.name, *col.vertex_layout);
162 }
163 }
164 }
165
167 m_staging_aggregate.data(),
168 std::min(total_bytes, available_size),
169 vk_buffer,
170 nullptr);
171}
172
173} // namespace MayaFlux::Buffers
#define MF_RT_ERROR(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
void add_geometry(const std::string &name, const std::shared_ptr< Nodes::GpuSync::GeometryWriterNode > &node, Portal::Graphics::PrimitiveTopology topology)
Add a geometry collection.
std::optional< GeometryCollection > get_collection(const std::string &name) const
Get collection metadata.
void processing_function(const std::shared_ptr< Buffer > &buffer) override
BufferProcessor interface - aggregates all geometry.
void remove_geometry(const std::string &name)
Remove a geometry collection.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
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.
PrimitiveTopology
Vertex assembly primitive topology.