17 std::span<const uint8_t> vertex_data,
19 uint32_t vertex_count)
22 , vertex_count(vertex_count)
23 , vertex_stride(vertex_stride)
76 uint32_t m_vertex_count {};
79 size_t m_vertex_stride {};
85 bool m_needs_layout_update {};
94 bool m_vertex_data_dirty {
true };
113 std::vector<double> process_batch(
unsigned int num_samples)
override;
119 [[nodiscard]] std::span<const uint8_t>
get_vertex_data()
const {
return m_vertex_buffer; }
127 [[nodiscard]] std::span<const uint32_t> get_index_data()
const;
133 [[nodiscard]]
size_t get_vertex_buffer_size_bytes()
const;
153 [[nodiscard]] uint32_t
get_index_count()
const {
return static_cast<uint32_t
>(m_index_buffer.size()); }
159 [[nodiscard]]
bool has_indices()
const {
return !m_index_buffer.empty(); }
170 void set_vertex_stride(
size_t stride);
180 void resize_vertex_buffer(uint32_t vertex_count,
bool preserve_data =
false);
190 void set_vertex_data(
const void* data,
size_t size_bytes);
200 void set_vertex(uint32_t vertex_index,
const void* data,
size_t size_bytes);
207 [[nodiscard]] std::span<const uint8_t> get_vertex(uint32_t vertex_index)
const;
216 template <
typename T>
219 set_vertex_stride(
sizeof(T));
220 resize_vertex_buffer(vertices.size());
221 std::memcpy(m_vertex_buffer.data(), vertices.data(),
222 vertices.size() *
sizeof(T));
223 m_vertex_count =
static_cast<uint32_t
>(vertices.size());
224 m_needs_layout_update =
true;
225 m_vertex_data_dirty =
true;
234 void set_indices(std::span<const uint32_t> indices);
242 template <
typename T>
245 set_vertex(index, &vertex,
sizeof(T));
254 template <
typename T>
257 auto data = get_vertex(index);
258 if (data.size_bytes() <
sizeof(T)) {
262 std::memcpy(&result, data.data(),
sizeof(T));
275 void clear_and_resize(uint32_t vertex_count);
290 [[nodiscard]] std::optional<Kakshya::VertexLayout>
get_vertex_layout()
const {
return m_vertex_layout; }
309 void save_state()
override;
317 void restore_state()
override;
328 return m_vertex_data_dirty || m_needs_layout_update;
354 m_vertex_data_dirty =
false;
355 m_needs_layout_update =
false;
372 void update_context(
double value)
override;
381 return Portal::Graphics::PrimitiveTopology::POINT_LIST;
385#ifdef MAYAFLUX_PLATFORM_MACOS
391 static std::vector<LineVertex> expand_lines_to_triangles(
392 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.
uint32_t get_index_count() const
Get number of indices in index buffer.
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.
std::vector< uint32_t > m_index_buffer
Optional index buffer for indexed drawing (not used by default)
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.
bool has_indices() const
Check if index buffer has been set.
~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
std::vector< uint32_t > index_buffer