47 uint32_t m_vertex_count {};
50 size_t m_vertex_stride {};
56 bool m_needs_layout_update {};
65 bool m_vertex_data_dirty {
true };
84 std::vector<double> process_batch(
unsigned int num_samples)
override;
90 [[nodiscard]] std::span<const uint8_t>
get_vertex_data()
const {
return m_vertex_buffer; }
96 [[nodiscard]]
size_t get_vertex_buffer_size_bytes()
const;
119 void set_vertex_stride(
size_t stride);
129 void resize_vertex_buffer(uint32_t vertex_count,
bool preserve_data =
false);
139 void set_vertex_data(
const void* data,
size_t size_bytes);
149 void set_vertex(uint32_t vertex_index,
const void* data,
size_t size_bytes);
156 [[nodiscard]] std::span<const uint8_t> get_vertex(uint32_t vertex_index)
const;
165 template <
typename T>
168 set_vertex_stride(
sizeof(T));
169 resize_vertex_buffer(vertices.size());
170 std::memcpy(m_vertex_buffer.data(), vertices.data(),
171 vertices.size() *
sizeof(T));
172 m_vertex_count =
static_cast<uint32_t
>(vertices.size());
173 m_needs_layout_update =
true;
174 m_vertex_data_dirty =
true;
183 template <
typename T>
186 set_vertex(index, &vertex,
sizeof(T));
195 template <
typename T>
198 auto data = get_vertex(index);
199 if (data.size_bytes() <
sizeof(T)) {
203 std::memcpy(&result, data.data(),
sizeof(T));
216 void clear_and_resize(uint32_t vertex_count);
231 [[nodiscard]] std::optional<Kakshya::VertexLayout>
get_vertex_layout()
const {
return m_vertex_layout; }
250 void save_state()
override;
258 void restore_state()
override;
269 return m_vertex_data_dirty || m_needs_layout_update;
280 m_vertex_data_dirty =
false;
281 m_needs_layout_update =
false;
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.
Complete description of vertex data layout in a buffer.
std::vector< uint8_t > vertex_buffer
std::optional< Kakshya::VertexLayout > vertex_layout