Ticket #3612: FixRangeSubdiv.patch

File FixRangeSubdiv.patch, 3.8 KB (added by wraitii, 8 years ago)
  • simulation2/helpers/Spatial.h

     
    398398        return true;
    399399    }
    400400
     401    friend struct SerializeFastSpatialSubdivision;
     402
    401403public:
    402404    FastSpatialSubdivision() :
    403405        m_SpatialDivisionsData(NULL), m_ArrayWidth(0)
     
    409411    {
    410412        Reset(other.m_ArrayWidth);
    411413        std::copy(&other.m_SpatialDivisionsData[0], &other.m_SpatialDivisionsData[m_ArrayWidth*m_ArrayWidth], m_SpatialDivisionsData);
     414        m_OverSizedData = other.m_OverSizedData;
    412415    }
    413416
    414417    ~FastSpatialSubdivision()
     
    440443        {
    441444            Reset(other.m_ArrayWidth);
    442445            std::copy(&other.m_SpatialDivisionsData[0], &other.m_SpatialDivisionsData[m_ArrayWidth*m_ArrayWidth], m_SpatialDivisionsData);
     446            m_OverSizedData = other.m_OverSizedData;
    443447        }
    444448        return *this;
    445449    }
     
    496500
    497501    /**
    498502     * Equivalent to Remove() then Add(), but slightly faster.
    499      * In particular for big objects nothing needs to be done.
    500503     */
    501504    void Move(entity_id_t item, CFixedVector2D oldPosition, CFixedVector2D newPosition, u32 size)
    502505    {       
    503506        if (size > SUBDIVISION_SIZE)
     507        {
     508            if (std::find(m_OverSizedData.begin(), m_OverSizedData.end(), item) == m_OverSizedData.end())
     509                m_OverSizedData.push_back(item);
    504510            return;
     511        }
    505512        if (SubdivisionIdx(newPosition) == SubdivisionIdx(oldPosition))
    506513            return;
    507514
     
    572579    }
    573580};
    574581
     582/**
     583 * Serialization helper template for FastSpatialSubdivision
     584 */
     585struct SerializeFastSpatialSubdivision
     586{
     587    void operator()(ISerializer& serialize, const char* UNUSED(name), FastSpatialSubdivision& value)
     588    {
     589        serialize.NumberU32_Unbounded("array width", value.m_ArrayWidth);
     590        size_t count = value.m_ArrayWidth * value.m_ArrayWidth;
     591        for (size_t i = 0; i < count; ++i)
     592            SerializeVector<SerializeU32_Unbounded>()(serialize, "subdiv items", value.m_SpatialDivisionsData[i]);
     593        SerializeVector<SerializeU32_Unbounded>()(serialize, "subdiv items", value.m_OverSizedData);
     594    }
     595   
     596    void operator()(IDeserializer& serialize, const char* UNUSED(name), FastSpatialSubdivision& value)
     597    {
     598        u32 width;
     599        serialize.NumberU32_Unbounded("array width", width);
     600        value.m_ArrayWidth = width;
     601       
     602        size_t count = value.m_ArrayWidth * value.m_ArrayWidth;
     603
     604        delete[] value.m_SpatialDivisionsData;
     605        value.m_SpatialDivisionsData = new std::vector<entity_id_t>[count];
     606        value.m_OverSizedData.clear();
     607
     608        for (size_t i = 0; i < count; ++i)
     609            SerializeVector<SerializeU32_Unbounded>()(serialize, "subdiv items", value.m_SpatialDivisionsData[i]);
     610       
     611        SerializeVector<SerializeU32_Unbounded>()(serialize, "subdiv items", value.m_OverSizedData);
     612
     613    }
     614};
     615
    575616#endif // INCLUDED_SPATIAL
  • simulation2/components/CCmpRangeManager.cpp

     
    424424        SerializeVector<SerializeU32_Unbounded>()(serialize, "los state", m_LosState);
    425425        SerializeVector<SerializeU32_Unbounded>()(serialize, "shared los masks", m_SharedLosMasks);
    426426        SerializeVector<SerializeU16_Unbounded>()(serialize, "shared dirty visibility masks", m_SharedDirtyVisibilityMasks);
     427
     428        SerializeFastSpatialSubdivision()(serialize, "range subdivisions", m_Subdivision);
    427429    }
    428430
    429431    virtual void Serialize(ISerializer& serialize)
     
    696698        return &m_Subdivision;
    697699    }
    698700
    699     // Reinitialise subdivisions and LOS data, based on entity data
     701    // Reinitialise LOS data, based on entity data
    700702    void ResetDerivedData()
    701703    {
    702704        ENSURE(m_WorldX0.IsZero() && m_WorldZ0.IsZero()); // don't bother implementing non-zero offsets yet
     705        if (!m_Deserializing)
    703706        ResetSubdivisions(m_WorldX1, m_WorldZ1);
    704707
    705708        m_LosTilesPerSide = (m_TerrainVerticesPerSide - 1)/LOS_TILES_RATIO;