|
5 | 5 | #include <optional>
|
6 | 6 | #include <filesystem>
|
7 | 7 | #include <unordered_map>
|
| 8 | +#include "ecsact/runtime/common.h" |
8 | 9 | #include "ecsact/runtime/meta.h"
|
9 | 10 |
|
10 | 11 | namespace ecsact::meta {
|
@@ -179,6 +180,17 @@ ECSACT_ALWAYS_INLINE std::vector<ecsact_field_id> get_field_ids(
|
179 | 180 | return field_ids;
|
180 | 181 | }
|
181 | 182 |
|
| 183 | +template<typename CompositeID> |
| 184 | +ECSACT_ALWAYS_INLINE auto get_field_type( |
| 185 | + CompositeID id, |
| 186 | + ecsact_field_id field_id |
| 187 | +) -> ecsact_field_type { |
| 188 | + return ecsact_meta_field_type( |
| 189 | + ecsact_id_cast<ecsact_composite_id>(id), |
| 190 | + field_id |
| 191 | + ); |
| 192 | +} |
| 193 | + |
182 | 194 | ECSACT_ALWAYS_INLINE std::vector<ecsact_system_id> get_system_ids(
|
183 | 195 | ecsact_package_id package_id
|
184 | 196 | ) {
|
@@ -484,67 +496,85 @@ ECSACT_ALWAYS_INLINE auto get_system_generates_components(
|
484 | 496 | return result;
|
485 | 497 | }
|
486 | 498 |
|
487 |
| -template<typename SystemLikeID, typename ComponentLikeID> |
488 |
| -ECSACT_ALWAYS_INLINE auto system_association_fields( |
489 |
| - SystemLikeID system_id, |
490 |
| - ComponentLikeID component_id |
491 |
| -) { |
492 |
| - auto sys_like_id = ecsact_id_cast<ecsact_system_like_id>(system_id); |
493 |
| - auto comp_like_id = ecsact_id_cast<ecsact_component_like_id>(component_id); |
494 |
| - |
495 |
| - std::vector<ecsact_field_id> field_ids; |
496 |
| - field_ids.resize( |
497 |
| - ecsact_meta_system_association_fields_count(sys_like_id, comp_like_id) |
| 499 | +template<typename SystemLikeID> |
| 500 | +ECSACT_ALWAYS_INLINE auto system_assoc_ids( // |
| 501 | + SystemLikeID system_id |
| 502 | +) -> std::vector<ecsact_system_assoc_id> { |
| 503 | + auto result = std::vector<ecsact_system_assoc_id>{}; |
| 504 | + result.resize(32); |
| 505 | + auto assoc_count = int32_t{}; |
| 506 | + |
| 507 | + ecsact_meta_system_assoc_ids( |
| 508 | + ecsact_id_cast<ecsact_system_like_id>(system_id), |
| 509 | + static_cast<int32_t>(result.size()), |
| 510 | + result.data(), |
| 511 | + &assoc_count |
498 | 512 | );
|
499 | 513 |
|
500 |
| - ecsact_meta_system_association_fields( |
501 |
| - sys_like_id, |
502 |
| - comp_like_id, |
503 |
| - static_cast<int32_t>(field_ids.size()), |
504 |
| - field_ids.data(), |
505 |
| - nullptr |
| 514 | + result.resize(assoc_count); |
| 515 | + |
| 516 | + return result; |
| 517 | +} |
| 518 | + |
| 519 | +template<typename SystemLikeID> |
| 520 | +ECSACT_ALWAYS_INLINE auto system_assoc_component_id( // |
| 521 | + SystemLikeID system_id, |
| 522 | + ecsact_system_assoc_id assoc_id |
| 523 | +) -> ecsact_component_like_id { |
| 524 | + return ecsact_meta_system_assoc_component_id( |
| 525 | + ecsact_id_cast<ecsact_system_like_id>(system_id), |
| 526 | + assoc_id |
506 | 527 | );
|
| 528 | +} |
507 | 529 |
|
508 |
| - return field_ids; |
| 530 | +template<typename SystemLikeID> |
| 531 | +ECSACT_ALWAYS_INLINE auto system_assoc_fields( |
| 532 | + SystemLikeID system_id, |
| 533 | + ecsact_system_assoc_id assoc_id |
| 534 | +) -> std::vector<ecsact_field_id> { |
| 535 | + auto result = std::vector<ecsact_field_id>{}; |
| 536 | + result.resize(32); |
| 537 | + auto fields_count = int32_t{}; |
| 538 | + ecsact_meta_system_assoc_fields( |
| 539 | + system_id, |
| 540 | + assoc_id, |
| 541 | + result.size(), |
| 542 | + result.data(), |
| 543 | + &fields_count |
| 544 | + ); |
| 545 | + result.resize(fields_count); |
| 546 | + return result; |
509 | 547 | }
|
510 | 548 |
|
511 |
| -template<typename SystemLikeID, typename ComponentLikeID> |
512 |
| -ECSACT_ALWAYS_INLINE auto system_association_capabilities( |
513 |
| - SystemLikeID system_id, |
514 |
| - ComponentLikeID component_id, |
515 |
| - ecsact_field_id field_id |
| 549 | +template<typename SystemLikeID> |
| 550 | +ECSACT_ALWAYS_INLINE auto system_assoc_capabilities( |
| 551 | + SystemLikeID id, |
| 552 | + ecsact_system_assoc_id assoc_id |
516 | 553 | ) {
|
517 | 554 | using result_t =
|
518 |
| - std::unordered_map<ecsact_component_like_id, ecsact_system_capability>; |
519 |
| - |
520 |
| - auto sys_like_id = ecsact_id_cast<ecsact_system_like_id>(system_id); |
521 |
| - auto comp_like_id = ecsact_id_cast<ecsact_component_like_id>(component_id); |
| 555 | + std::vector<std::pair<ecsact_component_like_id, ecsact_system_capability>>; |
522 | 556 |
|
523 |
| - auto count = ecsact_meta_system_association_capabilities_count( |
524 |
| - sys_like_id, |
525 |
| - comp_like_id, |
526 |
| - field_id |
527 |
| - ); |
| 557 | + const auto sys_like_id = ecsact_id_cast<ecsact_system_like_id>(id); |
| 558 | + auto count = ecsact_meta_system_capabilities_count(sys_like_id); |
528 | 559 | std::vector<ecsact_component_like_id> components;
|
529 | 560 | std::vector<ecsact_system_capability> capabilities;
|
530 | 561 | components.resize(count);
|
531 | 562 | capabilities.resize(count);
|
532 | 563 |
|
533 |
| - ecsact_meta_system_association_capabilities( |
| 564 | + ecsact_meta_system_assoc_capabilities( |
534 | 565 | sys_like_id,
|
535 |
| - comp_like_id, |
536 |
| - field_id, |
| 566 | + assoc_id, |
537 | 567 | count,
|
538 | 568 | components.data(),
|
539 | 569 | capabilities.data(),
|
540 | 570 | nullptr
|
541 | 571 | );
|
542 | 572 |
|
543 | 573 | result_t result;
|
544 |
| - result.reserve(count); |
| 574 | + result.resize(count); |
545 | 575 |
|
546 | 576 | for(decltype(count) i = 0; count > i; ++i) {
|
547 |
| - result[components[i]] = capabilities[i]; |
| 577 | + result[i] = {components[i], capabilities[i]}; |
548 | 578 | }
|
549 | 579 |
|
550 | 580 | return result;
|
@@ -592,6 +622,17 @@ auto system_notify_settings( //
|
592 | 622 | return result;
|
593 | 623 | }
|
594 | 624 |
|
| 625 | +template<typename CompositeID> |
| 626 | +ECSACT_ALWAYS_INLINE auto field_name( // |
| 627 | + CompositeID id, |
| 628 | + ecsact_field_id field_id |
| 629 | +) -> std::string { |
| 630 | + return ecsact_meta_field_name( |
| 631 | + ecsact_id_cast<ecsact_composite_id>(id), |
| 632 | + field_id |
| 633 | + ); |
| 634 | +} |
| 635 | + |
595 | 636 | ECSACT_ALWAYS_INLINE auto main_package() -> std::optional<ecsact_package_id> {
|
596 | 637 | auto main_pkg_id = ecsact_meta_main_package();
|
597 | 638 | if(main_pkg_id == static_cast<ecsact_package_id>(-1)) {
|
|
0 commit comments