#pragma once #include "SystemBase.h" #include "Component/Component.h" #include "Component/Camera.h" namespace Seele { namespace System { template class ComponentSystem : public SystemBase { public: ComponentSystem(PScene scene) : SystemBase(scene) {} virtual ~ComponentSystem() {} template auto getDependencies() { return Comp::dependencies; } template Dependencies<> getDependencies() { return Dependencies<>(); } template auto mergeDependencies(Dep... deps) { return (deps | ...); } void setupView(Dependencies<>, dp::thread_pool<>&) { registry.view().each([&](Components&... comp){ //pool.enqueue_detach([&](){ update(comp...); //}); }); } template void setupView(Dependencies, dp::thread_pool<>&) { registry.view().each([&](Components&... comp, Deps&... deps){ //pool.enqueue_detach([&](){ (accessComponent(deps) + ...); update((comp,...)); //}); }); } virtual void run(dp::thread_pool<>& pool, double delta) override { SystemBase::run(pool, delta); setupView(mergeDependencies((getDependencies(),...)), pool); } virtual void update() {} virtual void update(Components&... components) = 0; }; } // namespace System } // namespace Seele