57 : m_fn_name(
std::move(fn_name))
63 [[nodiscard]]
const std::string&
fn_name()
const {
return m_fn_name; }
74 [[nodiscard]]
const std::optional<glm::vec3>&
position()
const {
return m_position; }
90 [[nodiscard]] uint32_t
id()
const {
return m_id; }
105 std::string fn_name =
"")
107 add_audio_sink(m_audio_sinks, mgr, channel, std::move(fn), std::move(fn_name));
113 Nexus::remove_audio_sink(m_audio_sinks, mgr, channel);
126 add_render_sink(m_render_sinks, mgr, config, std::move(fn), std::move(fn_name), m_position);
129 [[nodiscard]]
const std::vector<AudioSink>&
audio_sinks()
const {
return m_audio_sinks; }
130 [[nodiscard]]
const std::vector<RenderSink>&
render_sinks()
const {
return m_render_sinks; }
134 const std::shared_ptr<Core::Window>&
window)
const
136 auto it = std::ranges::find_if(m_render_sinks,
138 return it != m_render_sinks.end() ? it->renderer :
nullptr;
159 void set_vertices(
const void* data,
size_t byte_count);
165 template <
typename T>
168 static_assert(
sizeof(T) == 60,
"set_vertices: T must be a 60-byte vertex type");
169 set_vertices(vertices.data(), vertices.size_bytes());
176 [[nodiscard]]
float intensity()
const {
return m_intensity; }
182 [[nodiscard]]
float radius()
const {
return m_radius; }
191 [[nodiscard]]
const std::optional<glm::vec3>&
color()
const {
return m_color; }
200 [[nodiscard]]
const std::optional<float>&
size()
const {
return m_size; }
215 void attach(
const std::shared_ptr<Buffers::VKBuffer>& buf,
const AttachConfig& config = {});
229 [[nodiscard]]
bool attached()
const {
return m_attachment.has_value(); }
241 template <
typename T>
244 auto influence = std::make_shared<Influence<T>>(std::move(producer));
245 influence->add_target(std::move(target));
246 m_influence = [influence](
const InfluenceContext& ctx) { influence->invoke(ctx); };
274 float m_intensity { 1.0F };
275 float m_radius { 1.0F };
std::weak_ptr< Core::Window > window
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.
const std::optional< glm::vec3 > & position() const
Return the current position, if set.
void set_influence(typename Influence< T >::Producer producer, typename Influence< T >::Target target)
Set the one target of an influence of any type.
float radius() const
Get the current radius.
std::optional< float > m_size
const std::vector< AudioSink > & audio_sinks() const
const InfluenceFn & fn() const
The influence function itself.
std::optional< glm::vec3 > m_color
void sink_audio(Buffers::BufferManager &mgr, uint32_t channel)
Register an audio output on channel.
void clear_size()
Clear the size, resetting it to an unset state.
uint32_t id() const
Return the stable object id assigned by Fabric.
std::function< void(const InfluenceContext &)> InfluenceFn
std::optional< glm::vec3 > m_position
void set_intensity(float i)
Set the intensity, a general-purpose parameter for influence functions.
const std::optional< float > & size() const
Get the current size, if set.
void set_size(float s)
Set the size, a general-purpose parameter for influence functions.
void render(Buffers::BufferManager &mgr, const Portal::Graphics::RenderConfig &config)
Register a render output targeting window.
void set_radius(float r)
Set the radius, a general-purpose parameter for influence functions.
const std::vector< RenderSink > & render_sinks() const
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.
std::optional< Attachment > m_attachment
std::vector< AudioSink > m_audio_sinks
Emitter()=default
Construct with no function, for an Emitter whose behaviour comes from a typed influence.
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.
void set_vertices(std::span< const T > vertices)
Set typed vertex data to all registered render sinks.
void remove_render(Buffers::BufferManager &mgr, const std::shared_ptr< Core::Window > &window)
Unregister the render sink targeting window.
std::vector< RenderSink > m_render_sinks
const std::optional< glm::vec3 > & color() const
Get the current color, if set.
bool attached() const
True while a buffer is attached.
void invoke(const InfluenceContext &ctx) const
Invoke the influence function with the supplied context.
Emitter(std::string fn_name, InfluenceFn fn)
Construct with a named influence function.
std::shared_ptr< Buffers::RenderProcessor > get_render_processor(const std::shared_ptr< Core::Window > &window) const
void clear_color()
Clear the color, resetting it to an unset state.
void clear_influence()
Remove the target set with set_influence().
void clear_position()
Clear the position, removing this object from spatial queries.
float intensity() const
Get the current intensity.
void set_color(const glm::vec3 &c)
Set the color, a general-purpose parameter for influence functions.
void set_audio_data(std::span< const double > samples)
Push samples to all registered audio sinks.
void set_fn_name(std::string name)
Set or replace the influence function's identifier.
void set_position(const glm::vec3 &p)
Set the position, enabling spatial indexing for this object.
Emitter(InfluenceFn fn)
Construct with an influence function.
void remove_audio_sink(Buffers::BufferManager &mgr, uint32_t channel)
Unregister the audio sink on channel.
Object that acts on existing MayaFlux objects when committed.
Orchestrates spatial indexing and scheduling for Nexus objects.
std::function< T(const Context &)> Producer
std::function< void(const T &)> Target
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 apply_attachment(Attachment &attachment, const InfluenceContext &ctx)
Rebuild the transform from ctx and place every render processor of the buffer.
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 follow_attachment(Attachment &attachment, std::optional< glm::vec3 > &position, const std::optional< glm::quat > &orientation)
Set position from the buffer, or fold an outside move into the attachment.
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.
How an Agent attaches to a buffer that already exists.
Data passed to an Emitter or Agent influence function on each commit.
std::shared_ptr< Core::Window > window
Holds the plumbing for one graphics output registered from a Nexus object.
Unified rendering configuration for graphics buffers.