diff --git a/Generals/Code/GameEngine/Source/GameClient/Drawable.cpp b/Generals/Code/GameEngine/Source/GameClient/Drawable.cpp index 10e680001b..f1adbcc7f5 100644 --- a/Generals/Code/GameEngine/Source/GameClient/Drawable.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/Drawable.cpp @@ -2163,15 +2163,25 @@ void Drawable::setStealthLook(StealthLookType look) //------------------------------------------------------------------------------------------------- void Drawable::draw() { - if ( getObject() && getObject()->isEffectivelyDead() ) - m_heatVisionOpacity = 0.0f;//dead folks don't stealth anyway - else if ( m_heatVisionOpacity > VERY_TRANSPARENT_HEATVISION )// keep fading any heatvision unless something has set it to zero - m_heatVisionOpacity *= HEATVISION_FADE_SCALAR; - else + { + //dead folks don't stealth anyway m_heatVisionOpacity = 0.0f; + } + else if ( m_heatVisionOpacity > VERY_TRANSPARENT_HEATVISION ) + { + // keep fading any added material unless something has set it to zero + // TheSuperHackers @tweak The stealth opacity fade time step is now decoupled from the render update. + static_assert(HEATVISION_FADE_SCALAR > 0.0f && HEATVISION_FADE_SCALAR < 1.0f, "HEATVISION_FADE_SCALAR must be between 0 and 1"); - + const Real timeScale = TheFramePacer->getActualLogicTimeScaleOverFpsRatio(); + const Real fadeScalar = 1.0f - (1.0f - HEATVISION_FADE_SCALAR) * timeScale; + m_heatVisionOpacity *= fadeScalar; + } + else + { + m_heatVisionOpacity = 0.0f; + } if (m_hidden || m_hiddenByStealth || getFullyObscuredByShroud()) return; // my, that was easy diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp index 9f1f5f7eaf..bc21adb930 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp @@ -2607,16 +2607,28 @@ void Drawable::setStealthLook(StealthLookType look) //------------------------------------------------------------------------------------------------- void Drawable::draw() { - if ( testTintStatus( TINT_STATUS_FRENZY ) == FALSE ) - { - if ( getObject() && getObject()->isEffectivelyDead() ) - m_secondMaterialPassOpacity = 0.0f;//dead folks don't stealth anyway - else if ( m_secondMaterialPassOpacity > VERY_TRANSPARENT_MATERIAL_PASS_OPACITY )// keep fading any add'l material unless something has set it to zero - m_secondMaterialPassOpacity *= MATERIAL_PASS_OPACITY_FADE_SCALAR; - else - m_secondMaterialPassOpacity = 0.0f; - } + if ( testTintStatus( TINT_STATUS_FRENZY ) == FALSE ) + { + if ( getObject() && getObject()->isEffectivelyDead() ) + { + //dead folks don't stealth anyway + m_secondMaterialPassOpacity = 0.0f; + } + else if ( m_secondMaterialPassOpacity > VERY_TRANSPARENT_MATERIAL_PASS_OPACITY ) + { + // keep fading any added material unless something has set it to zero + // TheSuperHackers @tweak The stealth opacity fade time step is now decoupled from the render update. + static_assert(MATERIAL_PASS_OPACITY_FADE_SCALAR > 0.0f && MATERIAL_PASS_OPACITY_FADE_SCALAR < 1.0f, "MATERIAL_PASS_OPACITY_FADE_SCALAR must be between 0 and 1"); + const Real timeScale = TheFramePacer->getActualLogicTimeScaleOverFpsRatio(); + const Real fadeScalar = 1.0f - (1.0f - MATERIAL_PASS_OPACITY_FADE_SCALAR) * timeScale; + m_secondMaterialPassOpacity *= fadeScalar; + } + else + { + m_secondMaterialPassOpacity = 0.0f; + } + } if (m_hidden || m_hiddenByStealth || getFullyObscuredByShroud()) return; // my, that was easy