Skip to content
2 changes: 1 addition & 1 deletion Core/GameEngine/Include/GameClient/GameWindowTransitions.h
Original file line number Diff line number Diff line change
Expand Up @@ -647,7 +647,7 @@ class TransitionGroup
typedef std::list<TransitionWindow *> TransitionWindowList;
TransitionWindowList m_transitionWindowList;
Int m_directionMultiplier;
Int m_currentFrame; ///< maintain how long we've spent on this transition;
Real m_currentFrame; ///< maintain how long we've spent on this transition (in 30fps-equivalent frames);
Comment thread
Caball009 marked this conversation as resolved.
AsciiString m_name;
};

Expand Down
47 changes: 38 additions & 9 deletions Core/GameEngine/Source/GameClient/GUI/GameWindowTransitions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
#include "GameClient/GameWindowTransitions.h"
#include "GameClient/GameWindow.h"
#include "GameClient/GameWindowManager.h"
#include "Common/FramePacer.h"
//-----------------------------------------------------------------------------
// DEFINES ////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -239,7 +240,7 @@ Int TransitionWindow::getTotalFrames( void )
//-----------------------------------------------------------------------------
TransitionGroup::TransitionGroup( void )
{
m_currentFrame = 0;
m_currentFrame = 0.0f;
m_fireOnce = FALSE;
}

Expand All @@ -256,7 +257,7 @@ TransitionGroup::~TransitionGroup( void )

void TransitionGroup::init( void )
{
m_currentFrame = 0;
m_currentFrame = 0.0f;
m_directionMultiplier = 1;
TransitionWindowList::iterator it = m_transitionWindowList.begin();
while (it != m_transitionWindowList.end())
Expand All @@ -270,13 +271,41 @@ void TransitionGroup::init( void )

void TransitionGroup::update( void )
{
m_currentFrame += m_directionMultiplier; // we go forward or backwards depending.
TransitionWindowList::iterator it = m_transitionWindowList.begin();
while (it != m_transitionWindowList.end())
// TheSuperHackers @tweak bobtista GUI transition timing is now decoupled from the render update.
// Step every integer frame between the old and new accumulator value so discrete-state-machine
// transitions cannot skip a state when the render frame rate dips below the base rate.
const Real timeScale = TheFramePacer->getBaseOverUpdateFpsRatio();
const Int prevFrame = (Int)m_currentFrame;
m_currentFrame += m_directionMultiplier * timeScale;
const Int newFrame = (Int)m_currentFrame;

if( newFrame == prevFrame )
{
TransitionWindow *tWin = *it;
tWin->update(m_currentFrame);
it++;
return;
}

const Int step = (newFrame > prevFrame) ? 1 : -1;
for( Int frame = prevFrame + step; frame != newFrame + step; frame += step )
{
Bool isFinished = TRUE;
TransitionWindowList::iterator it = m_transitionWindowList.begin();
while (it != m_transitionWindowList.end())
{
TransitionWindow *tWin = *it;
tWin->update(frame);

if( tWin->isFinished() == FALSE )
{
isFinished = FALSE;
}

it++;
}

if( isFinished )
{
break;
}
}
}

Expand Down Expand Up @@ -315,7 +344,7 @@ void TransitionGroup::reverse( void )
tWin->reverse(totalFrames);
it++;
}
m_currentFrame = totalFrames;
m_currentFrame = (Real)totalFrames;
// m_currentFrame ++;
}

Expand Down
7 changes: 6 additions & 1 deletion Generals/Code/GameEngine/Source/GameClient/InGameUI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5504,6 +5504,9 @@ static const UnsignedInt FRAMES_BEFORE_EXPIRE_TO_FADE = LOGICFRAMES_PER_SECOND *
// ------------------------------------------------------------------------------------------------
void InGameUI::updateAndDrawWorldAnimations( void )
{
// TheSuperHackers @tweak bobtista World animation Z-rise is now decoupled from the render update.
const Real zRiseTimeScale = TheFramePacer->getActualLogicTimeScaleOverFpsRatio();

// go through all animations
for( WorldAnimationListIterator it = m_worldAnimationList.begin();
it != m_worldAnimationList.end(); /*empty*/ )
Expand Down Expand Up @@ -5535,7 +5538,9 @@ void InGameUI::updateAndDrawWorldAnimations( void )

// update the Z value
if( wad->m_zRisePerSecond )
wad->m_worldPos.z += wad->m_zRisePerSecond / LOGICFRAMES_PER_SECOND;
{
wad->m_worldPos.z += wad->m_zRisePerSecond / LOGICFRAMES_PER_SECOND * zRiseTimeScale;
}

}

Expand Down
7 changes: 6 additions & 1 deletion GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5677,6 +5677,9 @@ static const UnsignedInt FRAMES_BEFORE_EXPIRE_TO_FADE = LOGICFRAMES_PER_SECOND *
// ------------------------------------------------------------------------------------------------
void InGameUI::updateAndDrawWorldAnimations( void )
{
// TheSuperHackers @tweak bobtista World animation Z-rise is now decoupled from the render update.
const Real zRiseTimeScale = TheFramePacer->getActualLogicTimeScaleOverFpsRatio();

// go through all animations
for( WorldAnimationListIterator it = m_worldAnimationList.begin();
it != m_worldAnimationList.end(); /*empty*/ )
Expand Down Expand Up @@ -5708,7 +5711,9 @@ void InGameUI::updateAndDrawWorldAnimations( void )

// update the Z value
if( wad->m_zRisePerSecond )
wad->m_worldPos.z += wad->m_zRisePerSecond / LOGICFRAMES_PER_SECOND;
{
wad->m_worldPos.z += wad->m_zRisePerSecond / LOGICFRAMES_PER_SECOND * zRiseTimeScale;
}

}

Expand Down
Loading