MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
CompositeGeometryBuffer.cpp
Go to the documentation of this file.
2
7
8namespace MayaFlux::Buffers {
9
11 size_t initial_capacity,
12 float over_allocate_factor)
13 : VKBuffer(
14 calculate_initial_size(initial_capacity),
15 Usage::VERTEX,
16 Kakshya::DataModality::VERTEX_POSITIONS_3D)
17 , m_over_allocate_factor(over_allocate_factor)
18{
20 "Created CompositeGeometryBuffer with {} bytes capacity (over-allocate: {:.2f}x)",
21 get_size_bytes(), over_allocate_factor);
22}
23
24void CompositeGeometryBuffer::remove_geometry(const std::string& name)
25{
26 if (!m_processor) {
28 "Cannot remove geometry '{}': processor not initialized", name);
29 return;
30 }
31
32 m_processor->remove_geometry(name);
33
34 std::erase_if(m_render_data,
35 [&name](const auto& pair) {
36 return pair.first == name;
37 });
38
40 "Removed geometry '{}' from composite buffer", name);
41}
42
43std::optional<CompositeGeometryProcessor::GeometryCollection>
44CompositeGeometryBuffer::get_collection(const std::string& name) const
45{
46 if (!m_processor) {
47 return std::nullopt;
48 }
49
50 return m_processor->get_collection(name);
51}
52
54{
55 return m_processor ? m_processor->get_collection_count() : 0;
56}
57
59{
60 auto self = std::dynamic_pointer_cast<CompositeGeometryBuffer>(shared_from_this());
61
62 m_processor = std::make_shared<CompositeGeometryProcessor>();
63 m_processor->set_processing_token(token);
64
66
67 auto chain = get_processing_chain();
68 if (!chain) {
69 chain = std::make_shared<BufferProcessingChain>();
71 }
72 chain->set_preferred_token(token);
73
75 "Setup CompositeGeometryProcessor with token {}",
76 static_cast<int>(token));
77}
78
80 const std::string& name,
81 const std::shared_ptr<Nodes::GpuSync::GeometryWriterNode>& node,
83 const std::shared_ptr<Core::Window>& target_window)
84{
85 RenderConfig config;
86 config.target_window = target_window;
87
88 switch (topology) {
90 config.vertex_shader = "point.vert.spv";
91 config.fragment_shader = "point.frag.spv";
92 break;
93
96#ifndef MAYAFLUX_PLATFORM_MACOS
97 config.vertex_shader = "line.vert.spv";
98 config.fragment_shader = "line.frag.spv";
99 config.geometry_shader = "line.geom.spv";
100#else
101 config.vertex_shader = "line_fallback.vert.spv";
102 config.fragment_shader = "line_fallback.frag.spv";
103#endif
104 break;
105
109 config.vertex_shader = "triangle.vert.spv";
110 config.fragment_shader = "triangle.frag.spv";
111 break;
112
113 default:
114 config.vertex_shader = "point.vert.spv";
115 config.fragment_shader = "point.frag.spv";
116 }
117
118 add_geometry(name, node, topology, config);
119}
120
122 const std::string& name,
123 const std::shared_ptr<Nodes::GpuSync::GeometryWriterNode>& node,
125 const RenderConfig& config)
126{
127 if (!node) {
128 error<std::invalid_argument>(
131 std::source_location::current(),
132 "Cannot add null geometry node '{}'", name);
133 }
134
135 if (!m_processor) {
136 error<std::runtime_error>(
139 std::source_location::current(),
140 "Must call setup_processors() before add_geometry()");
141 }
142
143 if (!config.target_window) {
144 error<std::invalid_argument>(
147 std::source_location::current(),
148 "Target window must be specified in RenderConfig");
149 }
150
151 m_processor->add_geometry(name, node, topology);
152 auto self = std::dynamic_pointer_cast<CompositeGeometryBuffer>(shared_from_this());
153
154 auto render = std::make_shared<RenderProcessor>(
155 ShaderConfig { config.vertex_shader });
156
157 render->set_fragment_shader(config.fragment_shader);
158
159 if (!config.geometry_shader.empty()) {
160 render->set_geometry_shader(config.geometry_shader);
161 }
162
163 if (auto layout = node->get_vertex_layout()) {
164 render->set_buffer_vertex_layout(self, *layout);
165 }
166
167 render->set_target_window(config.target_window, self);
168 render->set_primitive_topology(topology);
169 render->set_polygon_mode(config.polygon_mode);
170 render->set_cull_mode(config.cull_mode);
171
172 render->set_vertex_range(0, 0);
173
174 auto chain = get_processing_chain();
175 chain->add_processor(render, shared_from_this());
176
177 m_render_data[name] = RenderData {
178 .render_processor = render,
179 .vertex_offset = 0,
180 .vertex_count = 0
181 };
182
184 "Added geometry '{}' to composite buffer (topology: {}, shaders: {}/{})",
185 name, static_cast<int>(topology), config.vertex_shader, config.fragment_shader);
186}
187
189{
191 "setup_rendering() is deprecated for CompositeGeometryBuffer. "
192 "Use add_geometry() with RenderConfig instead.");
193}
194
195size_t CompositeGeometryBuffer::calculate_initial_size(size_t requested_capacity)
196{
197 constexpr size_t MIN_SIZE = 1024;
198 return std::max(requested_capacity, MIN_SIZE);
199}
200
202 const std::string& name,
203 uint32_t vertex_offset,
204 uint32_t vertex_count)
205{
206 auto it = m_render_data.find(name);
207 if (it != m_render_data.end()) {
208 it->second.vertex_offset = vertex_offset;
209 it->second.vertex_count = vertex_count;
210
211 it->second.render_processor->set_vertex_range(vertex_offset, vertex_count);
212
214 "Updated render range for '{}': offset={}, count={}",
215 name, vertex_offset, vertex_count);
216 }
217}
218
220 const std::string& name,
221 const Kakshya::VertexLayout& layout)
222{
223 auto it = m_render_data.find(name);
224 if (it == m_render_data.end()) {
225 return;
226 }
227
228 it->second.render_processor->set_buffer_vertex_layout(
229 std::dynamic_pointer_cast<VKBuffer>(shared_from_this()),
230 layout);
231
233 "Updated vertex layout for '{}': stride={}, vertices={}",
234 name, layout.stride_bytes, layout.vertex_count);
235}
236
237} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
void setup_rendering(const RenderConfig &config)
Setup rendering (DEPRECATED for CompositeGeometryBuffer)
std::optional< CompositeGeometryProcessor::GeometryCollection > get_collection(const std::string &name) const
Get geometry collection metadata.
void setup_processors(ProcessingToken token) override
Initialize buffer processors.
CompositeGeometryBuffer(size_t initial_capacity=1024 *1024, float over_allocate_factor=1.5F)
Create empty composite buffer.
void update_collection_vertex_layout(const std::string &name, const Kakshya::VertexLayout &layout)
Push a topology-specific vertex layout to the matching RenderProcessor.
void update_collection_render_range(const std::string &name, uint32_t vertex_offset, uint32_t vertex_count)
Update the vertex range for a specific geometry collection's render processor.
std::shared_ptr< CompositeGeometryProcessor > m_processor
std::unordered_map< std::string, RenderData > m_render_data
static size_t calculate_initial_size(size_t requested_capacity)
Calculate initial buffer size.
size_t get_collection_count() const
Get number of geometry collections.
void remove_geometry(const std::string &name)
Remove a geometry collection.
void add_geometry(const std::string &name, const std::shared_ptr< Nodes::GpuSync::GeometryWriterNode > &node, Portal::Graphics::PrimitiveTopology topology, const std::shared_ptr< Core::Window > &target_window)
Add a geometry collection.
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Definition VKBuffer.cpp:274
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:258
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:237
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:279
Vulkan-backed buffer wrapper used in processing chains.
Definition VKBuffer.hpp:52
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
PrimitiveTopology
Vertex assembly primitive topology.
std::shared_ptr< RenderProcessor > render_processor
uint32_t stride_bytes
Total bytes per vertex (stride in Vulkan terms) e.g., 3 floats (position) + 3 floats (normal) = 24 by...
uint32_t vertex_count
Total number of vertices in this buffer.
Complete description of vertex data layout in a buffer.
std::shared_ptr< Core::Window > target_window
Unified rendering configuration for graphics buffers.