mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-03-09 07:20:40 +00:00
Correct zone insertion logic
This commit is contained in:
parent
d9ff5d3f0e
commit
7e0016e670
2 changed files with 24 additions and 21 deletions
|
|
@ -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 (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)
|
||||
{
|
||||
// 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;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue