BulletSim: fix avatar bobbing or jiggling while stationary flying.

Various comments and debugging message mods.
user_profiles
Robert Adams 2013-02-08 15:25:57 -08:00
parent d92eb80373
commit 1b55a9d81e
6 changed files with 34 additions and 19 deletions

View File

@ -77,13 +77,14 @@ public class ExtendedPhysics : INonSharedRegionModule
m_log.ErrorFormat("{0} Initialization error: {0}", LogHeader, e); m_log.ErrorFormat("{0} Initialization error: {0}", LogHeader, e);
} }
m_log.ErrorFormat("{0} module {1} enabled", LogHeader, (Enabled ? "is" : "is not")); m_log.InfoFormat("{0} module {1} enabled", LogHeader, (Enabled ? "is" : "is not"));
} }
public void Close() public void Close()
{ {
if (BaseScene != null) if (BaseScene != null)
{ {
BaseScene.EventManager.OnObjectAddedToScene -= EventManager_OnObjectAddedToScene;
BaseScene.EventManager.OnSceneObjectPartUpdated -= EventManager_OnSceneObjectPartUpdated; BaseScene.EventManager.OnSceneObjectPartUpdated -= EventManager_OnSceneObjectPartUpdated;
BaseScene = null; BaseScene = null;
} }
@ -120,13 +121,20 @@ public class ExtendedPhysics : INonSharedRegionModule
Comms.RegisterScriptInvocations(this); Comms.RegisterScriptInvocations(this);
// When an object is modified, we might need to update its extended physics parameters // When an object is modified, we might need to update its extended physics parameters
BaseScene.EventManager.OnObjectAddedToScene += EventManager_OnObjectAddedToScene;
BaseScene.EventManager.OnSceneObjectPartUpdated += EventManager_OnSceneObjectPartUpdated; BaseScene.EventManager.OnSceneObjectPartUpdated += EventManager_OnSceneObjectPartUpdated;
} }
public Type ReplaceableInterface { get { return null; } } public Type ReplaceableInterface { get { return null; } }
#endregion // INonSharedRegionModule #endregion // INonSharedRegionModule
private void EventManager_OnObjectAddedToScene(SceneObjectGroup obj)
{
throw new NotImplementedException();
}
// Event generated when some property of a prim changes. // Event generated when some property of a prim changes.
private void EventManager_OnSceneObjectPartUpdated(SceneObjectPart sop, bool isFullUpdate) private void EventManager_OnSceneObjectPartUpdated(SceneObjectPart sop, bool isFullUpdate)
{ {

View File

@ -140,7 +140,7 @@ public sealed class BSCharacter : BSPhysObject
ZeroMotion(true); ZeroMotion(true);
ForcePosition = _position; ForcePosition = _position;
// Set the velocity and compute the proper friction // Set the velocity
_velocityMotor.Reset(); _velocityMotor.Reset();
_velocityMotor.SetTarget(_velocity); _velocityMotor.SetTarget(_velocity);
_velocityMotor.SetCurrent(_velocity); _velocityMotor.SetCurrent(_velocity);
@ -214,25 +214,28 @@ public sealed class BSCharacter : BSPhysObject
_velocityMotor.Step(timeStep); _velocityMotor.Step(timeStep);
// If we're not supposed to be moving, make sure things are zero. // If we're not supposed to be moving, make sure things are zero.
if (_velocityMotor.ErrorIsZero() && _velocityMotor.TargetValue == OMV.Vector3.Zero && IsColliding) if (_velocityMotor.ErrorIsZero() && _velocityMotor.TargetValue == OMV.Vector3.Zero)
{ {
// The avatar shouldn't be moving // The avatar shouldn't be moving
_velocityMotor.Zero(); _velocityMotor.Zero();
// If we are colliding with a stationary object, presume we're standing and don't move around if (IsColliding)
if (!ColliderIsMoving)
{ {
DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", LocalID); // If we are colliding with a stationary object, presume we're standing and don't move around
ZeroMotion(true /* inTaintTime */); if (!ColliderIsMoving)
} {
DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", LocalID);
ZeroMotion(true /* inTaintTime */);
}
// Standing has more friction on the ground // Standing has more friction on the ground
if (_currentFriction != BSParam.AvatarStandingFriction) if (_currentFriction != BSParam.AvatarStandingFriction)
{ {
_currentFriction = BSParam.AvatarStandingFriction; _currentFriction = BSParam.AvatarStandingFriction;
PhysicsScene.PE.SetFriction(PhysBody, _currentFriction); PhysicsScene.PE.SetFriction(PhysBody, _currentFriction);
}
} }
DetailLog("{0},BSCharacter.MoveMotor,taint,stopping,target={1}", LocalID, _velocityMotor.TargetValue); DetailLog("{0},BSCharacter.MoveMotor,taint,stopping,target={1},colliding={2}", LocalID, _velocityMotor.TargetValue, IsColliding);
} }
else else
{ {

View File

@ -71,6 +71,10 @@ public abstract class BSLinkset
ret = new BSLinksetCompound(physScene, parent); ret = new BSLinksetCompound(physScene, parent);
break; break;
} }
if (ret == null)
{
physScene.Logger.ErrorFormat("[BULLETSIM LINKSET] Factory could not create linkset. Parent name={1}, ID={2}", parent.Name, parent.LocalID);
}
return ret; return ret;
} }

View File

@ -290,13 +290,13 @@ public abstract class BSPhysObject : PhysicsActor
CollisionAccumulation++; CollisionAccumulation++;
// For movement tests, remember if we are colliding with an object that is moving. // For movement tests, remember if we are colliding with an object that is moving.
ColliderIsMoving = collidee != null ? collidee.RawVelocity != OMV.Vector3.Zero : false; ColliderIsMoving = collidee != null ? (collidee.RawVelocity != OMV.Vector3.Zero) : false;
// If someone has subscribed for collision events log the collision so it will be reported up // If someone has subscribed for collision events log the collision so it will be reported up
if (SubscribedEvents()) { if (SubscribedEvents()) {
CollisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth)); CollisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth));
DetailLog("{0},{1}.Collison.AddCollider,call,with={2},point={3},normal={4},depth={5}", DetailLog("{0},{1}.Collison.AddCollider,call,with={2},point={3},normal={4},depth={5},colliderMoving={6}",
LocalID, TypeName, collidingWith, contactPoint, contactNormal, pentrationDepth); LocalID, TypeName, collidingWith, contactPoint, contactNormal, pentrationDepth, ColliderIsMoving);
ret = true; ret = true;
} }

View File

@ -160,8 +160,8 @@ public class BSPrimLinkable : BSPrimDisplaced
// TODO: this will have to change when linksets are articulated. // TODO: this will have to change when linksets are articulated.
base.UpdateProperties(entprop); base.UpdateProperties(entprop);
} }
// The linkset might like to know about changing locations
Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this); Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this);
} }
public override bool Collide(uint collidingWith, BSPhysObject collidee, public override bool Collide(uint collidingWith, BSPhysObject collidee,

View File

@ -463,7 +463,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
if (!m_initialized) return null; if (!m_initialized) return null;
DetailLog("{0},AddPrimShape,call", localID); DetailLog("{0},BSScene.AddPrimShape,call", localID);
BSPhysObject prim = new BSPrimLinkable(localID, primName, this, position, size, rotation, pbs, isPhysical); BSPhysObject prim = new BSPrimLinkable(localID, primName, this, position, size, rotation, pbs, isPhysical);
lock (PhysObjects) PhysObjects.Add(localID, prim); lock (PhysObjects) PhysObjects.Add(localID, prim);