7 std::vector<glm::vec3> positions,
10 auto node = std::make_shared<GpuSync::GeometryLeafNode>(std::move(positions));
11 node->set_primitive_topology(topology);
12 node->compute_frame();
18 std::vector<Kakshya::Vertex> vertices,
21 auto node = std::make_shared<GpuSync::GeometryLeafNode>(std::move(vertices));
22 node->set_primitive_topology(topology);
23 node->compute_frame();
30 auto node = std::make_shared<GpuSync::MeshWriterNode>();
32 node->compute_frame();
41 "AssemblyOperator::add_geometry: null node ignored");
44 node->compute_frame();
45 m_items.push_back(std::move(node));
61 item->compute_frame();
70 return m_items[idx]->get_vertex_data();
76 for (
const auto& item :
m_items) {
77 auto span = item->get_vertex_data();
80 span.begin(), span.end());
91 auto layout_opt =
m_items[0]->get_vertex_layout();
96 auto layout = *layout_opt;
104 for (
const auto& item :
m_items) {
105 total += item->get_vertex_count();
112 return std::ranges::any_of(
114 [](
const auto& item) {
return item->needs_gpu_update(); });
120 item->clear_gpu_update_flag();
126 std::vector<DirtyVertexRange> ranges;
130 for (
const auto& item :
m_items) {
131 const auto count =
static_cast<uint32_t
>(item->get_vertex_count());
132 if (item->needs_gpu_update()) {
136 .vertex_count =
count });
159 uint32_t cluster = 0;
160 for (
const auto& item :
m_items) {
161 const size_t count = item->get_vertex_count();
162 for (
size_t i = 0; i <
count &&
offset + i < ids.size(); ++i) {
163 ids[
offset + i] = cluster;
177 return m_items[0]->get_primitive_topology();
182 std::vector<DrawRun> runs;
185 for (
const auto& item :
m_items) {
186 const auto count =
static_cast<uint32_t
>(item->get_vertex_count());
187 const auto topo = item->get_primitive_topology();
189 if (!runs.empty() && runs.back().topology == topo && is_concatenable_topology(topo)) {
190 runs.back().vertex_count +=
count;
207 if (query ==
"item_count") {
208 return static_cast<double>(
m_items.size());
210 if (query ==
"vertex_count") {
#define MF_ERROR(comp, ctx,...)
bool is_vertex_data_dirty() const override
Check if geometry changed this frame.
size_t get_point_count() const override
Get source point count (before topology expansion)
std::vector< std::shared_ptr< GpuSync::GeometryWriterNode > > m_items
std::vector< uint32_t > build_cluster_ids() const override
One cluster id per item; coincides with get_vertex_count() since items carry no interpolation step of...
size_t get_vertex_count() const override
Get number of vertices (may differ from point count for topology/path)
std::optional< double > query_state(std::string_view query) const override
Query operator internal state.
void process(float dt) override
Process for one batch cycle.
std::vector< DrawRun > topology_runs() const override
Coalesces adjacent items sharing a concatenable topology into one run; strip/fan items are always rep...
std::vector< DirtyVertexRange > dirty_vertex_ranges() const override
One DirtyVertexRange per item that needs a GPU update, in add_geometry() order, matching get_vertex_d...
std::span< const uint8_t > get_vertex_data() const override
Get vertex data for GPU upload.
std::optional< Portal::Graphics::PrimitiveTopology > declared_topology() const override
Forwards to the first item's own get_primitive_topology().
void mark_vertex_data_clean() override
Clear dirty flag after GPU upload.
std::vector< uint8_t > m_vertex_data_aggregate
std::span< const uint8_t > get_vertex_data_for_collection(uint32_t idx) const override
Get vertex data for specific collection (if multiple)
void * get_data_at(size_t global_index) override
Get mutable access to point at global index.
Kakshya::VertexLayout get_vertex_layout() const override
The universal Kakshya::Vertex attribute layout, vertex_count 0 when there are no items yet.
std::shared_ptr< GpuSync::GeometryLeafNode > add_geometry(std::vector< glm::vec3 > positions, Portal::Graphics::PrimitiveTopology topology=Portal::Graphics::PrimitiveTopology::POINT_LIST)
Add an item from plain positions (color/scalar/normal/uv default).
void set_parameter(std::string_view param, double value) override
Set operator parameter.
bool remove_geometry(const std::shared_ptr< GpuSync::GeometryWriterNode > &node)
Remove an item by identity.
@ NodeProcessing
Node graph processing (Nodes::NodeGraphManager)
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.
PrimitiveTopology
Vertex assembly primitive topology.
Owning CPU-side representation of a loaded or generated mesh.
static VertexLayout for_points(uint32_t stride=60)
Factory: layout for PointVertex (position, color, size, uv, normal, tangent)
Complete description of vertex data layout in a buffer.
Type-neutral vertex carrying the universal 60-byte attribute layout.
A contiguous span of vertex records that changed since the last mark_vertex_data_clean().
PrimitiveTopology topology
One contiguous span of vertices sharing a primitive topology.