MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
AssemblyNetwork.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "NodeNetwork.hpp"
5
7
8/**
9 * @class AssemblyNetwork
10 * @brief Holds hundreds or thousands of independent geometry items with no
11 * shared topology, layout, or relation to each other, rendered as
12 * one milled draw.
13 *
14 * Thin wrapper around a single AssemblyOperator, forwarding add_geometry()/
15 * remove_geometry() so the common case doesn't require reaching into
16 * create_operator<AssemblyOperator>() manually. Not a specialized operator
17 * (PathOperator/TopologyOperator/PhysicsOperator interpolate, connect, or
18 * simulate; this does none of that), and not built-in-primitive convenience:
19 * callers supply their own geometry from Kinesis generators, input, or
20 * procedural code and this just holds and draws it.
21 *
22 * Renders through the standard NetworkGeometryBuffer(network)->setup_rendering
23 * path with @c triangulate enabled: milling erases the per-item layout/
24 * topology mismatch, so a heterogeneous, arbitrarily large item count draws
25 * through exactly one RenderProcessor pass, the same way a mixed-topology
26 * PathOperator does.
27 */
28class MAYAFLUX_API AssemblyNetwork : public NodeNetwork {
29public:
30 struct VertexInput {
31 std::vector<Kakshya::Vertex> values;
33 Portal::Graphics::PrimitiveTopology::POINT_LIST
34 };
35 };
36
37 using Source = std::variant<
40 std::shared_ptr<GpuSync::GeometryWriterNode>>;
41
43
44 void process_batch(unsigned int num_samples) override;
45 [[nodiscard]] size_t get_node_count() const override;
46
47 NetworkOperator* get_operator() override { return m_operator.get(); }
48 const NetworkOperator* get_operator() const override { return m_operator.get(); }
49 bool has_operator() const override { return m_operator != nullptr; }
50
51 [[nodiscard]] AssemblyOperator* assembly() const { return m_operator.get(); }
52
53 std::shared_ptr<GpuSync::GeometryLeafNode> add_geometry(
54 std::vector<glm::vec3> positions,
55 Portal::Graphics::PrimitiveTopology topology = Portal::Graphics::PrimitiveTopology::POINT_LIST)
56 {
57 return m_operator->add_geometry(std::move(positions), topology);
58 }
59
60 std::shared_ptr<GpuSync::GeometryLeafNode> add_geometry(
61 std::vector<Kakshya::Vertex> vertices,
62 Portal::Graphics::PrimitiveTopology topology = Portal::Graphics::PrimitiveTopology::POINT_LIST)
63 {
64 return m_operator->add_geometry(std::move(vertices), topology);
65 }
66
67 std::shared_ptr<GpuSync::GeometryLeafNode> add_geometry(const VertexInput& input)
68 {
69 return add_geometry(input.values, input.topology);
70 }
71
72 std::shared_ptr<GpuSync::MeshWriterNode> add_geometry(const Kakshya::MeshData& mesh)
73 {
74 return m_operator->add_geometry(mesh);
75 }
76
77 void add_geometry(std::shared_ptr<GpuSync::GeometryWriterNode> node)
78 {
79 m_operator->add_geometry(std::move(node));
80 }
81
82 void add_geometry(const Source& source)
83 {
84 std::visit([this](const auto& value) { add_geometry(value); }, source);
85 }
86
87 bool remove_geometry(const std::shared_ptr<GpuSync::GeometryWriterNode>& node)
88 {
89 return m_operator->remove_geometry(node);
90 }
91
92private:
93 std::unique_ptr<AssemblyOperator> m_operator;
94};
95
96} // namespace MayaFlux::Nodes::Network
Core::GlobalInputConfig input
Definition Config.cpp:42
std::vector< glm::vec3 > positions
PrimitiveTopology topology
glm::vec3 value
const NetworkOperator * get_operator() const override
std::shared_ptr< GpuSync::MeshWriterNode > add_geometry(const Kakshya::MeshData &mesh)
std::unique_ptr< AssemblyOperator > m_operator
bool remove_geometry(const std::shared_ptr< GpuSync::GeometryWriterNode > &node)
std::shared_ptr< GpuSync::GeometryLeafNode > add_geometry(std::vector< Kakshya::Vertex > vertices, Portal::Graphics::PrimitiveTopology topology=Portal::Graphics::PrimitiveTopology::POINT_LIST)
std::variant< VertexInput, Kakshya::MeshData, std::shared_ptr< GpuSync::GeometryWriterNode > > Source
void add_geometry(std::shared_ptr< GpuSync::GeometryWriterNode > node)
NetworkOperator * get_operator() override
std::shared_ptr< GpuSync::GeometryLeafNode > add_geometry(const VertexInput &input)
std::shared_ptr< GpuSync::GeometryLeafNode > add_geometry(std::vector< glm::vec3 > positions, Portal::Graphics::PrimitiveTopology topology=Portal::Graphics::PrimitiveTopology::POINT_LIST)
Holds hundreds or thousands of independent geometry items with no shared topology,...
Holds an unordered set of independent geometry items, rendered as one milled draw.
Domain-agnostic interpretive lens for network processing.
Abstract base class for structured collections of nodes with defined relationships.
PrimitiveTopology
Vertex assembly primitive topology.
Owning CPU-side representation of a loaded or generated mesh.
Definition MeshData.hpp:33