MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Creator.cpp
Go to the documentation of this file.
1#include "Creator.hpp"
2
6
13
18
20
21namespace MayaFlux {
22
24
25void register_node(const std::shared_ptr<Nodes::Node>& node, const CreationContext& ctx)
26{
27 auto token = get_node_token(ctx.domain.value());
28
29 if (ctx.channel.has_value()) {
30 register_node(node, token, ctx.channel.value());
31 } else if (ctx.channels.has_value()) {
32 for (uint32_t ch : ctx.channels.value()) {
33 register_node(node, token, ch);
34 }
35 } else if (node->get_channel_mask() != 0) {
36 for (uint32_t ch = 0; ch < 32; ++ch) {
37 if (node->get_channel_mask() & (1 << ch)) {
38 register_node(node, token, ch);
39 }
40 }
41 } else {
42 register_node(node, token, 0);
43 }
44}
45
46void register_network(const std::shared_ptr<Nodes::Network::NodeNetwork>& network, const CreationContext& ctx)
47{
48 auto token = get_node_token(ctx.domain.value());
49
51 if (
53 && network->get_output_mode() != Nodes::Network::OutputMode::AUDIO_COMPUTE) {
56 "Registering audio network in AUDIO_RATE domain without AUDIO_SINK or AUDIO_COMPUTE mode. Forcing AUDIO_SINK mode.");
58 }
59 if (ctx.channel.has_value()) {
60 network->add_channel_usage(ctx.channel.value());
61 } else if (ctx.channels.has_value()) {
62 for (uint32_t ch : ctx.channels.value()) {
63 network->add_channel_usage(ch);
64 }
65 }
69 "Registering visual network in VISUAL_RATE domain without GRAPHICS_BIND output mode. Forcing GRAPHICS_BIND mode.");
71 }
72
74}
75
76void register_buffer(const std::shared_ptr<Buffers::Buffer>& buffer, const CreationContext& ctx)
77{
78 auto token = get_buffer_token(ctx.domain.value());
79
80 if (auto audio_buffer = std::dynamic_pointer_cast<Buffers::AudioBuffer>(buffer)) {
81 if (ctx.channel.has_value()) {
82 register_audio_buffer(audio_buffer, ctx.channel.value());
83 } else if (ctx.channels.has_value()) {
84 register_audio_buffer(audio_buffer, ctx.channels.value()[0]);
85 for (size_t i = 1; i < ctx.channels.value().size(); ++i) {
86 clone_buffer_to_channels(audio_buffer, { static_cast<uint32_t>(i) }, token);
87 }
88 } else {
89 register_audio_buffer(audio_buffer, audio_buffer->get_channel_id());
90 }
91 return;
92 }
93
94 if (auto vk_buffer = std::dynamic_pointer_cast<Buffers::VKBuffer>(buffer)) {
95 register_graphics_buffer(vk_buffer, token);
96 return;
97 }
98}
99
100void register_container(const std::shared_ptr<Kakshya::SoundFileContainer>& container, const Domain& domain)
101{
102 if (auto sound_container = std::dynamic_pointer_cast<Kakshya::SoundFileContainer>(container)) {
103 if (domain == Domain::AUDIO) {
104 (void)get_io_manager()->hook_audio_container_to_buffers(sound_container);
105 }
106 }
107}
108
109std::shared_ptr<Kakshya::SoundFileContainer> Creator::load_sound_container(const std::string& filepath)
110{
111 return get_io_manager()->load_audio(filepath);
112}
113
115 std::vector<std::shared_ptr<Buffers::MeshBuffer>> buffers)
116 : m_buffers(std::move(buffers))
117{
118}
119
121
123{
124 CreationContext ctx(d);
125 for (const auto& buf : m_buffers) {
127 std::static_pointer_cast<Buffers::Buffer>(buf), ctx);
128 }
129 return *this;
130}
131
132std::shared_ptr<Buffers::TextureBuffer> Creator::load_image_buffer(const std::string& filepath)
133{
134 return get_io_manager()->load_image(filepath);
135}
136
137std::vector<std::shared_ptr<Buffers::MeshBuffer>> Creator::load_mesh_buffers(const std::string& filepath)
138{
139 return get_io_manager()->load_mesh(filepath);
140}
141
142std::shared_ptr<Nodes::Network::MeshNetwork>
143Creator::load_mesh_network(const std::string& filepath, IO::TextureResolver resolver)
144{
145 return get_io_manager()->load_mesh_network(filepath, std::move(resolver));
146}
147
148std::shared_ptr<Nodes::Input::HIDNode> Creator::read_hid(
149 const Nodes::Input::HIDConfig& config,
150 const Core::InputBinding& binding)
151{
152 auto node = std::make_shared<Nodes::Input::HIDNode>(config);
153 register_input_node(node, binding);
154 return node;
155}
156
157std::shared_ptr<Nodes::Input::MIDINode> Creator::read_midi(
158 const Nodes::Input::MIDIConfig& config,
159 const Core::InputBinding& binding)
160{
161 auto node = std::make_shared<Nodes::Input::MIDINode>(config);
162 register_input_node(node, binding);
163 return node;
164}
165
166std::shared_ptr<Nodes::Input::OSCNode> Creator::read_osc(
167 const Nodes::Input::OSCConfig& config,
168 const Core::InputBinding& binding)
169{
170 auto node = std::make_shared<Nodes::Input::OSCNode>(config);
171 register_input_node(node, binding);
172 return node;
173}
174
175std::shared_ptr<Nodes::Input::TabletNode> Creator::read_tablet(
176 const Nodes::Input::TabletConfig& config,
177 const Core::InputBinding& binding)
178{
179 auto node = std::make_shared<Nodes::Input::TabletNode>(config);
180 register_input_node(node, binding);
181 return node;
182}
183
184std::shared_ptr<Nodes::Input::InputNode> Creator::read_input(
185 const Nodes::Input::InputConfig& config,
186 const Core::InputBinding& binding)
187{
188 switch (binding.backend) {
190 return read_hid(static_cast<const Nodes::Input::HIDConfig&>(config), binding);
192 return read_midi(static_cast<const Nodes::Input::MIDIConfig&>(config), binding);
194 return read_osc(static_cast<const Nodes::Input::OSCConfig&>(config), binding);
196 return read_tablet(static_cast<const Nodes::Input::TabletConfig&>(config), binding);
197 default:
199 "Input type {} not yet implemented",
200 static_cast<int>(binding.backend));
201 return nullptr;
202 }
203}
204
205} // namespace MayaFlux
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
Core::GlobalNetworkConfig network
Definition Config.cpp:39
Audio file loading and container management API.
std::shared_ptr< Nodes::Input::InputNode > read_input(const Nodes::Input::InputConfig &config, const Core::InputBinding &binding)
Create and register generic input node.
Definition Creator.cpp:184
std::shared_ptr< Nodes::Input::HIDNode > read_hid(const Nodes::Input::HIDConfig &config, const Core::InputBinding &binding)
Create and register HID input node.
Definition Creator.cpp:148
std::vector< std::shared_ptr< Buffers::MeshBuffer > > load_mesh_buffers(const std::string &filepath)
Definition Creator.cpp:137
std::shared_ptr< Nodes::Input::OSCNode > read_osc(const Nodes::Input::OSCConfig &config, const Core::InputBinding &binding)
Create and register OSC input node.
Definition Creator.cpp:166
std::shared_ptr< Nodes::Input::TabletNode > read_tablet(const Nodes::Input::TabletConfig &config, const Core::InputBinding &binding)
Create and register tablet input node.
Definition Creator.cpp:175
std::shared_ptr< Kakshya::SoundFileContainer > load_sound_container(const std::string &filepath)
Definition Creator.cpp:109
std::shared_ptr< Nodes::Input::MIDINode > read_midi(const Nodes::Input::MIDIConfig &config, const Core::InputBinding &binding)
Create and register MIDI input node.
Definition Creator.cpp:157
std::shared_ptr< Nodes::Network::MeshNetwork > load_mesh_network(const std::string &filepath, IO::TextureResolver resolver)
Definition Creator.cpp:143
std::shared_ptr< Buffers::TextureBuffer > load_image_buffer(const std::string &filepath)
Definition Creator.cpp:132
std::vector< std::shared_ptr< Buffers::MeshBuffer > > m_buffers
Definition Creator.hpp:101
MeshGroupHandle & operator|(Domain d)
Definition Creator.cpp:122
MeshGroupHandle(std::vector< std::shared_ptr< Buffers::MeshBuffer > > buffers)
Definition Creator.cpp:114
@ OSC
Open Sound Control (network)
@ TABLET
Digitizers and styluses (pressure, tilt, rotation)
@ HID
Generic HID devices (game controllers, custom hardware)
@ MIDI
MIDI controllers and instruments.
std::function< std::shared_ptr< Core::VKImage >(const std::string &)> TextureResolver
Callable that maps a raw material texture path to a GPU image.
Definition Depot.hpp:25
@ Init
Engine/subsystem initialization.
@ API
MayaFlux/API Wrapper and convenience functions.
@ GRAPHICS_BIND
State available for visualization (read-only)
@ AUDIO_COMPUTE
processed each cycle but not sent to output
@ AUDIO_SINK
Aggregated audio samples sent to output.
@ AUDIO_RATE
Nodes that process at the audio sample rate.
@ VISUAL_RATE
Nodes that process at the visual frame rate.
void register_input_node(const std::shared_ptr< Nodes::Input::InputNode > &node, const Core::InputBinding &binding)
Register an input node with specified binding.
Definition Input.cpp:21
Creator vega
Global Creator instance.
Definition Creator.cpp:23
void register_node(const std::shared_ptr< Nodes::Node > &node, const Nodes::ProcessingToken &token, uint32_t channel)
Definition Graph.cpp:123
MAYAFLUX_API Nodes::ProcessingToken get_node_token(Domain domain)
Extracts node processing token from domain.
Definition Domain.hpp:174
void register_buffer(const std::shared_ptr< Buffers::Buffer > &buffer, const CreationContext &ctx)
Definition Creator.cpp:76
void register_node_network(const std::shared_ptr< Nodes::Network::NodeNetwork > &network, const Nodes::ProcessingToken &token)
Registers a node network with the default engine's node graph manager.
Definition Graph.cpp:192
std::vector< std::shared_ptr< Buffers::AudioBuffer > > clone_buffer_to_channels(const std::shared_ptr< Buffers::AudioBuffer > &buffer, const std::vector< uint32_t > &channels)
Clones a buffer to multiple channels.
Definition Graph.cpp:271
void register_audio_buffer(const std::shared_ptr< Buffers::AudioBuffer > &buffer, uint32_t channel)
Registers an AudioBuffer with the default engine's buffer manager.
Definition Graph.cpp:229
void register_container(const std::shared_ptr< Kakshya::SoundFileContainer > &container, const Domain &domain)
Definition Creator.cpp:100
Domain
Unified domain enum combining all three ProcessingToken subsystems.
Definition Domain.hpp:22
@ AUDIO
Standard real-time audio processing domain.
Definition Domain.hpp:33
void register_graphics_buffer(const std::shared_ptr< Buffers::VKBuffer > &buffer, Buffers::ProcessingToken token)
Registers a VKBuffer with the default engine's buffer manager.
Definition Graph.cpp:239
std::shared_ptr< IO::IOManager > get_io_manager()
Retrieves the global IOManager instance for file loading and buffer management.
Definition Depot.cpp:256
void register_network(const std::shared_ptr< Nodes::Network::NodeNetwork > &network, const CreationContext &ctx)
Definition Creator.cpp:46
MAYAFLUX_API Buffers::ProcessingToken get_buffer_token(Domain domain)
Extracts buffer processing token from domain.
Definition Domain.hpp:184
Main namespace for the Maya Flux audio engine.
Definition Runtime.cpp:12
InputType backend
Which backend type.
Specifies what input an InputNode wants to receive.
std::optional< uint32_t > channel
Definition Creator.hpp:21
std::optional< std::vector< uint32_t > > channels
Definition Creator.hpp:22
std::optional< Domain > domain
Definition Creator.hpp:20
Unified configuration for all HID input types.
Definition HIDNode.hpp:21
Configuration for InputNode behavior.
Definition InputNode.hpp:67
MIDI input node configuration.
Definition MIDINode.hpp:10
Configuration for OSC input node argument extraction.
Definition OSCNode.hpp:16
Selects which part of a tablet frame becomes the node's scalar.