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

◆ register_element() [1/2]

template<typename T >
void MayaFlux::Portal::Forma::Bridge::register_element ( const ElementRef &  ref,
std::shared_ptr< MappedState< T > >  state,
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 and reader.

Called by Forma::create_element. The reader closes over the MappedState and is stored type-erased as std::function<float()>. The state records ref so later calls made through it address the same element. Rejected, with an error logged, when the Layer in ref has no shared_ptr owner.

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

Definition at line 378 of file Bridge.hpp.

382 {})
383 {
384 if (ref.first.expired()) {
386 "Bridge::register_element: element {} belongs to a Layer with no shared owner", ref.second);
387 return;
388 }
389
390 const uint32_t id = ref.second;
391
392 std::function<float()> reader;
393 if (project) {
394 reader = [s = state, p = std::move(project)] {
395 return p(s->value);
396 };
397 } else if constexpr (std::is_convertible_v<T, float>) {
398 reader = [s = state] {
399 return static_cast<float>(s->value);
400 };
401 } else {
402 reader = [id, reported = std::make_shared<bool>(false)] {
403 if (!*reported) {
404 *reported = true;
406 "Bridge: element {} has state type '{}' with no float conversion and no projection; its outbound reader yields 0",
407 id, typeid(T).name());
408 }
409 return 0.F;
410 };
411 }
412
413 std::function<std::vector<float>()> bulk_reader;
414 if constexpr (std::is_same_v<T, std::vector<float>>) {
415 bulk_reader = [s = state] { return s->value; };
416 } else if constexpr (std::is_same_v<T, std::vector<double>>) {
417 bulk_reader = [s = state] {
418 std::vector<float> out;
419 out.reserve(s->value.size());
420 for (double v : s->value)
421 out.push_back(static_cast<float>(v));
422 return out;
423 };
424 } else if constexpr (std::is_same_v<T, glm::vec2> || std::is_same_v<T, glm::vec3> || std::is_same_v<T, glm::vec4>) {
425 bulk_reader = [s = state] {
426 return std::vector<float>(&s->value[0], &s->value[0] + T::length());
427 };
428 }
429
430 std::function<Kakshya::GpuValue()> typed_reader;
431 std::optional<Kakshya::GpuDataFormat> typed_format;
432 if constexpr (Kakshya::GpuFormatElement<T>) {
433 typed_reader = [s = state] { return Kakshya::GpuValue { s->value }; };
434 typed_format = Kakshya::gpu_data_format_v<T>;
435 }
436
437 std::function<void(float)> writer;
438 if constexpr (std::is_convertible_v<float, T>) {
439 writer = [s = state](float v) {
440 s->write(static_cast<T>(v));
441 };
442 } else {
443 writer = [id, reported = std::make_shared<bool>(false)](float) {
444 if (!*reported) {
445 *reported = true;
447 "Bridge: element {} has state type '{}' with no float conversion and no projection; its inbound writer does nothing",
448 id, typeid(T).name());
449 }
450 };
451 }
452
453 state->id = id;
454 state->layer = ref.first;
455 m_records[ref.first][id] = ElementRecord {
456 .buffer = std::move(buffer),
457 .bindings = nullptr,
458 .reader = std::move(reader),
459 .bulk_reader = std::move(bulk_reader),
460 .writer = std::move(writer),
461 .inbound_task = {},
462 .outbound_tasks = {},
463 .binding_names = {},
464 .typed_reader = std::move(typed_reader),
465 .typed_format = typed_format,
466 };
467 }
#define MF_ERROR(comp, ctx,...)
#define MF_RT_WARN(comp, ctx,...)
std::shared_ptr< NetworkGeometryBuffer > buffer
std::vector< float > * out
glm::vec3 value
std::string name
Definition VKDevice.cpp:123
std::map< std::weak_ptr< Layer >, std::unordered_map< uint32_t, ElementRecord >, std::owner_less<> > m_records
Definition Bridge.hpp:698
@ Init
Engine/subsystem initialization.
@ Portal
High-level user-facing API layer.
std::variant< float, glm::vec2, glm::vec3, glm::vec4, double, glm::dvec2, glm::dvec3, glm::dvec4, int32_t, uint32_t, uint8_t, uint16_t, glm::mat4 > GpuValue
One value of any GpuDataFormat.

Referenced by MayaFlux::Portal::Forma::ColorPicker::place().

+ Here is the caller graph for this function: