Ticket #3612: FixRangeSubdiv.patch
File FixRangeSubdiv.patch, 3.8 KB (added by , 8 years ago) |
---|
-
simulation2/helpers/Spatial.h
398 398 return true; 399 399 } 400 400 401 friend struct SerializeFastSpatialSubdivision; 402 401 403 public: 402 404 FastSpatialSubdivision() : 403 405 m_SpatialDivisionsData(NULL), m_ArrayWidth(0) … … 409 411 { 410 412 Reset(other.m_ArrayWidth); 411 413 std::copy(&other.m_SpatialDivisionsData[0], &other.m_SpatialDivisionsData[m_ArrayWidth*m_ArrayWidth], m_SpatialDivisionsData); 414 m_OverSizedData = other.m_OverSizedData; 412 415 } 413 416 414 417 ~FastSpatialSubdivision() … … 440 443 { 441 444 Reset(other.m_ArrayWidth); 442 445 std::copy(&other.m_SpatialDivisionsData[0], &other.m_SpatialDivisionsData[m_ArrayWidth*m_ArrayWidth], m_SpatialDivisionsData); 446 m_OverSizedData = other.m_OverSizedData; 443 447 } 444 448 return *this; 445 449 } … … 496 500 497 501 /** 498 502 * Equivalent to Remove() then Add(), but slightly faster. 499 * In particular for big objects nothing needs to be done.500 503 */ 501 504 void Move(entity_id_t item, CFixedVector2D oldPosition, CFixedVector2D newPosition, u32 size) 502 505 { 503 506 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); 504 510 return; 511 } 505 512 if (SubdivisionIdx(newPosition) == SubdivisionIdx(oldPosition)) 506 513 return; 507 514 … … 572 579 } 573 580 }; 574 581 582 /** 583 * Serialization helper template for FastSpatialSubdivision 584 */ 585 struct 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 575 616 #endif // INCLUDED_SPATIAL -
simulation2/components/CCmpRangeManager.cpp
424 424 SerializeVector<SerializeU32_Unbounded>()(serialize, "los state", m_LosState); 425 425 SerializeVector<SerializeU32_Unbounded>()(serialize, "shared los masks", m_SharedLosMasks); 426 426 SerializeVector<SerializeU16_Unbounded>()(serialize, "shared dirty visibility masks", m_SharedDirtyVisibilityMasks); 427 428 SerializeFastSpatialSubdivision()(serialize, "range subdivisions", m_Subdivision); 427 429 } 428 430 429 431 virtual void Serialize(ISerializer& serialize) … … 696 698 return &m_Subdivision; 697 699 } 698 700 699 // Reinitialise subdivisions andLOS data, based on entity data701 // Reinitialise LOS data, based on entity data 700 702 void ResetDerivedData() 701 703 { 702 704 ENSURE(m_WorldX0.IsZero() && m_WorldZ0.IsZero()); // don't bother implementing non-zero offsets yet 705 if (!m_Deserializing) 703 706 ResetSubdivisions(m_WorldX1, m_WorldZ1); 704 707 705 708 m_LosTilesPerSide = (m_TerrainVerticesPerSide - 1)/LOS_TILES_RATIO;