MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
MeshWriterNode.cpp
Go to the documentation of this file.
1#include "MeshWriterNode.hpp"
2
5
7
8MeshWriterNode::MeshWriterNode(size_t initial_vertex_capacity)
9 : GeometryWriterNode(static_cast<uint32_t>(initial_vertex_capacity))
10{
11 m_vertices.reserve(initial_vertex_capacity);
13
14 auto layout = Kakshya::VertexLayout::for_meshes(sizeof(MeshVertex));
15 layout.vertex_count = 0;
16 set_vertex_layout(layout);
17
19 "Created MeshWriterNode with capacity for {} vertices", initial_vertex_capacity);
20}
21
23{
24 const auto* vb = std::get_if<std::vector<uint8_t>>(&data.vertex_variant);
25 const auto* ib = std::get_if<std::vector<uint32_t>>(&data.index_variant);
26
27 if (!vb || !ib || vb->empty() || ib->empty() || data.layout.stride_bytes == 0) {
29 "MeshWriterNode::set_mesh: invalid MeshData");
30 return;
31 }
32
33 const auto n = vb->size() / data.layout.stride_bytes;
35 std::span { reinterpret_cast<const MeshVertex*>(vb->data()), n },
36 std::span { ib->data(), ib->size() });
37}
38
39std::optional<Kakshya::MeshData> MeshWriterNode::get_mesh_data() const
40{
41 if (m_vertices.empty() || m_indices.empty()) {
42 return std::nullopt;
43 }
44
45 auto mesh_data = Kakshya::MeshData::empty();
46 Kakshya::MeshInsertion ins(mesh_data.vertex_variant, mesh_data.index_variant);
47 ins.insert_flat(
48 std::span<const uint8_t>(
49 reinterpret_cast<const uint8_t*>(m_vertices.data()),
50 m_vertices.size() * sizeof(MeshVertex)),
51 std::span<const uint32_t>(m_indices),
53
54 const auto access = ins.build();
55 if (!access) {
56 return std::nullopt;
57 }
58 mesh_data.layout = access->layout;
59
60 return mesh_data;
61}
62
64 std::span<const MeshVertex> vertices,
65 std::span<const uint32_t> indices)
66{
67 m_vertices.assign(vertices.begin(), vertices.end());
68 m_indices.assign(indices.begin(), indices.end());
69 m_mesh_dirty = true;
72}
73
74void MeshWriterNode::set_mesh_vertices(std::span<const MeshVertex> vertices)
75{
76 m_vertices.assign(vertices.begin(), vertices.end());
77 m_mesh_dirty = true;
80}
81
82void MeshWriterNode::set_mesh_indices(std::span<const uint32_t> indices)
83{
84 m_indices.assign(indices.begin(), indices.end());
85 m_mesh_dirty = true;
87}
88
90{
91 m_vertices.clear();
92 m_indices.clear();
93 m_mesh_dirty = true;
96}
97
102
104{
105 if (!m_mesh_dirty) {
106 return;
107 }
108
109 if (m_vertices.empty()) {
110 resize_vertex_buffer(0, false);
111 set_indices(std::span<const uint32_t> {});
112 } else {
113 set_vertices<MeshVertex>(std::span { m_vertices.data(), m_vertices.size() });
114 set_indices(std::span { m_indices.data(), m_indices.size() });
115 }
116
117 auto layout = Kakshya::VertexLayout::for_meshes(sizeof(MeshVertex));
118 layout.vertex_count = static_cast<uint32_t>(m_vertices.size());
119 set_vertex_layout(layout);
120
121 m_mesh_dirty = false;
122
124 "MeshWriterNode: uploaded {} vertices, {} indices ({} faces)",
125 m_vertices.size(), m_indices.size(), m_indices.size() / 3);
126}
127
128} // namespace MayaFlux::Nodes::GpuSync
#define MF_ERROR(comp, ctx,...)
#define MF_TRACE(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
std::vector< uint32_t > indices
std::optional< MeshAccess > build() const
Produce a MeshAccess over the current variant contents.
void insert_flat(std::span< const uint8_t > vertex_bytes, std::span< const uint32_t > index_data, const VertexLayout &layout)
Insert a single flat mesh (no submesh tracking).
Write counterpart to MeshAccess.
bool m_vertex_data_dirty
Flag: vertex data or layout changed since last GPU upload.
void set_vertex_layout(const Kakshya::VertexLayout &layout)
Set cached vertex layout.
void set_indices(std::span< const uint32_t > indices)
Set index buffer for indexed drawing.
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.
MeshWriterNode(size_t initial_vertex_capacity=1024)
void set_mesh(const Kakshya::MeshData &data)
Replace all vertex and index data from a MeshData owner.
std::optional< Kakshya::MeshData > get_mesh_data() const
The node's current geometry as MeshData, the inverse of set_mesh(const MeshData&).
void set_mesh_vertices(std::span< const MeshVertex > vertices)
Replace vertex array only; index array is unchanged.
Portal::Graphics::PrimitiveTopology get_primitive_topology() const override
Primitive topology this node's vertex data represents.
void set_mesh_indices(std::span< const uint32_t > indices)
Replace index array only; vertex array is unchanged.
void compute_frame() override
Compute GPU data for this frame.
@ NodeProcessing
Node graph processing (Nodes::NodeGraphManager)
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.
PrimitiveTopology
Vertex assembly primitive topology.
static MeshData empty()
Construct an empty MeshData with the canonical 60-byte mesh layout.
Definition MeshData.hpp:49
DataVariant vertex_variant
vector<uint8_t>: interleaved vertex bytes
Definition MeshData.hpp:34
DataVariant index_variant
vector<uint32_t>: triangle index list
Definition MeshData.hpp:35
Owning CPU-side representation of a loaded or generated mesh.
Definition MeshData.hpp:33
Vertex type for indexed triangle mesh primitives (TRIANGLE_LIST topology)
uint32_t stride_bytes
Total bytes per vertex (stride in Vulkan terms) e.g., 3 floats (position) + 3 floats (normal) = 24 by...
static VertexLayout for_meshes(uint32_t stride=60)
Factory: layout for MeshVertex (position, color, weight, uv, normal, tangent)