#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 void setupView(Dependencies, ThreadPool& pool) { List> work; registry.view().each([&](Components&... comp, Deps&... deps){ work.add([&]() { (accessComponent(deps), ...); update(comp...); }); }); pool.runAndWait(std::move(work)); } virtual void run(ThreadPool& pool, double delta) override { SystemBase::run(pool, delta); setupView((getDependencies() | ...), pool); } virtual void update() {} virtual void update(Components&... components) = 0; }; } // namespace System } // namespace Seele