MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NetworkGeometryBuffer.hpp
Go to the documentation of this file.
1#pragma once
2
6
8
9namespace MayaFlux::Buffers {
10
11class RenderProcessor;
12
13/**
14 * @class NetworkGeometryBuffer
15 * @brief Specialized buffer for geometry from NodeNetwork instances
16 *
17 * Aggregates geometry from all nodes within a network into a single GPU buffer.
18 * Designed for networks like ParticleNetwork (1000+ PointNodes), PointCloudNetwork,
19 * and other multi-node generative systems.
20 *
21 * Philosophy:
22 * - Networks are collections of MANY nodes with relationships
23 * - This buffer aggregates all node geometry → single draw call
24 * - Supports dynamic growth as networks evolve
25 *
26 * Key Differences from GeometryBuffer:
27 * - Accepts NodeNetwork (not single GeometryWriterNode)
28 * - Aggregates vertices from ALL internal nodes
29 * - Handles network-specific processing patterns
30 *
31 * Usage:
32 * ```cpp
33 * // Create particle network with 1000 particles
34 * auto particles = std::make_shared<ParticleNetwork>(1000);
35 * particles->set_topology(Topology::SPATIAL);
36 * particles->set_output_mode(OutputMode::GRAPHICS_BIND);
37 *
38 * // Create buffer that aggregates all 1000 PointNodes
39 * auto buffer = std::make_shared<NetworkGeometryBuffer>(particles);
40 * buffer->setup_processors(ProcessingToken::VISUAL_RATE);
41 *
42 * // Render all particles in one draw call
43 * auto render = std::make_shared<RenderProcessor>(config);
44 * render->set_target_window(window);
45 * buffer->add_processor(render);
46 * ```
47 */
48class MAYAFLUX_API NetworkGeometryBuffer : public VKBuffer {
49public:
50 struct RenderConfig {
51 std::shared_ptr<Core::Window> target_window;
52 std::string vertex_shader = "point.vert.spv";
53 std::string fragment_shader = "point.frag.spv";
54 Portal::Graphics::PrimitiveTopology topology = Portal::Graphics::PrimitiveTopology::POINT_LIST;
55 Portal::Graphics::PolygonMode polygon_mode = Portal::Graphics::PolygonMode::FILL;
56 Portal::Graphics::CullMode cull_mode = Portal::Graphics::CullMode::NONE;
57 };
58 /**
59 * @brief Create geometry buffer from network
60 * @param network NodeNetwork containing geometry nodes (e.g., ParticleNetwork)
61 * @param binding_name Logical name for this geometry binding (default: "network_geometry")
62 * @param over_allocate_factor Buffer size multiplier for dynamic growth (default: 2.0x)
63 *
64 * Buffer size is calculated based on network node count and estimated vertex size.
65 * Higher over_allocate_factor recommended for networks that may grow dynamically.
66 */
67 explicit NetworkGeometryBuffer(
68 std::shared_ptr<Nodes::NodeNetwork> network,
69 const std::string& binding_name = "network_geometry",
70 float over_allocate_factor = 2.0F);
71
72 ~NetworkGeometryBuffer() override = default;
73
74 /**
75 * @brief Initialize the buffer and its processors
76 */
77 void setup_processors(ProcessingToken token) override;
78
79 /**
80 * @brief Get the network driving this buffer
81 */
82 [[nodiscard]] std::shared_ptr<Nodes::NodeNetwork> get_network() const
83 {
84 return m_network;
85 }
86
87 /**
88 * @brief Get the processor managing uploads
89 */
90 [[nodiscard]] std::shared_ptr<NetworkGeometryProcessor> get_processor() const
91 {
92 return m_processor;
93 }
94
95 /**
96 * @brief Get the logical binding name
97 */
98 [[nodiscard]] const std::string& get_binding_name() const
99 {
100 return m_binding_name;
101 }
102
103 /**
104 * @brief Get current vertex count (aggregated from all network nodes)
105 */
106 [[nodiscard]] uint32_t get_vertex_count() const;
107
108 /**
109 * @brief Trigger network processing
110 *
111 * Calls network->process_batch() to update physics/state.
112 * Geometry aggregation happens automatically in processor.
113 */
114 void update_network(unsigned int num_samples = 1)
115 {
116 if (m_network && m_network->is_enabled()) {
117 m_network->process_batch(num_samples);
118 }
119 }
120
121 /**
122 * @brief Setup rendering with RenderProcessor
123 * @param config Rendering configuration
124 */
125 void setup_rendering(const RenderConfig& config);
126
127 std::shared_ptr<RenderProcessor> get_render_processor() const
128 {
129 return m_render_processor;
130 }
131
132private:
133 std::shared_ptr<Nodes::NodeNetwork> m_network;
134 std::shared_ptr<NetworkGeometryProcessor> m_processor;
135 std::string m_binding_name;
136
137 std::shared_ptr<RenderProcessor> m_render_processor;
138
139 /**
140 * @brief Calculate initial buffer size based on network node count
141 */
142 static size_t calculate_buffer_size(
143 const std::shared_ptr<Nodes::NodeNetwork>& network,
144 float over_allocate_factor);
145};
146
147} // namespace MayaFlux::Buffers
static MayaFlux::Nodes::ProcessingToken token
Definition Timers.cpp:8
std::shared_ptr< Nodes::NodeNetwork > m_network
const std::string & get_binding_name() const
Get the logical binding name.
std::shared_ptr< NetworkGeometryProcessor > m_processor
std::shared_ptr< RenderProcessor > get_render_processor() const
std::shared_ptr< RenderProcessor > m_render_processor
std::shared_ptr< Nodes::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:52
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
PolygonMode
Rasterization polygon mode.
PrimitiveTopology
Vertex assembly primitive topology.