Rendering Engine 0.2.0
Modular Graphics Rendering Engine | v0.2.0
Loading...
Searching...
No Matches
scene_manager.cpp
Go to the documentation of this file.
1#include "scene_manager.hpp"
2#include "scene.hpp"
3#include "i_renderer.hpp"
4#include "i_application.hpp"
5#include "texture_cache.hpp"
6#include "model_cache.hpp"
7#include "material_cache.hpp"
8#include "utility.hpp"
9
10namespace rendering_engine
11{
12
14 :
15 mRenderer(renderer),
16 mApp(app),
17 mCurrentScene(nullptr),
18 mNextScene(nullptr)
19{}
20
24
26{
27 // Apply pending registrations once (first initialization only)
28 static bool sRegistrationsApplied = false;
29 if (!sRegistrationsApplied)
30 {
31 auto& pending = GetPendingRegistrations();
32 for (auto& entry : pending)
33 {
34 RegisterScene(entry.first, entry.second);
35 }
36 pending.clear();
37 sRegistrationsApplied = true;
38 }
39 // Innitialize resources in next order.
40 // 1. Textures
41 // 2. Models
42 // 3. Materials
43 mTextureCache = std::make_shared<TextureCache>(mRenderer);
44 mModelCache = std::make_shared<ModelCache>(mRenderer);
45 const auto modelsFolder = Utility::GetModelsFolderPath();
46 mModelCache->CreateQuad2D();
47
49 {
50 mTextureCache->LoadTexturesFromPackage();
51 mModelCache->LoadModelsFromPackage();
52 }
53 else
54 {
55 const auto textureFolder = Utility::GetTextureFolderPath();
56 mTextureCache->LoadTexturesFromFolder(textureFolder.string());
57 mModelCache->LoadModelsFromFolder(modelsFolder.string());
58 }
59 mMaterialCache = std::make_shared<MaterialCache>(mRenderer);
60 mMaterialCache->CreateBuildInMaterials();
61
62 if(!GetMap().empty())
63 {
64 const std::string startScene = sStartSceneName;
65
66 if(!startScene.empty())
67 {
68 LoadScene(startScene);
69 }
70 }
71}
72
73void SceneManager::Update(float deltaTime)
74{
75 if (mNextScene)
76 {
77 if (mCurrentScene)
78 {
79 mCurrentScene->Shutdown();
80 }
81
82 mCurrentScene = std::move(mNextScene);
83 mCurrentScene->Initialize();
84 mNextScene = nullptr;
85 }
86
87 if (mCurrentScene)
88 {
89 mCurrentScene->Update(deltaTime);
90 }
91}
92
94{
95 if (mCurrentScene)
96 {
97 mCurrentScene->Draw();
98 }
99}
100
102{
103 if (mCurrentScene)
104 {
105 mCurrentScene->Shutdown();
106 }
107 mMaterialCache->ReleaseAll();
108 mModelCache->ReleaseAll();
109 mTextureCache->ReleaseAll();
110}
111
113{
114 return mApp;
115}
116
117std::vector<std::pair<std::string, SceneManager::Factory>>& SceneManager::GetPendingRegistrations()
118{
119 static std::vector<std::pair<std::string, Factory>> pending;
120 return pending;
121}
122
123void SceneManager::LoadScene(std::string sceneName)
124{
125 mNextScene = CreateScene(sceneName, *this);
126}
127
129{
131 rrc.renderer = mRenderer;
132 rrc.meshCache = mModelCache.get();
133 rrc.textureCache = mTextureCache.get();
134 rrc.materialCache = mMaterialCache.get();
135
136 return rrc;
137}
138
139bool SceneManager::RegisterScene(const std::string& name, Factory factory)
140{
141 auto& map = GetMap();
142 return map.emplace(name, std::move(factory)).second;
143}
144
145std::unique_ptr<Scene> SceneManager::CreateScene(const std::string& name, SceneManager& sm)
146{
147 std::unique_ptr<Scene> scene = nullptr;
148 auto& map = GetMap();
149 auto it = map.find(name);
150 if (it != map.end())
151 {
152 scene = (it->second)(sm);
153 }
154 return scene;
155}
156
157} // namespace rendering_engine
Defines a generic application interface for rendering-based programs.
Defines an abstract interface for rendering backends.
~SceneManager()
Destructor. Cleans up resources and active scenes.
virtual void Draw()
Draws the active scene using the associated renderer.
IApplication * GetApplication()
Returns the application associated with this SceneManager.
static bool RegisterScene(const std::string &name, Factory factory)
Registers a scene type with a name string.
virtual void Update(float deltaTime)
Updates the currently active scene.
static std::vector< std::pair< std::string, Factory > > & GetPendingRegistrations()
Type alias for the factory used to create scenes.
virtual void Shutdown()
Releases all scene-related resources and shuts down the manager.
void LoadScene(std::string sceneName)
Loads a new scene by name.
std::function< std::unique_ptr< Scene >(SceneManager &)> Factory
virtual void Initialize()
Initializes the current scene and related caches.
static std::unique_ptr< Scene > CreateScene(const std::string &name, SceneManager &sm)
Creates a scene instance by its registered name.
SceneManager(IRenderer *renderer, IApplication *app)
Constructs a SceneManager instance.
RenderResourceContext GetRenderResourceContext() const
Retrieves the current RenderResourceContext.
static boost::filesystem::path GetTextureFolderPath()
Returns absolute path to Content/Textures.
Definition utility.cpp:192
static boost::filesystem::path GetModelsFolderPath()
Returns absolute path to Content/Models.
Definition utility.cpp:197
static bool IsPackageProvided()
Checks whether packed assets (Pack.bin / Pack.json) exist.
Definition utility.cpp:212
Aggregates pointers to global rendering resource managers.