diff --git a/libs/ecs/include/psemek/ecs/detail/table.hpp b/libs/ecs/include/psemek/ecs/detail/table.hpp index 84687baf..2a350fd4 100644 --- a/libs/ecs/include/psemek/ecs/detail/table.hpp +++ b/libs/ecs/include/psemek/ecs/detail/table.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,13 @@ namespace psemek::ecs::detail return component_uuids_; } + std::optional get_component_column(util::uuid const & uuid) const + { + if (auto it = component_uuid_to_column_.find(uuid); it != component_uuid_to_column_.end()) + return it->second; + return std::nullopt; + } + util::span get_component_pointers() const { return component_pointers_; @@ -86,6 +94,7 @@ namespace psemek::ecs::detail protected: std::vector component_uuids_; + util::hash_map component_uuid_to_column_; std::vector component_pointers_; std::size_t row_count_ = 0; @@ -130,6 +139,8 @@ namespace psemek::ecs::detail assert(sizeof...(Components) == component_uuids.size()); component_uuids_.assign(component_uuids.begin(), component_uuids.end()); component_pointers_.resize(sizeof...(Components)); + for (std::size_t i = 0; i < component_uuids_.size(); ++i) + component_uuid_to_column_.insert({component_uuids_[i], i}); } template diff --git a/libs/ecs/include/psemek/ecs/entity_container.hpp b/libs/ecs/include/psemek/ecs/entity_container.hpp index dc70f6c3..012446ef 100644 --- a/libs/ecs/include/psemek/ecs/entity_container.hpp +++ b/libs/ecs/include/psemek/ecs/entity_container.hpp @@ -309,13 +309,11 @@ namespace psemek::ecs { util::uuid const uuid = Component::uuid(); - auto const component_uuids = table_->get_component_uuids(); + auto column = table_->get_component_column(uuid); + if (!column) + return nullptr; - for (std::size_t i = 0; i < component_uuids.size(); ++i) - if (uuid == component_uuids[i]) - return reinterpret_cast(table_->get_component_pointers()[i].data + detail::stride() * row_); - - return nullptr; + return reinterpret_cast(table_->get_component_pointers()[*column].data + detail::stride() * row_); } template diff --git a/libs/ecs/source/detail/query_cache.cpp b/libs/ecs/source/detail/query_cache.cpp index f381bbcd..b30c7ab4 100644 --- a/libs/ecs/source/detail/query_cache.cpp +++ b/libs/ecs/source/detail/query_cache.cpp @@ -10,16 +10,7 @@ namespace psemek::ecs::detail entry.table = table; for (auto const & uuid : component_uuids) - { - for (std::size_t i = 0; i < table->component_count(); ++i) - { - if (uuid == table->get_component_uuids()[i]) - { - entry.column_ids.push_back(i); - break; - } - } - } + entry.column_ids.push_back(*(table->get_component_column(uuid))); } }