mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 00:24:40 +00:00
Merge pull request #1475 from Azaezel/navMess2
NavMeshUpdateAll leak suppression (not 100% preventative)
This commit is contained in:
commit
21b8865778
1 changed files with 38 additions and 6 deletions
|
|
@ -112,13 +112,39 @@ DefineConsoleFunction(NavMeshUpdateAll, void, (S32 objid, bool remove), (0, fals
|
||||||
SimSet *set = NavMesh::getServerSet();
|
SimSet *set = NavMesh::getServerSet();
|
||||||
for(U32 i = 0; i < set->size(); i++)
|
for(U32 i = 0; i < set->size(); i++)
|
||||||
{
|
{
|
||||||
NavMesh *m = static_cast<NavMesh*>(set->at(i));
|
NavMesh *m = dynamic_cast<NavMesh*>(set->at(i));
|
||||||
m->buildTiles(obj->getWorldBox());
|
if (m)
|
||||||
|
{
|
||||||
|
m->cancelBuild();
|
||||||
|
m->buildTiles(obj->getWorldBox());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(remove)
|
if(remove)
|
||||||
obj->enableCollision();
|
obj->enableCollision();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DefineConsoleFunction(NavMeshUpdateAroundObject, void, (S32 objid, bool remove), (0, false),
|
||||||
|
"@brief Update all NavMesh tiles that intersect the given object's world box.")
|
||||||
|
{
|
||||||
|
SceneObject *obj;
|
||||||
|
if (!Sim::findObject(objid, obj))
|
||||||
|
return;
|
||||||
|
if (remove)
|
||||||
|
obj->disableCollision();
|
||||||
|
SimSet *set = NavMesh::getServerSet();
|
||||||
|
for (U32 i = 0; i < set->size(); i++)
|
||||||
|
{
|
||||||
|
NavMesh *m = dynamic_cast<NavMesh*>(set->at(i));
|
||||||
|
if (m)
|
||||||
|
{
|
||||||
|
m->cancelBuild();
|
||||||
|
m->buildTiles(obj->getWorldBox());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (remove)
|
||||||
|
obj->enableCollision();
|
||||||
|
}
|
||||||
|
|
||||||
DefineConsoleFunction(NavMeshUpdateOne, void, (S32 meshid, S32 objid, bool remove), (0, 0, false),
|
DefineConsoleFunction(NavMeshUpdateOne, void, (S32 meshid, S32 objid, bool remove), (0, 0, false),
|
||||||
"@brief Update all tiles in a given NavMesh that intersect the given object's world box.")
|
"@brief Update all tiles in a given NavMesh that intersect the given object's world box.")
|
||||||
{
|
{
|
||||||
|
|
@ -147,7 +173,7 @@ NavMesh::NavMesh()
|
||||||
mFileName = StringTable->insert("");
|
mFileName = StringTable->insert("");
|
||||||
mNetFlags.clear(Ghostable);
|
mNetFlags.clear(Ghostable);
|
||||||
|
|
||||||
mSaveIntermediates = true;
|
mSaveIntermediates = false;
|
||||||
nm = NULL;
|
nm = NULL;
|
||||||
ctx = NULL;
|
ctx = NULL;
|
||||||
|
|
||||||
|
|
@ -765,13 +791,15 @@ void NavMesh::buildNextTile()
|
||||||
// Intermediate data for tile build.
|
// Intermediate data for tile build.
|
||||||
TileData tempdata;
|
TileData tempdata;
|
||||||
TileData &tdata = mSaveIntermediates ? mTileData[i] : tempdata;
|
TileData &tdata = mSaveIntermediates ? mTileData[i] : tempdata;
|
||||||
|
|
||||||
|
// Remove any previous data.
|
||||||
|
nm->removeTile(nm->getTileRefAt(tile.x, tile.y, 0), 0, 0);
|
||||||
|
|
||||||
// Generate navmesh for this tile.
|
// Generate navmesh for this tile.
|
||||||
U32 dataSize = 0;
|
U32 dataSize = 0;
|
||||||
unsigned char* data = buildTileData(tile, tdata, dataSize);
|
unsigned char* data = buildTileData(tile, tdata, dataSize);
|
||||||
if(data)
|
if(data)
|
||||||
{
|
{
|
||||||
// Remove any previous data.
|
|
||||||
nm->removeTile(nm->getTileRefAt(tile.x, tile.y, 0), 0, 0);
|
|
||||||
// Add new data (navmesh owns and deletes the data).
|
// Add new data (navmesh owns and deletes the data).
|
||||||
dtStatus status = nm->addTile(data, dataSize, DT_TILE_FREE_DATA, 0, 0);
|
dtStatus status = nm->addTile(data, dataSize, DT_TILE_FREE_DATA, 0, 0);
|
||||||
int success = 1;
|
int success = 1;
|
||||||
|
|
@ -830,6 +858,7 @@ unsigned char *NavMesh::buildTileData(const Tile &tile, TileData &data, U32 &dat
|
||||||
SceneContainer::CallbackInfo info;
|
SceneContainer::CallbackInfo info;
|
||||||
info.context = PLC_Navigation;
|
info.context = PLC_Navigation;
|
||||||
info.boundingBox = box;
|
info.boundingBox = box;
|
||||||
|
data.geom.clear();
|
||||||
info.polyList = &data.geom;
|
info.polyList = &data.geom;
|
||||||
info.key = this;
|
info.key = this;
|
||||||
getContainer()->findObjects(box, StaticShapeObjectType | TerrainObjectType, buildCallback, &info);
|
getContainer()->findObjects(box, StaticShapeObjectType | TerrainObjectType, buildCallback, &info);
|
||||||
|
|
@ -843,8 +872,11 @@ unsigned char *NavMesh::buildTileData(const Tile &tile, TileData &data, U32 &dat
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for no geometry.
|
// Check for no geometry.
|
||||||
if(!data.geom.getVertCount())
|
if (!data.geom.getVertCount())
|
||||||
|
{
|
||||||
|
data.geom.clear();
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// Figure out voxel dimensions of this tile.
|
// Figure out voxel dimensions of this tile.
|
||||||
U32 width = 0, height = 0;
|
U32 width = 0, height = 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue