MayaFlux 0.4.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 config.fragment_shader = "line.frag.spv";
97#ifndef MAYAFLUX_PLATFORM_MACOS
98 config.vertex_shader = "line.vert.spv";
99 config.geometry_shader = "line.geom.spv";
100#else
101 config.vertex_shader = "line_fallback.vert.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 config.topology = topology;
119 add_geometry(name, node, topology, config);
120}
121
123 const std::string& name,
124 const std::shared_ptr<Nodes::GpuSync::GeometryWriterNode>& node,
126 const RenderConfig& config)
127{
128 if (!node) {
129 error<std::invalid_argument>(
132 std::source_location::current(),
133 "Cannot add null geometry node '{}'", name);
134 }
135
136 if (!m_processor) {
137 error<std::runtime_error>(
140 std::source_location::current(),
141 "Must call setup_processors() before add_geometry()");
142 }
143
144 if (!config.target_window) {
145 error<std::invalid_argument>(
148 std::source_location::current(),
149 "Target window must be specified in RenderConfig");
150 }
151
152 m_processor->add_geometry(name, node, topology);
153 auto self = std::dynamic_pointer_cast<CompositeGeometryBuffer>(shared_from_this());
154
155 std::shared_ptr<RenderProcessor> render;
156 apply_render_config(render, config, ShaderConfig { config.vertex_shader });
157
158 if (auto layout = node->get_vertex_layout()) {
159 render->set_buffer_vertex_layout(self, *layout);
160 }
161 render->set_vertex_range(0, 0);
162
163 auto chain = get_processing_chain();
164 chain->add_processor(render, shared_from_this());
165
166 m_render_data[name] = RenderData {
167 .render_processor = render,
168 .vertex_offset = 0,
169 .vertex_count = 0
170 };
171
173 "Added geometry '{}' to composite buffer (topology: {}, shaders: {}/{})",
174 name, static_cast<int>(topology), config.vertex_shader, config.fragment_shader);
175}
176
178{
180 "setup_rendering() is deprecated for CompositeGeometryBuffer. "
181 "Use add_geometry() with RenderConfig instead.");
182}
183
184size_t CompositeGeometryBuffer::calculate_initial_size(size_t requested_capacity)
185{
186 constexpr size_t MIN_SIZE = 1024;
187 return std::max(requested_capacity, MIN_SIZE);
188}
189
191 const std::string& name,
192 uint32_t vertex_offset,
193 uint32_t vertex_count)
194{
195 auto it = m_render_data.find(name);
196 if (it != m_render_data.end()) {
197 it->second.vertex_offset = vertex_offset;
198 it->second.vertex_count = vertex_count;
199
200 it->second.render_processor->set_vertex_range(vertex_offset, vertex_count);
201
203 "Updated render range for '{}': offset={}, count={}",
204 name, vertex_offset, vertex_count);
205 }
206}
207
209 const std::string& name,
210 const Kakshya::VertexLayout& layout)
211{
212 auto it = m_render_data.find(name);
213 if (it == m_render_data.end()) {
214 return;
215 }
216
217 it->second.render_processor->set_buffer_vertex_layout(
218 std::dynamic_pointer_cast<VKBuffer>(shared_from_this()),
219 layout);
220
222 "Updated vertex layout for '{}': stride={}, vertices={}",
223 name, layout.stride_bytes, layout.vertex_count);
224}
225
226} // 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:286
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:270
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:279
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:291
void apply_render_config(const RenderConfig &config, const ShaderConfig &shader_config)
Configure the internal m_render_processor from a RenderConfig.
Definition VKBuffer.cpp:359
Vulkan-backed buffer wrapper used in processing chains.
Definition VKBuffer.hpp:67
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.