diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
index 1c8de56a75..b9ec6b5450 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
@@ -771,16 +771,10 @@ namespace OpenSim.Region.Physics.OdePlugin
///
public void Move(float timeStep, List defects)
{
- // no lock; for now it's only called from within Simulate()
-
- // If the PID Controller isn't active then we set our force
- // calculating base velocity to the current position
-
if (Body == IntPtr.Zero)
return;
- d.Vector3 dtmp;
- d.BodyCopyPosition(Body, out dtmp);
+ d.Vector3 dtmp = d.BodyGetPosition(Body);
Vector3 localpos = new Vector3(dtmp.X, dtmp.Y, dtmp.Z);
// the Amotor still lets avatar rotation to drift during colisions
@@ -797,22 +791,43 @@ namespace OpenSim.Region.Physics.OdePlugin
{
_zeroPosition = localpos;
}
- //PidStatus = true;
-
if (!localpos.IsFinite())
{
-
m_log.Warn("[PHYSICS]: Avatar Position is non-finite!");
defects.Add(this);
// _parent_scene.RemoveCharacter(this);
// destroy avatar capsule and related ODE data
AvatarGeomAndBodyDestroy();
-
return;
}
+ // check outbounds forcing to be in world
+ bool fixbody = false;
+ if (localpos.X < 0.0f)
+ {
+ fixbody = true;
+ localpos.X = 0.1f;
+ }
+ else if (localpos.X > _parent_scene.WorldExtents.X - 0.1f)
+ {
+ fixbody = true;
+ localpos.X = _parent_scene.WorldExtents.X - 0.1f;
+ }
+ if (localpos.Y < 0.0f)
+ {
+ fixbody = true;
+ localpos.Y = 0.1f;
+ }
+ else if (localpos.Y > _parent_scene.WorldExtents.Y - 0.1)
+ {
+ fixbody = true;
+ localpos.Y = _parent_scene.WorldExtents.Y - 0.1f;
+ }
+ if (fixbody)
+ d.BodySetPosition(Body, localpos.X, localpos.Y, localpos.Z);
+
Vector3 vec = Vector3.Zero;
dtmp = d.BodyGetLinearVel(Body);
Vector3 vel = new Vector3(dtmp.X, dtmp.Y, dtmp.Z);
@@ -820,16 +835,12 @@ namespace OpenSim.Region.Physics.OdePlugin
float movementdivisor = 1f;
//Ubit change divisions into multiplications below
if (!m_alwaysRun)
- {
movementdivisor = 1 / walkDivisor;
- }
else
- {
movementdivisor = 1 / runDivisor;
- }
+ //******************************************
// colide with land
-
d.AABB aabb;
d.GeomGetAABB(Shell, out aabb);
float chrminZ = aabb.MinZ;
@@ -856,26 +867,6 @@ namespace OpenSim.Region.Physics.OdePlugin
else
vec.Z = depth * PID_P * 30;
- /*
- Vector3 vtmp;
- vtmp.X = _target_velocity.X * timeStep;
- vtmp.Y = _target_velocity.Y * timeStep;
- // fake and avoid squares
- float k = (Math.Abs(vtmp.X) + Math.Abs(vtmp.Y));
- if (k > 0)
- {
- posch.X += vtmp.X;
- posch.Y += vtmp.Y;
- terrainheight -= _parent_scene.GetTerrainHeightAtXY(posch.X, posch.Y);
- k = 1 + Math.Abs(terrainheight) / k;
- movementdivisor /= k;
-
- if (k < 1)
- k = 1;
- }
- */
-
-
if (depth < 0.1f)
{
m_iscolliding = true;
@@ -901,6 +892,7 @@ namespace OpenSim.Region.Physics.OdePlugin
else
m_iscollidingGround = false;
+ //******************************************
// if velocity is zero, use position control; otherwise, velocity control
if (_target_velocity.X == 0.0f && _target_velocity.Y == 0.0f && _target_velocity.Z == 0.0f
@@ -1012,97 +1004,31 @@ namespace OpenSim.Region.Physics.OdePlugin
// _parent_scene.RemoveCharacter(this);
// destroy avatar capsule and related ODE data
AvatarGeomAndBodyDestroy();
+ return;
}
+
+ // update our local ideia of position velocity and aceleration
+ _position = localpos;
+ _acceleration = _velocity; // previus velocity
+ _velocity = vel;
+ _acceleration = (vel - _acceleration) / timeStep;
+
}
///
- /// Updates the reported position and velocity. This essentially sends the data up to ScenePresence.
+ /// Updates the reported position and velocity.
+ /// Used to copy variables from unmanaged space at heartbeat rate and also trigger scene updates acording
+ /// also outbounds checking
+ /// copy and outbounds now done in move(..) at ode rate
+ ///
///
public void UpdatePositionAndVelocity()
{
- // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit!
- if (Body == IntPtr.Zero)
- return;
+ return;
- d.Vector3 vec;
- try
- {
- d.BodyCopyPosition(Body, out vec);
- }
- catch (NullReferenceException)
- {
- bad = true;
- _parent_scene.BadCharacter(this);
- vec = new d.Vector3(_position.X, _position.Y, _position.Z);
- base.RaiseOutOfBounds(_position); // Tells ScenePresence that there's a problem!
- m_log.WarnFormat("[ODEPLUGIN]: Avatar Null reference for Avatar {0}, physical actor {1}", m_name, m_uuid);
- }
+// if (Body == IntPtr.Zero)
+// return;
- _position.X = vec.X;
- _position.Y = vec.Y;
- _position.Z = vec.Z;
-
- bool fixbody = false;
-
- if (_position.X < 0.0f)
- {
- fixbody = true;
- _position.X = 0.1f;
- }
- else if (_position.X > (int)_parent_scene.WorldExtents.X - 0.1f)
- {
- fixbody = true;
- _position.X = (int)_parent_scene.WorldExtents.X - 0.1f;
- }
-
- if (_position.Y < 0.0f)
- {
- fixbody = true;
- _position.Y = 0.1f;
- }
- else if (_position.Y > (int)_parent_scene.WorldExtents.Y - 0.1)
- {
- fixbody = true;
- _position.Y = (int)_parent_scene.WorldExtents.Y - 0.1f;
- }
-
- if (fixbody)
- d.BodySetPosition(Body, _position.X, _position.Y, _position.Z);
-
- // Did we move last? = zeroflag
- // This helps keep us from sliding all over
-/*
- if (_zeroFlag)
- {
- _velocity.X = 0.0f;
- _velocity.Y = 0.0f;
- _velocity.Z = 0.0f;
-
- // Did we send out the 'stopped' message?
- if (!m_lastUpdateSent)
- {
- m_lastUpdateSent = true;
- base.RequestPhysicsterseUpdate();
- }
- }
- else
- {
- m_lastUpdateSent = false;
- */
- try
- {
- vec = d.BodyGetLinearVel(Body);
- }
- catch (NullReferenceException)
- {
- vec.X = _velocity.X;
- vec.Y = _velocity.Y;
- vec.Z = _velocity.Z;
- }
- _velocity.X = (vec.X);
- _velocity.Y = (vec.Y);
- _velocity.Z = (vec.Z);
- // }
}
///
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index 837eae3ff9..9ca2d3f29b 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -1861,6 +1861,9 @@ namespace OpenSim.Region.Physics.OdePlugin
statstart = Util.EnvironmentTickCount();
+/*
+// now included in characters move() and done at ode rate
+// maybe be needed later if we need to do any extra work at hearbeat rate
lock (_characters)
{
foreach (OdeCharacter actor in _characters)
@@ -1874,7 +1877,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
}
-
+*/
lock (_badCharacter)
{
if (_badCharacter.Count > 0)