Ticket #3271: Fix.2.patch
File Fix.2.patch, 3.7 KB (added by , 9 years ago) |
---|
-
source/simulation2/components/CCmpRangeManager.cpp
326 326 // Cache for visibility tracking (not serialized) 327 327 i32 m_LosTilesPerSide; 328 328 bool m_GlobalVisibilityUpdate; 329 std::vector< u8> m_GlobalPlayerVisibilityUpdate;329 std::vector<bool> m_GlobalPlayerVisibilityUpdate; 330 330 std::vector<u16> m_DirtyVisibility; 331 331 std::vector<std::set<entity_id_t> > m_LosTiles; 332 332 // List of entities that must be updated, regardless of the status of their tile … … 382 382 383 383 m_LosCircular = false; 384 384 m_TerrainVerticesPerSide = 0; 385 386 m_GlobalPlayerVisibilityUpdate.resize(MAX_LOS_PLAYER_ID); 387 385 388 } 386 389 387 390 virtual void Deinit() … … 406 409 407 410 SerializeVector<SerializeU32_Unbounded>()(serialize, "modified entities", m_ModifiedEntities); 408 411 412 serialize.Bool("global visibility update", m_GlobalVisibilityUpdate); 413 SerializeVector<SerializeBool>()(serialize, "global visibility player update",m_GlobalPlayerVisibilityUpdate); 414 409 415 // We don't serialize m_Subdivision, m_LosPlayerCounts or m_LosTiles 410 416 // since they can be recomputed from the entity data when deserializing; 411 417 // m_LosState must be serialized since it depends on the history of exploration … … 720 726 m_DirtyVisibility.resize(m_LosTilesPerSide*m_LosTilesPerSide); 721 727 m_LosTiles.clear(); 722 728 m_LosTiles.resize(m_LosTilesPerSide*m_LosTilesPerSide); 723 m_GlobalVisibilityUpdate = true;724 m_GlobalPlayerVisibilityUpdate.clear();725 m_GlobalPlayerVisibilityUpdate.resize(MAX_LOS_PLAYER_ID);726 729 727 730 for (EntityMap<EntityData>::const_iterator it = m_EntityData.begin(); it != m_EntityData.end(); ++it) 728 731 { … … 1619 1622 { 1620 1623 PROFILE("UpdateVisibilityData"); 1621 1624 1625 for (player_id_t player = 1; player < MAX_LOS_PLAYER_ID + 1; ++player) 1626 { 1622 1627 for (i32 n = 0; n < m_LosTilesPerSide * m_LosTilesPerSide; ++n) 1623 1628 { 1624 for (player_id_t player = 1; player < MAX_LOS_PLAYER_ID + 1; ++player)1629 if (m_GlobalPlayerVisibilityUpdate[player-1]|| m_GlobalVisibilityUpdate) 1625 1630 { 1626 if (IsVisibilityDirty(m_DirtyVisibility[n], player) || m_GlobalPlayerVisibilityUpdate[player-1] == 1 || m_GlobalVisibilityUpdate)1631 for (const entity_id_t& ent : m_LosTiles[n]) 1627 1632 { 1628 for (const entity_id_t& ent : m_LosTiles[n]) 1633 if (std::find(m_ModifiedEntities.begin(), m_ModifiedEntities.end(), ent) != m_ModifiedEntities.end()) 1634 { 1635 continue; 1636 } 1629 1637 UpdateVisibility(ent, player); 1630 1638 } 1631 1639 } 1640 else if (IsVisibilityDirty(m_DirtyVisibility[n], player)) 1641 for (const entity_id_t& ent : m_LosTiles[n]) 1642 UpdateVisibility(ent, player); 1632 1643 m_DirtyVisibility[n] = 0; 1633 1644 } 1645 } 1634 1646 1635 std::fill(m_GlobalPlayerVisibilityUpdate.begin(), m_GlobalPlayerVisibilityUpdate.end(), 0);1647 std::fill(m_GlobalPlayerVisibilityUpdate.begin(), m_GlobalPlayerVisibilityUpdate.end(), false); 1636 1648 m_GlobalVisibilityUpdate = false; 1637 1649 1638 1650 // Calling UpdateVisibility can modify m_ModifiedEntities, so be careful: … … 1670 1682 1671 1683 itEnts->second.visibilities = (itEnts->second.visibilities & ~(0x3 << 2 * (player - 1))) | (newVis << 2 * (player - 1)); 1672 1684 1685 printf("%i %i %i %i",player, ent, oldVis, newVis); 1673 1686 CMessageVisibilityChanged msg(player, ent, oldVis, newVis); 1674 1687 GetSimContext().GetComponentManager().PostMessage(ent, msg); 1675 1688 } … … 1731 1744 modified = true; 1732 1745 1733 1746 if (modified && (size_t)player <= m_GlobalPlayerVisibilityUpdate.size()) 1734 m_GlobalPlayerVisibilityUpdate[player-1] = 1;1747 m_GlobalPlayerVisibilityUpdate[player-1] = true; 1735 1748 } 1736 1749 1737 1750 virtual u32 GetSharedLosMask(player_id_t player)