Correct zone insertion logic

This commit is contained in:
James Urquhart 2023-02-06 18:11:53 +00:00 committed by Brian Roberts
parent d9ff5d3f0e
commit 7e0016e670
2 changed files with 24 additions and 21 deletions

View file

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

View file

@ -167,7 +167,7 @@ class SceneZoneSpaceManager
void _zoneInsert( SceneObject* object, bool queryListInitialized = false ); void _zoneInsert( SceneObject* object, bool queryListInitialized = false );
/// Detach zoning state from the given object. /// 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. /// Realloc zoning state to the given object.
void _zoneRealloc(SceneObject* object, bool queryListInitialized = false); void _zoneRealloc(SceneObject* object, bool queryListInitialized = false);