mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 16:44:36 +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
|
// 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue