diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 74701a5b98..f41e89ef9c 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -768,6 +768,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
{
g.RootPart.AttachPoint = g.RootPart.Shape.State;
g.RootPart.AttachOffset = g.AbsolutePosition;
+ g.RootPart.Shape.State = 0;
}
objlist.Add(g);
@@ -800,6 +801,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml);
g.RootPart.AttachPoint = g.RootPart.Shape.State;
g.RootPart.AttachOffset = g.AbsolutePosition;
+ g.RootPart.Shape.State = 0;
objlist.Add(g);
XmlElement el = (XmlElement)n;
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 0a1b921d30..f6f6a1af28 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1519,8 +1519,18 @@ namespace OpenSim.Region.Framework.Scenes
if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId))
{
// VolumeDetect can't be set via UI and will always be off when a change is made there
- if (PhysData.PhysShapeType == PhysShapeType.invalid)
- group.UpdatePrimFlags(localID, UsePhysics, SetTemporary, SetPhantom, false);
+ // now only change volume dtc if phantom off
+
+ if (PhysData.PhysShapeType == PhysShapeType.invalid) // check for extraPhysics data
+ {
+ bool vdtc;
+ if (SetPhantom) // if phantom keep volumedtc
+ vdtc = group.RootPart.VolumeDetectActive;
+ else // else turn it off
+ vdtc = false;
+
+ group.UpdatePrimFlags(localID, UsePhysics, SetTemporary, SetPhantom, vdtc);
+ }
else
{
SceneObjectPart part = GetSceneObjectPart(localID);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 7bd6c11d27..cb0a57a7d8 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1941,6 +1941,12 @@ namespace OpenSim.Region.Framework.Scenes
// "[SCENE]: Storing {0}, {1} in {2}",
// Name, UUID, m_scene.RegionInfo.RegionName);
+ if (RootPart.Shape.PCode == 9 && RootPart.Shape.State != 0)
+ {
+ RootPart.Shape.State = 0;
+ ScheduleGroupForFullUpdate();
+ }
+
SceneObjectGroup backup_group = Copy(false);
backup_group.RootPart.Velocity = RootPart.Velocity;
backup_group.RootPart.Acceleration = RootPart.Acceleration;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 511ab19310..c73fc986bd 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1830,7 +1830,7 @@ namespace OpenSim.Region.Framework.Scenes
public void ApplyPhysics(uint _ObjectFlags, bool _VolumeDetectActive, bool building)
{
- VolumeDetectActive = _VolumeDetectActive; //?? as is used this is redundante
+ VolumeDetectActive = _VolumeDetectActive;
if (!ParentGroup.Scene.CollidablePrims)
return;
@@ -1839,7 +1839,10 @@ namespace OpenSim.Region.Framework.Scenes
return;
bool isPhysical = (_ObjectFlags & (uint) PrimFlags.Physics) != 0;
- bool isPhantom = (_ObjectFlags & (uint) PrimFlags.Phantom) != 0;
+ bool isPhantom = (_ObjectFlags & (uint)PrimFlags.Phantom) != 0;
+
+ if (_VolumeDetectActive)
+ isPhantom = true;
if (IsJoint())
{
@@ -2065,6 +2068,7 @@ namespace OpenSim.Region.Framework.Scenes
///
/// Do a physics propery update for this part.
+ /// now also updates phantom and volume detector
///
///
///
@@ -2096,7 +2100,7 @@ namespace OpenSim.Region.Framework.Scenes
if (ParentGroup.RootPart == this)
AngularVelocity = new Vector3(0, 0, 0);
- if (pa.Phantom)
+ if (pa.Phantom && !VolumeDetectActive)
{
RemoveFromPhysics();
return;
@@ -2143,6 +2147,14 @@ namespace OpenSim.Region.Framework.Scenes
if (pa.Phantom != phan)
pa.Phantom = phan;
+// some engines dont' have this check still
+// if (VolumeDetectActive != pa.IsVolumeDtc)
+ {
+ if (VolumeDetectActive)
+ pa.SetVolumeDetect(1);
+ else
+ pa.SetVolumeDetect(0);
+ }
// If this part is a sculpt then delay the physics update until we've asynchronously loaded the
// mesh data.
@@ -4599,6 +4611,12 @@ namespace OpenSim.Region.Framework.Scenes
if ((UsePhysics == wasUsingPhysics) && (wasTemporary == SetTemporary) && (wasPhantom == SetPhantom) && (SetVD == wasVD))
return;
+ VolumeDetectActive = SetVD;
+
+ // volume detector implies phantom
+ if (VolumeDetectActive)
+ SetPhantom = true;
+
if (UsePhysics)
AddFlag(PrimFlags.Physics);
else
@@ -4614,7 +4632,6 @@ namespace OpenSim.Region.Framework.Scenes
else
RemFlag(PrimFlags.TemporaryOnRez);
- VolumeDetectActive = SetVD;
if (ParentGroup.Scene == null)
return;
@@ -4624,7 +4641,7 @@ namespace OpenSim.Region.Framework.Scenes
if (pa != null && building && pa.Building != building)
pa.Building = building;
- if ((SetPhantom && !UsePhysics) || ParentGroup.IsAttachment || PhysicsShapeType == (byte)PhysShapeType.none
+ if ((SetPhantom && !UsePhysics && !SetVD) || ParentGroup.IsAttachment || PhysicsShapeType == (byte)PhysShapeType.none
|| (Shape.PathCurve == (byte)Extrusion.Flexible))
{
if (pa != null)
@@ -4669,12 +4686,12 @@ namespace OpenSim.Region.Framework.Scenes
else // it already has a physical representation
{
DoPhysicsPropertyUpdate(UsePhysics, false); // Update physical status.
-
- if(VolumeDetectActive)
- pa.SetVolumeDetect(1);
- else
- pa.SetVolumeDetect(0);
-
+ /* moved into DoPhysicsPropertyUpdate
+ if(VolumeDetectActive)
+ pa.SetVolumeDetect(1);
+ else
+ pa.SetVolumeDetect(0);
+ */
if (pa.Building != building)
pa.Building = building;
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 292dbdce3c..ac791ae6e2 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1075,6 +1075,11 @@ namespace OpenSim.Region.Framework.Scenes
}
public void TeleportWithMomentum(Vector3 pos)
+ {
+ TeleportWithMomentum(pos, null);
+ }
+
+ public void TeleportWithMomentum(Vector3 pos, Vector3? v)
{
bool isFlying = Flying;
Vector3 vel = Velocity;
@@ -1083,7 +1088,12 @@ namespace OpenSim.Region.Framework.Scenes
AbsolutePosition = pos;
AddToPhysicalScene(isFlying);
if (PhysicsActor != null)
- PhysicsActor.SetMomentum(vel);
+ {
+ if (v.HasValue)
+ PhysicsActor.SetMomentum((Vector3)v);
+ else
+ PhysicsActor.SetMomentum(vel);
+ }
SendTerseUpdateToAllClients();
}
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index 68f21c8bc7..ebf5e8463d 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -323,9 +323,15 @@ namespace OpenSim.Region.OptionalModules.World.NPC
{
NPCAvatar av;
if (m_avatars.TryGetValue(npcID, out av))
+ {
+ if (npcID == callerID)
+ return true;
return CheckPermissions(av, callerID);
+ }
else
+ {
return false;
+ }
}
}
@@ -337,7 +343,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
/// true if they do, false if they don't.
private bool CheckPermissions(NPCAvatar av, UUID callerID)
{
- return callerID == UUID.Zero || av.OwnerID == UUID.Zero || av.OwnerID == callerID;
+ return callerID == UUID.Zero || av.OwnerID == UUID.Zero || av.OwnerID == callerID || av.AgentId == callerID;
}
}
}
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
index 9c1b87bea8..ec4be58361 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
@@ -683,7 +683,7 @@ namespace OpenSim.Region.Physics.OdePlugin
PID_D *= m_mass / _parent_scene.ODE_STEPSIZE;
PID_P /= 50 * 80;
PID_P *= m_mass / _parent_scene.ODE_STEPSIZE;
-
+
Body = d.BodyCreate(_parent_scene.world);
d.BodySetAutoDisableFlag(Body, false);
@@ -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;
@@ -851,32 +862,12 @@ namespace OpenSim.Region.Physics.OdePlugin
float depth = terrainheight - chrminZ;
if (!flying)
{
- vec.Z = -vel.Z * PID_D * 1.5f + depth * PID_P * 50;
+ vec.Z = -vel.Z * PID_D * 1.5f + depth * PID_P * 60;
}
else
- vec.Z = depth * PID_P * 50;
+ vec.Z = depth * PID_P * 60;
- /*
- 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)
+ if (depth < 0.2f)
{
m_iscolliding = true;
m_colliderfilter = 2;
@@ -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);
- // }
}
///
@@ -1245,7 +1171,7 @@ namespace OpenSim.Region.Physics.OdePlugin
CAPSULE_LENGTH = caplen;
AvatarGeomAndBodyCreation(_position.X, _position.Y,
- _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2));
+ _position.Z + (CAPSULE_LENGTH - prevCapsule) * 0.5f);
Velocity = Vector3.Zero;
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
index 32c4722bab..5467b9f85e 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
@@ -3228,17 +3228,13 @@ namespace OpenSim.Region.Physics.OdePlugin
{
if (!childPrim && m_isphysical && Body != IntPtr.Zero &&
!m_disabled && !m_isSelected && !m_building && !m_outbounds)
- // !m_disabled && !m_isSelected && !m_building && !m_outbounds)
{
- // if (!d.BodyIsEnabled(Body)) d.BodyEnable(Body); // KF add 161009
-
if (d.BodyIsEnabled(Body))
{
float timestep = _parent_scene.ODE_STEPSIZE;
// check outside region
- d.Vector3 lpos;
- d.GeomCopyPosition(prim_geom, out lpos); // root position that is seem by rest of simulator
+ d.Vector3 lpos = d.GeomGetPosition(prim_geom); // root position that is seem by rest of simulator
if (lpos.Z < -100 || lpos.Z > 100000f)
{
@@ -3321,12 +3317,9 @@ namespace OpenSim.Region.Physics.OdePlugin
{
// 'VEHICLES' are dealt with in ODEDynamics.cs
m_vehicle.Step();
- return;
}
-
else
{
-
float fx = 0;
float fy = 0;
float fz = 0;
@@ -3512,10 +3505,39 @@ namespace OpenSim.Region.Physics.OdePlugin
{
d.BodyAddTorque(Body, trq.X, trq.Y, trq.Z);
}
-
}
+
+ // update our ideia of velocities and acelerations
+ d.Quaternion ori;
+ d.Vector3 dtmpu;
+
+ _position.X = lpos.X;
+ _position.Y = lpos.Y;
+ _position.Z = lpos.Z;
+
+ d.GeomCopyQuaternion(prim_geom, out ori);
+ _orientation.X = ori.X;
+ _orientation.Y = ori.Y;
+ _orientation.Z = ori.Z;
+ _orientation.W = ori.W;
+
+ _acceleration = _velocity;
+
+ dtmpu = d.BodyGetLinearVel(Body);
+ _velocity.X = dtmpu.X;
+ _velocity.Y = dtmpu.Y;
+ _velocity.Z = dtmpu.Z;
+
+ float invts = 1 / timestep;
+ _acceleration = (_velocity - _acceleration) * invts;
+
+ dtmpu = d.BodyGetAngularVel(Body);
+ m_rotationalVelocity.X = dtmpu.X;
+ m_rotationalVelocity.Y = dtmpu.Y;
+ m_rotationalVelocity.Z = dtmpu.Z;
}
- else // body disabled
+
+ else // body disabled/sleeping
{
// let vehicles sleep
if (m_vehicle != null && m_vehicle.Type != Vehicle.TYPE_NONE)
@@ -3546,36 +3568,23 @@ namespace OpenSim.Region.Physics.OdePlugin
{
if (Body != IntPtr.Zero)
{
- Vector3 pv = Vector3.Zero;
bool lastZeroFlag = _zeroFlag;
- d.Vector3 lpos;
- d.GeomCopyPosition(prim_geom, out lpos); // root position that is seem by rest of simulator
-
-
- d.Quaternion ori;
- d.GeomCopyQuaternion(prim_geom, out ori);
- d.Vector3 vel = d.BodyGetLinearVel(Body);
- d.Vector3 rotvel = d.BodyGetAngularVel(Body);
-
- if ((Math.Abs(m_lastposition.X - lpos.X) < 0.01)
- && (Math.Abs(m_lastposition.Y - lpos.Y) < 0.01)
- && (Math.Abs(m_lastposition.Z - lpos.Z) < 0.01)
- && (Math.Abs(m_lastorientation.X - ori.X) < 0.0001)
- && (Math.Abs(m_lastorientation.Y - ori.Y) < 0.0001)
- && (Math.Abs(m_lastorientation.Z - ori.Z) < 0.0001)
+ if ((Math.Abs(m_lastposition.X - _position.X) < 0.01)
+ && (Math.Abs(m_lastposition.Y - _position.Y) < 0.01)
+ && (Math.Abs(m_lastposition.Z - _position.Z) < 0.01)
+ && (Math.Abs(m_lastorientation.X - _orientation.X) < 0.0001)
+ && (Math.Abs(m_lastorientation.Y - _orientation.Y) < 0.0001)
+ && (Math.Abs(m_lastorientation.Z - _orientation.Z) < 0.0001)
)
{
_zeroFlag = true;
- //Console.WriteLine("ZFT 2");
m_throttleUpdates = false;
}
else
{
- //m_log.Debug(Math.Abs(m_lastposition.X - l_position.X).ToString());
_zeroFlag = false;
m_lastUpdateSent = false;
- //m_throttleUpdates = false;
}
if (_zeroFlag)
@@ -3583,22 +3592,14 @@ namespace OpenSim.Region.Physics.OdePlugin
m_lastposition = _position;
m_lastorientation = _orientation;
- _velocity.X = 0.0f;
- _velocity.Y = 0.0f;
- _velocity.Z = 0.0f;
+ _velocity = Vector3.Zero;
+ _acceleration = Vector3.Zero;
+ m_rotationalVelocity = Vector3.Zero;
- _acceleration.X = 0;
- _acceleration.Y = 0;
- _acceleration.Z = 0;
-
- m_rotationalVelocity.X = 0;
- m_rotationalVelocity.Y = 0;
- m_rotationalVelocity.Z = 0;
if (!m_lastUpdateSent)
{
m_throttleUpdates = false;
throttleCounter = 0;
- m_rotationalVelocity = pv;
base.RequestPhysicsterseUpdate();
@@ -3612,39 +3613,12 @@ namespace OpenSim.Region.Physics.OdePlugin
base.RequestPhysicsterseUpdate();
}
- m_lastVelocity = _velocity;
-
- _position.X = lpos.X;
- _position.Y = lpos.Y;
- _position.Z = lpos.Z;
-
- _velocity.X = vel.X;
- _velocity.Y = vel.Y;
- _velocity.Z = vel.Z;
-
- _orientation.X = ori.X;
- _orientation.Y = ori.Y;
- _orientation.Z = ori.Z;
- _orientation.W = ori.W;
-
- _acceleration = ((_velocity - m_lastVelocity) / simulatedtime);
-
- if (m_rotationalVelocity.ApproxEquals(pv, 0.0001f))
- {
- m_rotationalVelocity = pv;
- }
- else
- {
- m_rotationalVelocity.X = rotvel.X;
- m_rotationalVelocity.Y = rotvel.Y;
- m_rotationalVelocity.Z = rotvel.Z;
- }
-
m_lastUpdateSent = false;
if (!m_throttleUpdates || throttleCounter > _parent_scene.geomUpdatesPerThrottledUpdate)
{
m_lastposition = _position;
m_lastorientation = _orientation;
+ m_lastVelocity = _velocity;
base.RequestPhysicsterseUpdate();
}
else
@@ -3656,17 +3630,11 @@ namespace OpenSim.Region.Physics.OdePlugin
else if (!m_lastUpdateSent || !_zeroFlag)
{
// Not a body.. so Make sure the client isn't interpolating
- _velocity.X = 0;
- _velocity.Y = 0;
- _velocity.Z = 0;
+ _velocity = Vector3.Zero;
+ _acceleration = Vector3.Zero;
+ m_rotationalVelocity = Vector3.Zero;
+ m_lastVelocity = Vector3.Zero;
- _acceleration.X = 0;
- _acceleration.Y = 0;
- _acceleration.Z = 0;
-
- m_rotationalVelocity.X = 0;
- m_rotationalVelocity.Y = 0;
- m_rotationalVelocity.Z = 0;
_zeroFlag = true;
if (!m_lastUpdateSent)
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index 7632e25530..9ca2d3f29b 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -455,15 +455,15 @@ namespace OpenSim.Region.Physics.OdePlugin
geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", geomDefaultDensity);
bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", bodyFramesAutoDisable);
-
+/*
bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", bodyPIDD);
bodyPIDG = physicsconfig.GetFloat("body_pid_gain", bodyPIDG);
-
+*/
forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing);
meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", meshSculptedPrim);
meshSculptLOD = physicsconfig.GetFloat("mesh_lod", meshSculptLOD);
MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", MeshSculptphysicalLOD);
-
+/*
if (Environment.OSVersion.Platform == PlatformID.Unix)
{
avPIDD = physicsconfig.GetFloat("av_pid_derivative_linux", avPIDD);
@@ -471,10 +471,11 @@ namespace OpenSim.Region.Physics.OdePlugin
}
else
{
+
avPIDD = physicsconfig.GetFloat("av_pid_derivative_win", avPIDD);
avPIDP = physicsconfig.GetFloat("av_pid_proportional_win", avPIDP);
}
-
+*/
physics_logging = physicsconfig.GetBoolean("physics_logging", false);
physics_logging_interval = physicsconfig.GetInt("physics_logging_interval", 0);
physics_logging_append_existing_logfile = physicsconfig.GetBoolean("physics_logging_append_existing_logfile", false);
@@ -1860,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)
@@ -1873,7 +1877,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
}
-
+*/
lock (_badCharacter)
{
if (_badCharacter.Count > 0)