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... Dep>
|
|
|
|
|
auto mergeDependencies(Dep... deps)
|
|
|
|
|
{
|
|
|
|
|
return (deps | ...);
|
|
|
|
|
}
|
2023-11-06 14:47:21 +01:00
|
|
|
void setupView(Dependencies<>, dp::thread_pool<>&)
|
|
|
|
|
{
|
|
|
|
|
registry.view<Components...>().each([&](Components&... comp){
|
|
|
|
|
//pool.enqueue_detach([&](){
|
|
|
|
|
update(comp...);
|
|
|
|
|
//});
|
|
|
|
|
});
|
|
|
|
|
}
|
2023-01-29 18:58:59 +01:00
|
|
|
template<typename... Deps>
|
|
|
|
|
void setupView(Dependencies<Deps...>, dp::thread_pool<>&)
|
|
|
|
|
{
|
|
|
|
|
registry.view<Components..., Deps...>().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<Components>(),...)), pool);
|
|
|
|
|
}
|
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
|