MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
GeometryBuffer.hpp
Go to the documentation of this file.
1#pragma once
2
6
8
9namespace MayaFlux::Buffers {
10
11class RenderProcessor;
12
13/**
14 * @class GeometryBuffer
15 * @brief Specialized buffer for generative geometry from GeometryWriterNode
16 *
17 * Automatically handles CPU→GPU upload of procedurally generated vertices.
18 * Designed for algorithmic geometry generation: particles, simulations,
19 * procedural meshes, data visualizations, etc.
20 *
21 * Philosophy:
22 * - Geometry is GENERATED, not loaded from files
23 * - Data flows from algorithm → GPU → screen
24 * - No primitive worship - users create their own forms
25 *
26 * Usage:
27 * class ParticleSystem : public GeometryWriterNode {
28 * void compute_frame() override {
29 * // Generate 1000 particle positions algorithmically
30 * for (int i = 0; i < 1000; i++) {
31 * positions[i] = simulate_physics(i);
32 * }
33 * update_vertex_buffer(positions);
34 * }
35 * };
36 *
37 * auto particles = std::make_shared<ParticleSystem>(1000);
38 * auto buffer = std::make_shared<GeometryBuffer>(particles);
39 *
40 * auto render = std::make_shared<RenderProcessor>(config);
41 * render->set_fragment_shader("particle.frag");
42 * render->set_target_window(window);
43 *
44 * buffer->add_processor(render) | Graphics;
45 */
46class MAYAFLUX_API GeometryBuffer : public VKBuffer {
47public:
48 struct RenderConfig {
49 std::shared_ptr<Core::Window> target_window;
50 std::string vertex_shader = "point.vert.spv";
51 std::string fragment_shader = "point.frag.spv";
52 Portal::Graphics::PrimitiveTopology topology = Portal::Graphics::PrimitiveTopology::POINT_LIST;
53 Portal::Graphics::PolygonMode polygon_mode = Portal::Graphics::PolygonMode::FILL;
54 Portal::Graphics::CullMode cull_mode = Portal::Graphics::CullMode::NONE;
55 };
56
57 /**
58 * @brief Create geometry buffer from generative node
59 * @param node GeometryWriterNode that generates vertices each frame
60 * @param binding_name Logical name for this geometry binding (default: "geometry")
61 * @param over_allocate_factor Buffer size multiplier for dynamic growth (default: 1.5x)
62 *
63 * Buffer size is initially set to node->get_vertex_buffer_size_bytes().
64 * If over_allocate_factor > 1.0, buffer will be larger to accommodate growth
65 * without reallocation.
66 */
67 explicit GeometryBuffer(
68 std::shared_ptr<Nodes::GpuSync::GeometryWriterNode> node,
69 const std::string& binding_name = "geometry",
70 float over_allocate_factor = 1.5f);
71
72 ~GeometryBuffer() 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 geometry node driving this buffer
81 */
82 [[nodiscard]] std::shared_ptr<Nodes::GpuSync::GeometryWriterNode> get_geometry_node() const
83 {
84 return m_geometry_node;
85 }
86
87 /**
88 * @brief Get the bindings processor managing uploads
89 */
90 [[nodiscard]] std::shared_ptr<GeometryBindingsProcessor> get_bindings_processor() const
91 {
92 return m_bindings_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 from node
105 */
106 [[nodiscard]] uint32_t get_vertex_count() const
107 {
108 return m_geometry_node ? m_geometry_node->get_vertex_count() : 0;
109 }
110
111 /**
112 * @brief Trigger vertex computation on the node
113 *
114 * Calls node->compute_frame() to regenerate geometry.
115 * Useful for explicit frame updates when not using domain-driven processing.
116 */
118 {
119 if (m_geometry_node) {
120 m_geometry_node->compute_frame();
121 }
122 }
123
124 /**
125 * @brief Setup rendering with RenderProcessor
126 * @param config Rendering configuration
127 */
128 void setup_rendering(const RenderConfig& config);
129
130 std::shared_ptr<RenderProcessor> get_render_processor() const
131 {
132 return m_render_processor;
133 }
134
135private:
136 std::shared_ptr<Nodes::GpuSync::GeometryWriterNode> m_geometry_node;
137 std::shared_ptr<GeometryBindingsProcessor> m_bindings_processor;
138 std::string m_binding_name;
139
140 std::shared_ptr<RenderProcessor> m_render_processor;
141
142 /**
143 * @brief Calculate initial buffer size with optional over-allocation
144 */
145 static size_t calculate_buffer_size(
146 const std::shared_ptr<Nodes::GpuSync::GeometryWriterNode>& node,
147 float over_allocate_factor);
148};
149
150} // namespace MayaFlux::Buffers
static MayaFlux::Nodes::ProcessingToken token
Definition Timers.cpp:8
std::shared_ptr< RenderProcessor > get_render_processor() const
std::shared_ptr< Nodes::GpuSync::GeometryWriterNode > get_geometry_node() const
Get the geometry node driving this buffer.
const std::string & get_binding_name() const
Get the logical binding name.
std::shared_ptr< Nodes::GpuSync::GeometryWriterNode > m_geometry_node
std::shared_ptr< RenderProcessor > m_render_processor
~GeometryBuffer() override=default
void update_geometry()
Trigger vertex computation on the node.
std::shared_ptr< GeometryBindingsProcessor > m_bindings_processor
std::shared_ptr< GeometryBindingsProcessor > get_bindings_processor() const
Get the bindings processor managing uploads.
uint32_t get_vertex_count() const
Get current vertex count from node.
Specialized buffer for generative geometry from GeometryWriterNode.
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.
std::shared_ptr< Core::Window > target_window