11 size_t initial_capacity,
12 float over_allocate_factor)
14 calculate_initial_size(initial_capacity),
16 Kakshya::DataModality::VERTEX_POSITIONS_3D)
17 , m_over_allocate_factor(over_allocate_factor)
20 "Created CompositeGeometryBuffer with {} bytes capacity (over-allocate: {:.2f}x)",
28 "Cannot remove geometry '{}': processor not initialized", name);
35 [&name](
const auto& pair) {
36 return pair.first == name;
40 "Removed geometry '{}' from composite buffer", name);
43std::optional<CompositeGeometryProcessor::GeometryCollection>
60 auto self = std::dynamic_pointer_cast<CompositeGeometryBuffer>(shared_from_this());
62 m_processor = std::make_shared<CompositeGeometryProcessor>();
69 chain = std::make_shared<BufferProcessingChain>();
72 chain->set_preferred_token(token);
75 "Setup CompositeGeometryProcessor with token {}",
76 static_cast<int>(token));
80 const std::string& name,
81 const std::shared_ptr<Nodes::GpuSync::GeometryWriterNode>& node,
83 const std::shared_ptr<Core::Window>& target_window)
96#ifndef MAYAFLUX_PLATFORM_MACOS
122 const std::string& name,
123 const std::shared_ptr<Nodes::GpuSync::GeometryWriterNode>& node,
128 error<std::invalid_argument>(
131 std::source_location::current(),
132 "Cannot add null geometry node '{}'", name);
136 error<std::runtime_error>(
139 std::source_location::current(),
140 "Must call setup_processors() before add_geometry()");
144 error<std::invalid_argument>(
147 std::source_location::current(),
148 "Target window must be specified in RenderConfig");
152 auto self = std::dynamic_pointer_cast<CompositeGeometryBuffer>(shared_from_this());
154 auto render = std::make_shared<RenderProcessor>(
163 if (
auto layout = node->get_vertex_layout()) {
164 render->set_buffer_vertex_layout(self, *layout);
168 render->set_primitive_topology(topology);
172 render->set_vertex_range(0, 0);
175 chain->add_processor(render, shared_from_this());
184 "Added geometry '{}' to composite buffer (topology: {}, shaders: {}/{})",
191 "setup_rendering() is deprecated for CompositeGeometryBuffer. "
192 "Use add_geometry() with RenderConfig instead.");
197 constexpr size_t MIN_SIZE = 1024;
198 return std::max(requested_capacity, MIN_SIZE);
202 const std::string& name,
203 uint32_t vertex_offset,
204 uint32_t vertex_count)
208 it->second.vertex_offset = vertex_offset;
209 it->second.vertex_count = vertex_count;
211 it->second.render_processor->set_vertex_range(vertex_offset, vertex_count);
214 "Updated render range for '{}': offset={}, count={}",
215 name, vertex_offset, vertex_count);
220 const std::string& name,
228 it->second.render_processor->set_buffer_vertex_layout(
229 std::dynamic_pointer_cast<VKBuffer>(shared_from_this()),
233 "Updated vertex layout for '{}': stride={}, vertices={}",
#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.
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
vk::DeviceSize get_size_bytes() const
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Vulkan-backed buffer wrapper used in processing chains.
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
std::string vertex_shader
std::string fragment_shader
std::string geometry_shader
Unified rendering configuration for graphics buffers.