BulletSim: add OutOfBounds logic and some position sanity checking

to eliminate some of the "cannot find terrain height" warning messages.
user_profiles
Robert Adams 2013-02-21 08:52:11 -08:00
parent 681653ca13
commit efb5da0aa6
5 changed files with 68 additions and 33 deletions

View File

@ -443,6 +443,7 @@ public sealed class BSCharacter : BSPhysObject
PhysicsScene.TaintedObject("BSCharacter.setPosition", delegate() PhysicsScene.TaintedObject("BSCharacter.setPosition", delegate()
{ {
DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation);
PositionSanityCheck();
ForcePosition = _position; ForcePosition = _position;
}); });
} }
@ -456,7 +457,6 @@ public sealed class BSCharacter : BSPhysObject
_position = value; _position = value;
if (PhysBody.HasPhysicalBody) if (PhysBody.HasPhysicalBody)
{ {
PositionSanityCheck();
PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation); PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation);
} }
} }
@ -513,8 +513,7 @@ public sealed class BSCharacter : BSPhysObject
PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate() PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate()
{ {
DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
if (PhysBody.HasPhysicalBody) ForcePosition = _position;
PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation);
}); });
ret = true; ret = true;
} }

View File

@ -46,6 +46,8 @@ public static class BSParam
public static float MeshMegaPrimThreshold { get; private set; } public static float MeshMegaPrimThreshold { get; private set; }
public static float SculptLOD { get; private set; } public static float SculptLOD { get; private set; }
public static int CrossingFailuresBeforeOutOfBounds { get; private set; }
public static float MinimumObjectMass { get; private set; } public static float MinimumObjectMass { get; private set; }
public static float MaximumObjectMass { get; private set; } public static float MaximumObjectMass { get; private set; }
public static float MaxLinearVelocity { get; private set; } public static float MaxLinearVelocity { get; private set; }
@ -73,23 +75,23 @@ public static class BSParam
public static float TerrainRestitution { get; private set; } public static float TerrainRestitution { get; private set; }
public static float TerrainCollisionMargin { get; private set; } public static float TerrainCollisionMargin { get; private set; }
public static float DefaultFriction; public static float DefaultFriction { get; private set; }
public static float DefaultDensity; public static float DefaultDensity { get; private set; }
public static float DefaultRestitution; public static float DefaultRestitution { get; private set; }
public static float CollisionMargin; public static float CollisionMargin { get; private set; }
public static float Gravity; public static float Gravity { get; private set; }
// Physics Engine operation // Physics Engine operation
public static float MaxPersistantManifoldPoolSize; public static float MaxPersistantManifoldPoolSize { get; private set; }
public static float MaxCollisionAlgorithmPoolSize; public static float MaxCollisionAlgorithmPoolSize { get; private set; }
public static bool ShouldDisableContactPoolDynamicAllocation; public static bool ShouldDisableContactPoolDynamicAllocation { get; private set; }
public static bool ShouldForceUpdateAllAabbs; public static bool ShouldForceUpdateAllAabbs { get; private set; }
public static bool ShouldRandomizeSolverOrder; public static bool ShouldRandomizeSolverOrder { get; private set; }
public static bool ShouldSplitSimulationIslands; public static bool ShouldSplitSimulationIslands { get; private set; }
public static bool ShouldEnableFrictionCaching; public static bool ShouldEnableFrictionCaching { get; private set; }
public static float NumberOfSolverIterations; public static float NumberOfSolverIterations { get; private set; }
public static bool UseSingleSidedMeshes; public static bool UseSingleSidedMeshes { get; private set; }
public static float GlobalContactBreakingThreshold; public static float GlobalContactBreakingThreshold { get; private set; }
// Avatar parameters // Avatar parameters
public static float AvatarFriction { get; private set; } public static float AvatarFriction { get; private set; }
@ -118,6 +120,7 @@ public static class BSParam
public static float VehicleGroundGravityFudge { get; private set; } public static float VehicleGroundGravityFudge { get; private set; }
public static bool VehicleDebuggingEnabled { get; private set; } public static bool VehicleDebuggingEnabled { get; private set; }
// Linkset implementation parameters
public static float LinksetImplementation { get; private set; } public static float LinksetImplementation { get; private set; }
public static bool LinkConstraintUseFrameOffset { get; private set; } public static bool LinkConstraintUseFrameOffset { get; private set; }
public static bool LinkConstraintEnableTransMotor { get; private set; } public static bool LinkConstraintEnableTransMotor { get; private set; }
@ -282,6 +285,11 @@ public static class BSParam
(s) => { return ShouldRemoveZeroWidthTriangles; }, (s) => { return ShouldRemoveZeroWidthTriangles; },
(s,v) => { ShouldRemoveZeroWidthTriangles = v; } ), (s,v) => { ShouldRemoveZeroWidthTriangles = v; } ),
new ParameterDefn<int>("CrossingFailuresBeforeOutOfBounds", "How forgiving we are about getting into adjactent regions",
5,
(s) => { return CrossingFailuresBeforeOutOfBounds; },
(s,v) => { CrossingFailuresBeforeOutOfBounds = v; } ),
new ParameterDefn<float>("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)", new ParameterDefn<float>("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)",
32f, 32f,
(s) => { return MeshLOD; }, (s) => { return MeshLOD; },
@ -695,6 +703,10 @@ public static class BSParam
} }
} }
// =====================================================================
// =====================================================================
// There are parameters that, when set, cause things to happen in the physics engine.
// This causes the broadphase collision cache to be cleared.
private static void ResetBroadphasePoolTainted(BSScene pPhysScene, float v) private static void ResetBroadphasePoolTainted(BSScene pPhysScene, float v)
{ {
BSScene physScene = pPhysScene; BSScene physScene = pPhysScene;
@ -704,6 +716,7 @@ public static class BSParam
}); });
} }
// This causes the constraint solver cache to be cleared and reset.
private static void ResetConstraintSolverTainted(BSScene pPhysScene, float v) private static void ResetConstraintSolverTainted(BSScene pPhysScene, float v)
{ {
BSScene physScene = pPhysScene; BSScene physScene = pPhysScene;

View File

@ -70,6 +70,8 @@ public class BSPrim : BSPhysObject
private bool _kinematic; private bool _kinematic;
private float _buoyancy; private float _buoyancy;
private int CrossingFailures { get; set; }
public BSDynamics VehicleController { get; private set; } public BSDynamics VehicleController { get; private set; }
private BSVMotor _targetMotor; private BSVMotor _targetMotor;
@ -197,7 +199,20 @@ public class BSPrim : BSPhysObject
{ {
get { return _isSelected; } get { return _isSelected; }
} }
public override void CrossingFailure() { return; }
public override void CrossingFailure()
{
CrossingFailures++;
if (CrossingFailures > BSParam.CrossingFailuresBeforeOutOfBounds)
{
base.RaiseOutOfBounds(RawPosition);
}
else if (CrossingFailures == BSParam.CrossingFailuresBeforeOutOfBounds)
{
m_log.WarnFormat("{0} Too many crossing failures for {1}", LogHeader, Name);
}
return;
}
// link me to the specified parent // link me to the specified parent
public override void link(PhysicsActor obj) { public override void link(PhysicsActor obj) {
@ -1123,7 +1138,11 @@ public class BSPrim : BSPhysObject
// Used for MoveTo // Used for MoveTo
public override OMV.Vector3 PIDTarget { public override OMV.Vector3 PIDTarget {
set { _PIDTarget = value; } set
{
// TODO: add a sanity check -- don't move more than a region or something like that.
_PIDTarget = value;
}
} }
public override float PIDTau { public override float PIDTau {
set { _PIDTau = value; } set { _PIDTau = value; }
@ -1177,7 +1196,9 @@ public class BSPrim : BSPhysObject
} }
else else
{ {
ForcePosition = movePosition; _position = movePosition;
PositionSanityCheck(true /* intaintTime */);
ForcePosition = _position;
} }
DetailLog("{0},BSPrim.PIDTarget,move,fromPos={1},movePos={2}", LocalID, origPosition, movePosition); DetailLog("{0},BSPrim.PIDTarget,move,fromPos={1},movePos={2}", LocalID, origPosition, movePosition);
}); });

