public:
virtual ~BaseComponentHelper() {}
virtual void remove_component(Entity e) = 0;
+ virtual void copy_component_to(Entity source, Entity target) = 0;
};
template <typename C>
void remove_component(Entity e) override {
e.remove<C>();
}
+ void copy_component_to(Entity source, Entity target) override {
+ target.assign_from_copy<C>(*(source.component<C>().get()));
+ }
};
/**
return entity;
}
+ /**
+ * Create a new Entity by copying another. Copy-constructs each component.
+ *
+ * Emits EntityCreatedEvent.
+ */
+ Entity create_from_copy(Entity original) {
+ assert(original.valid());
+ auto clone = create();
+ auto mask = original.component_mask();
+ for (size_t i = 0; i < component_helpers_.size(); i++) {
+ BaseComponentHelper *helper = component_helpers_[i];
+ if (helper && mask.test(i))
+ helper->copy_component_to(original, clone);
+ }
+ return clone;
+ }
+
+
/**
* Destroy an existing Entity::Id and its associated Components.
*
REQUIRE(!copy);
}
+TEST_CASE_METHOD(EntityManagerFixture, "TestEntityCreateFromCopy") {
+ Entity a = em.create();
+ a.assign<CopyVerifier>();
+ ComponentHandle<CopyVerifier> original = a.component<CopyVerifier>();
+ ComponentHandle<Position> aPosition = a.assign<Position>(1, 2);
+ Entity b = em.create_from_copy(a);
+ ComponentHandle<CopyVerifier> copy = b.component<CopyVerifier>();
+ ComponentHandle<Position> bPosition = b.component<Position>();
+ REQUIRE(original);
+ REQUIRE(original->copied == false);
+ REQUIRE(copy);
+ REQUIRE(copy->copied == 1);
+ REQUIRE(aPosition->x == bPosition->x);
+ REQUIRE(aPosition->y == bPosition->y);
+ REQUIRE(aPosition.get() != bPosition.get());
+ REQUIRE(a.component_mask() == b.component_mask());
+ REQUIRE(a != b);
+}
+
TEST_CASE_METHOD(EntityManagerFixture, "TestComponentHandleInvalidatedWhenComponentDestroyed") {
Entity a = em.create();
ComponentHandle<Position> position = a.assign<Position>(1, 2);