Fix copying entities

This commit is contained in:
Nikita Lisitsa 2024-01-06 22:21:07 +03:00
parent 5e64a4c216
commit 080893ee96
2 changed files with 20 additions and 15 deletions

View file

@ -17,6 +17,11 @@ namespace psemek::ecs::detail
return data_;
}
std::uint8_t const * data() const
{
return data_;
}
std::size_t stride() const
{
return stride_;
@ -38,8 +43,8 @@ namespace psemek::ecs::detail
}
virtual void push_row() = 0;
virtual void emplace_rows(std::uint8_t * data, std::size_t count) = 0;
virtual void insert_rows(std::uint8_t const * data, std::size_t count) = 0;
virtual void emplace_rows(column * from, std::size_t from_row, std::size_t count) = 0;
virtual void insert_rows(column const * from, std::size_t from_row, std::size_t count) = 0;
virtual void swap_rows(std::size_t row1, std::size_t row2) = 0;
virtual void pop_row() = 0;
virtual void clear() = 0;
@ -70,8 +75,8 @@ namespace psemek::ecs::detail
column_impl();
void push_row() override;
void emplace_rows(std::uint8_t * data, std::size_t count) override;
void insert_rows(std::uint8_t const * data, std::size_t count) override;
void emplace_rows(column * from, std::size_t from_row, std::size_t count) override;
void insert_rows(column const * from, std::size_t from_row, std::size_t count) override;
void swap_rows(std::size_t row1, std::size_t row2) override;
void pop_row() override;
void clear() override;
@ -94,8 +99,8 @@ namespace psemek::ecs::detail
column_impl();
void push_row() override;
void emplace_rows(std::uint8_t * data, std::size_t count) override;
void insert_rows(std::uint8_t const * data, std::size_t count) override;
void emplace_rows(column * from, std::size_t from_row, std::size_t count) override;
void insert_rows(column const * from, std::size_t from_row, std::size_t count) override;
void swap_rows(std::size_t row1, std::size_t row2) override;
void pop_row() override;
void clear() override;
@ -120,11 +125,11 @@ namespace psemek::ecs::detail
}
template <typename Component, bool Empty>
void column_impl<Component, Empty>::emplace_rows(std::uint8_t * data, std::size_t count)
void column_impl<Component, Empty>::emplace_rows(column * from, std::size_t from_row, std::size_t count)
{
allocate(row_count_ + count);
auto src = reinterpret_cast<Component *>(data);
auto src = reinterpret_cast<Component *>(from->data()) + from_row;
auto dst = reinterpret_cast<Component *>(data_) + row_count_;
auto src_end = src + count;
while (src != src_end)
@ -138,13 +143,13 @@ namespace psemek::ecs::detail
}
template <typename Component, bool Empty>
void column_impl<Component, Empty>::insert_rows(std::uint8_t const * data, std::size_t count)
void column_impl<Component, Empty>::insert_rows(column const * from, std::size_t from_row, std::size_t count)
{
if constexpr (std::is_copy_constructible_v<Component>)
{
allocate(row_count_ + count);
auto src = reinterpret_cast<Component const *>(data);
auto src = reinterpret_cast<Component const *>(from->data()) + from_row;
auto dst = reinterpret_cast<Component *>(data_) + row_count_;
auto src_end = src + count;
while (src != src_end)
@ -238,11 +243,11 @@ namespace psemek::ecs::detail
{}
template <typename Component>
void column_impl<Component, true>::emplace_rows(std::uint8_t *, std::size_t)
void column_impl<Component, true>::emplace_rows(column *, std::size_t, std::size_t)
{}
template <typename Component>
void column_impl<Component, true>::insert_rows(std::uint8_t const *, std::size_t)
void column_impl<Component, true>::insert_rows(column const *, std::size_t, std::size_t)
{}
template <typename Component>

View file

@ -51,7 +51,7 @@ namespace psemek::ecs::detail
for (auto & column : columns_)
{
if (auto other_column = from->column(column->uuid()))
column->emplace_rows(other_column->data() + other_column->stride() * from_row, 1);
column->emplace_rows(other_column, from_row, 1);
else
column->push_row();
}
@ -64,7 +64,7 @@ namespace psemek::ecs::detail
for (std::size_t i = 0; i < columns_.size(); ++i)
{
auto from_column = from->columns_[i].get();
columns_[i]->insert_rows(from_column->data() + from_column->stride() * from_row, 1);
columns_[i]->insert_rows(from_column, from_row, 1);
}
entity_handles_.push_back(handle);
return entity_handles_.size() - 1;
@ -129,7 +129,7 @@ namespace psemek::ecs::detail
for (std::size_t i = 0; i < columns_.size(); ++i)
{
auto * src_column = delayed_table_->columns_[i].get();
columns_[i]->emplace_rows(src_column->data(), count);
columns_[i]->emplace_rows(src_column, 0, count);
}
entity_handles_.insert(entity_handles_.end(), delayed_table_->entity_handles_.begin(), delayed_table_->entity_handles_.end());