MayaFlux 0.1.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{
9 if (initial_capacity > 0 && m_vertex_stride == 0) {
10 m_vertex_stride = sizeof(glm::vec3);
11 }
12
13 if (initial_capacity > 0) {
14 m_vertex_buffer.resize(initial_capacity * m_vertex_stride / sizeof(float));
15 }
16}
17
18void GeometryWriterNode::resize_vertex_buffer(uint32_t vertex_count, bool preserve_data)
19{
20 if (m_vertex_stride == 0) {
22 "Cannot resize vertex buffer: stride is 0. Call set_vertex_stride() first");
23 return;
24 }
25
26 size_t new_size_bytes = static_cast<size_t>(vertex_count) * m_vertex_stride;
27
28 if (!preserve_data) {
29 m_vertex_buffer.clear();
30 m_vertex_buffer.resize(new_size_bytes, 0.0F);
31 } else if (m_vertex_buffer.size() < new_size_bytes) {
32 m_vertex_buffer.resize(new_size_bytes, 0.0F);
33 } else if (m_vertex_buffer.size() > new_size_bytes) {
34 m_vertex_buffer.resize(new_size_bytes);
35 }
36
37 m_vertex_count = vertex_count;
40
42 "GeometryWriterNode: Resized vertex buffer to {} vertices ({} bytes total)",
43 vertex_count, new_size_bytes * sizeof(float));
44}
45
46void GeometryWriterNode::set_vertex_data(const void* data, size_t size_bytes)
47{
48 if (!data || size_bytes == 0) {
50 "Cannot set vertex data: null data or zero size");
51 return;
52 }
53
54 if (m_vertex_stride == 0) {
56 "Cannot set vertex data: stride is 0");
57 return;
58 }
59
60 auto expected_vertex_count = static_cast<uint32_t>(size_bytes / m_vertex_stride);
61
62 if (size_bytes % m_vertex_stride != 0) {
64 "Vertex data size {} is not multiple of stride {}",
65 size_bytes, m_vertex_stride);
66 }
67
68 size_t required_floats = size_bytes / sizeof(float);
69 if (m_vertex_buffer.size() < required_floats) {
70 m_vertex_buffer.resize(required_floats);
71 }
72
73 std::memcpy(m_vertex_buffer.data(), data, size_bytes);
74 m_vertex_count = expected_vertex_count;
77
79 "GeometryWriterNode: Set vertex data ({} vertices, {} bytes)",
80 m_vertex_count, size_bytes);
81}
82
83void GeometryWriterNode::set_vertex(uint32_t vertex_index, const void* data, size_t size_bytes)
84{
85 if (!data || size_bytes == 0) {
87 "Cannot set vertex: null data or zero size");
88 return;
89 }
90
91 if (m_vertex_stride == 0) {
93 "Cannot set vertex: stride is 0");
94 return;
95 }
96
97 if (vertex_index >= m_vertex_count) {
99 "Vertex index {} out of range (count: {})",
100 vertex_index, m_vertex_count);
101 return;
102 }
103
104 if (size_bytes > m_vertex_stride) {
106 "Vertex data size {} exceeds stride {}; truncating",
107 size_bytes, m_vertex_stride);
108 size_bytes = m_vertex_stride;
109 }
110
111 size_t offset_floats = (static_cast<size_t>(vertex_index) * m_vertex_stride) / sizeof(float);
112
113 std::memcpy(
114 reinterpret_cast<uint8_t*>(m_vertex_buffer.data()) + (offset_floats * sizeof(float)),
115 data,
116 size_bytes);
117
119 "GeometryWriterNode: Set vertex {} ({} bytes)", vertex_index, size_bytes);
120
121 m_vertex_data_dirty = true;
122}
123
125{
126 return m_vertex_buffer.size();
127}
128
130{
131 m_vertex_stride = stride;
133}
134
135std::span<const uint8_t> GeometryWriterNode::get_vertex(uint32_t vertex_index) const
136{
137 if (m_vertex_stride == 0 || m_vertex_count == 0) {
138 return {};
139 }
140
141 if (vertex_index >= m_vertex_count) {
143 "Vertex index {} out of range (count: {})",
144 vertex_index, m_vertex_count);
145 return {};
146 }
147
148 size_t offset_floats = (static_cast<size_t>(vertex_index) * m_vertex_stride) / sizeof(float);
149 size_t stride_floats = m_vertex_stride / sizeof(float);
150
151 if (offset_floats + stride_floats > m_vertex_buffer.size()) {
152 return {};
153 }
154
155 return { m_vertex_buffer.data() + offset_floats, stride_floats };
156}
157
159{
160 std::ranges::fill(m_vertex_buffer, 0);
161
162 m_vertex_data_dirty = true;
163}
164
165void GeometryWriterNode::clear_and_resize(uint32_t vertex_count)
166{
167 resize_vertex_buffer(vertex_count, false);
168}
169
170std::vector<double> GeometryWriterNode::process_batch(unsigned int num_samples)
171{
173
174 return std::vector<double>(num_samples, 0.0);
175}
176
178{
179 GeometryState state;
184
185 m_saved_state = std::move(state);
186
188 "GeometryWriterNode: Saved state ({} vertices, {} bytes)",
189 m_vertex_count, m_vertex_buffer.size() * sizeof(uint8_t));
190}
191
193{
194 if (!m_saved_state.has_value()) {
196 "GeometryWriterNode: No saved state to restore");
197 return;
198 }
199
200 m_vertex_buffer = m_saved_state->vertex_buffer;
201 m_vertex_count = m_saved_state->vertex_count;
202 m_vertex_stride = m_saved_state->vertex_stride;
203 m_vertex_layout = m_saved_state->vertex_layout;
204
206
208 "GeometryWriterNode: Restored state ({} vertices, {} bytes)",
209 m_vertex_count, m_vertex_buffer.size() * sizeof(uint8_t));
210}
211
212} // namespace MayaFlux::Nodes
#define MF_ERROR(comp, ctx,...)
#define MF_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
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.
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)
std::optional< Kakshya::VertexLayout > m_vertex_layout
Cached vertex layout for descriptor binding.
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.
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.
@ NodeProcessing
Node graph processing (Nodes::NodeGraphManager)
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.