MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
GeometryWriterNode.cpp
Go to the documentation of this file.
2
4
6
7GeometryWriterNode::GeometryWriterNode(uint32_t initial_capacity)
8{
10
11 if (initial_capacity > 0 && m_vertex_stride == 0) {
12 m_vertex_stride = sizeof(glm::vec3);
13 }
14
15 if (initial_capacity > 0) {
16 m_vertex_buffer.resize(static_cast<size_t>(initial_capacity) * m_vertex_stride);
17 }
18}
19
20void GeometryWriterNode::resize_vertex_buffer(uint32_t vertex_count, bool preserve_data)
21{
22 if (m_vertex_stride == 0) {
24 "Cannot resize vertex buffer: stride is 0. Call set_vertex_stride() first");
25 return;
26 }
27
28 size_t new_size_bytes = static_cast<size_t>(vertex_count) * m_vertex_stride;
29
30 if (!preserve_data) {
31 m_vertex_buffer.clear();
32 m_vertex_buffer.resize(new_size_bytes, 0);
33 } else if (m_vertex_buffer.size() < new_size_bytes) {
34 m_vertex_buffer.resize(new_size_bytes, 0);
35 } else if (m_vertex_buffer.size() > new_size_bytes) {
36 m_vertex_buffer.resize(new_size_bytes);
37 }
38
39 m_vertex_count = vertex_count;
42
44 "GeometryWriterNode: Resized vertex buffer to {} vertices ({} bytes total)",
45 vertex_count, new_size_bytes);
46}
47
48void GeometryWriterNode::set_vertex_data(const void* data, size_t size_bytes)
49{
50 if (!data || size_bytes == 0) {
52 "Cannot set vertex data: null data or zero size");
53 return;
54 }
55
56 if (m_vertex_stride == 0) {
58 "Cannot set vertex data: stride is 0");
59 return;
60 }
61
62 auto expected_vertex_count = static_cast<uint32_t>(size_bytes / m_vertex_stride);
63
64 if (size_bytes % m_vertex_stride != 0) {
66 "Vertex data size {} is not multiple of stride {}",
67 size_bytes, m_vertex_stride);
68 }
69
70 if (m_vertex_buffer.size() < size_bytes) {
71 m_vertex_buffer.resize(size_bytes);
72 }
73
74 std::memcpy(m_vertex_buffer.data(), data, size_bytes);
75 m_vertex_count = expected_vertex_count;
78
80 "GeometryWriterNode: Set vertex data ({} vertices, {} bytes)",
81 m_vertex_count, size_bytes);
82}
83
84void GeometryWriterNode::set_vertex(uint32_t vertex_index, const void* data, size_t size_bytes)
85{
86 if (!data || size_bytes == 0) {
88 "Cannot set vertex: null data or zero size");
89 return;
90 }
91
92 if (m_vertex_stride == 0) {
94 "Cannot set vertex: stride is 0");
95 return;
96 }
97
98 if (vertex_index >= m_vertex_count) {
100 "Vertex index {} out of range (count: {})",
101 vertex_index, m_vertex_count);
102 return;
103 }
104
105 if (size_bytes > m_vertex_stride) {
107 "Vertex data size {} exceeds stride {}; truncating",
108 size_bytes, m_vertex_stride);
109 size_bytes = m_vertex_stride;
110 }
111
112 const size_t offset = static_cast<size_t>(vertex_index) * m_vertex_stride;
113
114 if (offset + size_bytes > m_vertex_buffer.size()) {
116 "Vertex {} lies beyond the vertex buffer ({} bytes)",
117 vertex_index, m_vertex_buffer.size());
118 return;
119 }
120
121 std::memcpy(m_vertex_buffer.data() + offset, data, size_bytes);
122
124 "GeometryWriterNode: Set vertex {} ({} bytes)", vertex_index, size_bytes);
125
126 m_vertex_data_dirty = true;
127}
128
129void GeometryWriterNode::set_indices(std::span<const uint32_t> indices)
130{
131 m_index_buffer.assign(indices.begin(), indices.end());
132 m_vertex_data_dirty = true;
133
135 "GeometryWriterNode: Set index buffer ({} indices, {} bytes)",
136 m_index_buffer.size(), m_index_buffer.size() * sizeof(uint32_t));
137}
138
140{
141 return m_vertex_buffer.size();
142}
143
145{
146 m_vertex_stride = stride;
148}
149
150std::span<const uint8_t> GeometryWriterNode::get_vertex(uint32_t vertex_index) const
151{
152 if (m_vertex_stride == 0 || m_vertex_count == 0) {
153 return {};
154 }
155
156 if (vertex_index >= m_vertex_count) {
158 "Vertex index {} out of range (count: {})",
159 vertex_index, m_vertex_count);
160 return {};
161 }
162
163 const size_t offset = static_cast<size_t>(vertex_index) * m_vertex_stride;
164
165 if (offset + m_vertex_stride > m_vertex_buffer.size()) {
166 return {};
167 }
168
169 return { m_vertex_buffer.data() + offset, m_vertex_stride };
170}
171
172std::span<const uint32_t> GeometryWriterNode::get_index_data() const
173{
174 return std::span<const uint32_t> { m_index_buffer.data(), m_index_buffer.size() };
175}
176
178{
179 std::ranges::fill(m_vertex_buffer, 0);
180
181 if (!m_index_buffer.empty()) {
182 std::ranges::fill(m_index_buffer, 0);
183 }
184
185 m_vertex_data_dirty = true;
186}
187
188void GeometryWriterNode::clear_and_resize(uint32_t vertex_count)
189{
190 resize_vertex_buffer(vertex_count, false);
191}
192
193std::vector<double> GeometryWriterNode::process_batch(unsigned int num_samples)
194{
196
197 return std::vector<double>(num_samples, 0.0);
198}
199
201{
202 GeometryState state;
208
209 m_saved_state = std::move(state);
210
212 "GeometryWriterNode: Saved state ({} vertices, {} bytes)",
213 m_vertex_count, m_vertex_buffer.size() * sizeof(uint8_t));
214}
215
217{
218 if (!m_saved_state.has_value()) {
220 "GeometryWriterNode: No saved state to restore");
221 return;
222 }
223
224 m_vertex_buffer = m_saved_state->vertex_buffer;
225 m_vertex_count = m_saved_state->vertex_count;
226 m_vertex_stride = m_saved_state->vertex_stride;
227 m_vertex_layout = m_saved_state->vertex_layout;
228 m_index_buffer = m_saved_state->index_buffer;
229
231
233 "GeometryWriterNode: Restored state ({} vertices, {} bytes)",
234 m_vertex_count, m_vertex_buffer.size() * sizeof(uint8_t));
235}
236
246
251
252} // namespace MayaFlux::Nodes
#define MF_ERROR(comp, ctx,...)
#define MF_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
uint64_t offset
Definition Composite.cpp:10
std::vector< uint32_t > indices
glm::vec3 value
std::span< const uint8_t > m_gpu_data
GeometryWriterNode(uint32_t initial_capacity=1024)
Constructor.
void save_state() override
Save current geometry state.
std::span< const uint8_t > get_vertex(uint32_t vertex_index) const
Get a single vertex by index.
void restore_state() override
Restore saved geometry state.
std::vector< uint8_t > m_vertex_buffer
Vertex data buffer (flat array of bytes)
bool m_vertex_data_dirty
Flag: vertex data or layout changed since last GPU upload.
void clear()
Clear vertex buffer and reset count.
size_t get_vertex_buffer_size_bytes() const
Get vertex buffer size in bytes.
std::vector< double > process_batch(unsigned int num_samples) override
Process batch for geometry generation.
std::span< const uint32_t > get_index_data() const
Get raw index buffer data.
void clear_and_resize(uint32_t vertex_count)
Clear vertex buffer and resize to specified count.
size_t m_vertex_stride
Bytes per vertex (stride for vertex buffer binding)
void set_indices(std::span< const uint32_t > indices)
Set index buffer for indexed drawing.
std::optional< Kakshya::VertexLayout > m_vertex_layout
Cached vertex layout for descriptor binding.
NodeContext & get_last_context() override
Retrieves the last created context object.
std::vector< uint32_t > m_index_buffer
Optional index buffer for indexed drawing (not used by default)
void set_vertex_data(const void *data, size_t size_bytes)
Copy raw vertex data into buffer.
void resize_vertex_buffer(uint32_t vertex_count, bool preserve_data=false)
Resize vertex buffer to hold specified number of vertices.
void set_vertex_stride(size_t stride)
Set vertex stride (bytes per vertex)
bool m_needs_layout_update
Flag indicating if layout needs update.
void update_context(double value) override
Updates the context object with the current node state.
uint32_t m_vertex_count
Number of vertices in buffer.
void set_vertex(uint32_t vertex_index, const void *data, size_t size_bytes)
Set a single vertex by index.
virtual void compute_frame()=0
Compute GPU data for this frame.
double value
Current sample value.
Definition Node.hpp:63
Base context class for node callbacks.
Definition Node.hpp:53
uint8_t m_node_capability
Bitmask of capabilities declared by this node.
Definition Node.hpp:506
@ NodeProcessing
Node graph processing (Nodes::NodeGraphManager)
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.
@ STRUCTURED
Context also implements GpuStructuredData.
Definition NodeSpec.hpp:113