MayaFlux 0.5.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 config.vertex_shader = "line.vert.spv";
98#ifndef MAYAFLUX_PLATFORM_MACOS
99 config.geometry_shader = "line.geom.spv";
100#else
102#endif
103 break;
104
108 config.vertex_shader = "triangle.vert.spv";
109 config.fragment_shader = "triangle.frag.spv";
110 break;
111
112 default:
113 config.vertex_shader = "point.vert.spv";
114 config.fragment_shader = "point.frag.spv";
115 }
116
117 config.topology = topology;
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 std::shared_ptr<RenderProcessor> render;
155 apply_render_config(render, config, ShaderConfig { config.vertex_shader });
156
157 if (auto layout = node->get_vertex_layout()) {
158 render->set_buffer_vertex_layout(self, *layout);
159 }
160 render->set_vertex_range(0, 0);
161
162 auto chain = get_processing_chain();
163 chain->add_processor(render, shared_from_this());
164
165 m_render_data[name] = RenderData {
166 .render_processor = render,
167 .vertex_offset = 0,
168 .vertex_count = 0
169 };
170
172 "Added geometry '{}' to composite buffer (topology: {}, shaders: {}/{})",
173 name, static_cast<int>(topology), config.vertex_shader, config.fragment_shader);
174}
175
177{
179 "setup_rendering() is deprecated for CompositeGeometryBuffer. "
180 "Use add_geometry() with RenderConfig instead.");
181}
182
183size_t CompositeGeometryBuffer::calculate_initial_size(size_t requested_capacity)
184{
185 constexpr size_t MIN_SIZE = 1024;
186 return std::max(requested_capacity, MIN_SIZE);
187}
188
190 const std::string& name,
191 uint32_t vertex_offset,
192 uint32_t vertex_count)
193{
194 auto it = m_render_data.find(name);
195 if (it != m_render_data.end()) {
196 it->second.vertex_offset = vertex_offset;
197 it->second.vertex_count = vertex_count;
198
199 it->second.render_processor->set_vertex_range(vertex_offset, vertex_count);
200
202 "Updated render range for '{}': offset={}, count={}",
203 name, vertex_offset, vertex_count);
204 }
205}
206
208 const std::string& name,
209 const Kakshya::VertexLayout& layout)
210{
211 auto it = m_render_data.find(name);
212 if (it == m_render_data.end()) {
213 return;
214 }
215
216 it->second.render_processor->set_buffer_vertex_layout(
217 std::dynamic_pointer_cast<VKBuffer>(shared_from_this()),
218 layout);
219
221 "Updated vertex layout for '{}': stride={}, vertices={}",
222 name, layout.stride_bytes, layout.vertex_count);
223}
224
225} // 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:263
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:247
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:278
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:268
void apply_render_config(const RenderConfig &config, const ShaderConfig &shader_config)
Configure the internal m_render_processor from a RenderConfig.
Definition VKBuffer.cpp:336
Vulkan-backed buffer wrapper used in processing chains.
Definition VKBuffer.hpp:76
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.
BufferUsageHint
Semantic usage hint for buffer allocation and memory properties.
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.