19 std::vector<AudioSink>& sinks,
26 auto writer = std::make_shared<Buffers::AudioWriteProcessor>();
27 buf->set_default_processor(writer);
32 .
buf = std::move(buf),
33 .writer = std::move(writer),
35 .fn_name = std::move(fn_name),
40 "Nexus: audio sink added on channel {}", channel);
44 std::vector<AudioSink>& sinks,
48 auto it = std::ranges::find_if(sinks,
51 if (it == sinks.end()) {
53 "Nexus: remove_audio_sink called for channel {} but no sink found", channel);
61 "Nexus: audio sink removed from channel {}", channel);
64void push_audio_data(std::vector<AudioSink>& sinks, std::span<const double> samples)
66 for (
auto& s : sinks) {
67 s.writer->set_data(samples);
73 for (
auto& s : sinks) {
77 auto variant = s.fn(ctx);
79 if (
auto* vec = std::get_if<std::vector<double>>(&variant)) {
80 s.writer->set_data(std::span<const double>(*vec));
83 const Eigen::VectorXd v = acc.
to_vector();
84 std::vector<double> samples(
static_cast<size_t>(v.size()));
85 Eigen::Map<Eigen::VectorXd>(samples.data(), v.size()) = v;
86 s.writer->set_data(std::span<const double>(samples));
96 std::vector<RenderSink>& sinks,
101 const std::optional<glm::vec3>& initial_position)
103 constexpr size_t k_initial_bytes = 4096;
105 auto buf = std::make_shared<Buffers::VKBuffer>(
110 auto writer = std::make_shared<Buffers::DataWriteProcessor>();
111 buf->set_default_processor(writer);
118 if (vert.empty() || frag.empty()) {
123 frag =
"line.frag.spv";
124#ifndef MAYAFLUX_PLATFORM_MACOS
126 vert =
"line.vert.spv";
128 geom =
"line.geom.spv";
131 vert =
"line_fallback.vert.spv";
137 vert =
"triangle.vert.spv";
139 frag =
"triangle.frag.spv";
143 vert =
"point.vert.spv";
145 frag =
"point.frag.spv";
151 renderer->set_fragment_shader(frag);
154 renderer->set_geometry_shader(geom);
156 renderer->set_primitive_topology(config.
topology);
158 renderer->set_cull_mode(config.
cull_mode);
160 renderer->enable_depth_test();
161 buf->set_needs_depth_attachment(
true);
164 buf->set_render_processor(renderer);
165 buf->get_processing_chain()->add_final_processor(renderer, buf);
169 .writer = std::move(writer),
170 .renderer = std::move(renderer),
172 .fn_name = std::move(fn_name),
176 if (!sink.fn && initial_position.has_value()) {
177 sink.writer->set_data(std::vector<Kakshya::DataVariant> {
183 "Nexus: render sink added");
187 std::vector<RenderSink>& sinks,
189 const std::shared_ptr<Core::Window>& window)
191 auto it = std::ranges::find_if(sinks,
194 if (it == sinks.end()) {
196 "Nexus: remove_render_sink called but no sink found for given window");
204 "Nexus: render sink removed");
209 for (
auto& s : sinks) {
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
void remove_buffer(const std::shared_ptr< Buffer > &buffer, ProcessingToken token, uint32_t channel=0)
Removes a buffer from a token.
void add_buffer(const std::shared_ptr< Buffer > &buffer, ProcessingToken token, uint32_t channel=0)
Adds a buffer to a token and channel.
Token-based multimodal buffer management system for unified data stream processing.
Eigen::VectorXd to_vector() const
Convert DataVariant to Eigen column vector.
Type-erased accessor for converting DataVariant to Eigen types.
uint32_t s_preferred_buffer_size
Global default buffer size.
@ AUDIO_BACKEND
Standard audio processing backend configuration.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
@ VERTICES_3D
3D vertex data (positions, normals, etc.)
std::function< void(const InfluenceContext &)> RenderFn
void remove_render_sink(std::vector< RenderSink > &sinks, Buffers::BufferManager &mgr, const std::shared_ptr< Core::Window > &window)
Unregister and destroy the render sink targeting window.
void dispatch_render_sinks(std::vector< RenderSink > &sinks, const InfluenceContext &ctx)
For each sink that has a producer fn, call it and push the result.
void push_audio_data(std::vector< AudioSink > &sinks, std::span< const double > samples)
Push samples to every audio sink in sinks.
void dispatch_audio_sinks(std::vector< AudioSink > &sinks, const InfluenceContext &ctx)
For each sink that has a producer fn, call it and push the result.
void add_audio_sink(std::vector< AudioSink > &sinks, Buffers::BufferManager &mgr, uint32_t channel, std::function< Kakshya::DataVariant(const InfluenceContext &)> fn, std::string fn_name)
Create and register an audio sink on channel.
void add_render_sink(std::vector< RenderSink > &sinks, Buffers::BufferManager &mgr, const Portal::Graphics::RenderConfig &config, RenderFn fn, std::string fn_name, const std::optional< glm::vec3 > &initial_position)
Create and register a render sink targeting window.
void remove_audio_sink(std::vector< AudioSink > &sinks, Buffers::BufferManager &mgr, uint32_t channel)
Unregister and destroy the audio sink on channel.
std::shared_ptr< Buffers::AudioBuffer > buf
Holds the plumbing for one audio output registered from a Nexus object.
Data passed to an Emitter or Agent influence function on each commit.
std::shared_ptr< Core::Window > window
std::shared_ptr< Buffers::VKBuffer > buf
Holds the plumbing for one graphics output registered from a Nexus object.
std::shared_ptr< Core::Window > target_window
PrimitiveTopology topology
std::string vertex_shader
std::string fragment_shader
std::string geometry_shader
Unified rendering configuration for graphics buffers.