X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fgame%2Fsystem.h;fp=source%2Fgame%2Fsystem.h;h=e3d71171c1e19aa8e31da854aa007737885774ce;hb=ffbfe95f51058c4de3c898b1a02e2fadba2b8134;hp=3d62c06276553821694651c0c5f15020845cc083;hpb=bfbcfa2678c70d661cb9104b2ef677d7d7b5a637;p=libs%2Fgame.git diff --git a/source/game/system.h b/source/game/system.h index 3d62c06..e3d7117 100644 --- a/source/game/system.h +++ b/source/game/system.h @@ -3,6 +3,7 @@ #include #include +#include "accessguard.h" #include "component.h" #include "reflection.h" #include "stage.h" @@ -28,6 +29,8 @@ public: const Reflection::ClassBase &type; void (*prepare)(Stage &) = nullptr; void (*commit)(Stage &) = nullptr; + void (*unblock)(DependencyFlags) = nullptr; + void (*block)(DependencyFlags) = nullptr; Dependency(const Reflection::ClassBase &t): type(t) { } }; @@ -86,11 +89,23 @@ inline void System::declare_dependency(DependencyFlags flags) Dependency &dep = (i!=dependencies.end() ? *i : dependencies.emplace_back(type)); dep.flags = flags; if constexpr(requires(T &c) { typename T::Data; c.prepare_tick(); c.commit_tick(); }) + { +#ifdef DEBUG + dep.unblock = +[](DependencyFlags f){ + if(f&READ_OLD) AccessGuard::get_instance().unblock>(); + if(f&WRITE) AccessGuard::get_instance().unblock>(); + }; + dep.block = +[](DependencyFlags f){ + if(f&READ_OLD) AccessGuard::get_instance().block>(); + if(f&WRITE) AccessGuard::get_instance().block>(); + }; +#endif if(flags&WRITE) { dep.prepare = +[](Stage &s){ s.iterate_objects([](T &c){ c.prepare_tick(); }); }; dep.commit = +[](Stage &s){ s.iterate_objects([](T &c){ c.commit_tick(); }); }; } + } } } // namespace Msp::Game