MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NetworkGeometryBuffer.hpp
Go to the documentation of this file.
1#pragma once
2
6
7namespace MayaFlux::Buffers {
8
9class RenderProcessor;
10
11/**
12 * @class NetworkGeometryBuffer
13 * @brief Specialized buffer for geometry from NodeNetwork instances
14 *
15 * Aggregates geometry from all nodes within a network into a single GPU buffer.
16 * Designed for networks like ParticleNetwork (1000+ points in PointCollectionNode), PointCloudNetwork,
17 * and other multi-node generative systems.
18 *
19 * Philosophy:
20 * - Networks are collections of MANY nodes with relationships
21 * - This buffer aggregates all node geometry → single draw call
22 * - Supports dynamic growth as networks evolve
23 *
24 * Key Differences from GeometryBuffer:
25 * - Accepts NodeNetwork (not single GeometryWriterNode)
26 * - Aggregates vertices from ALL internal nodes
27 * - Handles network-specific processing patterns
28 *
29 * Usage:
30 * ```cpp
31 * // Create particle network with 1000 particles
32 * auto particles = std::make_shared<ParticleNetwork>(1000);
33 * particles->set_topology(Topology::SPATIAL);
34 * particles->set_output_mode(OutputMode::GRAPHICS_BIND);
35 *
36 * // Create buffer that aggregates all 1000 Points in PointCollectionNode inside the ParticleNetwork
37 * auto buffer = std::make_shared<NetworkGeometryBuffer>(particles);
38 * buffer->setup_processors(ProcessingToken::VISUAL_RATE);
39 *
40 * // Render all particles in one draw call
41 * auto render = std::make_shared<RenderProcessor>(config);
42 * render->set_target_window(window);
43 * buffer->add_processor(render);
44 * ```
45 */
46class MAYAFLUX_API NetworkGeometryBuffer : public VKBuffer {
47public:
48 /**
49 * @brief Create geometry buffer from network
50 * @param network NodeNetwork containing geometry nodes (e.g., ParticleNetwork)
51 * @param binding_name Logical name for this geometry binding (default: "network_geometry")
52 * @param over_allocate_factor Buffer size multiplier for dynamic growth (default: 2.0x)
53 *
54 * Buffer size is calculated based on network node count and estimated vertex size.
55 * Higher over_allocate_factor recommended for networks that may grow dynamically.
56 */
57 explicit NetworkGeometryBuffer(
58 std::shared_ptr<Nodes::Network::NodeNetwork> network,
59 const std::string& binding_name = "network_geometry",
60 float over_allocate_factor = 2.0F);
61
62 ~NetworkGeometryBuffer() override = default;
63
64 /**
65 * @brief Initialize the buffer and its processors
66 */
67 void setup_processors(ProcessingToken token) override;
68
69 /**
70 * @brief Get the network driving this buffer
71 */
72 [[nodiscard]] std::shared_ptr<Nodes::Network::NodeNetwork> get_network() const
73 {
74 return m_network;
75 }
76
77 /**
78 * @brief Get the processor managing uploads
79 */
80 [[nodiscard]] std::shared_ptr<NetworkGeometryProcessor> get_processor() const
81 {
82 return m_processor;
83 }
84
85 /**
86 * @brief Get the logical binding name
87 */
88 [[nodiscard]] const std::string& get_binding_name() const
89 {
90 return m_binding_name;
91 }
92
93 /**
94 * @brief Get current vertex count (aggregated from all network nodes)
95 */
96 [[nodiscard]] uint32_t get_vertex_count() const;
97
98 /**
99 * @brief Trigger network processing
100 *
101 * Calls network->process_batch() to update physics/state.
102 * Geometry aggregation happens automatically in processor.
103 */
104 void update_network(unsigned int num_samples = 1)
105 {
106 if (m_network && m_network->is_enabled()) {
107 m_network->process_batch(num_samples);
108 }
109 }
110
111 /**
112 * @brief Setup rendering with RenderProcessor
113 * @param config Rendering configuration
114 */
115 void setup_rendering(const RenderConfig& config);
116
117 /**
118 * @brief Add a RenderProcessor for a specific operator chain index
119 * @param config Rendering configuration
120 *
121 * This allows rendering different subsets of the network geometry with different pipelines.
122 * Each chain index corresponds to a specific node/operator in the network.
123 */
124 void add_chain_operator_rendering(const RenderConfig& config);
125
126 /**
127 * @brief Get RenderProcessor for a specific operator chain index
128 * @param index Operator chain index
129 * @return Optional containing RenderProcessor if exists
130 *
131 * Each chain index corresponds to a specific node/operator in the network.
132 */
133 [[nodiscard]] std::shared_ptr<RenderProcessor> get_chain_render_processor(size_t index) const;
134
135 /**
136 * @brief Update vertex range for a specific operator chain index
137 * @param index Operator chain index
138 * @param vertex_offset Starting vertex offset for this chain
139 * @param vertex_count Number of vertices for this chain
140 * @param layout Optional vertex layout for this chain (if different from primary)
141 *
142 * This allows the processor to push per-chain vertex ranges to the RenderProcessor,
143 * enabling it to issue draw calls for specific subsets of the geometry.
144 */
145 void update_chain_render_range(
146 size_t index,
147 uint32_t vertex_offset,
148 uint32_t vertex_count,
149 const std::optional<Kakshya::VertexLayout>& layout);
150
151protected:
152 std::shared_ptr<Nodes::Network::NodeNetwork> m_network;
153 std::shared_ptr<NetworkGeometryProcessor> m_processor;
154 std::string m_binding_name;
155
156private:
158 std::shared_ptr<RenderProcessor> render_processor;
159 uint32_t vertex_offset {};
160 uint32_t vertex_count {};
161 };
162 std::vector<ChainRenderEntry> m_chain_render_processors;
163
164 /**
165 * @brief Calculate initial buffer size based on network node count
166 */
167 static size_t calculate_buffer_size(
168 const std::shared_ptr<Nodes::Network::NodeNetwork>& network,
169 float over_allocate_factor);
170};
171
172} // namespace MayaFlux::Buffers
Core::GlobalNetworkConfig network
Definition Config.cpp:37
std::vector< ChainRenderEntry > m_chain_render_processors
const std::string & get_binding_name() const
Get the logical binding name.
std::shared_ptr< NetworkGeometryProcessor > m_processor
std::shared_ptr< Nodes::Network::NodeNetwork > m_network
std::shared_ptr< Nodes::Network::NodeNetwork > get_network() const
Get the network driving this buffer.
std::shared_ptr< NetworkGeometryProcessor > get_processor() const
Get the processor managing uploads.
void update_network(unsigned int num_samples=1)
Trigger network processing.
Specialized buffer for geometry from NodeNetwork instances.
Vulkan-backed buffer wrapper used in processing chains.
Definition VKBuffer.hpp:67
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.