Ticket #3271: visibility_serialization.patch

File visibility_serialization.patch, 5.4 KB (added by Itms, 8 years ago)
  • source/simulation2/components/CCmpRangeManager.cpp

     
    303303    bool m_DebugOverlayDirty;
    304304    std::vector<SOverlayLine> m_DebugOverlayLines;
    305305
     306    // Deserialization flag. A lot of different functions are called by Deserialize()
     307    // and we don't want to pass isDeserializing bool arguments to all of them...
     308    bool m_Deserializing;
     309
    306310    // World bounds (entities are expected to be within this range)
    307311    entity_pos_t m_WorldX0;
    308312    entity_pos_t m_WorldZ0;
     
    323327    bool m_LosCircular;
    324328    i32 m_TerrainVerticesPerSide;
    325329   
    326     // Cache for visibility tracking (not serialized)
     330    // Cache for visibility tracking
    327331    i32 m_LosTilesPerSide;
    328332    bool m_GlobalVisibilityUpdate;
    329333    std::vector<u8> m_GlobalPlayerVisibilityUpdate;
     
    367371        m_DebugOverlayEnabled = false;
    368372        m_DebugOverlayDirty = true;
    369373
     374        m_Deserializing = false;
    370375        m_WorldX0 = m_WorldZ0 = m_WorldX1 = m_WorldZ1 = entity_pos_t::Zero();
    371376
    372377        // Initialise with bogus values (these will get replaced when
     
    380385        m_SharedLosMasks.resize(MAX_LOS_PLAYER_ID+2,0);
    381386        m_SharedDirtyVisibilityMasks.resize(MAX_LOS_PLAYER_ID + 2, 0);
    382387
     388        m_GlobalVisibilityUpdate = true;
     389        m_GlobalPlayerVisibilityUpdate.resize(MAX_LOS_PLAYER_ID);
     390
    383391        m_LosCircular = false;
    384392        m_TerrainVerticesPerSide = 0;
    385393    }
     
    404412        serialize.Bool("los circular", m_LosCircular);
    405413        serialize.NumberI32_Unbounded("terrain verts per side", m_TerrainVerticesPerSide);
    406414
     415        serialize.Bool("global visibility update", m_GlobalVisibilityUpdate);
     416        SerializeVector<SerializeU8_Unbounded>()(serialize, "global player visibility update", m_GlobalPlayerVisibilityUpdate);
     417        SerializeVector<SerializeU16_Unbounded>()(serialize, "dirty visibility", m_DirtyVisibility);
    407418        SerializeVector<SerializeU32_Unbounded>()(serialize, "modified entities", m_ModifiedEntities);
    408419
    409420        // We don't serialize m_Subdivision, m_LosPlayerCounts or m_LosTiles
     
    427438        SerializeCommon(deserialize);
    428439
    429440        // Reinitialise subdivisions and LOS data
    430         ResetDerivedData(true);
     441        m_Deserializing = true;
     442        ResetDerivedData();
     443        m_Deserializing = false;
    431444    }
    432445
    433446    virtual void HandleMessage(const CMessage& msg, bool UNUSED(global))
     
    631644        m_WorldZ1 = z1;
    632645        m_TerrainVerticesPerSide = (i32)vertices;
    633646
    634         ResetDerivedData(false);
     647        ResetDerivedData();
    635648    }
    636649
    637650    virtual void Verify()
     
    648661        FastSpatialSubdivision oldSubdivision = m_Subdivision;
    649662        std::vector<std::set<entity_id_t> > oldLosTiles = m_LosTiles;
    650663
    651         ResetDerivedData(true);
     664        m_Deserializing = true;
     665        ResetDerivedData();
     666        m_Deserializing = false;
    652667
    653668        if (oldPlayerCounts != m_LosPlayerCounts)
    654669        {
     
    682697    }
    683698
    684699    // Reinitialise subdivisions and LOS data, based on entity data
    685     void ResetDerivedData(bool skipLosState)
     700    void ResetDerivedData()
    686701    {
    687702        ENSURE(m_WorldX0.IsZero() && m_WorldZ0.IsZero()); // don't bother implementing non-zero offsets yet
    688703        ResetSubdivisions(m_WorldX1, m_WorldZ1);
     
    693708        m_LosPlayerCounts.resize(MAX_LOS_PLAYER_ID+1);
    694709        m_ExploredVertices.clear();
    695710        m_ExploredVertices.resize(MAX_LOS_PLAYER_ID+1, 0);
    696         if (skipLosState)
     711        if (m_Deserializing)
    697712        {
    698713            // recalc current exploration stats.
    699714            for (i32 j = 0; j < m_TerrainVerticesPerSide; j++)
     
    715730        }
    716731        m_LosStateRevealed.clear();
    717732        m_LosStateRevealed.resize(m_TerrainVerticesPerSide*m_TerrainVerticesPerSide);
    718        
    719         m_DirtyVisibility.clear();
    720         m_DirtyVisibility.resize(m_LosTilesPerSide*m_LosTilesPerSide);
     733
     734        if (!m_Deserializing)
     735        {
     736            m_DirtyVisibility.clear();
     737            m_DirtyVisibility.resize(m_LosTilesPerSide*m_LosTilesPerSide);
     738        }
     739        ENSURE(m_DirtyVisibility.size() == m_LosTilesPerSide*m_LosTilesPerSide);
     740
    721741        m_LosTiles.clear();
    722742        m_LosTiles.resize(m_LosTilesPerSide*m_LosTilesPerSide);
    723         m_GlobalVisibilityUpdate = true;
    724         m_GlobalPlayerVisibilityUpdate.clear();
    725         m_GlobalPlayerVisibilityUpdate.resize(MAX_LOS_PLAYER_ID);
    726743
    727744        for (EntityMap<EntityData>::const_iterator it = m_EntityData.begin(); it != m_EntityData.end(); ++it)
    728745        {
     
    17111728    {
    17121729        m_LosCircular = enabled;
    17131730
    1714         ResetDerivedData(false);
     1731        ResetDerivedData();
    17151732    }
    17161733
    17171734    virtual bool GetLosCircular()
     
    19711988
    19721989    inline void MarkVisibilityDirtyAroundTile(u8 owner, i32 i, i32 j)
    19731990    {
     1991        // If we're still in the deserializing process, we must not modify m_DirtyVisibility
     1992        if (m_Deserializing)
     1993            return;
     1994
    19741995        // Mark the LoS tiles around the updated vertex
    19751996        // 1: left-up, 2: right-up, 3: left-down, 4: right-down
    19761997        int n1 = ((j-1)/LOS_TILES_RATIO)*m_LosTilesPerSide + (i-1)/LOS_TILES_RATIO;
  • source/simulation2/serialization/SerializeTemplates.h

     
    151151    }
    152152};
    153153
     154struct SerializeU8_Unbounded
     155{
     156    void operator()(ISerializer& serialize, const char* name, u8 value)
     157    {
     158        serialize.NumberU8_Unbounded(name, value);
     159    }
     160
     161    void operator()(IDeserializer& deserialize, const char* name, u8& value)
     162    {
     163        deserialize.NumberU8_Unbounded(name, value);
     164    }
     165};
     166
    154167struct SerializeU16_Unbounded
    155168{
    156169    void operator()(ISerializer& serialize, const char* name, u16 value)