Files
Seele/src/Engine/System/ComponentSystem.h
T

48 lines
1.2 KiB
C++
Raw Normal View History

2023-01-29 18:58:59 +01:00
#pragma once
#include "SystemBase.h"
#include "Component/Component.h"
2023-11-10 19:18:09 +01:00
#include "Component/Camera.h"
2023-01-29 18:58:59 +01:00
namespace Seele
{
namespace System
{
template<typename... Components>
class ComponentSystem : public SystemBase
{
public:
ComponentSystem(PScene scene) : SystemBase(scene) {}
virtual ~ComponentSystem() {}
2023-11-10 19:18:09 +01:00
template<has_dependencies Comp>
2023-01-29 18:58:59 +01:00
auto getDependencies()
{
return Comp::dependencies;
}
template<typename Comp>
Dependencies<> getDependencies()
{
return Dependencies<>();
}
template<typename... Deps>
2023-12-17 16:16:46 +01:00
void setupView(Dependencies<Deps...>, ThreadPool& pool)
2023-01-29 18:58:59 +01:00
{
2023-12-17 16:16:46 +01:00
List<std::function<void()>> work;
2023-01-29 18:58:59 +01:00
registry.view<Components..., Deps...>().each([&](Components&... comp, Deps&... deps){
2023-12-17 16:16:46 +01:00
work.add([&]() {
2023-12-22 19:46:07 +01:00
(accessComponent(deps), ...);
update(comp...);
2023-12-17 16:16:46 +01:00
});
2023-01-29 18:58:59 +01:00
});
2023-12-17 16:16:46 +01:00
pool.runAndWait(std::move(work));
2023-01-29 18:58:59 +01:00
}
2023-12-17 16:16:46 +01:00
virtual void run(ThreadPool& pool, double delta) override
2023-01-29 18:58:59 +01:00
{
SystemBase::run(pool, delta);
2023-12-22 19:46:07 +01:00
setupView((getDependencies<Components>() | ...), pool);
2023-01-29 18:58:59 +01:00
}
2023-11-06 14:47:21 +01:00
virtual void update() {}
2023-01-29 18:58:59 +01:00
virtual void update(Components&... components) = 0;
};
} // namespace System
} // namespace Seele