MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NetworkGeometryBuffer.cpp
Go to the documentation of this file.
2
6
8
9namespace MayaFlux::Buffers {
10
12 std::shared_ptr<Nodes::NodeNetwork> network,
13 const std::string& binding_name,
14 float over_allocate_factor)
15 : VKBuffer(
16 calculate_buffer_size(network, over_allocate_factor),
17 Usage::VERTEX,
18 Kakshya::DataModality::VERTEX_POSITIONS_3D)
19 , m_network(std::move(network))
20 , m_binding_name(binding_name)
21{
22 if (!m_network) {
23 error<std::invalid_argument>(
26 std::source_location::current(),
27 "Cannot create NetworkGeometryBuffer with null NodeNetwork");
28 }
29
31 "Created NetworkGeometryBuffer '{}' for {} nodes ({} bytes estimated)",
33 m_network->get_node_count(),
35}
36
38{
39 auto self = std::dynamic_pointer_cast<NetworkGeometryBuffer>(shared_from_this());
40
41 m_processor = std::make_shared<NetworkGeometryProcessor>();
42 m_processor->set_processing_token(token);
43 m_processor->bind_network(
46 self);
47
49
50 auto chain = get_processing_chain();
51 if (!chain) {
52 chain = std::make_shared<BufferProcessingChain>();
54 }
55 chain->set_preferred_token(token);
56
58 "Setup NetworkGeometryProcessor for '{}' with token {}",
59 m_binding_name, static_cast<int>(token));
60}
61
63{
64 if (!m_render_processor) {
65 m_render_processor = std::make_shared<RenderProcessor>(
67 }
68
69 m_render_processor->set_fragment_shader(config.fragment_shader);
70 m_render_processor->set_target_window(config.target_window);
71 m_render_processor->set_primitive_topology(config.topology);
72 m_render_processor->set_polygon_mode(config.polygon_mode);
73 m_render_processor->set_cull_mode(config.cull_mode);
74
75 get_processing_chain()->add_processor(m_render_processor, shared_from_this());
76}
77
79{
80 // Each node in network typically produces 1 vertex (for PointNode networks)
81 // Processor will provide actual count after aggregation
82 return static_cast<uint32_t>(m_network ? m_network->get_node_count() : 0);
83}
84
86 const std::shared_ptr<Nodes::NodeNetwork>& network,
87 float over_allocate_factor)
88{
89 if (!network) {
90 return 0;
91 }
92
93 size_t node_count = network->get_node_count();
94
95 if (node_count == 0) {
97 "NodeNetwork has zero nodes. Buffer will be created with minimum size.");
98 return 4096;
99 }
100
101 // Estimate: assume each node produces one PointVertex (position + color + size)
102 size_t vertex_size = sizeof(Nodes::GpuSync::PointVertex);
103 size_t base_size = node_count * vertex_size;
104
105 auto allocated_size = static_cast<size_t>(
106 static_cast<float>(base_size) * over_allocate_factor);
107
108 if (over_allocate_factor > 1.0F) {
110 "Over-allocated network geometry buffer: {} nodes × {} bytes = {} → {} bytes ({}x)",
111 node_count, vertex_size, base_size, allocated_size, over_allocate_factor);
112 }
113
114 return allocated_size;
115}
116
117} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
static MayaFlux::Nodes::ProcessingToken token
Definition Timers.cpp:8
std::shared_ptr< Nodes::NodeNetwork > m_network
std::shared_ptr< NetworkGeometryProcessor > m_processor
uint32_t get_vertex_count() const
Get current vertex count (aggregated from all network nodes)
void setup_rendering(const RenderConfig &config)
Setup rendering with RenderProcessor.
std::shared_ptr< RenderProcessor > m_render_processor
static size_t calculate_buffer_size(const std::shared_ptr< Nodes::NodeNetwork > &network, float over_allocate_factor)
Calculate initial buffer size based on network node count.
void setup_processors(ProcessingToken token) override
Initialize the buffer and its processors.
NetworkGeometryBuffer(std::shared_ptr< Nodes::NodeNetwork > network, const std::string &binding_name="network_geometry", float over_allocate_factor=2.0F)
Create geometry buffer from network.
void set_processing_chain(std::shared_ptr< Buffers::BufferProcessingChain > chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:286
void set_default_processor(std::shared_ptr< Buffers::BufferProcessor > processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:265
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Definition VKBuffer.cpp:281
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:221
Vulkan-backed buffer wrapper used in processing chains.
Definition VKBuffer.hpp:52
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
Complete configuration for shader processor.