]> git.tdb.fi Git - libs/game.git/commitdiff
Add polymorphism discovery for systems
authorMikko Rasa <tdb@tdb.fi>
Sat, 27 Jan 2024 09:19:54 +0000 (11:19 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sat, 27 Jan 2024 09:19:54 +0000 (11:19 +0200)
source/game/director.cpp
source/game/stage.h
source/game/system.h

index eedc4d5befe0c16c321cf5c99c1a81c3ce52d1d5..53c54547b87c6356a78964ae2f7b8388c4fb0ca0 100644 (file)
@@ -21,6 +21,7 @@ Director::Director(DataFile::Collection &r):
 
        reflector.get_or_create_class<Entity>();
        reflector.get_or_create_class<Component>();
+       reflector.get_or_create_class<System>();
 }
 
 // Hide ~unique_ptr<Stage> from the header
index 0095c764cf64fce34a34e9e7bcf19a84cefd1b62..8e98d76482a2262c50ff3fac708f99de7f16fd79 100644 (file)
@@ -86,13 +86,11 @@ inline void Stage::iterate_objects(const F &func)
 template<typename T, typename... Args>
 inline T &Stage::add_system(Args &&... args)
 {
-       // Ensure that a reflected class exists for scheduling
-       reflector.get_or_create_class<T>();
-
-       auto &sys = systems.emplace_back(std::make_unique<T>(*this, std::forward<Args>(args)...));
-       scheduler.add_system(*sys);
+       auto &sys = static_cast<T &>(*systems.emplace_back(std::make_unique<T>(*this, std::forward<Args>(args)...)));
+       reflector.get_or_create_class<T>().template set_polymorphic_base<System>(sys);
+       scheduler.add_system(sys);
        pending_reschedule = true;
-       return static_cast<T &>(*sys);
+       return sys;
 }
 
 template<typename T>
index 4d39e301762d2981ce629c8ce51676a1370fe810..2f0f8ba56ca8aeb8a640af992dd29472f8f7348e 100644 (file)
@@ -14,6 +14,8 @@ namespace Msp::Game {
 class MSPGAME_API System
 {
 public:
+       using PolymorphicBase = System;
+
        enum DependencyFlags
        {
                NO_DEPENDENCY = 0,