ADD: Introduce Scenes
This commit is contained in:
parent
c1732e01fa
commit
6e37fda356
@ -101,6 +101,8 @@ add_library(Engine STATIC
|
|||||||
engine/src/utils/openglWrapper/shader/Uniform.h
|
engine/src/utils/openglWrapper/shader/Uniform.h
|
||||||
engine/src/utils/openglWrapper/shader/UniformValue.cpp
|
engine/src/utils/openglWrapper/shader/UniformValue.cpp
|
||||||
engine/src/utils/openglWrapper/shader/UniformValue.h
|
engine/src/utils/openglWrapper/shader/UniformValue.h
|
||||||
|
engine/src/layer/Scene.cpp
|
||||||
|
engine/src/layer/Scene.h
|
||||||
)
|
)
|
||||||
target_include_directories(Engine PUBLIC engine/src)
|
target_include_directories(Engine PUBLIC engine/src)
|
||||||
target_link_libraries(Engine PUBLIC OpenGL::GL glfw glad glm::glm imgui)
|
target_link_libraries(Engine PUBLIC OpenGL::GL glfw glad glm::glm imgui)
|
||||||
@ -140,6 +142,10 @@ add_executable(ColorRace
|
|||||||
engine/src/layer/Layer.h
|
engine/src/layer/Layer.h
|
||||||
game/src/GameLayer.cpp
|
game/src/GameLayer.cpp
|
||||||
game/src/GameLayer.h
|
game/src/GameLayer.h
|
||||||
|
engine/src/layer/SceneManager.cpp
|
||||||
|
engine/src/layer/SceneManager.h
|
||||||
|
game/src/GameScene.cpp
|
||||||
|
game/src/GameScene.h
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
26
engine/src/layer/Scene.cpp
Normal file
26
engine/src/layer/Scene.cpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
//
|
||||||
|
// Created by sebastian on 30.07.26.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Scene.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
|
void engine::Scene::onUpdate() {
|
||||||
|
for (const auto& layer : m_layers) {
|
||||||
|
layer->onUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void engine::Scene::onRender() {
|
||||||
|
for (const auto& layer : m_layers) {
|
||||||
|
layer->onRender();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void engine::Scene::addLayer(std::unique_ptr<Layer> layer) {
|
||||||
|
layer->onAttach();
|
||||||
|
m_layers.push_back(std::move(layer));
|
||||||
|
|
||||||
|
}
|
||||||
38
engine/src/layer/Scene.h
Normal file
38
engine/src/layer/Scene.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
//
|
||||||
|
// Created by sebastian on 30.07.26.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef COLORRACE_SCENE_H
|
||||||
|
#define COLORRACE_SCENE_H
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "Layer.h"
|
||||||
|
#include "renderer/entities/Camera.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace engine {
|
||||||
|
class Scene {
|
||||||
|
public:
|
||||||
|
explicit Scene() {}
|
||||||
|
virtual ~Scene() = default;
|
||||||
|
virtual void onEnter() {}
|
||||||
|
virtual void onExit() {
|
||||||
|
for (const auto& layer : m_layers) {
|
||||||
|
layer->onDetach();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void onUpdate();
|
||||||
|
void onRender();
|
||||||
|
protected:
|
||||||
|
std::vector<std::unique_ptr<Layer>> m_layers;
|
||||||
|
|
||||||
|
void addLayer(std::unique_ptr<Layer> layer);
|
||||||
|
|
||||||
|
engine::EntityRegistry entityRegistry;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif //COLORRACE_SCENE_H
|
||||||
51
engine/src/layer/SceneManager.cpp
Normal file
51
engine/src/layer/SceneManager.cpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
//
|
||||||
|
// Created by sebastian on 30.07.26.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "SceneManager.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
|
void engine::SceneManager::switchTo(std::unique_ptr<Scene> scene, std::function<void()> onSceneLoaded) {
|
||||||
|
onSceneLoaded = std::move(onSceneLoaded);
|
||||||
|
nextScene = std::move(scene);
|
||||||
|
|
||||||
|
//Todo: Integrate Asset Loader
|
||||||
|
}
|
||||||
|
|
||||||
|
void engine::SceneManager::update() {
|
||||||
|
if (nextScene) {
|
||||||
|
//Todo: AssetLoader should process AssetQueue
|
||||||
|
|
||||||
|
if (getTransitionProgress() == 1.0) { // Todo: Replace with AssetLoader.getProgress.done()
|
||||||
|
if (currentScene) {
|
||||||
|
currentScene->onExit();
|
||||||
|
}
|
||||||
|
|
||||||
|
currentScene = std::move(nextScene);
|
||||||
|
nextScene = nullptr;
|
||||||
|
currentScene->onEnter();
|
||||||
|
|
||||||
|
// Todo: Stop AssetLoader
|
||||||
|
if (onSceneLoaded) {
|
||||||
|
onSceneLoaded();
|
||||||
|
onSceneLoaded = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentScene) {
|
||||||
|
currentScene->onUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void engine::SceneManager::render() const {
|
||||||
|
if (currentScene) {
|
||||||
|
currentScene->onRender();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float engine::SceneManager::getTransitionProgress() const {
|
||||||
|
return 1.0f;
|
||||||
|
}
|
||||||
31
engine/src/layer/SceneManager.h
Normal file
31
engine/src/layer/SceneManager.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
//
|
||||||
|
// Created by sebastian on 30.07.26.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef COLORRACE_SCENEMANAGER_H
|
||||||
|
#define COLORRACE_SCENEMANAGER_H
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "Scene.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace engine {
|
||||||
|
class SceneManager {
|
||||||
|
public:
|
||||||
|
SceneManager() = default;
|
||||||
|
void switchTo(std::unique_ptr<Scene> scene, std::function<void()> onSceneLoaded = nullptr);
|
||||||
|
void update();
|
||||||
|
void render() const;
|
||||||
|
~SceneManager() = default;
|
||||||
|
|
||||||
|
[[nodiscard]] float getTransitionProgress() const;
|
||||||
|
private:
|
||||||
|
std::unique_ptr<Scene> currentScene;
|
||||||
|
std::unique_ptr<Scene> nextScene;
|
||||||
|
bool isTransitioning = false;
|
||||||
|
std::function<void()> onSceneLoaded;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif //COLORRACE_SCENEMANAGER_H
|
||||||
@ -4,7 +4,9 @@
|
|||||||
|
|
||||||
#ifndef COLORRACE_RENDERQUEUE_H
|
#ifndef COLORRACE_RENDERQUEUE_H
|
||||||
#define COLORRACE_RENDERQUEUE_H
|
#define COLORRACE_RENDERQUEUE_H
|
||||||
|
#include <iostream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
#include "glm/glm.hpp"
|
#include "glm/glm.hpp"
|
||||||
#include "model/RawModel.h"
|
#include "model/RawModel.h"
|
||||||
|
|||||||
@ -12,9 +12,9 @@
|
|||||||
|
|
||||||
|
|
||||||
void ColorRaceApp::onUpdate(float deltaTime) {
|
void ColorRaceApp::onUpdate(float deltaTime) {
|
||||||
gameLayer->onUpdate();
|
sceneManager->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorRaceApp::onRender() {
|
void ColorRaceApp::onRender() {
|
||||||
gameLayer->onRender();
|
sceneManager->render();
|
||||||
}
|
}
|
||||||
@ -5,10 +5,12 @@
|
|||||||
#ifndef COLORRACE_COLORRACEAPP_H
|
#ifndef COLORRACE_COLORRACEAPP_H
|
||||||
#define COLORRACE_COLORRACEAPP_H
|
#define COLORRACE_COLORRACEAPP_H
|
||||||
#include "GameLayer.h"
|
#include "GameLayer.h"
|
||||||
|
#include "GameScene.h"
|
||||||
#include "core/Application.h"
|
#include "core/Application.h"
|
||||||
#include "ecs/EntityRegistry.h"
|
#include "ecs/EntityRegistry.h"
|
||||||
#include "ecs/standardComponents/MeshComponent.h"
|
#include "ecs/standardComponents/MeshComponent.h"
|
||||||
#include "ecs/standardComponents/TransformComponent.h"
|
#include "ecs/standardComponents/TransformComponent.h"
|
||||||
|
#include "layer/SceneManager.h"
|
||||||
#include "renderer/MeshRenderer.h"
|
#include "renderer/MeshRenderer.h"
|
||||||
#include "renderer/entities/Camera.h"
|
#include "renderer/entities/Camera.h"
|
||||||
#include "renderer/primitives/CubeFactory.h"
|
#include "renderer/primitives/CubeFactory.h"
|
||||||
@ -31,13 +33,11 @@ public:
|
|||||||
config.debugContext = true;
|
config.debugContext = true;
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
ColorRaceApp() : Application(makeConfig()) {
|
ColorRaceApp() : Application(makeConfig()), sceneManager(std::make_unique<engine::SceneManager>()) {
|
||||||
|
sceneManager->switchTo(std::make_unique<GameScene>());
|
||||||
gameLayer = std::make_unique<GameLayer>();
|
|
||||||
gameLayer->onAttach();
|
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<GameLayer> gameLayer;
|
std::unique_ptr<engine::SceneManager> sceneManager;
|
||||||
protected:
|
protected:
|
||||||
void onUpdate(float deltaTime) override;
|
void onUpdate(float deltaTime) override;
|
||||||
void onRender() override;
|
void onRender() override;
|
||||||
|
|||||||
@ -4,6 +4,9 @@
|
|||||||
|
|
||||||
#include "GameLayer.h"
|
#include "GameLayer.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
#include "ecs/standardComponents/MeshComponent.h"
|
#include "ecs/standardComponents/MeshComponent.h"
|
||||||
#include "ecs/standardComponents/TransformComponent.h"
|
#include "ecs/standardComponents/TransformComponent.h"
|
||||||
#include "renderer/MeshRenderer.h"
|
#include "renderer/MeshRenderer.h"
|
||||||
@ -14,11 +17,6 @@ void GameLayer::onAttach() {
|
|||||||
m_renderState.depthTesting = false;
|
m_renderState.depthTesting = false;
|
||||||
m_renderState.backfaceCulling = false;
|
m_renderState.backfaceCulling = false;
|
||||||
|
|
||||||
m_camera = std::make_unique<engine::Camera>();
|
|
||||||
m_camera->setPosition({0.0f, 0.0f, 5.0f});
|
|
||||||
m_camera->setYaw(0.0f);
|
|
||||||
m_camera->setPitch(0.0f);
|
|
||||||
|
|
||||||
m_renderer = std::make_unique<engine::MeshRenderer>();
|
m_renderer = std::make_unique<engine::MeshRenderer>();
|
||||||
|
|
||||||
Entity entity = m_entityRegistry.createEntity();
|
Entity entity = m_entityRegistry.createEntity();
|
||||||
@ -45,7 +43,5 @@ void GameLayer::onRender() {
|
|||||||
|
|
||||||
MeshRenderSystem meshRenderSystem;
|
MeshRenderSystem meshRenderSystem;
|
||||||
meshRenderSystem.update(m_entityRegistry, m_renderQueue);
|
meshRenderSystem.update(m_entityRegistry, m_renderQueue);
|
||||||
|
m_renderer->render(m_renderQueue, *m_camera);
|
||||||
MeshRenderer renderer;
|
|
||||||
renderer.render(m_renderQueue, *m_camera);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#ifndef COLORRACE_GAMELAYER_H
|
#ifndef COLORRACE_GAMELAYER_H
|
||||||
#define COLORRACE_GAMELAYER_H
|
#define COLORRACE_GAMELAYER_H
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
#include "ecs/EntityRegistry.h"
|
#include "ecs/EntityRegistry.h"
|
||||||
#include "layer/Layer.h"
|
#include "layer/Layer.h"
|
||||||
#include "renderer/MeshRenderer.h"
|
#include "renderer/MeshRenderer.h"
|
||||||
@ -13,6 +15,8 @@
|
|||||||
|
|
||||||
class GameLayer: public engine::Layer {
|
class GameLayer: public engine::Layer {
|
||||||
public:
|
public:
|
||||||
|
GameLayer(engine::EntityRegistry& entityRegistry, std::shared_ptr<engine::Camera> cam)
|
||||||
|
: m_entityRegistry(entityRegistry), m_camera(std::move(cam)), m_renderer(std::make_unique<engine::MeshRenderer>()) {}
|
||||||
void onAttach() override;
|
void onAttach() override;
|
||||||
void onDetach() override;
|
void onDetach() override;
|
||||||
void onUpdate() override;
|
void onUpdate() override;
|
||||||
@ -20,9 +24,9 @@ public:
|
|||||||
private:
|
private:
|
||||||
engine::GLRenderState m_renderState;
|
engine::GLRenderState m_renderState;
|
||||||
engine::RenderQueue m_renderQueue;
|
engine::RenderQueue m_renderQueue;
|
||||||
engine::EntityRegistry m_entityRegistry;
|
engine::EntityRegistry& m_entityRegistry;
|
||||||
|
std::shared_ptr<engine::Camera> m_camera;
|
||||||
std::unique_ptr<engine::MeshRenderer> m_renderer;
|
std::unique_ptr<engine::MeshRenderer> m_renderer;
|
||||||
std::unique_ptr<engine::Camera> m_camera;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //COLORRACE_GAMELAYER_H
|
#endif //COLORRACE_GAMELAYER_H
|
||||||
|
|||||||
21
game/src/GameScene.cpp
Normal file
21
game/src/GameScene.cpp
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// Created by sebastian on 30.07.26.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "GameScene.h"
|
||||||
|
|
||||||
|
#include "GameLayer.h"
|
||||||
|
|
||||||
|
GameScene::GameScene() : Scene(), m_camera(std::make_unique<engine::Camera>()) {}
|
||||||
|
|
||||||
|
void GameScene::onEnter() {
|
||||||
|
addLayer(std::make_unique<GameLayer>(entityRegistry, m_camera));
|
||||||
|
|
||||||
|
m_camera->setPosition({0.0f, 0.0f, 5.0f});
|
||||||
|
m_camera->setYaw(0.0f);
|
||||||
|
m_camera->setPitch(0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GameScene::onExit() {
|
||||||
|
Scene::onExit();
|
||||||
|
}
|
||||||
21
game/src/GameScene.h
Normal file
21
game/src/GameScene.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// Created by sebastian on 30.07.26.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef COLORRACE_GAMESCENE_H
|
||||||
|
#define COLORRACE_GAMESCENE_H
|
||||||
|
#include "layer/Scene.h"
|
||||||
|
|
||||||
|
|
||||||
|
class GameScene : public engine::Scene {
|
||||||
|
public:
|
||||||
|
GameScene();
|
||||||
|
void onEnter() override;
|
||||||
|
void onExit() override;
|
||||||
|
private:
|
||||||
|
std::shared_ptr<engine::Camera> m_camera;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //COLORRACE_GAMESCENE_H
|
||||||
Loading…
Reference in New Issue
Block a user