MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
PointCollectionNode.cpp
Go to the documentation of this file.
3
5
7 : GeometryWriterNode(static_cast<uint32_t>(initial_capacity))
8{
9 m_points.reserve(initial_capacity);
10 const auto& stride = sizeof(PointVertex);
11 set_vertex_stride(stride);
12 auto layout = Kakshya::VertexLayout::for_points(stride);
13
14 layout.vertex_count = 0;
15 set_vertex_layout(layout);
16
17 resize_vertex_buffer(static_cast<uint32_t>(initial_capacity), false);
18
20 "Created PointCollectionNode with capacity for {} points", initial_capacity);
21}
22
23PointCollectionNode::PointCollectionNode(std::vector<PointVertex> points)
24 : GeometryWriterNode(static_cast<uint32_t>(points.size()))
25 , m_points(std::move(points))
26{
27 const auto& stride = sizeof(PointVertex);
28 set_vertex_stride(stride);
29 auto layout = Kakshya::VertexLayout::for_points(stride);
30 layout.vertex_count = static_cast<uint32_t>(m_points.size());
31 set_vertex_layout(layout);
32
33 resize_vertex_buffer(static_cast<uint32_t>(m_points.size()), false);
34
36 "Created PointCollectionNode with {} points", m_points.size());
37}
38
40{
41 m_points.push_back(point);
44}
45
46void PointCollectionNode::add_points(const std::vector<PointVertex>& points)
47{
48 m_points.insert(m_points.end(), points.begin(), points.end());
51}
52
53void PointCollectionNode::set_points(const std::vector<PointVertex>& points)
54{
55 m_points.clear();
56 m_points = points;
59}
60
61void PointCollectionNode::update_point(size_t index, const PointVertex& point)
62{
63 if (index < m_points.size()) {
64 m_points[index] = point;
66 } else {
68 "Point index {} out of range (count: {})", index, m_points.size());
69 }
70}
71
73{
74 if (index < m_points.size()) {
75 return m_points[index];
76 }
78 "Point index {} out of range, returning zero", index);
79 return {};
80}
81
88
90{
91 if (m_points.empty()) {
92 resize_vertex_buffer(0, false);
93 return;
94 }
95
96 if (get_vertex_count() != m_points.size()) {
97 resize_vertex_buffer(static_cast<uint32_t>(m_points.size()), false);
98 }
99
100 set_vertices<PointVertex>(std::span { m_points.data(), m_points.size() });
101
102 if (auto layout = get_vertex_layout()) {
103 layout->vertex_count = static_cast<uint32_t>(m_points.size());
104 set_vertex_layout(*layout);
105 }
106
108 "PointSourceNode: Uploaded {} points to vertex buffer", m_points.size());
109}
110
111} // namespace MayaFlux::Nodes
#define MF_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
uint32_t get_vertex_count() const
Get number of vertices.
bool m_vertex_data_dirty
Flag: vertex data or layout changed since last GPU upload.
std::optional< Kakshya::VertexLayout > get_vertex_layout() const
Get cached vertex layout.
void set_vertex_layout(const Kakshya::VertexLayout &layout)
Set cached vertex layout.
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.
Base class for nodes that generate 3D geometry data.
void update_point(size_t index, const PointVertex &point)
Update specific point position.
void set_points(const std::vector< PointVertex > &points)
Set all points (replaces existing)
void add_point(const PointVertex &point)
Add a point to the collection.
PointCollectionNode(size_t initial_capacity=1024)
Create empty point source.
void add_points(const std::vector< PointVertex > &points)
Add multiple points.
void compute_frame() override
Compute frame - uploads positions to vertex buffer.
PointVertex get_point(size_t index) const
Get point position.
@ NodeProcessing
Node graph processing (Nodes::NodeGraphManager)
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.
static VertexLayout for_points(uint32_t stride=28)
Factory: Create layout for point primitives (position, color, size)