Ticket #3107: t3107_bugfix_a18.patch
File t3107_bugfix_a18.patch, 1.7 KB (added by , 9 years ago) |
---|
-
source/simulation2/components/CCmpRangeManager.cpp
1601 1601 1602 1602 void UpdateVisibilityData() 1603 1603 { 1604 1604 PROFILE("UpdateVisibilityData"); 1605 1605 1606 if (m_GlobalVisibilityUpdate) 1607 m_ModifiedEntities.clear(); 1608 1606 1609 for (i32 n = 0; n < m_LosTilesPerSide * m_LosTilesPerSide; ++n) 1607 1610 { 1608 1611 for (player_id_t player = 1; player < MAX_LOS_PLAYER_ID + 1; ++player) 1609 1612 { 1610 1613 if (IsVisibilityDirty(m_DirtyVisibility[n], player) || m_GlobalPlayerVisibilityUpdate[player-1] == 1 || m_GlobalVisibilityUpdate) … … 1616 1619 m_DirtyVisibility[n] = 0; 1617 1620 } 1618 1621 1619 1622 std::fill(m_GlobalPlayerVisibilityUpdate.begin(), m_GlobalPlayerVisibilityUpdate.end(), 0); 1620 1623 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()) 1623 1630 { 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); 1626 1636 } 1627 1628 m_ModifiedEntities.clear();1629 m_GlobalVisibilityUpdate = false;1630 1637 } 1631 1638 1632 1639 virtual void RequestVisibilityUpdate(entity_id_t ent) 1633 1640 { 1634 1641 if (std::find(m_ModifiedEntities.begin(), m_ModifiedEntities.end(), ent) == m_ModifiedEntities.end())