diff --git a/Makefile b/Makefile index c54ab3c..6601abd 100644 --- a/Makefile +++ b/Makefile @@ -37,5 +37,10 @@ ifeq ($(MEMOVERLAY),1) CPPFLAGS += -DPSXSPLASH_MEMOVERLAY endif +# FPSOVERLAY=1 → Enable runtime FPS overlay +ifeq ($(FPSOVERLAY), 1) +CPPFLAGS += -DPSXSPLASH_FPSOVERLAY +endif + include third_party/nugget/psyqo-lua/psyqo-lua.mk include third_party/nugget/psyqo/psyqo.mk diff --git a/src/main.cpp b/src/main.cpp index b924a0e..3aa9195 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -119,8 +119,10 @@ void MainScene::frame() { m_sceneManager.GameTick(gpu()); + #if defined(PSXSPLASH_FPSOVERLAY) app.m_font.chainprintf(gpu(), {{.x = 2, .y = 2}}, {{.r = 0xff, .g = 0xff, .b = 0xff}}, "FPS: %i", gpu().getRefreshRate() / deltaTime); + #endif gpu().pumpCallbacks(); } diff --git a/src/renderer.cpp b/src/renderer.cpp index 603bb33..2f8b8d7 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -45,14 +45,14 @@ void psxsplash::Renderer::SetCamera(psxsplash::Camera& camera) { m_currentCamera void psxsplash::Renderer::SetFog(const FogConfig& fog) { m_fog = fog; + // Always use fog color as the GPU clear/back color + m_clearcolor = fog.color; if (fog.enabled) { - m_clearcolor = fog.color; write(static_cast(fog.color.r) << 4); write(static_cast(fog.color.g) << 4); write(static_cast(fog.color.b) << 4); m_fog.fogFarSZ = 8000 / fog.density; } else { - m_clearcolor = {.r = 0, .g = 0, .b = 0}; m_fog.fogFarSZ = 0; } } @@ -135,9 +135,8 @@ void psxsplash::Renderer::processTriangle( int32_t fogIR[3] = {0, 0, 0}; if (fogFarSZ > 0) { int32_t fogNear = fogFarSZ / 4; - int32_t range4 = (fogFarSZ - fogNear) >> 4; - if (range4 < 1) range4 = 1; - int32_t scale = 4096 / range4; + int32_t range = fogFarSZ - fogNear; + if (range < 1) range = 1; int32_t szArr[3] = {sz0, sz1, sz2}; for (int vi = 0; vi < 3; vi++) { int32_t ir; @@ -146,11 +145,10 @@ void psxsplash::Renderer::processTriangle( } else if (szArr[vi] >= fogFarSZ) { ir = 4096; } else { - ir = ((szArr[vi] - fogNear) * scale) >> 4; - if (ir > 4096) ir = 4096; - int32_t inv = 4096 - ir; - ir = 4096 - ((inv >> 2) * (inv >> 2) >> 8); - if (ir < 0) ir = 0; + // Linear 0..4096 over [fogNear, fogFarSZ] + int32_t t = ((szArr[vi] - fogNear) * 4096) / range; + // Quadratic ease-in: t^2 / 4096 + ir = (t * t) >> 12; } fogIR[vi] = ir; } diff --git a/src/scenemanager.cpp b/src/scenemanager.cpp index 13fc356..0fbf70a 100644 --- a/src/scenemanager.cpp +++ b/src/scenemanager.cpp @@ -69,17 +69,13 @@ void psxsplash::SceneManager::InitializeScene(uint8_t* splashpackData, LoadingSc m_roomTriRefs = sceneSetup.roomTriRefs; m_roomTriRefCount = sceneSetup.roomTriRefCount; - // Configure fog from splashpack data (v11+) - if (sceneSetup.fogEnabled) { + // Configure fog and back color from splashpack data (v11+) + { psxsplash::FogConfig fogCfg; - fogCfg.enabled = true; + fogCfg.enabled = sceneSetup.fogEnabled; fogCfg.color = {.r = sceneSetup.fogR, .g = sceneSetup.fogG, .b = sceneSetup.fogB}; fogCfg.density = sceneSetup.fogDensity; Renderer::GetInstance().SetFog(fogCfg); - } else { - psxsplash::FogConfig fogCfg; - fogCfg.enabled = false; - Renderer::GetInstance().SetFog(fogCfg); } // Copy component arrays m_interactables = std::move(sceneSetup.interactables);