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