15 std::span<const uint8_t> vertex_data,
17 uint32_t vertex_count)
20 , vertex_count(vertex_count)
21 , vertex_stride(vertex_stride)
71 uint32_t m_vertex_count {};
74 size_t m_vertex_stride {};
80 bool m_needs_layout_update {};
89 bool m_vertex_data_dirty {
true };
108 std::vector<double> process_batch(
unsigned int num_samples)
override;
114 [[nodiscard]] std::span<const uint8_t>
get_vertex_data()
const {
return m_vertex_buffer; }
120 [[nodiscard]]
size_t get_vertex_buffer_size_bytes()
const;
143 void set_vertex_stride(
size_t stride);
153 void resize_vertex_buffer(uint32_t vertex_count,
bool preserve_data =
false);
163 void set_vertex_data(
const void* data,
size_t size_bytes);
173 void set_vertex(uint32_t vertex_index,
const void* data,
size_t size_bytes);
180 [[nodiscard]] std::span<const uint8_t> get_vertex(uint32_t vertex_index)
const;
189 template <
typename T>
192 set_vertex_stride(
sizeof(T));
193 resize_vertex_buffer(vertices.size());
194 std::memcpy(m_vertex_buffer.data(), vertices.data(),
195 vertices.size() *
sizeof(T));
196 m_vertex_count =
static_cast<uint32_t
>(vertices.size());
197 m_needs_layout_update =
true;
198 m_vertex_data_dirty =
true;
207 template <
typename T>
210 set_vertex(index, &vertex,
sizeof(T));
219 template <
typename T>
222 auto data = get_vertex(index);
223 if (data.size_bytes() <
sizeof(T)) {
227 std::memcpy(&result, data.data(),
sizeof(T));
240 void clear_and_resize(uint32_t vertex_count);
255 [[nodiscard]] std::optional<Kakshya::VertexLayout>
get_vertex_layout()
const {
return m_vertex_layout; }
274 void save_state()
override;
282 void restore_state()
override;
293 return m_vertex_data_dirty || m_needs_layout_update;
304 m_vertex_data_dirty =
false;
305 m_needs_layout_update =
false;
322 void update_context(
double value)
override;
GPU-uploadable structured data (arrays of POD structs)
GeometryContext(double value, std::span< const uint8_t > vertex_data, size_t vertex_stride, uint32_t vertex_count)
Context for GeometryWriterNode - provides vertex buffer access.
uint32_t get_vertex_count() const
Get number of vertices.
std::vector< uint8_t > m_vertex_buffer
Vertex data buffer (flat array of bytes)
void clear_gpu_update_flag() override
Clear the dirty flag after GPU upload completes.
bool needs_layout_update() const
Check if layout needs update.
std::optional< Kakshya::VertexLayout > get_vertex_layout() const
Get cached vertex layout.
void set_vertex_layout(const Kakshya::VertexLayout &layout)
Set cached vertex layout.
std::optional< GeometryState > m_saved_state
void set_vertices(std::span< const T > vertices)
Set multiple vertices from typed array.
std::optional< Kakshya::VertexLayout > m_vertex_layout
Cached vertex layout for descriptor binding.
void clear_layout_update_flag()
Clear layout update flag.
size_t get_vertex_stride() const
Get stride (bytes per vertex)
bool needs_gpu_update() const override
Check if vertex data or layout changed since last GPU sync.
~GeometryWriterNode() override=default
void set_vertex_typed(uint32_t index, const T &vertex)
Set a single vertex by index from typed data.
std::span< const uint8_t > get_vertex_data() const
Get raw vertex buffer data.
T get_vertex_typed(uint32_t index) const
Get a single vertex by index as typed data.
Base class for nodes that generate 3D geometry data.
Base context class for node callbacks.
Complete description of vertex data layout in a buffer.
std::vector< uint8_t > vertex_buffer
std::optional< Kakshya::VertexLayout > vertex_layout