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),
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::GeometryWriteProcessor>();
119 }
else if (is_mesh) {
125 buf->set_default_processor(writer);
133 if (vert.empty() || frag.empty()) {
138 frag =
"line.frag.spv";
139#ifndef MAYAFLUX_PLATFORM_MACOS
141 vert =
"line.vert.spv";
143 geom =
"line.geom.spv";
146 vert =
"line_fallback.vert.spv";
152 vert =
"triangle.vert.spv";
154 frag =
"triangle.frag.spv";
158 vert =
"point.vert.spv";
160 frag =
"point.frag.spv";
166 renderer->set_fragment_shader(frag);
168 renderer->set_geometry_shader(geom);
170 renderer->set_primitive_topology(config.
topology);
172 renderer->set_cull_mode(config.
cull_mode);
174 buf->get_processing_chain()->add_final_processor(renderer, buf);
178 .writer = std::move(writer),
179 .renderer = std::move(renderer),
185 if (!sink.fn && initial_position.has_value()) {
186 sink.writer->set_data(
191 "Nexus: render sink added");
195 std::vector<RenderSink>& sinks,
197 const std::shared_ptr<Core::Window>& window)
199 auto it = std::ranges::find_if(sinks,
202 if (it == sinks.end()) {
204 "Nexus: remove_render_sink called but no sink found for given window");
212 "Nexus: render sink removed");
216 std::vector<RenderSink>& sinks,
217 const void* data,
size_t byte_count,
220 for (
auto& s : sinks) {
221 s.writer->set_vertices(data, byte_count, layout);
227 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.
@ LINE
Interpret vertex data as Nodes::LineVertex.
@ MESH
Interpret vertex data as Nodes::MeshVertex.
@ POINT
Interpret vertex data as Nodes::PointVertex.
@ 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.
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 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 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_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.
std::function< void(const InfluenceContext &)> RenderFn
void push_audio_data(std::vector< AudioSink > &sinks, std::span< const double > samples)
Push samples to every audio sink in sinks.
void remove_audio_sink(std::vector< AudioSink > &sinks, Buffers::BufferManager &mgr, uint32_t channel)
Unregister and destroy the audio sink on channel.
void push_vertices(std::vector< RenderSink > &sinks, const void *data, size_t byte_count, const Kakshya::VertexLayout &layout)
Push pre-resolved vertex bytes to every render sink.
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.
Complete description of vertex data layout in a buffer.
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.