MayaFlux 1.0.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
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>
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
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#ifdef MAYAFLUX_PLATFORM_MACOS
99 config.triangulate = true;
100#endif
101
102 if (config.triangulate) {
103 config.geometry_shader.clear();
104 } else {
105 config.geometry_shader = "line.geom.spv";
106 }
107 break;
108
112 config.vertex_shader = "triangle.vert.spv";
113 config.fragment_shader = "triangle.frag.spv";
114 break;
115
116 default:
117 config.vertex_shader = "point.vert.spv";
118 config.fragment_shader = "point.frag.spv";
119 }
120
121 config.topology = topology;
122 add_geometry(name, node, topology, config);
123}
124
126 const std::string& name,
127 const std::shared_ptr<Nodes::GpuSync::GeometryWriterNode>& node,
129 const RenderConfig& config)
130{
131 if (!node) {
132 error<std::invalid_argument>(
135 std::source_location::current(),
136 "Cannot add null geometry node '{}'", name);
137 }
138
139 if (!m_processor) {
140 error<std::runtime_error>(
143 std::source_location::current(),
144 "Must call setup_processors() before add_geometry()");
145 }
146
147 if (!config.target_window) {
148 error<std::invalid_argument>(
151 std::source_location::current(),
152 "Target window must be specified in RenderConfig");
153 }
154
155 m_processor->add_geometry(name, node, topology);
156 auto self = std::dynamic_pointer_cast<CompositeGeometryBuffer>(shared_from_this());
157
158 std::shared_ptr<RenderProcessor> render;
159 apply_render_config(render, config, ShaderConfig { config.vertex_shader });
160
161 if (auto layout = node->get_vertex_layout()) {
162 render->set_buffer_vertex_layout(self, *layout);
163 }
164 render->set_vertex_range(0, 0);
165
167 chain->add_processor(render, shared_from_this());
168
170 .render_processor = render,
171 .vertex_offset = 0,
172 .vertex_count = 0
173 };
174
176 "Added geometry '{}' to composite buffer (topology: {}, shaders: {}/{})",
177 name, static_cast<int>(topology), config.vertex_shader, config.fragment_shader);
178}
179
181{
183 "setup_rendering() is deprecated for CompositeGeometryBuffer. "
184 "Use add_geometry() with RenderConfig instead.");
185}
186
187size_t CompositeGeometryBuffer::calculate_initial_size(size_t requested_capacity)
188{
189 constexpr size_t MIN_SIZE = 1024;
190 return std::max(requested_capacity, MIN_SIZE);
191}
192
194 const std::string& name,
195 uint32_t vertex_offset,
196 uint32_t vertex_count)
197{
198 auto it = m_render_data.find(name);
199 if (it != m_render_data.end()) {
200 it->second.vertex_offset = vertex_offset;
201 it->second.vertex_count = vertex_count;
202
203 it->second.render_processor->set_vertex_range(vertex_offset, vertex_count);
204
206 "Updated render range for '{}': offset={}, count={}",
207 name, vertex_offset, vertex_count);
208 }
209}
210
212 const std::string& name,
213 const Kakshya::VertexLayout& layout)
214{
215 auto it = m_render_data.find(name);
216 if (it == m_render_data.end()) {
217 return;
218 }
219
220 it->second.render_processor->set_buffer_vertex_layout(
221 std::dynamic_pointer_cast<VKBuffer>(shared_from_this()),
222 layout);
223
225 "Updated vertex layout for '{}': stride={}, vertices={}",
226 name, layout.stride_bytes, layout.vertex_count);
227}
228
229} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
BufferProcessingChain * chain
PrimitiveTopology topology
std::string name
Definition VKDevice.cpp:123
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:271
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:255
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:280
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:276
void apply_render_config(const RenderConfig &config, const ShaderConfig &shader_config)
Configure the internal m_render_processor from a RenderConfig.
Definition VKBuffer.cpp:344
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
bool triangulate
Reduce supplied spans to triangles before drawing them.
Unified rendering configuration for graphics buffers.