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));
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
431 std::optional<Kakshya::GpuDataFormat> typed_format;
432 if constexpr (Kakshya::GpuFormatElement<T>) {
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
@ 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.