Ticket #3107: t3107_bugfix_a18.patch

File t3107_bugfix_a18.patch, 1.7 KB (added by elexis, 9 years ago)

Same patch as Itms committed, but for alpha 18. (Used for debugging other oos tickets)

  • source/simulation2/components/CCmpRangeManager.cpp

     
    16011601
    16021602    void UpdateVisibilityData()
    16031603    {
    16041604        PROFILE("UpdateVisibilityData");
    16051605       
     1606        if (m_GlobalVisibilityUpdate)
     1607            m_ModifiedEntities.clear();
     1608
    16061609        for (i32 n = 0; n < m_LosTilesPerSide * m_LosTilesPerSide; ++n)
    16071610        {
    16081611            for (player_id_t player = 1; player < MAX_LOS_PLAYER_ID + 1; ++player)
    16091612            {
    16101613                if (IsVisibilityDirty(m_DirtyVisibility[n], player) || m_GlobalPlayerVisibilityUpdate[player-1] == 1 || m_GlobalVisibilityUpdate)
     
    16161619            m_DirtyVisibility[n] = 0;
    16171620        }
    16181621
    16191622        std::fill(m_GlobalPlayerVisibilityUpdate.begin(), m_GlobalPlayerVisibilityUpdate.end(), 0);
    16201623
    1621         // Don't bother updating modified entities if the update was global
    1622         if (!m_GlobalVisibilityUpdate)
     1624        m_GlobalVisibilityUpdate = false;
     1625
     1626        // Calling UpdateVisibility can modify m_ModifiedEntities, so be careful
     1627        // Infinite loops could be triggered by feedback between entities and their mirages
     1628        int check = 0;
     1629        while (!m_ModifiedEntities.empty())
    16231630        {
    1624             for (auto& ent : m_ModifiedEntities)
    1625                 UpdateVisibility(ent);
     1631            ++check;
     1632            ENSURE(check < 1000 && "Possible infinite loop in UpdateVisibilityData");
     1633            entity_id_t ent = m_ModifiedEntities.back();
     1634            m_ModifiedEntities.pop_back();
     1635            UpdateVisibility(ent);
    16261636        }
    1627 
    1628         m_ModifiedEntities.clear();
    1629         m_GlobalVisibilityUpdate = false;
    16301637    }
    16311638
    16321639    virtual void RequestVisibilityUpdate(entity_id_t ent)
    16331640    {
    16341641        if (std::find(m_ModifiedEntities.begin(), m_ModifiedEntities.end(), ent) == m_ModifiedEntities.end())