MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
GeometryLeafNode.cpp
Go to the documentation of this file.
3
5
6namespace {
7
8Kakshya::VertexLayout layout_for_topology(Portal::Graphics::PrimitiveTopology topology)
9{
11 switch (topology) {
12 case PrimitiveTopology::LINE_LIST:
13 case PrimitiveTopology::LINE_STRIP:
15 case PrimitiveTopology::TRIANGLE_LIST:
16 case PrimitiveTopology::TRIANGLE_STRIP:
17 case PrimitiveTopology::TRIANGLE_FAN:
19 case PrimitiveTopology::POINT_LIST:
20 default:
22 }
23}
24
25} // namespace
26
27GeometryLeafNode::GeometryLeafNode(size_t initial_capacity)
28 : GeometryWriterNode(static_cast<uint32_t>(initial_capacity))
29{
30 m_items.reserve(initial_capacity);
32
33 auto layout = layout_for_topology(get_primitive_topology());
34 layout.vertex_count = 0;
35 set_vertex_layout(layout);
36
37 resize_vertex_buffer(static_cast<uint32_t>(initial_capacity), false);
38}
39
40GeometryLeafNode::GeometryLeafNode(std::vector<Vertex> vertices)
41 : GeometryWriterNode(static_cast<uint32_t>(vertices.size()))
42 , m_items(std::move(vertices))
43{
45
46 auto layout = layout_for_topology(get_primitive_topology());
47 layout.vertex_count = static_cast<uint32_t>(m_items.size());
48 set_vertex_layout(layout);
49
50 resize_vertex_buffer(static_cast<uint32_t>(m_items.size()), false);
51}
52
53GeometryLeafNode::GeometryLeafNode(std::vector<glm::vec3> positions)
54 : GeometryLeafNode(size_t { 0 })
55{
56 set_positions(std::move(positions));
57}
58
59void GeometryLeafNode::set_positions(std::vector<glm::vec3> positions)
60{
61 m_items.clear();
62 m_items.reserve(positions.size());
63 for (const auto& p : positions) {
64 Vertex v;
65 v.position = p;
66 m_items.push_back(v);
67 }
68 m_geometry_dirty = true;
69}
70
71void GeometryLeafNode::set_geometry(std::vector<Vertex> vertices)
72{
73 m_items = std::move(vertices);
74 m_geometry_dirty = true;
75}
76
77void GeometryLeafNode::update_vertex(size_t index, const Vertex& vertex)
78{
79 if (index >= m_items.size()) {
81 "GeometryLeafNode: vertex index {} out of range (count: {})", index, m_items.size());
82 return;
83 }
84 m_items[index] = vertex;
85 m_geometry_dirty = true;
86}
87
89{
90 m_items.clear();
91 m_geometry_dirty = true;
92}
93
95{
96 if (!m_geometry_dirty) {
97 return;
98 }
99 m_geometry_dirty = false;
100
101 if (m_items.empty()) {
102 resize_vertex_buffer(0, false);
103 return;
104 }
105
106 if (get_vertex_count() != m_items.size()) {
107 resize_vertex_buffer(static_cast<uint32_t>(m_items.size()), false);
108 }
109
110 set_vertices<Vertex>(std::span { m_items.data(), m_items.size() });
111
112 auto layout = layout_for_topology(get_primitive_topology());
113 layout.vertex_count = static_cast<uint32_t>(m_items.size());
114 set_vertex_layout(layout);
115}
116
117} // namespace MayaFlux::Nodes::GpuSync
#define MF_WARN(comp, ctx,...)
uint32_t index
Definition VKDevice.cpp:142
void set_geometry(std::vector< Vertex > vertices)
Replace geometry with fully specified vertices.
void compute_frame() override
No-op unless a mutator has run since the last call, so AssemblyOperator::process() calling this on ev...
void update_vertex(size_t index, const Vertex &vertex)
void set_positions(std::vector< glm::vec3 > positions)
Replace geometry with plain positions (color/scalar/normal/uv default).
One independent, arbitrary-topology geometry item.
uint32_t get_vertex_count() const
Get number of vertices.
virtual Portal::Graphics::PrimitiveTopology get_primitive_topology() const
Primitive topology this node's vertex data represents.
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)
Base class for nodes that generate 3D geometry data.
@ NodeProcessing
Node graph processing (Nodes::NodeGraphManager)
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.
Kakshya::Vertex Vertex
Definition VertexSpec.hpp:7
PrimitiveTopology
Vertex assembly primitive topology.
static VertexLayout for_lines(uint32_t stride=60)
Factory: layout for LineVertex (position, color, thickness, uv, normal, tangent)
static VertexLayout for_meshes(uint32_t stride=60)
Factory: layout for MeshVertex (position, color, weight, uv, normal, tangent)
static VertexLayout for_points(uint32_t stride=60)
Factory: layout for PointVertex (position, color, size, uv, normal, tangent)
Type-neutral vertex carrying the universal 60-byte attribute layout.