]> git.tdb.fi Git - libs/game.git/blobdiff - source/game/owned.h
Change Owned's constructor to take a pointer to the parent
[libs/game.git] / source / game / owned.h
index fc2acab6ecb02ab0d4079630dae5f5fe5b8fc939..76a75521a47a0d04b1d02d0531e065144f026796 100644 (file)
@@ -22,11 +22,7 @@ public:
        Owned(Handle<P>, Args &&...);
 
        template<typename P, typename... Args>
-       Owned(Owned<P> &p, Args &&... a): Owned(static_cast<Handle<P> &>(p), std::forward<Args>(a)...) { }
-
-       template<typename P, typename... Args>
-               requires(!std::is_const_v<P>)
-       Owned(P &parent, Args &&... args): Owned(Handle<P>::from_object(&parent), std::forward<Args>(args)...) { }
+       Owned(P *parent, Args &&... args): Owned(Handle<P>::from_object(parent), std::forward<Args>(args)...) { }
 
        Owned(Owned &&other): Handle<T>(other) { other.ptr = nullptr; }
        Owned &operator=(Owned &&other);
@@ -53,14 +49,19 @@ Owned<T>::Owned(Handle<P> parent, Args &&... args)
 
        Stage &stage = get_stage(*parent);
        Pool<T> &pool = stage.get_pools().get_pool<T>();
+       bool first_created = !pool.get_capacity();
        this->ptr = pool.create(parent, std::forward<Args>(args)...);
        if constexpr(std::is_base_of_v<Component, T>)
        {
+               if(first_created)
+                       stage.get_reflector().get_or_create_class<T>().template set_polymorphic_base<Component>(**this);
                parent->add_component(*this);
                stage.get_event_source().emit<Events::ComponentCreated>(*this);
        }
        else
        {
+               if(first_created)
+                       stage.get_reflector().get_or_create_class<T>().template set_polymorphic_base<Entity>(**this);
                parent->add_child(*this);
                stage.get_event_source().emit<Events::EntityCreated>(*this);
        }