diff --git a/Strife.ML b/Strife.ML index 88a3348..78067fe 160000 --- a/Strife.ML +++ b/Strife.ML @@ -1 +1 @@ -Subproject commit 88a3348b2ec9aab2f788326e03eceb935064fceb +Subproject commit 78067fedf1ca4cb800fbc3ebc53fc8d07e36afda diff --git a/src/Engine.cpp b/src/Engine.cpp index 7450908..7eb3aa2 100755 --- a/src/Engine.cpp +++ b/src/Engine.cpp @@ -31,6 +31,8 @@ extern ConsoleVar g_developerMode("developer-mode", true, true); #endif ConsoleVar g_isServer("server", false); +extern ConsoleVar g_fastUpdate("fast-update", false); +extern ConsoleVar g_trainDeltaTime("train-dt", 1 / 60.f, true); static ConcurrentQueue> g_workQueue; @@ -193,11 +195,18 @@ void Engine::RunFrame() float now = GetTimeSeconds(); float timeUntilUpdate = nextGameToRun->nextUpdateTime - now; + + if (!g_fastUpdate.Value() && timeUntilUpdate > 0) + { + AccurateSleepFor(timeUntilUpdate); + } + else + { + nextGameToRun->nextUpdateTime = now; + } - AccurateSleepFor(timeUntilUpdate); - nextGameToRun->RunFrame(GetTimeSeconds()); + nextGameToRun->RunFrame(GetTimeSeconds()); nextGameToRun->nextUpdateTime = nextGameToRun->nextUpdateTime + 1.0f / nextGameToRun->targetTickRate; - ScriptCompiler::GetInstance()->Update(); } diff --git a/src/Engine.hpp b/src/Engine.hpp index 6846331..abcad42 100755 --- a/src/Engine.hpp +++ b/src/Engine.hpp @@ -111,4 +111,6 @@ class Engine std::function _loadResources; }; -extern ConsoleVar g_developerMode; \ No newline at end of file +extern ConsoleVar g_developerMode; +extern ConsoleVar g_fastUpdate; +extern ConsoleVar g_trainDeltaTime; diff --git a/src/Net/ServerGame.cpp b/src/Net/ServerGame.cpp index 9c23945..78ab930 100755 --- a/src/Net/ServerGame.cpp +++ b/src/Net/ServerGame.cpp @@ -25,7 +25,10 @@ void BaseGameInstance::RunFrame(float currentTime) auto input = engine->GetInput(); auto sdlManager = engine->GetSdlManager(); - if (!isHeadless) + const bool fastUpdate = g_fastUpdate.Value(); + const float trainDt = g_trainDeltaTime.Value(); + + if (!isHeadless && !fastUpdate) { input->Update(); sdlManager->Update(); @@ -41,17 +44,26 @@ void BaseGameInstance::RunFrame(float currentTime) { scene->lastFrameStart = currentTime; scene->isFirstFrame = false; + lastRenderTime = currentFrameStart; } auto realDeltaTime = currentTime - scene->lastFrameStart; + float renderDeltaTime; - float renderDeltaTime = !engine->IsPaused() - ? realDeltaTime - : realDeltaTime; //0; + if (fastUpdate) + { + renderDeltaTime = trainDt; + } + else + { + renderDeltaTime = !engine->IsPaused() + ? realDeltaTime + : realDeltaTime; //0; + } scene->deltaTime = renderDeltaTime; - if (!isHeadless) + if (!isHeadless && !fastUpdate) { engine->GetSoundManager()->UpdateActiveSoundEmitters(scene->deltaTime); } @@ -70,34 +82,20 @@ void BaseGameInstance::RunFrame(float currentTime) bool allowConsole = !isHeadless && g_developerMode.Value(); auto console = engine->GetConsole(); - if (allowConsole) - { - if (console->IsOpen()) - { - console->HandleInput(input); - } - - bool tildePressed = InputButton(SDL_SCANCODE_GRAVE).IsPressed(); + std::chrono::duration timeSinceLastRender = std::chrono::duration_cast>(currentFrameStart - lastRenderTime); - if (tildePressed) + if (!isHeadless && (!fastUpdate || (timeSinceLastRender.count() >= trainDt))) + { + if (fastUpdate) { - if (console->IsOpen()) - { - console->Close(); - engine->ResumeGame(); - } - else - { - console->Open(); - engine->PauseGame(); - } + input->Update(); + sdlManager->Update(); } - } - if (!isHeadless) - { Render(scene.get(), realDeltaTime, renderDeltaTime); + lastRenderTime = currentFrameStart; + if (!fastUpdate) { static int count = 0; @@ -112,6 +110,30 @@ void BaseGameInstance::RunFrame(float currentTime) } input->GetMouse()->SetMouseScale(Vector2::Unit() * scene->GetCamera()->Zoom()); + + if (allowConsole) + { + if (console->IsOpen()) + { + console->HandleInput(input); + } + + bool tildePressed = InputButton(SDL_SCANCODE_GRAVE).IsPressed(); + + if (tildePressed) + { + if (console->IsOpen()) + { + console->Close(); + engine->ResumeGame(); + } + else + { + console->Open(); + engine->PauseGame(); + } + } + } } scene->lastFrameStart = currentTime; @@ -126,7 +148,7 @@ void BaseGameInstance::RunFrame(float currentTime) } void BaseGameInstance::Render(Scene* scene, float deltaTime, float renderDeltaTime) -{ +{ auto input = engine->GetInput(); auto sdlManager = engine->GetSdlManager(); auto renderer = engine->GetRenderer(); @@ -211,7 +233,6 @@ BaseGameInstance::BaseGameInstance(Engine* engine, SLNet::RakPeerInterface* rakn engine(engine), fileTransferService(&rpcManager) { - } void ServerGame::HandleNewConnection(SLNet::Packet* packet) diff --git a/src/Net/ServerGame.hpp b/src/Net/ServerGame.hpp index 6b197d8..22bd19f 100755 --- a/src/Net/ServerGame.hpp +++ b/src/Net/ServerGame.hpp @@ -277,6 +277,8 @@ struct BaseGameInstance float targetTickRate; float nextUpdateTime = 0; FileTransferService fileTransferService; + + std::chrono::steady_clock::time_point lastRenderTime; }; struct ServerGame : BaseGameInstance diff --git a/src/Renderer/SdlManager.cpp b/src/Renderer/SdlManager.cpp index 52ad8c5..b2a3f1f 100755 --- a/src/Renderer/SdlManager.cpp +++ b/src/Renderer/SdlManager.cpp @@ -107,10 +107,11 @@ void SdlManager::Init() fwprintf(stderr, L"SetProcessDpiAwareness: %hs\n", err.ErrorMessage()); } #endif - - if (SDL_Init(SDL_INIT_EVERYTHING) < 0) + + unsigned int flags = SDL_INIT_EVENTS | SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_TIMER; + if (SDL_Init(flags) < 0) { - FatalError("Failed to initialize SDL"); + FatalError("Failed to initialize SDL: %s", SDL_GetError()); } SetDefaultValuesOnFirstRun(); diff --git a/src/Resource/ResourceManager.cpp b/src/Resource/ResourceManager.cpp index 17b1015..c444063 100644 --- a/src/Resource/ResourceManager.cpp +++ b/src/Resource/ResourceManager.cpp @@ -105,7 +105,7 @@ void ResourceManager::LoadContentFile(const char* filePath) ResourceSettings settings; settings.resourceName = name.c_str(); - settings.path = path.c_str(); + settings.path = path.string().c_str(); settings.resourceType = type.c_str(); settings.attributes = attributes; diff --git a/src/Scene/EntitySerializer.cpp b/src/Scene/EntitySerializer.cpp index dd7db35..8b02fdb 100644 --- a/src/Scene/EntitySerializer.cpp +++ b/src/Scene/EntitySerializer.cpp @@ -132,7 +132,7 @@ std::string SerializeEntityProperty(const bool& value) template<> bool DeserializeEntityProperty(const std::string& value) { - if (value == "true" || value != "0") + if (value == "true" || value == "1") { return true; } diff --git a/src/Scene/IGame.cpp b/src/Scene/IGame.cpp index c1b92d1..9ee81ad 100755 --- a/src/Scene/IGame.cpp +++ b/src/Scene/IGame.cpp @@ -58,16 +58,20 @@ void IGame::Run() void IGame::Render(PipelineRunner& renderPipeline) { - renderPipeline - .ModifyRendererState([](RendererState& state) - { - state.SetDepthBufferEnabled(true); - state.ClearBuffers(); - }) - .UseSceneCamera() - .RenderEntities() - .RenderDebugPrimitives() - .RenderImgui(); + renderPipeline.ModifyRendererState([](RendererState& state) + { + state.SetDepthBufferEnabled(true); + state.ClearBuffers(); + }); + + if (!(g_fastUpdate.Value())) + { + renderPipeline + .UseSceneCamera() + .RenderEntities() + .RenderDebugPrimitives() + .RenderImgui(); + } renderPipeline .UseUiCamera() diff --git a/src/Scene/SceneManager.cpp b/src/Scene/SceneManager.cpp index 035ea07..e241001 100755 --- a/src/Scene/SceneManager.cpp +++ b/src/Scene/SceneManager.cpp @@ -95,7 +95,8 @@ void SceneManager::BuildNewScene(const SceneModel* sceneModel) } else { - _scene->CreateEntity(entity.type, serializer); + Entity* createdEntity = _scene->CreateEntity(entity.type, serializer); + createdEntity->name = StringId(entity.name); } }