56 lines
1.6 KiB
C++
56 lines
1.6 KiB
C++
#include <psemek/ecs/entity_container.hpp>
|
|
|
|
namespace psemek::ecs
|
|
{
|
|
|
|
bool entity_container::alive(handle const & entity) const
|
|
{
|
|
return entity_list_.get_entities()[entity.id].epoch == entity.epoch;
|
|
}
|
|
|
|
void entity_container::destroy(handle const & entity)
|
|
{
|
|
do_destroy(entity);
|
|
entity_list_.destroy(entity.id);
|
|
}
|
|
|
|
entity_accessor entity_container::get(handle const & entity)
|
|
{
|
|
auto const data = entity_list_.get_entities()[entity.id];
|
|
return {data.table, data.row};
|
|
}
|
|
|
|
detail::table * entity_container::insert_table(std::vector<std::unique_ptr<detail::column>> columns)
|
|
{
|
|
auto table = table_container_.insert(std::make_unique<detail::table>(std::move(columns)));
|
|
|
|
query_cache_container_.apply([table](detail::query_cache & cache){
|
|
cache.add(table);
|
|
}, [table](util::uuid const & uuid){ return table->column(uuid) != nullptr; });
|
|
|
|
return table;
|
|
}
|
|
|
|
void entity_container::do_destroy(handle const & entity)
|
|
{
|
|
auto entities = entity_list_.get_entities();
|
|
auto & data = entities[entity.id];
|
|
auto & iteration_data = data.table->get_iteration_data();
|
|
|
|
if (!iteration_data || iteration_data->current_row < data.row)
|
|
remove_row(*data.table, data.row, entities);
|
|
else
|
|
data.table->push_remove(data.row);
|
|
}
|
|
|
|
void entity_container::remove_row(detail::table & table, std::uint32_t row, util::span<detail::entity_data> entities)
|
|
{
|
|
// Swap with the last row in that table
|
|
auto table_entity_handles = table.entity_handles();
|
|
table.swap_rows(row, table_entity_handles.size() - 1);
|
|
table.pop_row();
|
|
auto swap_handle = table_entity_handles[row];
|
|
entities[swap_handle.id].row = row;
|
|
}
|
|
|
|
}
|