MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Creator.cpp
Go to the documentation of this file.
1#include "Creator.hpp"
3
7
18
23
25
26namespace MayaFlux {
27
29
30#include "Generated/CreatorDefinitions.inc"
31
32void register_node(const std::shared_ptr<Nodes::Node>& node, const CreationContext& ctx)
33{
34 auto token = get_node_token(ctx.domain.value());
35
36 if (ctx.channel.has_value()) {
37 register_node(node, token, ctx.channel.value());
38 } else if (ctx.channels.has_value()) {
39 for (uint32_t ch : ctx.channels.value()) {
40 register_node(node, token, ch);
41 }
42 } else if (node->get_channel_mask() != 0) {
43 for (uint32_t ch = 0; ch < 32; ++ch) {
44 if (node->get_channel_mask() & (1 << ch)) {
45 register_node(node, token, ch);
46 }
47 }
48 } else {
49 register_node(node, token, 0);
50 }
51}
52
53void register_network(const std::shared_ptr<Nodes::Network::NodeNetwork>& network, const CreationContext& ctx)
54{
55 auto token = get_node_token(ctx.domain.value());
56
58 if (
60 && network->get_output_mode() != Nodes::Network::OutputMode::AUDIO_COMPUTE) {
63 "Registering audio network in AUDIO_RATE domain without AUDIO_SINK or AUDIO_COMPUTE mode. Forcing AUDIO_SINK mode.");
65 }
66 if (ctx.channel.has_value()) {
67 network->add_channel_usage(ctx.channel.value());
68 } else if (ctx.channels.has_value()) {
69 for (uint32_t ch : ctx.channels.value()) {
70 network->add_channel_usage(ch);
71 }
72 }
76 "Registering visual network in VISUAL_RATE domain without GRAPHICS_BIND output mode. Forcing GRAPHICS_BIND mode.");
78 }
79
81}
82
83void register_buffer(const std::shared_ptr<Buffers::Buffer>& buffer, const CreationContext& ctx)
84{
85 auto token = get_buffer_token(ctx.domain.value());
86
87 if (auto audio_buffer = std::dynamic_pointer_cast<Buffers::AudioBuffer>(buffer)) {
88 if (ctx.channel.has_value()) {
89 register_audio_buffer(audio_buffer, ctx.channel.value());
90 } else if (ctx.channels.has_value()) {
91 register_audio_buffer(audio_buffer, ctx.channels.value()[0]);
92 for (size_t i = 1; i < ctx.channels.value().size(); ++i) {
93 clone_buffer_to_channels(audio_buffer, { static_cast<uint32_t>(i) }, token);
94 }
95 } else {
96 register_audio_buffer(audio_buffer, audio_buffer->get_channel_id());
97 }
98 return;
99 }
100
101 if (auto vk_buffer = std::dynamic_pointer_cast<Buffers::VKBuffer>(buffer)) {
102 register_graphics_buffer(vk_buffer, token);
103 return;
104 }
105}
106
107void register_container(const std::shared_ptr<Kakshya::SoundFileContainer>& container, const Domain& domain)
108{
109 if (auto sound_container = std::dynamic_pointer_cast<Kakshya::SoundFileContainer>(container)) {
110 if (domain == Domain::AUDIO && get_io_manager()->get_audio_buffers(sound_container).empty()) {
111 (void)get_io_manager()->hook_audio_container_to_buffers(sound_container);
112 }
113 }
114}
115
116void register_container(const std::shared_ptr<Kakshya::VideoStreamContainer>& container, const Domain& domain)
117{
118 if (!container || domain != Domain::GRAPHICS) {
119 return;
120 }
121
122 const auto io = get_io_manager();
123
124 if (const auto camera = std::dynamic_pointer_cast<Kakshya::CameraContainer>(container)) {
125 if (!io->get_camera_buffer(camera)) {
126 (void)io->hook_camera_to_buffer(camera);
127 }
128 return;
129 }
130
131 if (!io->get_video_buffer(container)) {
132 (void)io->hook_video_container_to_buffer(container);
133 }
134
135 if (const auto file = std::dynamic_pointer_cast<Kakshya::VideoFileContainer>(container)) {
136 if (const auto audio = io->get_extracted_audio(file); audio && io->get_audio_buffers(audio).empty()) {
137 (void)io->hook_audio_container_to_buffers(audio);
138 }
139 }
140}
141
142std::shared_ptr<Kakshya::SoundFileContainer> Creator::load_sound_container(const std::string& filepath)
143{
144 return get_io_manager()->load_audio(filepath);
145}
146
147std::shared_ptr<Kakshya::CompositeContainer>
149 const std::string& filepath,
150 std::optional<Kakshya::CompositeLayout> layout)
151{
152 return get_io_manager()->load_composite(filepath, std::move(layout));
153}
154
156 std::vector<std::shared_ptr<Buffers::MeshBuffer>> buffers)
157 : m_buffers(std::move(buffers))
158{
159}
160
162
164{
165 CreationContext ctx(d);
166 for (const auto& buf : m_buffers) {
168 std::static_pointer_cast<Buffers::Buffer>(buf), ctx);
169 }
170 return *this;
171}
172
173std::shared_ptr<Buffers::TextureBuffer> Creator::load_image_buffer(
174 const std::string& filepath, int desired_channels,
175 std::optional<Kakshya::Region> region)
176{
177 return get_io_manager()->load_image(filepath, desired_channels, std::move(region));
178}
179
180std::shared_ptr<Buffers::VolumeGridBuffer> Creator::load_volume_buffer(const std::string& filepath)
181{
182 return get_io_manager()->load_volume(filepath);
183}
184
185std::vector<std::shared_ptr<Buffers::MeshBuffer>> Creator::load_mesh_buffers(const std::string& filepath)
186{
187 return get_io_manager()->load_mesh(filepath);
188}
189
190std::shared_ptr<Nodes::Network::MeshNetwork>
191Creator::load_mesh_network(const std::string& filepath, IO::TextureResolver resolver)
192{
193 return get_io_manager()->load_mesh_network(filepath, std::move(resolver));
194}
195
196std::shared_ptr<Kakshya::CameraContainer> Creator::read_camera(const IO::CameraConfig& config)
197{
198 auto container = get_io_manager()->open_camera(config);
199 if (!container) {
201 "read_camera: open_camera failed for device '{}'", config.device_name);
202 return nullptr;
203 }
204
205 MF_LIVE_EXPOSE_AUTO(container);
206 return container;
207}
208
209std::shared_ptr<Kakshya::CameraContainer> Creator::read_camera()
210{
211 auto container = choose_camera();
212 if (container)
213 MF_LIVE_EXPOSE_AUTO(container);
214 return container;
215}
216
217std::shared_ptr<Nodes::Input::HIDNode> Creator::read_hid(
218 const Nodes::Input::HIDConfig& config,
219 const Core::InputBinding& binding)
220{
221 auto node = std::make_shared<Nodes::Input::HIDNode>(config);
222 register_input_node(node, binding);
223 return node;
224}
225
226std::shared_ptr<Nodes::Input::MIDINode> Creator::read_midi(
227 const Nodes::Input::MIDIConfig& config,
228 const Core::InputBinding& binding)
229{
230 auto node = std::make_shared<Nodes::Input::MIDINode>(config);
231 register_input_node(node, binding);
232 return node;
233}
234
235std::shared_ptr<Nodes::Input::OSCNode> Creator::read_osc(
236 const Nodes::Input::OSCConfig& config,
237 const Core::InputBinding& binding)
238{
239 auto node = std::make_shared<Nodes::Input::OSCNode>(config);
240 register_input_node(node, binding);
241 return node;
242}
243
244std::shared_ptr<Nodes::Input::TabletNode> Creator::read_tablet(
245 const Nodes::Input::TabletConfig& config,
246 const Core::InputBinding& binding)
247{
248 auto node = std::make_shared<Nodes::Input::TabletNode>(config);
249 register_input_node(node, binding);
250 return node;
251}
252
253std::shared_ptr<Nodes::Input::InputNode> Creator::read_input(
254 const Nodes::Input::InputConfig& config,
255 const Core::InputBinding& binding)
256{
257 switch (binding.backend) {
259 return read_hid(static_cast<const Nodes::Input::HIDConfig&>(config), binding);
261 return read_midi(static_cast<const Nodes::Input::MIDIConfig&>(config), binding);
263 return read_osc(static_cast<const Nodes::Input::OSCConfig&>(config), binding);
265 return read_tablet(static_cast<const Nodes::Input::TabletConfig&>(config), binding);
266 default:
268 "Input type {} not yet implemented",
269 static_cast<int>(binding.backend));
270 return nullptr;
271 }
272}
273
274} // namespace MayaFlux
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
Core::GlobalNetworkConfig network
Definition Config.cpp:43
Dialog-backed loading and file-type helpers.
bool size
#define MF_LIVE_EXPOSE_AUTO(ptr)
Auto-expose variant that deduces the key prefix from the shared_ptr element type.
std::shared_ptr< NetworkGeometryBuffer > buffer
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:253
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:217
std::shared_ptr< Kakshya::CameraContainer > read_camera()
Let the user pick a camera and capture mode, then read it as above.
Definition Creator.cpp:209
std::vector< std::shared_ptr< Buffers::MeshBuffer > > load_mesh_buffers(const std::string &filepath)
Definition Creator.cpp:185
std::shared_ptr< Buffers::TextureBuffer > load_image_buffer(const std::string &filepath, int desired_channels, std::optional< Kakshya::Region > region)
Definition Creator.cpp:173
std::shared_ptr< Kakshya::CompositeContainer > load_composite_container(const std::string &filepath, std::optional< Kakshya::CompositeLayout > layout)
Definition Creator.cpp:148
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:235
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:244
std::shared_ptr< Buffers::VolumeGridBuffer > load_volume_buffer(const std::string &filepath)
Definition Creator.cpp:180
std::shared_ptr< Kakshya::SoundFileContainer > load_sound_container(const std::string &filepath)
Definition Creator.cpp:142
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:226
std::shared_ptr< Nodes::Network::MeshNetwork > load_mesh_network(const std::string &filepath, IO::TextureResolver resolver)
Definition Creator.cpp:191
std::vector< std::shared_ptr< Buffers::MeshBuffer > > m_buffers
Definition Creator.hpp:110
MeshGroupHandle & operator|(Domain d)
Definition Creator.cpp:163
MeshGroupHandle(std::vector< std::shared_ptr< Buffers::MeshBuffer > > buffers)
Definition Creator.cpp:155
@ 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:31
@ Init
Engine/subsystem initialization.
@ Runtime
General runtime operations (default fallback)
@ 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:28
void register_node(const std::shared_ptr< Nodes::Node > &node, const Nodes::ProcessingToken &token, uint32_t channel)
Definition Graph.cpp:139
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:83
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:208
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:282
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:240
void register_container(const std::shared_ptr< Kakshya::SoundFileContainer > &container, const Domain &domain)
Definition Creator.cpp:107
Domain
Unified domain enum combining all three ProcessingToken subsystems.
Definition Domain.hpp:22
@ AUDIO
Standard real-time audio processing domain.
Definition Domain.hpp:33
@ GRAPHICS
Standard real-time graphics processing domain.
Definition Domain.hpp:55
std::shared_ptr< Kakshya::CameraContainer > choose_camera(bool choose_mode)
Let the user pick a camera, and optionally a capture mode, then open it via IOManager::open_camera().
Definition Depot.cpp:302
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:250
std::shared_ptr< IO::IOManager > get_io_manager()
Retrieves the global IOManager instance for file loading and buffer management.
Definition Depot.cpp:575
void register_network(const std::shared_ptr< Nodes::Network::NodeNetwork > &network, const CreationContext &ctx)
Definition Creator.cpp:53
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:29
std::optional< std::vector< uint32_t > > channels
Definition Creator.hpp:30
std::optional< Domain > domain
Definition Creator.hpp:28
std::string device_name
Platform device string.
Configuration for opening a camera device via FFmpeg.
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.