MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
InstanceNetwork.cpp
Go to the documentation of this file.
1#include "InstanceNetwork.hpp"
2
4
6
8
10
16
18 std::string name, std::shared_ptr<GpuSync::GeometryWriterNode> node)
19{
20 if (!node) {
21 error<std::invalid_argument>(
23 std::source_location::current(),
24 "InstanceNetwork::add_slot: null GeometryWriterNode for slot '{}'", name);
25 }
26
27 const auto idx = static_cast<uint32_t>(m_slots.size());
28 if (name.empty()) {
29 name = "slot_" + std::to_string(idx) + "_" + Reflect::short_dynamic_type_name(*node);
30 }
31 m_slots.push_back({ .index = idx, .name = std::move(name), .node = std::move(node) });
32 return idx;
33}
34
35GeometrySlot& InstanceNetwork::get_slot(uint32_t index) { return m_slots.at(index); }
36const GeometrySlot& InstanceNetwork::get_slot(uint32_t index) const { return m_slots.at(index); }
37
39{
40 auto it = std::ranges::find_if(
41 m_slots, [name](const GeometrySlot& s) { return s.name == name; });
42 return it != m_slots.end() ? &*it : nullptr;
43}
44
45const GeometrySlot* InstanceNetwork::find_slot(std::string_view name) const
46{
47 auto it = std::ranges::find_if(
48 m_slots, [name](const GeometrySlot& s) { return s.name == name; });
49 return it != m_slots.end() ? &*it : nullptr;
50}
51
52void InstanceNetwork::set_operator(std::shared_ptr<NetworkOperator> op)
53{
54 m_operator = std::move(op);
55}
56
57void InstanceNetwork::process_batch(unsigned int num_samples)
58{
59 if (!is_enabled() || m_slots.empty())
60 return;
61
62 for (unsigned int frame = 0; frame < num_samples; ++frame) {
63 if (m_operator) {
64 if (auto* inst_op = dynamic_cast<InstanceOperator*>(m_operator.get()))
65 inst_op->set_slots(m_slots);
66 m_operator->process(0.0F);
67 }
68
69 if (m_operator_chain) {
70 for (const auto& op : m_operator_chain->operators()) {
71 if (auto* inst_op = dynamic_cast<InstanceOperator*>(op.get()))
72 inst_op->set_slots(m_slots);
73 op->process(0.0F);
74 }
75 }
76 }
77
78 for (const auto& slot : m_slots) {
79 if (slot.node)
80 slot.node->compute_frame();
81 }
82}
83
85{
86 for (auto& slot : m_slots) {
87 slot.transform = glm::mat4(1.0F);
88 slot.dirty = true;
89 }
90}
91
92std::optional<double> InstanceNetwork::get_node_output(size_t index) const
93{
94 if (index >= m_slots.size())
95 return std::nullopt;
96 return static_cast<double>(index);
97}
98
99std::unordered_map<std::string, std::string> InstanceNetwork::get_metadata() const
100{
101 auto meta = NodeNetwork::get_metadata();
102 meta["slot_count"] = std::to_string(m_slots.size());
103 meta["operator"] = m_operator ? std::string(m_operator->get_type_name()) : "none";
104 meta["chain_size"] = m_operator_chain
105 ? std::to_string(m_operator_chain->size())
106 : "0";
107 return meta;
108}
109
110} // namespace MayaFlux::Nodes::Network
GeometrySlot * find_slot(std::string_view name)
uint32_t add_slot(std::string name, std::shared_ptr< GpuSync::GeometryWriterNode > node)
void reset() override
Reset network to initial state.
std::optional< double > get_node_output(size_t index) const override
Get output of specific internal node (for ONE_TO_ONE mapping)
void process_batch(unsigned int num_samples) override
Process the network for the given number of samples.
std::unordered_map< std::string, std::string > get_metadata() const override
Get network metadata for debugging/visualization.
std::shared_ptr< NetworkOperator > m_operator
GeometrySlot & get_slot(uint32_t index)
void set_operator(std::shared_ptr< NetworkOperator > op)
Abstract base for operators that process InstanceNetwork slots.
bool is_enabled() const
Check if network is enabled.
std::shared_ptr< OperatorChain > m_operator_chain
virtual std::unordered_map< std::string, std::string > get_metadata() const
Get network metadata for debugging/visualization.
void set_output_mode(OutputMode mode)
Set the network's output routing mode.
@ Init
Engine/subsystem initialization.
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.
@ GRAPHICS_BIND
State available for visualization (read-only)
std::string short_dynamic_type_name(const T &obj) noexcept
Returns the unqualified dynamic type name of obj.
Definition TypeInfo.hpp:95
Peer unit within an InstanceNetwork.