From 6e37fda3560c1f84609774918c010410db35f4d0 Mon Sep 17 00:00:00 2001 From: sebastian Date: Thu, 30 Jul 2026 07:42:56 +0200 Subject: [PATCH] ADD: Introduce Scenes --- CMakeLists.txt | 6 ++++ engine/src/layer/Scene.cpp | 26 ++++++++++++++++ engine/src/layer/Scene.h | 38 +++++++++++++++++++++++ engine/src/layer/SceneManager.cpp | 51 +++++++++++++++++++++++++++++++ engine/src/layer/SceneManager.h | 31 +++++++++++++++++++ engine/src/renderer/RenderQueue.h | 2 ++ game/src/ColorRaceApp.cpp | 4 +-- game/src/ColorRaceApp.h | 10 +++--- game/src/GameLayer.cpp | 12 +++----- game/src/GameLayer.h | 8 +++-- game/src/GameScene.cpp | 21 +++++++++++++ game/src/GameScene.h | 21 +++++++++++++ 12 files changed, 213 insertions(+), 17 deletions(-) create mode 100644 engine/src/layer/Scene.cpp create mode 100644 engine/src/layer/Scene.h create mode 100644 engine/src/layer/SceneManager.cpp create mode 100644 engine/src/layer/SceneManager.h create mode 100644 game/src/GameScene.cpp create mode 100644 game/src/GameScene.h diff --git a/CMakeLists.txt b/CMakeLists.txt index faa61b3..19ce6b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,6 +101,8 @@ add_library(Engine STATIC engine/src/utils/openglWrapper/shader/Uniform.h engine/src/utils/openglWrapper/shader/UniformValue.cpp 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_link_libraries(Engine PUBLIC OpenGL::GL glfw glad glm::glm imgui) @@ -140,6 +142,10 @@ add_executable(ColorRace engine/src/layer/Layer.h game/src/GameLayer.cpp game/src/GameLayer.h + engine/src/layer/SceneManager.cpp + engine/src/layer/SceneManager.h + game/src/GameScene.cpp + game/src/GameScene.h ) diff --git a/engine/src/layer/Scene.cpp b/engine/src/layer/Scene.cpp new file mode 100644 index 0000000..74a406d --- /dev/null +++ b/engine/src/layer/Scene.cpp @@ -0,0 +1,26 @@ +// +// Created by sebastian on 30.07.26. +// + +#include "Scene.h" + +#include +#include + +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->onAttach(); + m_layers.push_back(std::move(layer)); + +} diff --git a/engine/src/layer/Scene.h b/engine/src/layer/Scene.h new file mode 100644 index 0000000..b850cf8 --- /dev/null +++ b/engine/src/layer/Scene.h @@ -0,0 +1,38 @@ +// +// Created by sebastian on 30.07.26. +// + +#ifndef COLORRACE_SCENE_H +#define COLORRACE_SCENE_H +#include +#include + +#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> m_layers; + + void addLayer(std::unique_ptr layer); + + engine::EntityRegistry entityRegistry; + }; +} + + +#endif //COLORRACE_SCENE_H diff --git a/engine/src/layer/SceneManager.cpp b/engine/src/layer/SceneManager.cpp new file mode 100644 index 0000000..57ed4e9 --- /dev/null +++ b/engine/src/layer/SceneManager.cpp @@ -0,0 +1,51 @@ +// +// Created by sebastian on 30.07.26. +// + +#include "SceneManager.h" + +#include +#include + +void engine::SceneManager::switchTo(std::unique_ptr scene, std::function 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; +} diff --git a/engine/src/layer/SceneManager.h b/engine/src/layer/SceneManager.h new file mode 100644 index 0000000..0e7ec4b --- /dev/null +++ b/engine/src/layer/SceneManager.h @@ -0,0 +1,31 @@ +// +// Created by sebastian on 30.07.26. +// + +#ifndef COLORRACE_SCENEMANAGER_H +#define COLORRACE_SCENEMANAGER_H +#include + +#include "Scene.h" + + +namespace engine { + class SceneManager { + public: + SceneManager() = default; + void switchTo(std::unique_ptr scene, std::function onSceneLoaded = nullptr); + void update(); + void render() const; + ~SceneManager() = default; + + [[nodiscard]] float getTransitionProgress() const; + private: + std::unique_ptr currentScene; + std::unique_ptr nextScene; + bool isTransitioning = false; + std::function onSceneLoaded; + }; + + +} +#endif //COLORRACE_SCENEMANAGER_H diff --git a/engine/src/renderer/RenderQueue.h b/engine/src/renderer/RenderQueue.h index fd5d8d5..9dcd77f 100644 --- a/engine/src/renderer/RenderQueue.h +++ b/engine/src/renderer/RenderQueue.h @@ -4,7 +4,9 @@ #ifndef COLORRACE_RENDERQUEUE_H #define COLORRACE_RENDERQUEUE_H +#include #include +#include #include "glm/glm.hpp" #include "model/RawModel.h" diff --git a/game/src/ColorRaceApp.cpp b/game/src/ColorRaceApp.cpp index e467786..ba73a0f 100644 --- a/game/src/ColorRaceApp.cpp +++ b/game/src/ColorRaceApp.cpp @@ -12,9 +12,9 @@ void ColorRaceApp::onUpdate(float deltaTime) { - gameLayer->onUpdate(); + sceneManager->update(); } void ColorRaceApp::onRender() { - gameLayer->onRender(); + sceneManager->render(); } \ No newline at end of file diff --git a/game/src/ColorRaceApp.h b/game/src/ColorRaceApp.h index 9eba2c6..5b2f353 100644 --- a/game/src/ColorRaceApp.h +++ b/game/src/ColorRaceApp.h @@ -5,10 +5,12 @@ #ifndef COLORRACE_COLORRACEAPP_H #define COLORRACE_COLORRACEAPP_H #include "GameLayer.h" +#include "GameScene.h" #include "core/Application.h" #include "ecs/EntityRegistry.h" #include "ecs/standardComponents/MeshComponent.h" #include "ecs/standardComponents/TransformComponent.h" +#include "layer/SceneManager.h" #include "renderer/MeshRenderer.h" #include "renderer/entities/Camera.h" #include "renderer/primitives/CubeFactory.h" @@ -31,13 +33,11 @@ public: config.debugContext = true; return config; } - ColorRaceApp() : Application(makeConfig()) { - - gameLayer = std::make_unique(); - gameLayer->onAttach(); + ColorRaceApp() : Application(makeConfig()), sceneManager(std::make_unique()) { + sceneManager->switchTo(std::make_unique()); } private: - std::unique_ptr gameLayer; + std::unique_ptr sceneManager; protected: void onUpdate(float deltaTime) override; void onRender() override; diff --git a/game/src/GameLayer.cpp b/game/src/GameLayer.cpp index 727f619..5dab343 100644 --- a/game/src/GameLayer.cpp +++ b/game/src/GameLayer.cpp @@ -4,6 +4,9 @@ #include "GameLayer.h" +#include +#include + #include "ecs/standardComponents/MeshComponent.h" #include "ecs/standardComponents/TransformComponent.h" #include "renderer/MeshRenderer.h" @@ -14,11 +17,6 @@ void GameLayer::onAttach() { m_renderState.depthTesting = false; m_renderState.backfaceCulling = false; - m_camera = std::make_unique(); - m_camera->setPosition({0.0f, 0.0f, 5.0f}); - m_camera->setYaw(0.0f); - m_camera->setPitch(0.0f); - m_renderer = std::make_unique(); Entity entity = m_entityRegistry.createEntity(); @@ -45,7 +43,5 @@ void GameLayer::onRender() { MeshRenderSystem meshRenderSystem; meshRenderSystem.update(m_entityRegistry, m_renderQueue); - - MeshRenderer renderer; - renderer.render(m_renderQueue, *m_camera); + m_renderer->render(m_renderQueue, *m_camera); } diff --git a/game/src/GameLayer.h b/game/src/GameLayer.h index 76135b2..108f063 100644 --- a/game/src/GameLayer.h +++ b/game/src/GameLayer.h @@ -4,6 +4,8 @@ #ifndef COLORRACE_GAMELAYER_H #define COLORRACE_GAMELAYER_H +#include + #include "ecs/EntityRegistry.h" #include "layer/Layer.h" #include "renderer/MeshRenderer.h" @@ -13,6 +15,8 @@ class GameLayer: public engine::Layer { public: + GameLayer(engine::EntityRegistry& entityRegistry, std::shared_ptr cam) + : m_entityRegistry(entityRegistry), m_camera(std::move(cam)), m_renderer(std::make_unique()) {} void onAttach() override; void onDetach() override; void onUpdate() override; @@ -20,9 +24,9 @@ public: private: engine::GLRenderState m_renderState; engine::RenderQueue m_renderQueue; - engine::EntityRegistry m_entityRegistry; + engine::EntityRegistry& m_entityRegistry; + std::shared_ptr m_camera; std::unique_ptr m_renderer; - std::unique_ptr m_camera; }; #endif //COLORRACE_GAMELAYER_H diff --git a/game/src/GameScene.cpp b/game/src/GameScene.cpp new file mode 100644 index 0000000..db22ed8 --- /dev/null +++ b/game/src/GameScene.cpp @@ -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()) {} + +void GameScene::onEnter() { + addLayer(std::make_unique(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(); +} diff --git a/game/src/GameScene.h b/game/src/GameScene.h new file mode 100644 index 0000000..619de8b --- /dev/null +++ b/game/src/GameScene.h @@ -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 m_camera; + +}; + + +#endif //COLORRACE_GAMESCENE_H