Ticket #4045: fewercopy.3.patch

File fewercopy.3.patch, 6.1 KB (added by wraitii, 8 years ago)

Saner version passing a vector thanks to sanderd

  • simulation2/components/CCmpRangeManager.cpp

     
    320320    EntityMap<EntityData> m_EntityData;
    321321
    322322    FastSpatialSubdivision m_Subdivision; // spatial index of m_EntityData
    323     std::vector<entity_id_t> m_SubdivisionResults;
     323    std::vector<const std::vector<entity_id_t>* > m_SubdivisionResults;
    324324
    325325    // LOS state:
    326326    static const player_id_t MAX_LOS_PLAYER_ID = 16;
     
    380380        // SetBounds is called)
    381381        ResetSubdivisions(entity_pos_t::FromInt(1024), entity_pos_t::FromInt(1024));
    382382
    383         m_SubdivisionResults.reserve(4096);
     383        m_SubdivisionResults.reserve(256);
    384384
    385385        // The whole map should be visible to Gaia by default, else e.g. animals
    386386        // will get confused when trying to run from enemies
     
    10721072
    10731073            for (size_t i = 0; i < m_SubdivisionResults.size(); ++i)
    10741074            {
    1075                 EntityMap<EntityData>::const_iterator it = m_EntityData.find(m_SubdivisionResults[i]);
    1076                 ENSURE(it != m_EntityData.end());
     1075                std::vector<entity_id_t>::const_iterator eit = m_SubdivisionResults[i]->begin();
     1076                for (; eit != m_SubdivisionResults[i]->end(); ++eit)
     1077                {
     1078                    EntityMap<EntityData>::const_iterator it = m_EntityData.find(*eit);
     1079                    ENSURE(it != m_EntityData.end());
    10771080
    1078                 if (!TestEntityQuery(q, it->first, it->second))
    1079                     continue;
     1081                    if (!TestEntityQuery(q, it->first, it->second))
     1082                        continue;
    10801083
    1081                 CmpPtr<ICmpPosition> cmpSecondPosition(GetSimContext(), m_SubdivisionResults[i]);
    1082                 if (!cmpSecondPosition || !cmpSecondPosition->IsInWorld())
    1083                     continue;
    1084                 CFixedVector3D secondPosition = cmpSecondPosition->GetPosition();
     1084                    CmpPtr<ICmpPosition> cmpSecondPosition(GetSimContext(), *eit);
     1085                    if (!cmpSecondPosition || !cmpSecondPosition->IsInWorld())
     1086                        continue;
     1087                    CFixedVector3D secondPosition = cmpSecondPosition->GetPosition();
    10851088
    1086                 // Restrict based on precise distance
    1087                 if (!InParabolicRange(
     1089                    // Restrict based on precise distance
     1090                    if (!InParabolicRange(
    10881091                        CFixedVector3D(it->second.x, secondPosition.Y, it->second.z)
    1089                             - pos3d,
     1092                        - pos3d,
    10901093                        q.maxRange))
    1091                     continue;
     1094                        continue;
    10921095
    1093                 if (!q.minRange.IsZero())
    1094                 {
    1095                     int distVsMin = (CFixedVector2D(it->second.x, it->second.z) - pos).CompareLength(q.minRange);
    1096                     if (distVsMin < 0)
    1097                         continue;
     1096                    if (!q.minRange.IsZero())
     1097                    {
     1098                        int distVsMin = (CFixedVector2D(it->second.x, it->second.z) - pos).CompareLength(q.minRange);
     1099                        if (distVsMin < 0)
     1100                            continue;
     1101                    }
     1102
     1103                    r.push_back(it->first);
    10981104                }
    1099 
    1100                 r.push_back(it->first);
    11011105            }
    11021106            std::sort(r.begin(), r.end());
    11031107        }
     
    11101114
    11111115            for (size_t i = 0; i < m_SubdivisionResults.size(); ++i)
    11121116            {
    1113                 EntityMap<EntityData>::const_iterator it = m_EntityData.find(m_SubdivisionResults[i]);
    1114                 ENSURE(it != m_EntityData.end());
     1117                std::vector<entity_id_t>::const_iterator eit = m_SubdivisionResults[i]->begin();
     1118                for (; eit != m_SubdivisionResults[i]->end(); ++eit)
     1119                {
     1120                    EntityMap<EntityData>::const_iterator it = m_EntityData.find(*eit);
     1121                    ENSURE(it != m_EntityData.end());
    11151122
    1116                 if (!TestEntityQuery(q, it->first, it->second))
    1117                     continue;
     1123                    if (!TestEntityQuery(q, it->first, it->second))
     1124                        continue;
    11181125
    1119                 // Restrict based on precise distance
    1120                 int distVsMax = (CFixedVector2D(it->second.x, it->second.z) - pos).CompareLength(q.maxRange);
    1121                 if (distVsMax > 0)
    1122                     continue;
     1126                    // Restrict based on precise distance
     1127                    int distVsMax = (CFixedVector2D(it->second.x, it->second.z) - pos).CompareLength(q.maxRange);
     1128                    if (distVsMax > 0)
     1129                        continue;
    11231130
    1124                 if (!q.minRange.IsZero())
    1125                 {
    1126                     int distVsMin = (CFixedVector2D(it->second.x, it->second.z) - pos).CompareLength(q.minRange);
    1127                     if (distVsMin < 0)
    1128                         continue;
     1131                    if (!q.minRange.IsZero())
     1132                    {
     1133                        int distVsMin = (CFixedVector2D(it->second.x, it->second.z) - pos).CompareLength(q.minRange);
     1134                        if (distVsMin < 0)
     1135                            continue;
     1136                    }
     1137
     1138                    r.push_back(it->first);
    11291139                }
    1130 
    1131                 r.push_back(it->first);
    11321140            }
    11331141            std::sort(r.begin(), r.end());
    11341142        }
  • simulation2/helpers/Spatial.h

     
    513513     * Returns a (non sorted) list of items that are either in the square or close to it.
    514514     * It's the responsibility of the querier to do proper distance checking and entity sorting.
    515515     */
    516     void GetInRange(std::vector<entity_id_t>& out, CFixedVector2D posMin, CFixedVector2D posMax) const
     516    void GetInRange(std::vector< const std::vector<entity_id_t>* >& out, CFixedVector2D posMin, CFixedVector2D posMax) const
    517517    {
    518518        size_t minX = Index(posMin.X);
    519519        size_t minY = Index(posMin.Y);
     
    530530        ENSURE(out.empty() && "GetInRange: out is not clean");
    531531
    532532        // Add oversized items, they can be anywhere
    533         out.insert(out.end(), m_OverSizedData.begin(), m_OverSizedData.end());
     533        if (!m_OverSizedData.empty())
     534            out.push_back(&m_OverSizedData);
    534535
    535536        for (size_t Y = minY; Y < maxY; ++Y)
    536         {
    537537            for (size_t X = minX; X < maxX; ++X)
    538             {
    539                 std::vector<entity_id_t>& subdivision = m_SpatialDivisionsData[X + Y*m_ArrayWidth];
    540                 if (!subdivision.empty())
    541                     out.insert(out.end(), subdivision.begin(), subdivision.end());
    542             }
    543         }
     538                out.push_back(&m_SpatialDivisionsData[X + Y*m_ArrayWidth]);
    544539    }
    545540
    546541    /**
     
    547542     * Returns a (non sorted) list of items that are either in the circle or close to it.
    548543     * It's the responsibility of the querier to do proper distance checking and entity sorting.
    549544     */
    550     void GetNear(std::vector<entity_id_t>& out, CFixedVector2D pos, entity_pos_t range) const
     545    void GetNear(std::vector<const std::vector<entity_id_t>* >& out, CFixedVector2D pos, entity_pos_t range) const
    551546    {
    552547        // Because the subdivision size is rather big wrt typical ranges,
    553548        // this square over-approximation is hopefully not too bad.