#include "Engine.h" #include "src/Core/Physics/PhysicsManager.h" #include #include "src/Core/Input.h" #include "src/Core/FileSystem.h" #include "src/Scripting/ScriptingEngine.h" #include "src/Rendering/Renderer.h" #include "src/Rendering/Renderer2D.h" #include #include namespace Nuake { Ref Engine::CurrentProject; Ref Engine::CurrentWindow; float Engine::m_LastFrameTime = 0.0f; float Engine::m_FixedUpdateRate = 1.0 / 144.0f; float Engine::m_FixedUpdateDifference = 0.f; bool Engine::IsPlayMode = false; void Engine::Init() { Logger::Log("Engine initialization..."); PhysicsManager::Get()->Init(); Logger::Log("Physics initialized"); // Creates the window CurrentWindow = Window::Get(); Logger::Log("Window initialized"); Renderer2D::Init(); Logger::Log("2D renderer initialized"); Logger::Log("Engine initialized succesfully!"); } void Engine::Tick() { float time = (float)glfwGetTime(); Timestep timestep = time - m_LastFrameTime; m_LastFrameTime = time; // Dont update if no scene is loaded. if (CurrentWindow->GetScene()) { // Play mode update all the entities, Editor does not. if (Engine::IsPlayMode) { CurrentWindow->Update(timestep); m_FixedUpdateDifference += timestep; // Fixed update if (m_FixedUpdateDifference >= m_FixedUpdateRate) { CurrentWindow->FixedUpdate(m_FixedUpdateRate); m_FixedUpdateDifference = 0.f; } } else { GetCurrentScene()->EditorUpdate(timestep); } } Input::Update(); } void Engine::EnterPlayMode() { // Dont trigger init if already in player mode. if (IsPlayMode) return; if (GetCurrentScene()->OnInit()) IsPlayMode = true; else GetCurrentScene()->OnExit(); } void Engine::ExitPlayMode() { // Dont trigger exit if already not in play mode. if (IsPlayMode) { GetCurrentScene()->OnExit(); Input::ShowMouse(); } Input::ShowMouse(); IsPlayMode = false; } void Engine::Draw() { // Start imgui frame ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); // Draw scene Window::Get()->Draw(); } void Engine::EndDraw() { Window::Get()->EndDraw(); } void Engine::Close() { glfwTerminate(); } Ref Engine::GetCurrentScene() { return CurrentWindow->GetScene(); } bool Engine::LoadScene(Ref scene) { return CurrentWindow->SetScene(scene); } Ref Engine::GetProject() { return CurrentProject; } bool Engine::LoadProject(Ref project) { CurrentProject = project; if (!Engine::LoadScene(CurrentProject->DefaultScene)) return false; FileSystem::SetRootDirectory(project->FullPath + "/../"); return true; } Ref Engine::GetCurrentWindow() { return CurrentWindow; } }