summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/Frontend.cpp20
-rw-r--r--src/core/Timer.cpp67
-rw-r--r--src/core/Timer.h4
-rw-r--r--src/core/main.cpp5
4 files changed, 39 insertions, 57 deletions
diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp
index 4677e4c9..3057ceac 100644
--- a/src/core/Frontend.cpp
+++ b/src/core/Frontend.cpp
@@ -950,12 +950,7 @@ CMenuManager::DisplayHelperText()
m_nHelperTextAlpha -= 2;
}
#else
- static float fadeAlpha = 0.0f; // To keep it precisely
- if (m_nHelperTextAlpha >= 255 && fadeAlpha < 250) fadeAlpha = m_nHelperTextAlpha;
-
- // -2 per every 33 ms (1000.f/30.f - original frame limiter fps)
- fadeAlpha -= (frameTime / 33.0f) * 2.0f;
- m_nHelperTextAlpha = fadeAlpha;
+ m_nHelperTextAlpha -= 2 * CTimer::GetLogicalFramesPassed();
#endif
if (m_nHelperTextAlpha < 1)
ResetHelperText();
@@ -2686,11 +2681,7 @@ CMenuManager::DrawFrontEndNormal()
static float fadeAlpha = 0.0f;
if (m_nMenuFadeAlpha < 255) {
- if (m_nMenuFadeAlpha == 0 && fadeAlpha > 1.0f) fadeAlpha = 0.0f;
-
- // +20 per every 33 ms (1000.f/30.f - original frame limiter fps)
- fadeAlpha += (frameTime) * 20.f / 33.f;
- m_nMenuFadeAlpha = fadeAlpha;
+ m_nMenuFadeAlpha += 20 * CTimer::GetLogicalFramesPassed();
} else {
// TODO: what is this? waiting mouse?
if(field_518 == 4){
@@ -2950,12 +2941,7 @@ CMenuManager::DrawFrontEndNormal()
// Famous transparent menu bug
#ifdef FIX_BUGS
- static float fadeAlpha = 0.0f;
- if (m_nMenuFadeAlpha == 0 && fadeAlpha > 1.0f) fadeAlpha = 0.0f;
-
- // +20 per every 33 ms (1000.f/30.f - original frame limiter fps)
- fadeAlpha += (frameTime) * 20.f / 33.f;
- m_nMenuFadeAlpha = fadeAlpha;
+ m_nMenuFadeAlpha += 20 * CTimer::GetLogicalFramesPassed();
#else
static uint32 LastFade = 0;
diff --git a/src/core/Timer.cpp b/src/core/Timer.cpp
index 0c1875e9..29875c91 100644
--- a/src/core/Timer.cpp
+++ b/src/core/Timer.cpp
@@ -37,10 +37,6 @@ RsTimerType suspendPcTimer;
uint32 suspendDepth;
-#ifdef FIX_BUGS
-double frameTime;
-#endif
-
void CTimer::Initialise(void)
{
debug("Initialising CTimer...\n");
@@ -90,6 +86,12 @@ void CTimer::Shutdown(void)
void CTimer::Update(void)
{
+#ifdef FIX_BUGS
+ static double frameTimeLogical = 0.0;
+ static double frameTimeFraction = 0.0;
+ static double frameTimeFractionScaled = 0.0;
+#endif
+
m_snPreviousTimeInMilliseconds = m_snTimeInMilliseconds;
#ifdef _WIN32
@@ -101,31 +103,30 @@ void CTimer::Update(void)
int32 updInCycles = (pc.LowPart - _oldPerfCounter.LowPart); // & 0x7FFFFFFF; pointless
_oldPerfCounter = pc;
-
+
+ // bugfix from VC
+#ifdef FIX_BUGS
+ float updInCyclesScaled = GetIsPaused() ? updInCycles : updInCycles * ms_fTimeScale;
+#else
float updInCyclesScaled = updInCycles * ms_fTimeScale;
-
- // We need that real frame time to fix transparent menu bug.
-#ifndef FIX_BUGS
- double
#endif
- frameTime = updInCyclesScaled / (double)_nCyclesPerMS;
+
+ double frameTime = updInCyclesScaled / (double)_nCyclesPerMS;
#ifdef FIX_BUGS
+ // count frames as if we're running at 30 fps
m_LogicalFramesPassed = 0;
- static double frameTimeLogical = 0.0;
frameTimeLogical += ((double)updInCycles / (double)_nCyclesPerMS);
while (frameTimeLogical >= 1000.0 / 30.0) {
frameTimeLogical -= 1000.0 / 30.0;
m_LogicalFramesPassed++;
}
m_LogicalFrameCounter += m_LogicalFramesPassed;
-#endif
-#ifdef FIX_BUGS
- static double frameTimeDouble = 0.0;
- frameTimeDouble += frameTime;
+ frameTimeFraction += (double)updInCycles / (double)_nCyclesPerMS;
+ frameTimeFractionScaled += frameTime;
- m_snTimeInMillisecondsPauseMode += uint32(frameTimeDouble);
+ m_snTimeInMillisecondsPauseMode += uint32(frameTimeFraction);
#else
m_snTimeInMillisecondsPauseMode = m_snTimeInMillisecondsPauseMode + frameTime;
#endif
@@ -135,8 +136,8 @@ void CTimer::Update(void)
else
{
#ifdef FIX_BUGS
- m_snTimeInMilliseconds += uint32(frameTimeDouble);
- m_snTimeInMillisecondsNonClipped += uint32(frameTimeDouble);
+ m_snTimeInMilliseconds += uint32(frameTimeFractionScaled);
+ m_snTimeInMillisecondsNonClipped += uint32(frameTimeFractionScaled);
#else
m_snTimeInMilliseconds = m_snTimeInMilliseconds + frameTime;
m_snTimeInMillisecondsNonClipped = m_snTimeInMillisecondsNonClipped + frameTime;
@@ -144,7 +145,8 @@ void CTimer::Update(void)
ms_fTimeStep = frameTime / 1000.0f * 50.0f;
}
#ifdef FIX_BUGS
- frameTimeDouble -= uint32(frameTimeDouble);
+ frameTimeFraction -= uint32(frameTimeFraction);
+ frameTimeFractionScaled -= uint32(frameTimeFractionScaled);
#endif
}
else
@@ -154,30 +156,24 @@ void CTimer::Update(void)
RsTimerType updInMs = timer - oldPcTimer;
- // We need that real frame time to fix transparent menu bug.
-#ifndef FIX_BUGS
- double
-#endif
- frameTime = (double)updInMs * ms_fTimeScale;
+ double frameTime = (double)updInMs * ms_fTimeScale;
+
+ oldPcTimer = timer;
#ifdef FIX_BUGS
+ // count frames as if we're running at 30 fps
m_LogicalFramesPassed = 0;
- static double frameTimeLogical = 0.0;
frameTimeLogical += (double)updInMs;
while(frameTimeLogical >= 1000.0 / 30.0) {
frameTimeLogical -= 1000.0 / 30.0;
m_LogicalFramesPassed++;
}
m_LogicalFrameCounter += m_LogicalFramesPassed;
-#endif
- oldPcTimer = timer;
-
-#ifdef FIX_BUGS
- static double frameTimeDouble = 0.0;
- frameTimeDouble += frameTime;
+ frameTimeFraction += (double)updInMs;
+ frameTimeFractionScaled += frameTime;
- m_snTimeInMillisecondsPauseMode += uint32(frameTimeDouble);
+ m_snTimeInMillisecondsPauseMode += uint32(frameTimeFraction);
#else
m_snTimeInMillisecondsPauseMode = m_snTimeInMillisecondsPauseMode + frameTime;
#endif
@@ -187,8 +183,8 @@ void CTimer::Update(void)
else
{
#ifdef FIX_BUGS
- m_snTimeInMilliseconds += uint32(frameTimeDouble);
- m_snTimeInMillisecondsNonClipped += uint32(frameTimeDouble);
+ m_snTimeInMilliseconds += uint32(frameTimeFractionScaled);
+ m_snTimeInMillisecondsNonClipped += uint32(frameTimeFractionScaled);
#else
m_snTimeInMilliseconds = m_snTimeInMilliseconds + frameTime;
m_snTimeInMillisecondsNonClipped = m_snTimeInMillisecondsNonClipped + frameTime;
@@ -196,7 +192,8 @@ void CTimer::Update(void)
ms_fTimeStep = frameTime / 1000.0f * 50.0f;
}
#ifdef FIX_BUGS
- frameTimeDouble -= uint32(frameTimeDouble);
+ frameTimeFraction -= uint32(frameTimeFraction);
+ frameTimeFractionScaled -= uint32(frameTimeFractionScaled);
#endif
}
diff --git a/src/core/Timer.h b/src/core/Timer.h
index 7b68303a..819bd30c 100644
--- a/src/core/Timer.h
+++ b/src/core/Timer.h
@@ -69,7 +69,3 @@ public:
static uint32 GetLogicalFramesPassed(void) { return m_LogicalFramesPassed; }
#endif
};
-
-#ifdef FIX_BUGS
-extern double frameTime;
-#endif
diff --git a/src/core/main.cpp b/src/core/main.cpp
index 492f481e..6a773ba5 100644
--- a/src/core/main.cpp
+++ b/src/core/main.cpp
@@ -1177,7 +1177,10 @@ DisplayGameDebugText()
FrameSamples++;
#ifdef FIX_BUGS
- FramesPerSecondCounter += frameTime / 1000.f; // convert to seconds
+ // this is inaccurate with over 1000 fps
+ static uint32 PreviousTimeInMillisecondsPauseMode = 0;
+ FramesPerSecondCounter += (CTimer::GetTimeInMillisecondsPauseMode() - PreviousTimeInMillisecondsPauseMode) / 1000.0f; // convert to seconds
+ PreviousTimeInMillisecondsPauseMode = CTimer::GetTimeInMillisecondsPauseMode();
FramesPerSecond = FrameSamples / FramesPerSecondCounter;
#else
FramesPerSecondCounter += 1000.0f / CTimer::GetTimeStepNonClippedInMilliseconds();