BulletSim: tweaks to terrain boundry computation. No functional changes.

user_profiles
Robert Adams 2013-03-27 16:59:13 -07:00
parent 9ca54d00d8
commit 3f9b274180
1 changed files with 29 additions and 21 deletions

View File

@ -343,37 +343,35 @@ public sealed class BSTerrainManager : IDisposable
{ {
Vector3 ret = pPos; Vector3 ret = pPos;
// First, base addresses are never negative so correct for that possible problem.
if (ret.X < 0f || ret.Y < 0f)
{
ret.X = Util.Clamp<float>(ret.X, 0f, 1000000f);
ret.Y = Util.Clamp<float>(ret.Y, 0f, 1000000f);
DetailLog("{0},BSTerrainManager.ClampPositionToKnownTerrain,zeroingNegXorY,oldPos={1},newPos={2}",
BSScene.DetailLogZero, pPos, ret);
}
// Can't do this function if we don't know about any terrain. // Can't do this function if we don't know about any terrain.
if (m_terrains.Count == 0) if (m_terrains.Count == 0)
return ret; return ret;
int loopPrevention = 5; int loopPrevention = 10;
Vector3 terrainBaseXYZ; Vector3 terrainBaseXYZ;
BSTerrainPhys physTerrain; BSTerrainPhys physTerrain;
while (!GetTerrainPhysicalAtXYZ(ret, out physTerrain, out terrainBaseXYZ)) while (!GetTerrainPhysicalAtXYZ(ret, out physTerrain, out terrainBaseXYZ))
{ {
// The passed position is not within a known terrain area. // The passed position is not within a known terrain area.
// NOTE that GetTerrainPhysicalAtXYZ will set 'terrainBaseXYZ' to the base of the unfound region.
// First, base addresses are never negative so correct for that possible problem. // Must be off the top of a region. Find an adjacent region to move into.
if (ret.X < 0f || ret.Y < 0f) Vector3 adjacentTerrainBase = FindAdjacentTerrainBase(terrainBaseXYZ);
{
if (ret.X < 0f) ret.X = Math.Min(ret.X, adjacentTerrainBase.X + (ret.X % DefaultRegionSize.X));
ret.X = 0f; ret.Y = Math.Min(ret.Y, adjacentTerrainBase.Y + (ret.X % DefaultRegionSize.Y));
if (ret.Y < 0f) DetailLog("{0},BSTerrainManager.ClampPositionToKnownTerrain,findingAdjacentRegion,adjacentRegBase={1},oldPos={2},newPos={3}",
ret.Y = 0f; BSScene.DetailLogZero, adjacentTerrainBase, pPos, ret);
DetailLog("{0},BSTerrainManager.ClampPositionToKnownTerrain,zeroingNegXorY,oldPos={1},newPos={2}",
BSScene.DetailLogZero, pPos, ret);
}
else
{
// Must be off the top of a region. Find an adjacent region to move into.
Vector3 adjacentTerrainBase = FindAdjacentTerrainBase(terrainBaseXYZ);
ret.X = Math.Min(ret.X, adjacentTerrainBase.X + DefaultRegionSize.X);
ret.Y = Math.Min(ret.Y, adjacentTerrainBase.Y + DefaultRegionSize.Y);
DetailLog("{0},BSTerrainManager.ClampPositionToKnownTerrain,findingAdjacentRegion,adjacentRegBase={1},oldPos={2},newPos={3}",
BSScene.DetailLogZero, adjacentTerrainBase, pPos, ret);
}
if (loopPrevention-- < 0f) if (loopPrevention-- < 0f)
{ {
// The 'while' is a little dangerous so this prevents looping forever if the // The 'while' is a little dangerous so this prevents looping forever if the
@ -383,6 +381,7 @@ public sealed class BSTerrainManager : IDisposable
break; break;
} }
} }
return ret; return ret;
} }
@ -479,11 +478,20 @@ public sealed class BSTerrainManager : IDisposable
private Vector3 FindAdjacentTerrainBase(Vector3 pTerrainBase) private Vector3 FindAdjacentTerrainBase(Vector3 pTerrainBase)
{ {
Vector3 ret = pTerrainBase; Vector3 ret = pTerrainBase;
// Can't do this function if we don't know about any terrain.
if (m_terrains.Count == 0)
return ret;
// Just some sanity
ret.X = Util.Clamp<float>(ret.X, 0f, 1000000f);
ret.Y = Util.Clamp<float>(ret.Y, 0f, 1000000f);
ret.Z = 0f; ret.Z = 0f;
lock (m_terrains) lock (m_terrains)
{ {
// Once down to the <0,0> region, we have to be done. // Once down to the <0,0> region, we have to be done.
while (ret.X > 0f && ret.Y > 0f) while (ret.X > 0f || ret.Y > 0f)
{ {
if (ret.X > 0f) if (ret.X > 0f)
{ {