]> code.bitgloo.com Git - clyne/entityx.git/commitdiff
Allow Entity cloning via EntityManager::create_from_copy
authorZack Mulgrew <zmulgrew@linkedin.com>
Mon, 29 Feb 2016 09:22:57 +0000 (01:22 -0800)
committerZack Mulgrew <zmulgrew@linkedin.com>
Fri, 8 Apr 2016 06:44:54 +0000 (23:44 -0700)
entityx/Entity.h
entityx/Entity_test.cc

index b55a45f5b4aa410dba0c488c685bad1750f8475f..0f037b417ea4bacfa14df7d946b273ac4880f22a 100644 (file)
@@ -332,6 +332,7 @@ class BaseComponentHelper {
 public:
   virtual ~BaseComponentHelper() {}
   virtual void remove_component(Entity e) = 0;
+  virtual void copy_component_to(Entity source, Entity target) = 0;
 };
 
 template <typename C>
@@ -340,6 +341,9 @@ public:
   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()));
+  }
 };
 
 /**
@@ -565,6 +569,24 @@ class EntityManager : entityx::help::NonCopyable {
     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.
    *
index e07a5679173ab285f9b63dfda89a5a1ee684b174..9e75ee3c1ed8c890936dc7aaf4f8b7f248f24e2e 100644 (file)
@@ -501,6 +501,25 @@ TEST_CASE_METHOD(EntityManagerFixture, "TestComponentAssignmentFromCopy") {
   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);