diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 12 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs | 15 |
2 files changed, 25 insertions, 2 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index f0d17d3..7b98f9d 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -1125,7 +1125,19 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1125 | { | 1125 | { |
1126 | // If body is already heigher, use its height as target height | 1126 | // If body is already heigher, use its height as target height |
1127 | if (VehiclePosition.Z > m_VhoverTargetHeight) | 1127 | if (VehiclePosition.Z > m_VhoverTargetHeight) |
1128 | { | ||
1128 | m_VhoverTargetHeight = VehiclePosition.Z; | 1129 | m_VhoverTargetHeight = VehiclePosition.Z; |
1130 | |||
1131 | // A 'misfeature' of this flag is that if the vehicle is above it's hover height, | ||
1132 | // the vehicle's buoyancy goes away. This is an SL bug that got used by so many | ||
1133 | // scripts that it could not be changed. | ||
1134 | // So, if above the height, reapply gravity if buoyancy had it turned off. | ||
1135 | if (m_VehicleBuoyancy != 0) | ||
1136 | { | ||
1137 | Vector3 appliedGravity = ControllingPrim.ComputeGravity(ControllingPrim.Buoyancy) * m_vehicleMass; | ||
1138 | VehicleAddForce(appliedGravity); | ||
1139 | } | ||
1140 | } | ||
1129 | } | 1141 | } |
1130 | 1142 | ||
1131 | if ((m_flags & VehicleFlag.LOCK_HOVER_HEIGHT) != 0) | 1143 | if ((m_flags & VehicleFlag.LOCK_HOVER_HEIGHT) != 0) |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs b/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs index c4807c4..c016eed 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs | |||
@@ -354,6 +354,8 @@ public sealed class BSTerrainManager : IDisposable | |||
354 | // Return a new position that is over known terrain if the position is outside our terrain. | 354 | // Return a new position that is over known terrain if the position is outside our terrain. |
355 | public Vector3 ClampPositionIntoKnownTerrain(Vector3 pPos) | 355 | public Vector3 ClampPositionIntoKnownTerrain(Vector3 pPos) |
356 | { | 356 | { |
357 | float edgeEpsilon = 0.1f; | ||
358 | |||
357 | Vector3 ret = pPos; | 359 | Vector3 ret = pPos; |
358 | 360 | ||
359 | // First, base addresses are never negative so correct for that possible problem. | 361 | // First, base addresses are never negative so correct for that possible problem. |
@@ -378,10 +380,19 @@ public sealed class BSTerrainManager : IDisposable | |||
378 | // NOTE that GetTerrainPhysicalAtXYZ will set 'terrainBaseXYZ' to the base of the unfound region. | 380 | // NOTE that GetTerrainPhysicalAtXYZ will set 'terrainBaseXYZ' to the base of the unfound region. |
379 | 381 | ||
380 | // Must be off the top of a region. Find an adjacent region to move into. | 382 | // Must be off the top of a region. Find an adjacent region to move into. |
383 | // The returned terrain is always 'lower'. That is, closer to <0,0>. | ||
381 | Vector3 adjacentTerrainBase = FindAdjacentTerrainBase(terrainBaseXYZ); | 384 | Vector3 adjacentTerrainBase = FindAdjacentTerrainBase(terrainBaseXYZ); |
382 | 385 | ||
383 | ret.X = Math.Min(ret.X, adjacentTerrainBase.X + (ret.X % DefaultRegionSize.X)); | 386 | if (adjacentTerrainBase.X < terrainBaseXYZ.X) |
384 | ret.Y = Math.Min(ret.Y, adjacentTerrainBase.Y + (ret.X % DefaultRegionSize.Y)); | 387 | { |
388 | // moving down into a new region in the X dimension. New position will be the max in the new base. | ||
389 | ret.X = adjacentTerrainBase.X + DefaultRegionSize.X - edgeEpsilon; | ||
390 | } | ||
391 | if (adjacentTerrainBase.Y < terrainBaseXYZ.Y) | ||
392 | { | ||
393 | // moving down into a new region in the X dimension. New position will be the max in the new base. | ||
394 | ret.Y = adjacentTerrainBase.Y + DefaultRegionSize.Y - edgeEpsilon; | ||
395 | } | ||
385 | DetailLog("{0},BSTerrainManager.ClampPositionToKnownTerrain,findingAdjacentRegion,adjacentRegBase={1},oldPos={2},newPos={3}", | 396 | DetailLog("{0},BSTerrainManager.ClampPositionToKnownTerrain,findingAdjacentRegion,adjacentRegBase={1},oldPos={2},newPos={3}", |
386 | BSScene.DetailLogZero, adjacentTerrainBase, pPos, ret); | 397 | BSScene.DetailLogZero, adjacentTerrainBase, pPos, ret); |
387 | 398 | ||