Ticket #3271: Fix.2.patch

File Fix.2.patch, 3.7 KB (added by wraitii, 9 years ago)

better version

  • source/simulation2/components/CCmpRangeManager.cpp

     
    326326    // Cache for visibility tracking (not serialized)
    327327    i32 m_LosTilesPerSide;
    328328    bool m_GlobalVisibilityUpdate;
    329     std::vector<u8> m_GlobalPlayerVisibilityUpdate;
     329    std::vector<bool> m_GlobalPlayerVisibilityUpdate;
    330330    std::vector<u16> m_DirtyVisibility;
    331331    std::vector<std::set<entity_id_t> > m_LosTiles;
    332332    // List of entities that must be updated, regardless of the status of their tile
     
    382382
    383383        m_LosCircular = false;
    384384        m_TerrainVerticesPerSide = 0;
     385       
     386        m_GlobalPlayerVisibilityUpdate.resize(MAX_LOS_PLAYER_ID);
     387
    385388    }
    386389
    387390    virtual void Deinit()
     
    406409
    407410        SerializeVector<SerializeU32_Unbounded>()(serialize, "modified entities", m_ModifiedEntities);
    408411
     412        serialize.Bool("global visibility update", m_GlobalVisibilityUpdate);
     413        SerializeVector<SerializeBool>()(serialize, "global visibility player update",m_GlobalPlayerVisibilityUpdate);
     414
    409415        // We don't serialize m_Subdivision, m_LosPlayerCounts or m_LosTiles
    410416        // since they can be recomputed from the entity data when deserializing;
    411417        // m_LosState must be serialized since it depends on the history of exploration
     
    720726        m_DirtyVisibility.resize(m_LosTilesPerSide*m_LosTilesPerSide);
    721727        m_LosTiles.clear();
    722728        m_LosTiles.resize(m_LosTilesPerSide*m_LosTilesPerSide);
    723         m_GlobalVisibilityUpdate = true;
    724         m_GlobalPlayerVisibilityUpdate.clear();
    725         m_GlobalPlayerVisibilityUpdate.resize(MAX_LOS_PLAYER_ID);
    726729
    727730        for (EntityMap<EntityData>::const_iterator it = m_EntityData.begin(); it != m_EntityData.end(); ++it)
    728731        {
     
    16191622    {
    16201623        PROFILE("UpdateVisibilityData");
    16211624
     1625        for (player_id_t player = 1; player < MAX_LOS_PLAYER_ID + 1; ++player)
     1626        {
    16221627        for (i32 n = 0; n < m_LosTilesPerSide * m_LosTilesPerSide; ++n)
    16231628        {
    1624             for (player_id_t player = 1; player < MAX_LOS_PLAYER_ID + 1; ++player)
     1629                if (m_GlobalPlayerVisibilityUpdate[player-1]|| m_GlobalVisibilityUpdate)
    16251630            {
    1626                 if (IsVisibilityDirty(m_DirtyVisibility[n], player) || m_GlobalPlayerVisibilityUpdate[player-1] == 1 || m_GlobalVisibilityUpdate)
     1631                    for (const entity_id_t& ent : m_LosTiles[n])
    16271632                {
    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                        }
    16291637                        UpdateVisibility(ent, player);
    16301638                }
    16311639            }
     1640                else if (IsVisibilityDirty(m_DirtyVisibility[n], player))
     1641                    for (const entity_id_t& ent : m_LosTiles[n])
     1642                        UpdateVisibility(ent, player);
    16321643            m_DirtyVisibility[n] = 0;
    16331644        }
     1645        }
    16341646
    1635         std::fill(m_GlobalPlayerVisibilityUpdate.begin(), m_GlobalPlayerVisibilityUpdate.end(), 0);
     1647        std::fill(m_GlobalPlayerVisibilityUpdate.begin(), m_GlobalPlayerVisibilityUpdate.end(), false);
    16361648        m_GlobalVisibilityUpdate = false;
    16371649
    16381650        // Calling UpdateVisibility can modify m_ModifiedEntities, so be careful:
     
    16701682
    16711683        itEnts->second.visibilities = (itEnts->second.visibilities & ~(0x3 << 2 * (player - 1))) | (newVis << 2 * (player - 1));
    16721684
     1685        printf("%i %i %i %i",player, ent, oldVis, newVis);
    16731686        CMessageVisibilityChanged msg(player, ent, oldVis, newVis);
    16741687        GetSimContext().GetComponentManager().PostMessage(ent, msg);
    16751688    }
     
    17311744                modified = true;
    17321745
    17331746        if (modified && (size_t)player <= m_GlobalPlayerVisibilityUpdate.size())
    1734             m_GlobalPlayerVisibilityUpdate[player-1] = 1;
     1747            m_GlobalPlayerVisibilityUpdate[player-1] = true;
    17351748    }
    17361749
    17371750    virtual u32 GetSharedLosMask(player_id_t player)