MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
PointCollectionNode.cpp
Go to the documentation of this file.
3
5
6namespace {
7 Kakshya::VertexLayout create_point_vertex_layout()
8 {
9 Kakshya::VertexLayout layout;
10 layout.stride_bytes = sizeof(PointVertex);
11
12 layout.attributes.push_back(Kakshya::VertexAttributeLayout {
14 .offset_in_vertex = 0,
15 .name = "position" });
16 layout.attributes.push_back(Kakshya::VertexAttributeLayout {
17 .component_modality = Kakshya::DataModality::VERTEX_COLORS_RGB,
18 .offset_in_vertex = sizeof(glm::vec3),
19 .name = "color" });
20 layout.attributes.push_back(Kakshya::VertexAttributeLayout {
21 .component_modality = Kakshya::DataModality::UNKNOWN,
22 .offset_in_vertex = sizeof(glm::vec3) + sizeof(glm::vec3),
23 .name = "size" });
24
25 return layout;
26 }
27}
28
30 : GeometryWriterNode(static_cast<uint32_t>(initial_capacity))
31{
32 m_points.reserve(initial_capacity);
34
35 auto layout = create_point_vertex_layout();
36 layout.vertex_count = 0;
37 set_vertex_layout(layout);
38
39 resize_vertex_buffer(static_cast<uint32_t>(initial_capacity), false);
40
42 "Created PointCollectionNode with capacity for {} points", initial_capacity);
43}
44
45PointCollectionNode::PointCollectionNode(std::vector<PointVertex> points)
46 : GeometryWriterNode(static_cast<uint32_t>(points.size()))
47 , m_points(std::move(points))
48{
50
51 auto layout = create_point_vertex_layout();
52 layout.vertex_count = static_cast<uint32_t>(m_points.size());
53 set_vertex_layout(layout);
54
55 resize_vertex_buffer(static_cast<uint32_t>(m_points.size()), false);
56
58 "Created PointCollectionNode with {} points", m_points.size());
59}
60
62{
63 m_points.push_back(point);
66}
67
68void PointCollectionNode::add_points(const std::vector<PointVertex>& points)
69{
70 m_points.insert(m_points.end(), points.begin(), points.end());
73}
74
75void PointCollectionNode::set_points(const std::vector<PointVertex>& points)
76{
77 m_points.clear();
78 m_points = points;
81}
82
83void PointCollectionNode::update_point(size_t index, const PointVertex& point)
84{
85 if (index < m_points.size()) {
86 m_points[index] = point;
88 } else {
90 "Point index {} out of range (count: {})", index, m_points.size());
91 }
92}
93
95{
96 if (index < m_points.size()) {
97 return m_points[index];
98 }
100 "Point index {} out of range, returning zero", index);
101 return {};
102}
103
105{
106 m_points.clear();
107 m_vertex_data_dirty = true;
109}
110
112{
113 if (m_points.empty()) {
114 resize_vertex_buffer(0, false);
115 return;
116 }
117
118 if (get_vertex_count() != m_points.size()) {
119 resize_vertex_buffer(static_cast<uint32_t>(m_points.size()), false);
120 }
121
122 set_vertices<PointVertex>(std::span { m_points.data(), m_points.size() });
123
124 if (auto layout = get_vertex_layout()) {
125 layout->vertex_count = static_cast<uint32_t>(m_points.size());
126 set_vertex_layout(*layout);
127 }
128
130 "PointSourceNode: Uploaded {} points to vertex buffer", m_points.size());
131}
132
133} // 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.
@ UNKNOWN
Unknown or undefined modality.