Files
Seele/src/Engine/Scene/Scene.h
T

78 lines
2.1 KiB
C++
Raw Normal View History

2020-05-05 01:51:13 +02:00
#pragma once
#include <entt/entt.hpp>
2020-04-15 02:03:56 +02:00
#include "MinimalEngine.h"
2023-01-29 18:58:59 +01:00
#include "Graphics/Graphics.h"
2020-06-02 11:46:18 +02:00
#include "Graphics/MeshBatch.h"
2023-01-21 18:43:21 +01:00
#include "Physics/PhysicsSystem.h"
2023-02-01 22:13:04 +01:00
#include "Component/Skybox.h"
2020-04-15 02:03:56 +02:00
namespace Seele
{
2021-04-01 16:40:14 +02:00
DECLARE_REF(Material)
DECLARE_REF(Entity)
2020-05-05 01:51:13 +02:00
#define MAX_DIRECTIONAL_LIGHTS 4
#define MAX_POINT_LIGHTS 256
struct LightEnv
{
2023-02-27 13:52:57 +01:00
Gfx::PStructuredBuffer directionalLights;
Gfx::PUniformBuffer numDirectional;
Gfx::PStructuredBuffer pointLights;
Gfx::PUniformBuffer numPoints;
};
2020-04-15 02:03:56 +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();
2023-01-21 18:43:21 +01:00
void update(float deltaTime);
entt::entity createEntity()
{
return registry.create();
}
2023-01-21 18:43:21 +01:00
void destroyEntity(entt::entity identifier)
{
2023-01-21 18:43:21 +01:00
registry.destroy(identifier);
}
template<typename Component, typename... Args>
Component& attachComponent(entt::entity entity, Args&&... args)
{
return registry.emplace<Component>(entity, std::forward<Args>(args)...);
}
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);
}
2023-01-29 18:58:59 +01:00
template<typename Component, typename Func>
void view(Func func) requires std::is_invocable_v<Func, Component&>
{
registry.view<Component>().each(func);
}
2023-02-13 14:56:13 +01:00
Array<MeshBatch> getStaticMeshes();
2023-03-07 21:25:56 +01:00
LightEnv getLightBuffer();
2023-02-01 22:13:04 +01:00
Component::Skybox getSkybox();
2023-01-21 18:43:21 +01:00
Gfx::PStructuredBuffer getSceneDataBuffer() const { return sceneDataBuffer; }
2023-01-29 18:58:59 +01:00
Gfx::PGraphics getGraphics() const { return graphics; }
entt::registry registry;
2020-04-15 02:03:56 +02:00
private:
2023-01-21 18:43:21 +01:00
struct PrimitiveSceneData
{
Matrix4 localToWorld;
Matrix4 worldToLocal;
Vector4 actorLocation;
};
Array<PrimitiveSceneData> sceneData;
2023-02-27 13:52:57 +01:00
Gfx::PStructuredBuffer sceneDataBuffer;
LightEnv lightEnv;
2023-01-21 18:43:21 +01:00
PhysicsSystem physics;
2020-09-19 14:36:50 +02:00
Gfx::PGraphics graphics;
2020-04-15 02:03:56 +02:00
};
DEFINE_REF(Scene)
2020-05-05 01:51:13 +02:00
} // namespace Seele