MayaFlux 0.3.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::Network::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 RenderConfig resolved_config = config;
65
66 switch (config.topology) {
68 if (config.vertex_shader.empty())
69 resolved_config.vertex_shader = "point.vert.spv";
70 if (config.fragment_shader.empty())
71 resolved_config.fragment_shader = "point.frag.spv";
72 break;
75#ifndef MAYAFLUX_PLATFORM_MACOS
76 if (config.vertex_shader.empty())
77 resolved_config.vertex_shader = "line.vert.spv";
78 if (config.fragment_shader.empty())
79 resolved_config.fragment_shader = "line.frag.spv";
80 if (config.geometry_shader.empty())
81 resolved_config.geometry_shader = "line.geom.spv";
82#else
83 if (config.vertex_shader.empty())
84 resolved_config.vertex_shader = "line_fallback.vert.spv";
85 if (config.fragment_shader.empty())
86 resolved_config.fragment_shader = "line_fallback.frag.spv";
87
89#endif // !MAYAFLUX_PLATFORM_MACOS
90 break;
93 if (config.vertex_shader.empty())
94 resolved_config.vertex_shader = "triangle.vert.spv";
95 if (config.fragment_shader.empty())
96 resolved_config.fragment_shader = "triangle.frag.spv";
97 break;
98 default:
99 if (config.vertex_shader.empty())
100 resolved_config.vertex_shader = "point.vert.spv";
101 if (config.fragment_shader.empty())
102 resolved_config.fragment_shader = "point.frag.spv";
103 }
104
105 if (!m_render_processor) {
106 m_render_processor = std::make_shared<RenderProcessor>(
107 ShaderConfig { resolved_config.vertex_shader });
108 } else {
109 m_render_processor->set_shader(resolved_config.vertex_shader);
110 }
111
112 m_render_processor->set_fragment_shader(resolved_config.fragment_shader);
113 if (!resolved_config.geometry_shader.empty()) {
114 m_render_processor->set_geometry_shader(resolved_config.geometry_shader);
115 }
116 m_render_processor->set_target_window(config.target_window, std::dynamic_pointer_cast<VKBuffer>(shared_from_this()));
117 m_render_processor->set_primitive_topology(resolved_config.topology);
118 m_render_processor->set_polygon_mode(config.polygon_mode);
119 m_render_processor->set_cull_mode(config.cull_mode);
120
121 get_processing_chain()->add_final_processor(m_render_processor, shared_from_this());
122
123 set_default_render_config(resolved_config);
124}
125
127{
128 if (!m_network) {
129 return 0;
130 }
131
132 auto* operator_ptr = m_network->get_operator();
133 if (operator_ptr) {
134 auto* graphics_op = dynamic_cast<Nodes::Network::GraphicsOperator*>(operator_ptr);
135 if (graphics_op) {
136 return static_cast<uint32_t>(graphics_op->get_vertex_count());
137 }
138 }
139
140 return static_cast<uint32_t>(m_network->get_node_count());
141}
142
144 const std::shared_ptr<Nodes::Network::NodeNetwork>& network,
145 float over_allocate_factor)
146{
147 if (!network) {
148 return 0;
149 }
150
151 size_t node_count = network->get_node_count();
152 if (node_count == 0) {
154 "NodeNetwork has zero nodes. Buffer will be created with minimum size.");
155 return 4096;
156 }
157
158 size_t base_size = 0;
159
160 if (auto* operator_ptr = network->get_operator()) {
161 if (auto graphics_op = dynamic_cast<Nodes::Network::GraphicsOperator*>(operator_ptr)) {
162 size_t vertex_count = graphics_op->get_vertex_count();
163 auto layout = graphics_op->get_vertex_layout();
164
165 if (vertex_count > 0 && layout.stride_bytes > 0) {
166 base_size = vertex_count * layout.stride_bytes;
167
169 "Network geometry buffer sizing: {} vertices × {} bytes = {} bytes (operator: {})",
170 vertex_count, layout.stride_bytes, base_size, operator_ptr->get_type_name());
171 }
172 }
173 }
174
175 if (base_size == 0) {
176 size_t vertex_size = sizeof(Nodes::PointVertex);
177 base_size = node_count * vertex_size;
178
180 "Network geometry buffer fallback sizing: {} nodes × {} bytes = {} bytes",
181 node_count, vertex_size, base_size);
182 }
183
184 auto allocated_size = static_cast<size_t>(
185 static_cast<float>(base_size) * over_allocate_factor);
186
187 if (over_allocate_factor > 1.0F) {
189 "Over-allocated by {}x: {} → {} bytes",
190 over_allocate_factor, base_size, allocated_size);
191 }
192
193 return allocated_size;
194}
195
196} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
NetworkGeometryBuffer(std::shared_ptr< Nodes::Network::NodeNetwork > network, const std::string &binding_name="network_geometry", float over_allocate_factor=2.0F)
Create geometry buffer from network.
std::shared_ptr< NetworkGeometryProcessor > m_processor
uint32_t get_vertex_count() const
Get current vertex count (aggregated from all network nodes)
std::shared_ptr< Nodes::Network::NodeNetwork > m_network
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::Network::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.
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Definition VKBuffer.cpp:274
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:258
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:237
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:279
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
Definition VKBuffer.hpp:502
Vulkan-backed buffer wrapper used in processing chains.
Definition VKBuffer.hpp:52
Operator that produces GPU-renderable geometry.
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.
std::shared_ptr< Core::Window > target_window
Unified rendering configuration for graphics buffers.