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>
|
2024-05-01 19:05:48 +02:00
|
|
|
void setupView(Dependencies<Deps...>)
|
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
|
|
|
});
|
2024-05-01 19:05:48 +02:00
|
|
|
getThreadPool().runAndWait(std::move(work));
|
2023-01-29 18:58:59 +01:00
|
|
|
}
|
2024-05-01 19:05:48 +02:00
|
|
|
virtual void run(double delta) override
|
2023-01-29 18:58:59 +01:00
|
|
|
{
|
2024-05-01 19:05:48 +02:00
|
|
|
SystemBase::run(delta);
|
|
|
|
|
setupView((getDependencies<Components>() | ...));
|
2023-01-29 18:58:59 +01:00
|
|
|
}
|
2024-01-16 19:24:49 +01:00
|
|
|
virtual void update() override {}
|
2023-01-29 18:58:59 +01:00
|
|
|
virtual void update(Components&... components) = 0;
|
|
|
|
|
};
|
|
|
|
|
} // namespace System
|
|
|
|
|
} // namespace Seele
|