MayaFlux 0.3.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+ PointNodes), 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 PointNodes
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 std::shared_ptr<RenderProcessor> get_render_processor() const
118 {
119 return m_render_processor;
120 }
121
122private:
123 std::shared_ptr<Nodes::Network::NodeNetwork> m_network;
124 std::shared_ptr<NetworkGeometryProcessor> m_processor;
125 std::string m_binding_name;
126
127 std::shared_ptr<RenderProcessor> m_render_processor;
128
129 /**
130 * @brief Calculate initial buffer size based on network node count
131 */
132 static size_t calculate_buffer_size(
133 const std::shared_ptr<Nodes::Network::NodeNetwork>& network,
134 float over_allocate_factor);
135};
136
137} // namespace MayaFlux::Buffers
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< RenderProcessor > get_render_processor() const
std::shared_ptr< RenderProcessor > m_render_processor
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:52
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.