Engine
Frameworkcreatedbymeusableforthecreationofsimplegames.CurrentlysupportsOpenGL(Verysimple)andVulkan.
engine.cpp
Go to the documentation of this file.
1 #include "Engine/engine.hpp"
5 
6 #ifdef USING_OPENGL
9 #endif
10 #ifdef USING_VULKAN
13 #endif
14 
15 #include <ThirdParty/cereal/include/cereal/archives/json.hpp>
16 #include <fstream>
17 
18 namespace Engine
19 {
20  eastl::shared_ptr<Engine> Engine::instance;
21  eastl::shared_ptr<EngineImGui> engineImGui;
22 
23  eastl::weak_ptr<Window> Engine::GetWindow() noexcept
24  {
25  return instance->window;
26  }
27 
28  eastl::weak_ptr<Window> Engine::CreateAndReturnWindow(int width, int height, const char* title) noexcept
29  {
30  if (instance->window == nullptr)
31 #ifdef USING_OPENGL
32  instance->window = eastl::shared_ptr<OpenGLWindow>(new OpenGLWindow(width, height, title));
33 #endif
34 #ifdef USING_VULKAN
35  instance->window = eastl::shared_ptr<VulkanWindow>(new VulkanWindow(width, height, title));
36 #endif
37  return instance->window;
38  }
39 
40  eastl::weak_ptr<InputManager> Engine::GetInputManager() noexcept
41  {
42  if (instance->inputManager == nullptr)
43  instance->inputManager = eastl::shared_ptr<InputManager>(new InputManager());
44  return instance->inputManager;
45  }
46 
47  eastl::weak_ptr<Random> Engine::GetRandom()
48  {
49  if (instance->random == nullptr)
50  instance->random = eastl::shared_ptr<Random>(new Random());
51  return instance->random;
52  }
53 
54  eastl::weak_ptr<Renderer> Engine::GetRenderer() noexcept
55  {
56  if (instance->renderer == nullptr)
57  {
58 #ifdef USING_OPENGL
59  instance->renderer = eastl::shared_ptr<OpenGLRenderer>(new OpenGLRenderer("Basic3D.vsh", "Basic3D.fsh"));
60 #endif
61 #ifdef USING_VULKAN
62  instance->renderer = eastl::shared_ptr<VulkanRenderer>(new VulkanRenderer());
63  GetRenderer<VulkanRenderer>().lock()->InitializeRenderer();
64 #endif
65  }
66  return instance->renderer;
67  }
68 
69  eastl::weak_ptr<Camera> Engine::GetCamera() noexcept
70  {
71  if (instance->camera == nullptr)
72  instance->camera = eastl::shared_ptr<Camera>(new Camera(
73  glm::vec3(0.f, 100.f, 150.f),
74  glm::vec3(0.f, -1.f, 0.f),
75  60.f,
76  float(GetWindow().lock()->GetHeight()) / float(GetWindow().lock()->GetHeight()),
77  0.1f,
78  1000.f));
79  return instance->camera;
80  }
81 
82  eastl::weak_ptr<Time> Engine::GetTime() noexcept
83  {
84  if (instance->time == nullptr)
85  instance->time = eastl::shared_ptr<Time>(new Time());
86  return instance->time;
87  }
88 
89  eastl::weak_ptr<EntitySystem> Engine::GetEntitySystem() const noexcept
90  {
91  if (instance->entitySystem == nullptr)
92  instance->entitySystem = eastl::shared_ptr<EntitySystem>(new EntitySystem());
93  return instance->entitySystem;
94  }
95 
96  eastl::weak_ptr<ResourceManager> Engine::GetResourceManager() const noexcept
97  {
98  if (instance->resourceManager == nullptr)
99  instance->resourceManager = eastl::shared_ptr<ResourceManager>(new ResourceManager());
100  return instance->resourceManager;
101  }
102 
103  eastl::weak_ptr<CollisionSystem> Engine::GetCollisionSystem() const noexcept
104  {
105  if (instance->collisionSystem == nullptr)
106  instance->collisionSystem = eastl::shared_ptr<CollisionSystem>(new CollisionSystem());
107  return instance->collisionSystem;
108  }
109 
110  eastl::weak_ptr<Engine> Engine::InitializeEngine(bool isPlaying) noexcept
111  {
112  if (instance != nullptr)
113  return instance;
114 
115  instance = eastl::shared_ptr<Engine>(new Engine());
116  instance->isPlaying = isPlaying;
117 
118  EngineInitializationData initializationData = instance->LoadEngineSettings();
119 
120  instance->CreateAndReturnWindow(
121  initializationData.windowWidth,
122  initializationData.windowHeight,
123  initializationData.windowTitle.c_str());
124  instance->GetRenderer();
125  instance->GetInputManager();
126  engineImGui = eastl::shared_ptr<EngineImGui>(new EngineImGui());
127  return instance;
128  }
129 
130  eastl::weak_ptr<Engine> Engine::GetEngine() noexcept
131  {
132  if (instance == nullptr)
133  return InitializeEngine();
134  return instance;
135  }
136 
137  void Engine::Update() noexcept
138  {
139  GetTime().lock()->OnUpdateBegin();
140 
141  if (instance->isPlaying)
142  {
143  if (instance->entitySystem != nullptr)
144  instance->entitySystem->Update();
145 
146  if (instance->collisionSystem != nullptr)
147  if (instance->collisionSystem->IsRunning() == false)
148  instance->collisionSystem->Start();
149 
150  if (instance->collisionSystem != nullptr)
151  instance->collisionSystem->Update();
152  }
153 
154  //Input manager should always update.
155  if (instance->inputManager != nullptr)
156  instance->inputManager->Update();
157 
158  Render();
159  GetTime().lock()->OnUpdateEnd();
160  }
161 
162  void Engine::Destroy() noexcept
163  {
164  SaveEngineSettings();
165 
166  engineImGui.reset();
167  instance->time.reset();
168  instance->camera.reset();
169  instance->inputManager.reset();
170  instance->resourceManager.reset();
171  instance->collisionSystem.reset();
172  instance->entitySystem.reset();
173  instance->renderer.reset();
174  instance->window.reset();
175  instance->random.reset();
176  instance.reset();
177  }
178 
179  void Engine::SetIsPlaying(bool isPlaying)
180  {
181  instance->isPlaying = isPlaying;
182  }
183 
184  bool Engine::GetIsPlaying()
185  {
186  return instance->isPlaying;
187  }
188 
189  EngineInitializationData Engine::LoadEngineSettings()
190  {
191  EngineInitializationData initializationData;
192  std::ifstream inputStream("Resources/Engine/engineInitializationData.json");
193  if (inputStream.good())
194  {
195  cereal::JSONInputArchive archive(inputStream);
196  archive(initializationData);
197  }
198 
199  return initializationData;
200  }
201 
202  void Engine::SaveEngineSettings()
203  {
204  std::ofstream outputStream("Resources/Engine/engineInitializationData.json");
205  cereal::JSONOutputArchive archive(outputStream);
206  EngineInitializationData engineInitializationData
207  {
208  instance->window->GetWidth(),
209  instance->window->GetHeight(),
210  std::string(instance->window->GetTitle().c_str())
211  };
212 
213  archive(CEREAL_NVP(engineInitializationData));
214  }
215 
216  void Engine::Render() noexcept
217  {
218  if (instance->window != nullptr)
219  instance->window->Update();
220 
221  if (instance->renderer != nullptr)
222  {
223  instance->renderer->RendererBegin(
224  GetCamera().lock()->GetView(),
225  GetCamera().lock()->GetProjection());
226  instance->renderer->OnRender();
227 
228  instance->renderer->RendererEnd();
229  }
230  }
231 } // namespace Engine
This object is a simple wrapper class regarding gainput. It also sends information to ImGUI to keep t...
std::string windowTitle
Window Title defines the title of the engine window. Default is "".
Definition: engine.hpp:34
This class is used to create models, load in meshes and textures. NOTE: Only the Engine is allowed to...
This class is used for the creation of a camera.
Definition: Camera.hpp:12
int windowHeight
WindowHeight defines the height of the engine window. Default is 480.
Definition: engine.hpp:29
This object keeps track of all available entities. NOTE: only the Engine class is allowed to create t...
IMGUI_API float GetTime()
Definition: imgui.cpp:2160
This object is used to retrieve information regarding the time. NOTE: This object can only be created...
Definition: Time.hpp:11
The Collision System handles and stores run-time collision data using the Box2D library ...
This class provides random nummber generation of ints and floats withing the passed boundaries ...
Definition: Random.hpp:9
eastl::shared_ptr< EngineImGui > engineImGui
Definition: engine.cpp:21
int windowWidth
WindowWidth defines the width of the engine window. Default is 640.
Definition: engine.hpp:24
IMGUI_API void Render()
Definition: imgui.cpp:2769