17 std::span<const uint8_t> vertex_data,
19 uint32_t vertex_count)
22 , vertex_count(vertex_count)
23 , vertex_stride(vertex_stride)
73 uint32_t m_vertex_count {};
76 size_t m_vertex_stride {};
82 bool m_needs_layout_update {};
91 bool m_vertex_data_dirty {
true };
110 std::vector<double> process_batch(
unsigned int num_samples)
override;
116 [[nodiscard]] std::span<const uint8_t>
get_vertex_data()
const {
return m_vertex_buffer; }
122 [[nodiscard]]
size_t get_vertex_buffer_size_bytes()
const;
145 void set_vertex_stride(
size_t stride);
155 void resize_vertex_buffer(uint32_t vertex_count,
bool preserve_data =
false);
165 void set_vertex_data(
const void* data,
size_t size_bytes);
175 void set_vertex(uint32_t vertex_index,
const void* data,
size_t size_bytes);
182 [[nodiscard]] std::span<const uint8_t> get_vertex(uint32_t vertex_index)
const;
191 template <
typename T>
194 set_vertex_stride(
sizeof(T));
195 resize_vertex_buffer(vertices.size());
196 std::memcpy(m_vertex_buffer.data(), vertices.data(),
197 vertices.size() *
sizeof(T));
198 m_vertex_count =
static_cast<uint32_t
>(vertices.size());
199 m_needs_layout_update =
true;
200 m_vertex_data_dirty =
true;
209 template <
typename T>
212 set_vertex(index, &vertex,
sizeof(T));
221 template <
typename T>
224 auto data = get_vertex(index);
225 if (data.size_bytes() <
sizeof(T)) {
229 std::memcpy(&result, data.data(),
sizeof(T));
242 void clear_and_resize(uint32_t vertex_count);
257 [[nodiscard]] std::optional<Kakshya::VertexLayout>
get_vertex_layout()
const {
return m_vertex_layout; }
276 void save_state()
override;
284 void restore_state()
override;
295 return m_vertex_data_dirty || m_needs_layout_update;
321 m_vertex_data_dirty =
false;
322 m_needs_layout_update =
false;
339 void update_context(
double value)
override;
348 return Portal::Graphics::PrimitiveTopology::POINT_LIST;
352#ifdef MAYAFLUX_PLATFORM_MACOS
358 static std::vector<LineVertex> expand_lines_to_triangles(
359 const std::vector<LineVertex>& line_segments);
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.
bool needs_vertex_data_update() const
Check if vertex data has changed since last GPU sync.
virtual Portal::Graphics::PrimitiveTopology get_primitive_topology() const
Get primitive topology for rendering.
std::vector< uint8_t > m_vertex_buffer
Vertex data buffer (flat array of bytes)
void mark_vertex_data_dirty(bool state)
Set vertex data dirty flag.
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.
PrimitiveTopology
Vertex assembly primitive topology.
Complete description of vertex data layout in a buffer.
std::vector< uint8_t > vertex_buffer
std::optional< Kakshya::VertexLayout > vertex_layout