Ticket #2913: use_cached_visibility.patch

File use_cached_visibility.patch, 2.6 KB (added by Itms, 9 years ago)
  • source/simulation2/components/CCmpRangeManager.cpp

     
    13761376            return CLosQuerier(GetSharedLosMask(player), m_LosState, m_TerrainVerticesPerSide);
    13771377    }
    13781378
    1379     virtual ELosVisibility GetLosVisibility(CEntityHandle ent, player_id_t player, bool forceRetainInFog)
     1379    ELosVisibility ComputeLosVisibility(CEntityHandle ent, player_id_t player, bool forceRetainInFog)
    13801380    {
    13811381        // Entities not with positions in the world are never visible
    13821382        if (ent.GetId() == INVALID_ENTITY)
     
    14241424        return VIS_HIDDEN;
    14251425    }
    14261426
     1427    ELosVisibility ComputeLosVisibility(entity_id_t ent, player_id_t player, bool forceRetainInFog)
     1428    {
     1429        CEntityHandle handle = GetSimContext().GetComponentManager().LookupEntityHandle(ent);
     1430        return ComputeLosVisibility(handle, player, forceRetainInFog);
     1431    }
     1432
     1433    virtual ELosVisibility GetLosVisibility(CEntityHandle ent, player_id_t player, bool forceRetainInFog)
     1434    {
     1435        entity_id_t entId = ent.GetId();
     1436       
     1437        // Entities not with positions in the world are never visible
     1438        if (entId == INVALID_ENTITY)
     1439            return VIS_HIDDEN;
     1440        CmpPtr<ICmpPosition> cmpPosition(ent);
     1441        if (!cmpPosition || !cmpPosition->IsInWorld())
     1442            return VIS_HIDDEN;
     1443
     1444        CFixedVector2D pos = cmpPosition->GetPosition2D();
     1445        i32 n = PosToLosTilesHelper(pos.X, pos.Y);
     1446
     1447        if (m_DirtyVisibility[n])
     1448            return ComputeLosVisibility(ent, player, forceRetainInFog);
     1449
     1450        if (std::find(m_ModifiedEntities.begin(), m_ModifiedEntities.end(), entId) != m_ModifiedEntities.end())
     1451            return ComputeLosVisibility(ent, player, forceRetainInFog);
     1452
     1453        EntityMap<EntityData>::iterator it = m_EntityData.find(entId);
     1454        if (it == m_EntityData.end())
     1455            return ComputeLosVisibility(ent, player, forceRetainInFog);
     1456
     1457        return static_cast<ELosVisibility>((it->second.visibilities >> (2*(player-1))) & 0x3);
     1458    }
     1459
    14271460    virtual ELosVisibility GetLosVisibility(entity_id_t ent, player_id_t player, bool forceRetainInFog)
    14281461    {
    14291462        CEntityHandle handle = GetSimContext().GetComponentManager().LookupEntityHandle(ent);
     
    15061539        for (player_id_t player = 1; player < MAX_LOS_PLAYER_ID+1; ++player)
    15071540        {
    15081541            u8 oldVis = (itEnts->second.visibilities >> (2*(player-1))) & 0x3;
    1509             u8 newVis = GetLosVisibility(itEnts->first, player, false);
     1542            u8 newVis = ComputeLosVisibility(itEnts->first, player, false);
    15101543           
    15111544            oldVisibilities.push_back(oldVis);
    15121545            newVisibilities.push_back(newVis);