2020-05-05 01:51:13 +02:00
|
|
|
#pragma once
|
2025-04-06 09:57:47 +02:00
|
|
|
#include "MinimalEngine.h"
|
2024-06-09 12:20:04 +02:00
|
|
|
#include "Graphics/Graphics.h"
|
2023-10-26 18:37:29 +02:00
|
|
|
#include "LightEnvironment.h"
|
2024-06-09 12:20:04 +02:00
|
|
|
#include "Physics/PhysicsSystem.h"
|
2026-04-12 20:49:02 +02:00
|
|
|
#include "FluidScene.h"
|
2024-06-09 12:20:04 +02:00
|
|
|
#include <entt/entt.hpp>
|
|
|
|
|
|
|
|
|
|
namespace Seele {
|
2021-04-01 16:40:14 +02:00
|
|
|
DECLARE_REF(Material)
|
2022-11-15 12:19:11 +01:00
|
|
|
DECLARE_REF(Entity)
|
2024-06-09 12:20:04 +02:00
|
|
|
class Scene {
|
|
|
|
|
public:
|
2020-09-19 14:36:50 +02:00
|
|
|
Scene(Gfx::PGraphics graphics);
|
2020-04-15 02:03:56 +02:00
|
|
|
~Scene();
|
2024-07-18 11:45:56 +02:00
|
|
|
void bakeLighting();
|
2023-01-21 18:43:21 +01:00
|
|
|
void update(float deltaTime);
|
2024-06-09 12:20:04 +02:00
|
|
|
entt::entity createEntity() { return registry.create(); }
|
|
|
|
|
void destroyEntity(entt::entity identifier) { registry.destroy(identifier); }
|
|
|
|
|
template <typename Component, typename... Args> Component& attachComponent(entt::entity entity, Args&&... args) {
|
2023-01-21 18:43:21 +01:00
|
|
|
return registry.emplace<Component>(entity, std::forward<Args>(args)...);
|
2022-11-15 12:19:11 +01:00
|
|
|
}
|
2024-06-09 12:20:04 +02:00
|
|
|
template <typename Component> Component& accessComponent(entt::entity entity) { return registry.get<Component>(entity); }
|
|
|
|
|
template <typename Component> const Component& accessComponent(entt::entity entity) const { return registry.get<Component>(entity); }
|
|
|
|
|
template <typename... Component, typename Func>
|
|
|
|
|
void view(Func func)
|
|
|
|
|
requires std::is_invocable_v<Func, Component&...> || std::is_invocable_v<Func, entt::entity, Component&...>
|
2023-01-29 18:58:59 +01:00
|
|
|
{
|
2023-10-24 15:01:09 +02:00
|
|
|
registry.view<Component...>().each(func);
|
2023-01-29 18:58:59 +01:00
|
|
|
}
|
2024-06-09 12:20:04 +02:00
|
|
|
template <typename Component> auto constructCallback() { return registry.on_construct<Component>(); }
|
|
|
|
|
template <typename Component> auto destroyCallback() { return registry.on_destroy<Component>(); }
|
2023-10-26 18:37:29 +02:00
|
|
|
PLightEnvironment getLightEnvironment() { return lightEnv; }
|
2026-04-12 20:49:02 +02:00
|
|
|
PFluidScene getFluidScene() { return fluidScene; }
|
2023-01-29 18:58:59 +01:00
|
|
|
Gfx::PGraphics getGraphics() const { return graphics; }
|
2022-11-15 12:19:11 +01:00
|
|
|
entt::registry registry;
|
2024-06-09 12:20:04 +02:00
|
|
|
|
|
|
|
|
private:
|
2023-11-06 14:47:21 +01:00
|
|
|
Gfx::PGraphics graphics;
|
2023-11-01 23:12:30 +01:00
|
|
|
OLightEnvironment lightEnv;
|
2026-04-12 20:49:02 +02:00
|
|
|
OFluidScene fluidScene;
|
2023-01-21 18:43:21 +01:00
|
|
|
PhysicsSystem physics;
|
2024-07-18 11:45:56 +02:00
|
|
|
Array<Gfx::OTexture2D> lightMaps;
|
2020-04-15 02:03:56 +02:00
|
|
|
};
|
2022-11-15 12:19:11 +01:00
|
|
|
DEFINE_REF(Scene)
|
2020-05-05 01:51:13 +02:00
|
|
|
} // namespace Seele
|