瀏覽代碼

Correct zone insertion logic

James Urquhart 2 年之前
父節點
當前提交
7e0016e670
共有 2 個文件被更改,包括 22 次插入19 次删除
  1. 21 18
      Engine/source/scene/zones/sceneZoneSpaceManager.cpp
  2. 1 1
      Engine/source/scene/zones/sceneZoneSpaceManager.h

+ 21 - 18
Engine/source/scene/zones/sceneZoneSpaceManager.cpp

@@ -426,7 +426,7 @@ void SceneZoneSpaceManager::_rezoneObject( SceneObject* object )
    // Update the object's zoning information by removing and recomputing
    // its zoning information.
 
-   _zoneRemove( object );
+   _zoneRemove( object, false );
    _zoneInsert( object, true ); // Query already in place.
 }
 
@@ -607,6 +607,8 @@ void SceneZoneSpaceManager::_zoneInsert( SceneObject* object, bool queryListInit
    U32 numGlobalZones = 0;
    U32 remainingZones = SceneObject::MaxObjectZones;
    U32 globalZones[SceneObject::MaxObjectZones];
+   bool outsideIncluded = true;
+   mTempObjectZones.clear();
 
    if (!outsideOnly)
    {
@@ -619,10 +621,8 @@ void SceneZoneSpaceManager::_zoneInsert( SceneObject* object, bool queryListInit
       // Go through the zone spaces and link all zones that the object
       // overlaps.
 
-      bool outsideIncluded = true;
       const U32 numZoneSpaces = mZoneSpacesQueryList.size();
 
-      mTempObjectZones.clear();
       mTempObjectZones.reserve(numZoneSpaces);
 
       for (U32 i = 0; i < numZoneSpaces; ++i)
@@ -663,35 +663,36 @@ void SceneZoneSpaceManager::_zoneInsert( SceneObject* object, bool queryListInit
             dCopyArray(globalZones + numGlobalZones, zones, numZones);
 
             mTempObjectZones.push_back(zoneRecord);
-            zoneSpace->_onZoneAddObject(object, zones + zoneRecord.startZone, numZones);
 
             numGlobalZones += zoneRecord.numZones;
             remainingZones -= zoneRecord.numZones;
          }
       }
+   }
 
-      // If the object crosses into the outside zone or hasn't been
-      // added to any zone above, add it to the outside zone.
+   // If the object crosses into the outside zone or hasn't been
+   // added to any zone above, add it to the outside zone.
 
-      if (outsideOnly || (outsideIncluded && remainingZones > 0))
-      {
-         TempZoneRecord zoneRecord;
-         zoneRecord.numZones = 1;
-         zoneRecord.space = static_cast<SceneZoneSpace*>(getRootZone());
-         zoneRecord.startZone = numGlobalZones;
-         globalZones[numGlobalZones++] = RootZoneId;
-         mTempObjectZones.push_back(zoneRecord);
-      }
+   if (outsideOnly || (outsideIncluded && remainingZones > 0))
+   {
+      TempZoneRecord zoneRecord;
+      zoneRecord.numZones = 1;
+      zoneRecord.space = static_cast<SceneZoneSpace*>(getRootZone());
+      zoneRecord.startZone = numGlobalZones;
+      globalZones[numGlobalZones++] = RootZoneId;
+      mTempObjectZones.push_back(zoneRecord);
    }
 
+   if (numGlobalZones > 0)
+   {
+      _setObjectZoneList(object, numGlobalZones, globalZones);
+   }
 
    for (TempZoneRecord record : mTempObjectZones)
    {
       // Let the zone manager know we have added objects to its
       // zones.
 
-      _setObjectZoneList(object, numGlobalZones, globalZones);
-
       if (record.numZones > 0)
       {
          record.space->_onZoneAddObject(object, globalZones + record.startZone, record.numZones);
@@ -705,7 +706,7 @@ void SceneZoneSpaceManager::_zoneInsert( SceneObject* object, bool queryListInit
 
 //-----------------------------------------------------------------------------
 
-void SceneZoneSpaceManager::_zoneRemove( SceneObject* obj )
+void SceneZoneSpaceManager::_zoneRemove( SceneObject* obj, bool freeList )
 {
    if (obj->mZoneListHandle == 0)
       return;
@@ -777,6 +778,8 @@ void SceneZoneSpaceManager::_setObjectZoneList( SceneObject* object, U32 numZone
    {
       mObjectZoneLists.reallocList(object->mZoneListHandle, numZones, zoneList);
    }
+
+   object->mNumCurrZones = numZones;
 }
 
 //-----------------------------------------------------------------------------

+ 1 - 1
Engine/source/scene/zones/sceneZoneSpaceManager.h

@@ -167,7 +167,7 @@ class SceneZoneSpaceManager
       void _zoneInsert( SceneObject* object, bool queryListInitialized = false );
 
       /// Detach zoning state from the given object.
-      void _zoneRemove( SceneObject* object );
+      void _zoneRemove( SceneObject* object, bool freeList = true );
 
       /// Realloc zoning state to the given object.
       void _zoneRealloc(SceneObject* object, bool queryListInitialized = false);