View File

@ -568,7 +568,7 @@ public sealed class BSShapeCollection : IDisposable
{ {
newShape = PhysicsScene.PE.BuildCapsuleShape(PhysicsScene.World, 1f, 1f, prim.Scale); newShape = PhysicsScene.PE.BuildCapsuleShape(PhysicsScene.World, 1f, 1f, prim.Scale);
if (DDetail) DetailLog("{0},BSShapeCollection.BuiletPhysicalNativeShape,capsule,scale={1}", prim.LocalID, prim.Scale); if (DDetail) DetailLog("{0},BSShapeCollection.BuildPhysicalNativeShape,capsule,scale={1}", prim.LocalID, prim.Scale);
} }
else else
{ {

View File

@ -1,17 +1,16 @@
CURRENT PRIORITIES CURRENT PRIORITIES
================================================= =================================================
One sided meshes? Should terrain be built into a closed shape?
When meshes get partially wedged into the terrain, they cannot push themselves out.
It is possible that Bullet processes collisions whether entering or leaving a mesh.
Ref: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4869
Deleting a linkset while standing on the root will leave the physical shape of the root behind. Deleting a linkset while standing on the root will leave the physical shape of the root behind.
Not sure if it is because standing on it. Done with large prim linksets. Not sure if it is because standing on it. Done with large prim linksets.
Terrain detail: double terrain mesh detail
Vehicle angular vertical attraction Vehicle angular vertical attraction
vehicle angular banking vehicle angular banking
Center-of-gravity Center-of-gravity
Vehicle angular deflection Vehicle angular deflection
Preferred orientation angular correction fix Preferred orientation angular correction fix
Enable vehicle border crossings (at least as poorly as ODE)
Terrain skirts
Avatar created in previous region and not new region when crossing border
Vehicle recreated in new sim at small Z value (offset from root value?) (DONE)
when should angular and linear motor targets be zeroed? when selected? when should angular and linear motor targets be zeroed? when selected?
Need a vehicle.clear()? Or an 'else' in prestep if not physical. Need a vehicle.clear()? Or an 'else' in prestep if not physical.
Teravus llMoveToTarget script debug Teravus llMoveToTarget script debug
@ -26,14 +25,16 @@ Avatar movement
flying into a wall doesn't stop avatar who keeps appearing to move through the obstacle (DONE) flying into a wall doesn't stop avatar who keeps appearing to move through the obstacle (DONE)
walking up stairs is not calibrated correctly (stairs out of Kepler cabin) walking up stairs is not calibrated correctly (stairs out of Kepler cabin)
avatar capsule rotation completed (NOT DONE - Bullet's capsule shape is not the solution) avatar capsule rotation completed (NOT DONE - Bullet's capsule shape is not the solution)
Enable vehicle border crossings (at least as poorly as ODE)
Terrain skirts
Avatar created in previous region and not new region when crossing border
Vehicle recreated in new sim at small Z value (offset from root value?) (DONE)
Vehicle script tuning/debugging Vehicle script tuning/debugging
Avanti speed script Avanti speed script
Weapon shooter script Weapon shooter script
Add material densities to the material types Move material definitions (friction, ...) into simulator.
Add material densities to the material types.
Terrain detail: double terrain mesh detail
One sided meshes? Should terrain be built into a closed shape?
When meshes get partially wedged into the terrain, they cannot push themselves out.
It is possible that Bullet processes collisions whether entering or leaving a mesh.
Ref: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4869
VEHICLES TODO LIST: VEHICLES TODO LIST:
================================================= =================================================
@ -65,6 +66,7 @@ Vehicle attributes are not restored when a vehicle is rezzed on region creation
GENERAL TODO LIST: GENERAL TODO LIST:
================================================= =================================================
Add a sanity check for PIDTarget location.
Level-of-detail for mesh creation. Prims with circular interiors require lod of 32. Level-of-detail for mesh creation. Prims with circular interiors require lod of 32.
Is much saved with lower LODs? At the moment, all set to 32. Is much saved with lower LODs? At the moment, all set to 32.
Collisions are inconsistant: arrows are supposed to hit and report collision. Often don't. Collisions are inconsistant: arrows are supposed to hit and report collision. Often don't.