MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Emitter.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "Sinks.hpp"
5
7
8namespace MayaFlux::Buffers {
9class VKBuffer;
10}
11
12namespace MayaFlux::Nexus {
13
14/**
15 * @class Emitter
16 * @brief Object that acts on existing MayaFlux objects when committed.
17 *
18 * Constructed with only an influence function. Position is optional: call
19 * @c set_position before registering with @c Fabric if spatial indexing is
20 * required. Entities without a position are committed normally but are not
21 * inserted into the spatial index.
22 *
23 * The id is assigned by @c Fabric::wire and is stable for the object's
24 * lifetime. It is zero until the object has been registered.
25 */
26class Emitter {
27public:
28 using InfluenceFn = std::function<void(const InfluenceContext&)>;
29
30 /**
31 * @brief Construct with an influence function.
32 * @param fn Called on every commit with the current context.
33 */
35 : m_fn(std::move(fn))
36 {
37 }
38
39 /**
40 * @brief Construct with a named influence function.
41 * @param fn_name Identifier used for state encoding.
42 * @param fn Called on every commit with the current context.
43 */
45 : m_fn_name(std::move(fn_name))
46 , m_fn(std::move(fn))
47 {
48 }
49
50 /** @brief Identifier assigned to the influence function, empty if anonymous. */
51 [[nodiscard]] const std::string& fn_name() const { return m_fn_name; }
52
53 /** @brief Set or replace the influence function's identifier. */
54 void set_fn_name(std::string name) { m_fn_name = std::move(name); }
55
56 /** @brief The influence function itself. */
57 [[nodiscard]] const InfluenceFn& fn() const { return m_fn; }
58
59 /**
60 * @brief Return the current position, if set.
61 */
62 [[nodiscard]] const std::optional<glm::vec3>& position() const { return m_position; }
63
64 /**
65 * @brief Set the position, enabling spatial indexing for this object.
66 * @param p World-space coordinates.
67 */
68 void set_position(const glm::vec3& p) { m_position = p; }
69
70 /**
71 * @brief Clear the position, removing this object from spatial queries.
72 */
73 void clear_position() { m_position.reset(); }
74
75 /**
76 * @brief Return the stable object id assigned by Fabric.
77 */
78 [[nodiscard]] uint32_t id() const { return m_id; }
79
80 // =========================================================================
81 // Output sinks
82 // =========================================================================
83
84 /** @brief Register an audio output on @p channel. */
89
90 /** @brief Register an audio output on @p channel with a producer function. */
92 std::function<Kakshya::DataVariant(const InfluenceContext&)> fn,
93 std::string fn_name = "")
94 {
95 add_audio_sink(m_audio_sinks, mgr, channel, std::move(fn), std::move(fn_name));
96 }
97
98 /** @brief Unregister the audio sink on @p channel. */
103
104 /** @brief Register a render output targeting @p window. */
106 {
107 add_render_sink(m_render_sinks, mgr, config, {}, "", m_position);
108 }
109
110 /** @brief Register a render output targeting @p window with a producer function. */
112 std::string fn_name, RenderFn fn)
113 {
114 add_render_sink(m_render_sinks, mgr, config, std::move(fn), std::move(fn_name), m_position);
115 }
116
117 [[nodiscard]] const std::vector<AudioSink>& audio_sinks() const { return m_audio_sinks; }
118 [[nodiscard]] const std::vector<RenderSink>& render_sinks() const { return m_render_sinks; }
119
120 /* @brief Return the render processor for the sink targeting @p window, or nullptr if not found. */
121 std::shared_ptr<Buffers::RenderProcessor> get_render_processor(
122 const std::shared_ptr<Core::Window>& window) const
123 {
124 auto it = std::ranges::find_if(m_render_sinks,
125 [&window](const RenderSink& s) { return s.window == window; });
126 return it != m_render_sinks.end() ? it->renderer : nullptr;
127 }
128
129 /** @brief Unregister the render sink targeting @p window. */
130 void remove_render(Buffers::BufferManager& mgr, const std::shared_ptr<Core::Window>& window)
131 {
133 }
134
135 /** @brief Push @p samples to all registered audio sinks. */
136 void set_audio_data(std::span<const double> samples)
137 {
139 }
140
141 /**
142 * @brief Push pre-resolved vertex bytes to all registered render sinks.
143 * @param data Pointer to vertex data.
144 * @param byte_count Total size in bytes.
145 * @param layout VertexLayout describing stride and attributes.
146 */
147 void set_vertices(const void* data, size_t byte_count,
148 const Kakshya::VertexLayout& layout)
149 {
150 push_vertices(m_render_sinks, data, byte_count, layout);
151 }
152
153 /**
154 * @brief Push typed vertex data to all registered render sinks.
155 * @tparam T One of Nodes::PointVertex, Nodes::LineVertex, Nodes::MeshVertex.
156 * @param vertices Span of vertex structs.
157 */
158 template <typename T>
159 void set_vertices(std::span<const T> vertices)
160 {
161 auto layout = Nodes::vertex_layout_for<T>();
162 layout.vertex_count = static_cast<uint32_t>(vertices.size());
163 push_vertices(m_render_sinks, vertices.data(),
164 vertices.size_bytes(), layout);
165 }
166
167 /** @brief Set the intensity, a general-purpose parameter for influence functions. */
168 void set_intensity(float i) { m_intensity = i; }
169
170 /** @brief Get the current intensity. */
171 [[nodiscard]] float intensity() const { return m_intensity; }
172
173 /** @brief Set the radius, a general-purpose parameter for influence functions. */
174 void set_radius(float r) { m_radius = r; }
175
176 /** @brief Get the current radius. */
177 [[nodiscard]] float radius() const { return m_radius; }
178
179 /** @brief Set the color, a general-purpose parameter for influence functions. */
180 void set_color(const glm::vec3& c) { m_color = c; }
181
182 /** @brief Clear the color, resetting it to an unset state. */
183 void clear_color() { m_color.reset(); }
184
185 /** @brief Get the current color, if set. */
186 [[nodiscard]] const std::optional<glm::vec3>& color() const { return m_color; }
187
188 /** @brief Set the size, a general-purpose parameter for influence functions. */
189 void set_size(float s) { m_size = s; }
190
191 /** @brief Clear the size, resetting it to an unset state. */
192 void clear_size() { m_size.reset(); }
193
194 /** @brief Get the current size, if set. */
195 [[nodiscard]] const std::optional<float>& size() const { return m_size; }
196
197 /**
198 * @brief Set the render processor to target for GPU-side influence delivery.
199 *
200 * Creates a UBO matching the InfluenceUBO layout, registers a binding
201 * named "u_influence" at set=1 binding=0 on the target processor,
202 * and binds the UBO. On each subsequent invoke(), the context fields
203 * are packed into the UBO automatically.
204 *
205 * @param proc Target render processor. Must outlive this Emitter or
206 * be cleared via clear_influence_target() first.
207 */
208 void set_influence_target(std::shared_ptr<Buffers::RenderProcessor> proc);
209
210 /**
211 * @brief Disconnect from the current influence target.
212 *
213 * Unbinds the "u_influence" descriptor from the target processor
214 * and releases the UBO.
215 */
217
218 /**
219 * @brief Return the current influence target, if set.
220 */
221 [[nodiscard]] std::weak_ptr<Buffers::RenderProcessor> influence_target() const
222 {
223 return m_influence_target;
224 }
225
226 /**
227 * @brief Invoke the influence function with the supplied context.
228 * @param ctx Populated context for this commit.
229 */
230 void invoke(const InfluenceContext& ctx) const
231 {
232 if (m_fn) {
233 m_fn(ctx);
234 }
237 if (m_influence_ubo)
239 }
240
241private:
242 std::optional<glm::vec3> m_position;
243 std::optional<glm::vec3> m_color;
244 std::optional<float> m_size;
245 float m_intensity { 1.0F };
246 float m_radius { 1.0F };
247
248 std::shared_ptr<Buffers::RenderProcessor> m_influence_target;
249 std::shared_ptr<Buffers::VKBuffer> m_influence_ubo;
250
252 uint32_t m_id {};
253 std::string m_fn_name;
254
255 mutable std::vector<AudioSink> m_audio_sinks;
256 mutable std::vector<RenderSink> m_render_sinks;
257
258 void upload_influence_ubo(const InfluenceContext& ctx) const;
259
260 friend class Fabric;
261};
262
263} // namespace MayaFlux::Nexus
uint32_t channel
Token-based multimodal buffer management system for unified data stream processing.
const std::string & fn_name() const
Identifier assigned to the influence function, empty if anonymous.
Definition Emitter.hpp:51
void set_vertices(const void *data, size_t byte_count, const Kakshya::VertexLayout &layout)
Push pre-resolved vertex bytes to all registered render sinks.
Definition Emitter.hpp:147
const std::optional< glm::vec3 > & position() const
Return the current position, if set.
Definition Emitter.hpp:62
float radius() const
Get the current radius.
Definition Emitter.hpp:177
std::weak_ptr< Buffers::RenderProcessor > influence_target() const
Return the current influence target, if set.
Definition Emitter.hpp:221
std::shared_ptr< Buffers::VKBuffer > m_influence_ubo
Definition Emitter.hpp:249
std::optional< float > m_size
Definition Emitter.hpp:244
const std::vector< AudioSink > & audio_sinks() const
Definition Emitter.hpp:117
const InfluenceFn & fn() const
The influence function itself.
Definition Emitter.hpp:57
std::optional< glm::vec3 > m_color
Definition Emitter.hpp:243
void sink_audio(Buffers::BufferManager &mgr, uint32_t channel)
Register an audio output on channel.
Definition Emitter.hpp:85
void clear_size()
Clear the size, resetting it to an unset state.
Definition Emitter.hpp:192
uint32_t id() const
Return the stable object id assigned by Fabric.
Definition Emitter.hpp:78
std::function< void(const InfluenceContext &)> InfluenceFn
Definition Emitter.hpp:28
std::shared_ptr< Buffers::RenderProcessor > m_influence_target
Definition Emitter.hpp:248
std::optional< glm::vec3 > m_position
Definition Emitter.hpp:242
void set_intensity(float i)
Set the intensity, a general-purpose parameter for influence functions.
Definition Emitter.hpp:168
const std::optional< float > & size() const
Get the current size, if set.
Definition Emitter.hpp:195
void set_size(float s)
Set the size, a general-purpose parameter for influence functions.
Definition Emitter.hpp:189
void render(Buffers::BufferManager &mgr, const Portal::Graphics::RenderConfig &config)
Register a render output targeting window.
Definition Emitter.hpp:105
void set_influence_target(std::shared_ptr< Buffers::RenderProcessor > proc)
Set the render processor to target for GPU-side influence delivery.
Definition Emitter.cpp:10
void set_radius(float r)
Set the radius, a general-purpose parameter for influence functions.
Definition Emitter.hpp:174
void upload_influence_ubo(const InfluenceContext &ctx) const
Definition Emitter.cpp:42
const std::vector< RenderSink > & render_sinks() const
Definition Emitter.hpp:118
void render(Buffers::BufferManager &mgr, const Portal::Graphics::RenderConfig &config, std::string fn_name, RenderFn fn)
Register a render output targeting window with a producer function.
Definition Emitter.hpp:111
std::vector< AudioSink > m_audio_sinks
Definition Emitter.hpp:255
void sink_audio(Buffers::BufferManager &mgr, uint32_t channel, std::function< Kakshya::DataVariant(const InfluenceContext &)> fn, std::string fn_name="")
Register an audio output on channel with a producer function.
Definition Emitter.hpp:91
void set_vertices(std::span< const T > vertices)
Push typed vertex data to all registered render sinks.
Definition Emitter.hpp:159
void remove_render(Buffers::BufferManager &mgr, const std::shared_ptr< Core::Window > &window)
Unregister the render sink targeting window.
Definition Emitter.hpp:130
std::vector< RenderSink > m_render_sinks
Definition Emitter.hpp:256
const std::optional< glm::vec3 > & color() const
Get the current color, if set.
Definition Emitter.hpp:186
void invoke(const InfluenceContext &ctx) const
Invoke the influence function with the supplied context.
Definition Emitter.hpp:230
Emitter(std::string fn_name, InfluenceFn fn)
Construct with a named influence function.
Definition Emitter.hpp:44
std::shared_ptr< Buffers::RenderProcessor > get_render_processor(const std::shared_ptr< Core::Window > &window) const
Definition Emitter.hpp:121
void clear_color()
Clear the color, resetting it to an unset state.
Definition Emitter.hpp:183
void clear_position()
Clear the position, removing this object from spatial queries.
Definition Emitter.hpp:73
float intensity() const
Get the current intensity.
Definition Emitter.hpp:171
void set_color(const glm::vec3 &c)
Set the color, a general-purpose parameter for influence functions.
Definition Emitter.hpp:180
void set_audio_data(std::span< const double > samples)
Push samples to all registered audio sinks.
Definition Emitter.hpp:136
void clear_influence_target()
Disconnect from the current influence target.
Definition Emitter.cpp:35
void set_fn_name(std::string name)
Set or replace the influence function's identifier.
Definition Emitter.hpp:54
void set_position(const glm::vec3 &p)
Set the position, enabling spatial indexing for this object.
Definition Emitter.hpp:68
Emitter(InfluenceFn fn)
Construct with an influence function.
Definition Emitter.hpp:34
void remove_audio_sink(Buffers::BufferManager &mgr, uint32_t channel)
Unregister the audio sink on channel.
Definition Emitter.hpp:99
Object that acts on existing MayaFlux objects when committed.
Definition Emitter.hpp:26
Orchestrates spatial indexing and scheduling for Nexus objects.
Definition Fabric.hpp:37
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.
Definition NDData.hpp:76
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.
Definition Sinks.cpp:194
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.
Definition Sinks.cpp:18
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.
Definition Sinks.cpp:71
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.
Definition Sinks.cpp:95
std::function< void(const InfluenceContext &)> RenderFn
Definition Sinks.hpp:28
void push_audio_data(std::vector< AudioSink > &sinks, std::span< const double > samples)
Push samples to every audio sink in sinks.
Definition Sinks.cpp:64
void remove_audio_sink(std::vector< AudioSink > &sinks, Buffers::BufferManager &mgr, uint32_t channel)
Unregister and destroy the audio sink on channel.
Definition Sinks.cpp:43
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.
Definition Sinks.cpp:215
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.
Definition Sinks.cpp:225
Complete description of vertex data layout in a buffer.
Data passed to an Emitter or Agent influence function on each commit.
std::shared_ptr< Core::Window > window
Definition Sinks.hpp:71
Holds the plumbing for one graphics output registered from a Nexus object.
Definition Sinks.hpp:65
Unified rendering configuration for graphics buffers.