[colobot] 17/62: Merge long first frame rendering fix from #898

Didier Raboud odyx at moszumanska.debian.org
Fri Nov 10 11:53:55 UTC 2017


This is an automated email from the git hooks/post-receive script.

odyx pushed a commit to branch debian/master
in repository colobot.

commit d860a08d21d916bf5a98bdd03e60b0bc9ffc08b6
Author: krzys-h <krzys_h at interia.pl>
Date:   Sun Jun 4 13:10:50 2017 +0200

    Merge long first frame rendering fix from #898
    
    Also did some changes to make sure the "F1 to open SatCom" appears immediately (not after 0.1s),
    and that mission timer won't start ticking in the first simulation frame (mainly for code battle initial pause)
---
 src/graphics/engine/engine.h |  6 ++--
 src/level/robotmain.cpp      | 71 ++++++++++++++++++++++++--------------------
 2 files changed, 41 insertions(+), 36 deletions(-)

diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h
index 834de1e..429bca1 100644
--- a/src/graphics/engine/engine.h
+++ b/src/graphics/engine/engine.h
@@ -869,6 +869,9 @@ public:
     //! Specifies the location and direction of view
     void SetViewParams(const Math::Vector &eyePt, const Math::Vector &lookatPt, const Math::Vector &upVec);
 
+    //! Updates the textures used for drawing ground spot
+    void        UpdateGroundSpotTextures();
+
     //! Loads texture, creating it if not already present
     Texture         LoadTexture(const std::string& name);
     //! Loads texture from existing image
@@ -1197,9 +1200,6 @@ protected:
     //! Draws the user interface over the scene
     void        DrawInterface();
 
-    //! Updates the textures used for drawing ground spot
-    void        UpdateGroundSpotTextures();
-
     //! Draws old-style shadow spots
     void        DrawShadowSpots();
     //! Draws the gradient background
diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp
index 5f932cb..6c8cb09 100644
--- a/src/level/robotmain.cpp
+++ b/src/level/robotmain.cpp
@@ -2304,37 +2304,7 @@ void CRobotMain::InitEye()
 //! Advances the entire scene
 bool CRobotMain::EventFrame(const Event &event)
 {
-    // TODO: For some reason we're getting one big event with event.rTime > 0.1f after loading before the movie starts?
-    if (!m_immediatSatCom && !m_beginSatCom && !m_movieLock &&
-         m_gameTime > 0.1f && m_phase == PHASE_SIMUL)
-    {
-        m_displayText->DisplayError(INFO_BEGINSATCOM, Math::Vector(0.0f,0.0f,0.0f));
-        m_beginSatCom = true;  // message appears
-    }
-
     m_time += event.rTime;
-    if (!m_movieLock && !m_pause->IsPauseType(PAUSE_ENGINE))
-    {
-        m_gameTime += event.rTime;
-        m_gameTimeAbsolute += m_app->GetRealRelTime() / 1e9f;
-    }
-
-    if (!m_movieLock && !m_pause->IsPauseType(PAUSE_ENGINE) && m_missionTimerStarted)
-        m_missionTimer += event.rTime;
-
-    if (!m_pause->IsPauseType(PAUSE_ENGINE) && m_autosave && m_gameTimeAbsolute >= m_autosaveLast+(m_autosaveInterval*60) && m_phase == PHASE_SIMUL)
-    {
-        if (m_levelCategory == LevelCategory::Missions    ||
-            m_levelCategory == LevelCategory::FreeGame    ||
-            m_levelCategory == LevelCategory::CustomLevels )
-        {
-            if (!IOIsBusy() && m_missionType != MISSION_CODE_BATTLE)
-            {
-                m_autosaveLast = m_gameTimeAbsolute;
-                Autosave();
-            }
-        }
-    }
 
     m_water->EventProcess(event);
     m_cloud->EventProcess(event);
@@ -2419,6 +2389,40 @@ bool CRobotMain::EventFrame(const Event &event)
     if (toto != nullptr)
         dynamic_cast<CInteractiveObject*>(toto)->EventProcess(event);
 
+    // NOTE: m_movieLock is set only after the first update of CAutoBase finishes
+
+    if (m_phase == PHASE_SIMUL)
+    {
+        if (!m_immediatSatCom && !m_beginSatCom && !m_movieLock)
+        {
+            m_displayText->DisplayError(INFO_BEGINSATCOM, Math::Vector(0.0f, 0.0f, 0.0f));
+            m_beginSatCom = true;  // message appears
+        }
+
+        if (!m_pause->IsPauseType(PAUSE_ENGINE) && !m_movieLock)
+        {
+            m_gameTime += event.rTime;
+            m_gameTimeAbsolute += m_app->GetRealRelTime() / 1e9f;
+
+            if (m_missionTimerStarted)
+                m_missionTimer += event.rTime;
+
+            if (m_autosave && m_gameTimeAbsolute >= m_autosaveLast + (m_autosaveInterval * 60))
+            {
+                if (m_levelCategory == LevelCategory::Missions ||
+                    m_levelCategory == LevelCategory::FreeGame ||
+                    m_levelCategory == LevelCategory::CustomLevels)
+                {
+                    if (!IOIsBusy() && m_missionType != MISSION_CODE_BATTLE)
+                    {
+                        m_autosaveLast = m_gameTimeAbsolute;
+                        Autosave();
+                    }
+                }
+            }
+        }
+    }
+
     HiliteFrame(event.rTime);
 
     // Moves the film indicator.
@@ -3645,12 +3649,13 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
             throw CLevelParserException("Unknown command: '" + line->GetCommand() + "' in " + line->GetLevelFilename() + ":" + boost::lexical_cast<std::string>(line->GetLineNumber()));
         }
 
+        // Do this here to prevent the first frame from taking a long time to render
+        m_engine->UpdateGroundSpotTextures();
+
         m_ui->GetLoadingScreen()->SetProgress(1.0f, RT_LOADING_FINISHED);
         if (m_ui->GetLoadingScreen()->IsVisible())
         {
-            // Force render of the "Loading finished" screen
-            // TODO: For some reason, rendering of the first frame after the simulation starts is very slow
-            // We're doing this because it looks weird when the progress bar is finished but it still says "Loading programs"
+            // Force render of the "Loading finished" screen because it looks weird when the progress bar disappears in the middle
             m_app->Render();
         }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git



More information about the Pkg-games-commits mailing list