MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ register_element() [2/2]

template<typename T >
void MayaFlux::Portal::Forma::Bridge::register_element ( std::shared_ptr< MappedState< T > >  state,
uint32_t  id,
std::shared_ptr< Buffers::FormaBuffer buffer,
std::function< float(T)>  project = {} 
)
inline

Register a MappedState<T> so that MappedState overloads and outbound bindings can resolve to the correct element id and reader.

Called by Forma::create_element. The reader closes over the MappedState and is stored type-erased as std::function<float()>.

Template Parameters
TMappedState value type.
Parameters
stateMappedState to register.
idElement id from Layer::add.
bufferFormaBuffer the element renders into.
projectOptional T -> float projection. Identity cast if empty.

Definition at line 280 of file Bridge.hpp.

284 {})
285 {
286 std::function<float()> reader;
287 if (project) {
288 reader = [s = state, p = std::move(project)] {
289 return p(s->value);
290 };
291 } else if constexpr (std::is_convertible_v<T, float>) {
292 reader = [s = state] {
293 return static_cast<float>(s->value);
294 };
295 } else {
296 reader = [] { return 0.F; };
297 }
298
299 std::function<std::vector<float>()> bulk_reader;
300 if constexpr (std::is_same_v<T, std::vector<float>>) {
301 bulk_reader = [s = state] { return s->value; };
302 } else if constexpr (std::is_same_v<T, std::vector<double>>) {
303 bulk_reader = [s = state] {
304 std::vector<float> out;
305 out.reserve(s->value.size());
306 for (double v : s->value)
307 out.push_back(static_cast<float>(v));
308 return out;
309 };
310 }
311
312 std::function<void(float)> writer;
313 if constexpr (std::is_convertible_v<float, T>) {
314 writer = [s = state](float v) {
315 s->write(static_cast<T>(v));
316 };
317 } else {
318 writer = [](float) { };
319 }
320
321 state->id = id;
322 m_records[id] = ElementRecord {
323 .buffer = std::move(buffer),
324 .bindings = nullptr,
325 .reader = std::move(reader),
326 .bulk_reader = std::move(bulk_reader),
327 .writer = std::move(writer),
328 .inbound_task = {},
329 .outbound_tasks = {},
330 };
331 }
std::unordered_map< uint32_t, ElementRecord > m_records
Definition Bridge.hpp:527