MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NetworkGeometryProcessor.hpp
Go to the documentation of this file.
1#pragma once
2
5
6namespace MayaFlux::Nodes {
7class NodeNetwork;
8class ParticleNetwork;
9} // namespace MayaFlux::Nodes
10
11namespace MayaFlux::Buffers {
12
13/**
14 * @class NetworkGeometryProcessor
15 * @brief BufferProcessor that aggregates geometry from NodeNetwork nodes
16 *
17 * Extracts geometry from all nodes within a network and uploads to GPU as
18 * a single vertex buffer. Handles network-specific patterns like ParticleNetwork
19 * (many PointNodes) and PointCloudNetwork.
20 *
21 * Key Differences from GeometryBindingsProcessor:
22 * - Operates on NodeNetwork (not single GeometryWriterNode)
23 * - Aggregates vertices from ALL internal nodes
24 * - Type-aware: special handling for ParticleNetwork, PointCloudNetwork, etc.
25 *
26 * Behavior:
27 * - Extracts ALL node geometry from bound networks
28 * - Aggregates into single vertex buffer
29 * - Uses staging buffer for device-local targets
30 * - Supports multiple network bindings (different networks → different buffers)
31 *
32 * Usage:
33 * ```cpp
34 * auto particles = std::make_shared<ParticleNetwork>(1000);
35 * auto vertex_buffer = std::make_shared<VKBuffer>(...);
36 *
37 * auto processor = std::make_shared<NetworkGeometryProcessor>();
38 * processor->bind_network("particles", particles, vertex_buffer);
39 *
40 * vertex_buffer->set_default_processor(processor);
41 * vertex_buffer->process_default(); // Aggregates all 1000 PointNodes → GPU
42 * ```
43 */
44class MAYAFLUX_API NetworkGeometryProcessor : public VKBufferProcessor {
45public:
47
48 /**
49 * @brief Structure representing a network geometry binding
50 */
52 std::shared_ptr<Nodes::NodeNetwork> network;
53 std::shared_ptr<VKBuffer> gpu_vertex_buffer;
54 std::shared_ptr<VKBuffer> staging_buffer;
55 };
56
57 /**
58 * @brief Bind a network to a GPU vertex buffer
59 * @param name Logical name for this binding
60 * @param network NodeNetwork to aggregate geometry from
61 * @param vertex_buffer GPU vertex buffer to upload to
62 *
63 * If vertex_buffer is device-local, a staging buffer is automatically created.
64 */
65 void bind_network(
66 const std::string& name,
67 const std::shared_ptr<Nodes::NodeNetwork>& network,
68 const std::shared_ptr<VKBuffer>& vertex_buffer);
69
70 /**
71 * @brief Remove a network binding
72 * @param name Name of binding to remove
73 */
74 void unbind_network(const std::string& name);
75
76 /**
77 * @brief Check if a binding exists
78 * @param name Binding name
79 * @return True if binding exists
80 */
81 [[nodiscard]] bool has_binding(const std::string& name) const;
82
83 /**
84 * @brief Get all binding names
85 * @return Vector of binding names
86 */
87 [[nodiscard]] std::vector<std::string> get_binding_names() const;
88
89 /**
90 * @brief Get number of active bindings
91 * @return Binding count
92 */
93 [[nodiscard]] size_t get_binding_count() const;
94
95 /**
96 * @brief Get a specific binding
97 * @param name Binding name
98 * @return Optional containing binding if exists
99 */
100 [[nodiscard]] std::optional<NetworkBinding> get_binding(const std::string& name) const;
101
102 /**
103 * @brief BufferProcessor interface - aggregates and uploads network geometry
104 * @param buffer The buffer this processor is attached to
105 *
106 * For each bound network:
107 * 1. Extract vertices from all internal nodes
108 * 2. Aggregate into single vertex array
109 * 3. Upload to GPU vertex buffer
110 */
111 void processing_function(std::shared_ptr<Buffer> buffer) override;
112
113private:
114 std::unordered_map<std::string, NetworkBinding> m_bindings;
115
116 /**
117 * @brief Extract vertices from ParticleNetwork
118 * @return Vector of aggregated PointVertex data
119 */
120 std::vector<Nodes::GpuSync::PointVertex> extract_particle_vertices(
121 const std::shared_ptr<Nodes::ParticleNetwork>& network);
122
123 /**
124 * @brief Extract vertices from generic NodeNetwork (fallback)
125 * @return Vector of aggregated vertex data
126 *
127 * Attempts to cast internal nodes to PointNode and extract geometry.
128 * For custom network types, extend this with type-specific logic.
129 */
130 std::vector<Nodes::GpuSync::PointVertex> extract_network_vertices(
131 const std::shared_ptr<Nodes::NodeNetwork>& network);
132};
133
134} // namespace MayaFlux::Buffers
std::unordered_map< std::string, NetworkBinding > m_bindings
BufferProcessor that aggregates geometry from NodeNetwork nodes.
Contains the node-based computational processing system components.
Definition Chronie.hpp:5
Structure representing a network geometry binding.