BulletSim: Add delay to stationary check after adding force to Avatar.

Fix to Mantis 8496.
Add parameter [BulletSim] AvatarAddForceFrames.
0.9.1.0-post-fixes
Robert Adams 2019-03-06 10:29:46 -08:00
parent 39f73b82d4
commit 87c81b5172
3 changed files with 19 additions and 10 deletions

View File

@ -47,9 +47,9 @@ public class BSActorAvatarMove : BSActor
// The amount the step up is applying. Used to smooth stair walking. // The amount the step up is applying. Used to smooth stair walking.
float m_lastStepUp; float m_lastStepUp;
// There are times the velocity is set but we don't want to inforce stationary until the // There are times the velocity or force is set but we don't want to inforce
// real velocity drops. // stationary until some tick in the future and the real velocity drops.
bool m_waitingForLowVelocityForStationary = false; int m_waitingForLowVelocityForStationary = 0;
public BSActorAvatarMove(BSScene physicsScene, BSPhysObject pObj, string actorName) public BSActorAvatarMove(BSScene physicsScene, BSPhysObject pObj, string actorName)
: base(physicsScene, pObj, actorName) : base(physicsScene, pObj, actorName)
@ -114,14 +114,18 @@ public class BSActorAvatarMove : BSActor
m_velocityMotor.Enabled = true; m_velocityMotor.Enabled = true;
m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,SetVelocityAndTarget,vel={1}, targ={2}", m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,SetVelocityAndTarget,vel={1}, targ={2}",
m_controllingPrim.LocalID, vel, targ); m_controllingPrim.LocalID, vel, targ);
m_waitingForLowVelocityForStationary = false; m_waitingForLowVelocityForStationary = 0;
} }
}); });
} }
public void SuppressStationayCheckUntilLowVelocity() public void SuppressStationayCheckUntilLowVelocity()
{ {
m_waitingForLowVelocityForStationary = true; m_waitingForLowVelocityForStationary = 1;
}
public void SuppressStationayCheckUntilLowVelocity(int waitTicks)
{
m_waitingForLowVelocityForStationary = waitTicks;
} }
// If a movement motor has not been created, create one and start the movement // If a movement motor has not been created, create one and start the movement
@ -143,7 +147,7 @@ public class BSActorAvatarMove : BSActor
m_controllingPrim.OnPreUpdateProperty += Process_OnPreUpdateProperty; m_controllingPrim.OnPreUpdateProperty += Process_OnPreUpdateProperty;
m_walkingUpStairs = 0; m_walkingUpStairs = 0;
m_waitingForLowVelocityForStationary = false; m_waitingForLowVelocityForStationary = 0;
} }
} }
@ -194,15 +198,17 @@ public class BSActorAvatarMove : BSActor
// if colliding with something stationary and we're not doing volume detect . // if colliding with something stationary and we're not doing volume detect .
if (!m_controllingPrim.ColliderIsMoving && !m_controllingPrim.ColliderIsVolumeDetect) if (!m_controllingPrim.ColliderIsMoving && !m_controllingPrim.ColliderIsVolumeDetect)
{ {
if (m_waitingForLowVelocityForStationary) if (m_waitingForLowVelocityForStationary-- <= 0)
{ {
// if waiting for velocity to drop and it has finally dropped, we can be stationary // if waiting for velocity to drop and it has finally dropped, we can be stationary
// m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,waitingForLowVelocity {1}",
// m_controllingPrim.LocalID, m_waitingForLowVelocityForStationary);
if (m_controllingPrim.RawVelocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared) if (m_controllingPrim.RawVelocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared)
{ {
m_waitingForLowVelocityForStationary = false; m_waitingForLowVelocityForStationary = 0;
} }
} }
if (!m_waitingForLowVelocityForStationary) if (m_waitingForLowVelocityForStationary <= 0)
{ {
m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID); m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID);
m_controllingPrim.IsStationary = true; m_controllingPrim.IsStationary = true;

2
OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs Normal file → Executable file
View File

@ -701,7 +701,7 @@ public sealed class BSCharacter : BSPhysObject
} }
if (m_moveActor != null) if (m_moveActor != null)
{ {
m_moveActor.SuppressStationayCheckUntilLowVelocity(); m_moveActor.SuppressStationayCheckUntilLowVelocity(BSParam.AvatarAddForceFrames);
} }
}); });
} }

View File

@ -149,6 +149,7 @@ public static class BSParam
public static float AvatarHeightHighFudge { get; private set; } public static float AvatarHeightHighFudge { get; private set; }
public static float AvatarFlyingGroundMargin { get; private set; } public static float AvatarFlyingGroundMargin { get; private set; }
public static float AvatarFlyingGroundUpForce { get; private set; } public static float AvatarFlyingGroundUpForce { get; private set; }
public static int AvatarAddForceFrames { get; private set; }
public static float AvatarTerminalVelocity { get; private set; } public static float AvatarTerminalVelocity { get; private set; }
public static float AvatarContactProcessingThreshold { get; private set; } public static float AvatarContactProcessingThreshold { get; private set; }
public static float AvatarAddForcePushFactor { get; private set; } public static float AvatarAddForcePushFactor { get; private set; }
@ -634,6 +635,8 @@ public static class BSParam
5f ), 5f ),
new ParameterDefn<float>("AvatarFlyingGroundUpForce", "Upward force applied to the avatar to keep it at flying ground margin", new ParameterDefn<float>("AvatarFlyingGroundUpForce", "Upward force applied to the avatar to keep it at flying ground margin",
2.0f ), 2.0f ),
new ParameterDefn<int>("AvatarAddForceFrames", "Frames to allow AddForce to apply before checking for stationary",
10 ),
new ParameterDefn<float>("AvatarTerminalVelocity", "Terminal Velocity of falling avatar", new ParameterDefn<float>("AvatarTerminalVelocity", "Terminal Velocity of falling avatar",
-54.0f ), -54.0f ),
new ParameterDefn<float>("AvatarContactProcessingThreshold", "Distance from capsule to check for collisions", new ParameterDefn<float>("AvatarContactProcessingThreshold", "Distance from capsule to check for collisions",