From 7b46506822be1dd1559661453ebc580336487683 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 28 Oct 2011 23:15:51 +0100
Subject: fetch SOP.RotationOffset once in UpdateRotation() and compare rather
than fetch four separate times.
No functional change.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 25 +++++++++++++++++-----
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
2 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index c8ecc9b..2ff3fb7 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -797,7 +797,14 @@ namespace OpenSim.Region.Framework.Scenes
m_rotationOffset = actor.Orientation;
}
}
-
+
+// float roll, pitch, yaw = 0;
+// m_rotationOffset.GetEulerAngles(out roll, out pitch, out yaw);
+//
+// m_log.DebugFormat(
+// "[SCENE OBJECT PART]: Got euler {0} for RotationOffset on {1} {2}",
+// new Vector3(roll, pitch, yaw), Name, LocalId);
+
return m_rotationOffset;
}
@@ -834,6 +841,13 @@ namespace OpenSim.Region.Framework.Scenes
m_log.Error("[SCENEOBJECTPART]: ROTATIONOFFSET" + ex.Message);
}
}
+
+// float roll, pitch, yaw = 0;
+// m_rotationOffset.GetEulerAngles(out roll, out pitch, out yaw);
+//
+// m_log.DebugFormat(
+// "[SCENE OBJECT PART]: Set euler {0} for RotationOffset on {1} {2}",
+// new Vector3(roll, pitch, yaw), Name, LocalId);
}
}
@@ -4495,12 +4509,13 @@ namespace OpenSim.Region.Framework.Scenes
PhysActor = null;
}
+ ///
+ /// This updates the part's rotation and sends out an update to clients if necessary.
+ ///
+ ///
public void UpdateRotation(Quaternion rot)
{
- if ((rot.X != RotationOffset.X) ||
- (rot.Y != RotationOffset.Y) ||
- (rot.Z != RotationOffset.Z) ||
- (rot.W != RotationOffset.W))
+ if (rot != RotationOffset)
{
RotationOffset = rot;
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index ee6c708..38cdd77 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1769,7 +1769,7 @@ namespace OpenSim.Region.Framework.Scenes
Rotation = Quaternion.CreateFromEulers(angle);
// m_log.DebugFormat("[SCENE PRESENCE]: Body rot for {0} set to {1}", Name, Rotation);
-
+
Vector3 agent_control_v3 = new Vector3();
HandleMoveToTargetUpdate(ref agent_control_v3);
AddNewMovement(agent_control_v3);
--
cgit v1.1
From 9bf8c3e7b73da735a6e8aa865e5d19f16453981c Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 28 Oct 2011 23:38:57 +0100
Subject: Add missing doc to rotation/position methods in SOG
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 2d6d4ec..f6d3293 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2808,7 +2808,7 @@ namespace OpenSim.Region.Framework.Scenes
#region Rotation
///
- ///
+ /// Update the rotation of the group.
///
///
public void UpdateGroupRotationR(Quaternion rot)
@@ -2836,7 +2836,7 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- ///
+ /// Update the position and rotation of a group simultaneously.
///
///
///
@@ -2870,7 +2870,7 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- ///
+ /// Update the rotation of a single prim within the group.
///
///
///
@@ -2899,7 +2899,7 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- ///
+ /// Update the position and rotation simultaneously of a single prim within the group.
///
///
///
@@ -2931,7 +2931,7 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- ///
+ /// Update the entire rotation of the group.
///
///
public void UpdateRootRotation(Quaternion rot)
--
cgit v1.1
From c2da1c4580302a3f1a30b7ad2e70f590aff76167 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 28 Oct 2011 23:43:31 +0100
Subject: set grp.RootPart.GroupPosition for code consistency (and readability)
rather than calling SOP.OffsetForNewRegion
---
.../CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | 4 ++--
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 5 -----
2 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index f4d2fda..7324b26 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -1686,7 +1686,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
// Offset the positions for the new region across the border
Vector3 oldGroupPosition = grp.RootPart.GroupPosition;
- grp.OffsetForNewRegion(pos);
+ grp.RootPart.GroupPosition = pos;
// If we fail to cross the border, then reset the position of the scene object on that border.
uint x = 0, y = 0;
@@ -1694,7 +1694,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent))
{
- grp.OffsetForNewRegion(oldGroupPosition);
+ grp.RootPart.GroupPosition = oldGroupPosition;
grp.ScheduleGroupForFullUpdate();
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index f6d3293..64810d2 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2798,11 +2798,6 @@ namespace OpenSim.Region.Framework.Scenes
ScheduleGroupForTerseUpdate();
}
- public void OffsetForNewRegion(Vector3 offset)
- {
- m_rootPart.GroupPosition = offset;
- }
-
#endregion
#region Rotation
--
cgit v1.1
From 61e97ee4c85d79098731eb7ddc074af388c61380 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 29 Oct 2011 00:39:01 +0100
Subject: Remove completely unused SOG.Rotation parameter
We always use SOP.Rotation instead
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 8 --------
.../Framework/Scenes/Tests/SceneObjectLinkingTests.cs | 18 +++++++++---------
.../ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 2 +-
3 files changed, 10 insertions(+), 18 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 64810d2..2ea9854 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -281,14 +281,6 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_parts.Count; }
}
- protected Quaternion m_rotation = Quaternion.Identity;
-
- public virtual Quaternion Rotation
- {
- get { return m_rotation; }
- set { m_rotation = value; }
- }
-
public Quaternion GroupRotation
{
get { return m_rootPart.RotationOffset; }
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs
index 2912a46..90cdd7b 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs
@@ -62,9 +62,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests
grp1.AbsolutePosition = new Vector3(10, 10, 10);
grp2.AbsolutePosition = Vector3.Zero;
-
+
// <90,0,0>
- grp1.Rotation = (Quaternion.CreateFromEulers(90 * Utils.DEG_TO_RAD, 0, 0));
+// grp1.UpdateGroupRotationR(Quaternion.CreateFromEulers(90 * Utils.DEG_TO_RAD, 0, 0));
// <180,0,0>
grp2.UpdateGroupRotationR(Quaternion.CreateFromEulers(180 * Utils.DEG_TO_RAD, 0, 0));
@@ -85,7 +85,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
if (debugtest)
{
m_log.Debug("parts: " + grp1.Parts.Length);
- m_log.Debug("Group1: Pos:"+grp1.AbsolutePosition+", Rot:"+grp1.Rotation);
+ m_log.Debug("Group1: Pos:"+grp1.AbsolutePosition+", Rot:"+grp1.GroupRotation);
m_log.Debug("Group1: Prim1: OffsetPosition:"+ part1.OffsetPosition+", OffsetRotation:"+part1.RotationOffset);
m_log.Debug("Group1: Prim2: OffsetPosition:"+part2.OffsetPosition+", OffsetRotation:"+part2.RotationOffset);
}
@@ -152,13 +152,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests
grp4.AbsolutePosition = new Vector3(40, 40, 40);
// <90,0,0>
- grp1.Rotation = (Quaternion.CreateFromEulers(90 * Utils.DEG_TO_RAD, 0, 0));
+// grp1.UpdateGroupRotationR(Quaternion.CreateFromEulers(90 * Utils.DEG_TO_RAD, 0, 0));
// <180,0,0>
grp2.UpdateGroupRotationR(Quaternion.CreateFromEulers(180 * Utils.DEG_TO_RAD, 0, 0));
// <270,0,0>
- grp3.Rotation = (Quaternion.CreateFromEulers(270 * Utils.DEG_TO_RAD, 0, 0));
+// grp3.UpdateGroupRotationR(Quaternion.CreateFromEulers(270 * Utils.DEG_TO_RAD, 0, 0));
// <0,90,0>
grp4.UpdateGroupRotationR(Quaternion.CreateFromEulers(0, 90 * Utils.DEG_TO_RAD, 0));
@@ -187,12 +187,12 @@ namespace OpenSim.Region.Framework.Scenes.Tests
{
m_log.Debug("--------After Link-------");
m_log.Debug("Group1: parts:" + grp1.Parts.Length);
- m_log.Debug("Group1: Pos:"+grp1.AbsolutePosition+", Rot:"+grp1.Rotation);
+ m_log.Debug("Group1: Pos:"+grp1.AbsolutePosition+", Rot:"+grp1.GroupRotation);
m_log.Debug("Group1: Prim1: OffsetPosition:" + part1.OffsetPosition + ", OffsetRotation:" + part1.RotationOffset);
m_log.Debug("Group1: Prim2: OffsetPosition:"+part2.OffsetPosition+", OffsetRotation:"+ part2.RotationOffset);
m_log.Debug("Group3: parts:" + grp3.Parts.Length);
- m_log.Debug("Group3: Pos:"+grp3.AbsolutePosition+", Rot:"+grp3.Rotation);
+ m_log.Debug("Group3: Pos:"+grp3.AbsolutePosition+", Rot:"+grp3.GroupRotation);
m_log.Debug("Group3: Prim1: OffsetPosition:"+part3.OffsetPosition+", OffsetRotation:"+part3.RotationOffset);
m_log.Debug("Group3: Prim2: OffsetPosition:"+part4.OffsetPosition+", OffsetRotation:"+part4.RotationOffset);
}
@@ -240,12 +240,12 @@ namespace OpenSim.Region.Framework.Scenes.Tests
{
m_log.Debug("--------After De-Link-------");
m_log.Debug("Group1: parts:" + grp1.Parts.Length);
- m_log.Debug("Group1: Pos:" + grp1.AbsolutePosition + ", Rot:" + grp1.Rotation);
+ m_log.Debug("Group1: Pos:" + grp1.AbsolutePosition + ", Rot:" + grp1.GroupRotation);
m_log.Debug("Group1: Prim1: OffsetPosition:" + part1.OffsetPosition + ", OffsetRotation:" + part1.RotationOffset);
m_log.Debug("Group1: Prim2: OffsetPosition:" + part2.OffsetPosition + ", OffsetRotation:" + part2.RotationOffset);
m_log.Debug("Group3: parts:" + grp3.Parts.Length);
- m_log.Debug("Group3: Pos:" + grp3.AbsolutePosition + ", Rot:" + grp3.Rotation);
+ m_log.Debug("Group3: Pos:" + grp3.AbsolutePosition + ", Rot:" + grp3.GroupRotation);
m_log.Debug("Group3: Prim1: OffsetPosition:" + part3.OffsetPosition + ", OffsetRotation:" + part3.RotationOffset);
m_log.Debug("Group3: Prim2: OffsetPosition:" + part4.OffsetPosition + ", OffsetRotation:" + part4.RotationOffset);
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 654f168..f3206ac 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -541,7 +541,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (World.Entities.TryGetValue(target, out entity))
{
if (entity is SceneObjectGroup)
- ((SceneObjectGroup)entity).Rotation = rotation;
+ ((SceneObjectGroup)entity).UpdateGroupRotationR(rotation);
else if (entity is ScenePresence)
((ScenePresence)entity).Rotation = rotation;
}
--
cgit v1.1
From 5ae8de3c00cdf5d200b3158116a1e1fd9a404229 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 29 Oct 2011 01:39:48 +0100
Subject: Stop setting _position as well as m_taint_position in
ODECharacter.Position
setting position at the same time as taint appears to undermine the whole purpose of taint
testing doesn't reveal any obvious regressions in doing this
---
OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 4 ++--
OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 5 +----
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 9f24ee7..a7f83f9 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -4857,8 +4857,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
data.CollisionPlane.ToBytes(objectData, 0);
data.OffsetPosition.ToBytes(objectData, 16);
- //data.Velocity.ToBytes(objectData, 28);
- //data.Acceleration.ToBytes(objectData, 40);
+// data.Velocity.ToBytes(objectData, 28);
+// data.Acceleration.ToBytes(objectData, 40);
data.Rotation.ToBytes(objectData, 52);
//data.AngularVelocity.ToBytes(objectData, 64);
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index c22d27f..5ad7616 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -431,13 +431,10 @@ namespace OpenSim.Region.Physics.OdePlugin
value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5;
}
- _position.X = value.X;
- _position.Y = value.Y;
- _position.Z = value.Z;
-
m_taintPosition.X = value.X;
m_taintPosition.Y = value.Y;
m_taintPosition.Z = value.Z;
+
_parent_scene.AddPhysicsActorTaint(this);
}
else
--
cgit v1.1
From a5ea9f883092ca7b54aeb1c6e3abb8a5ebed1dc7 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 29 Oct 2011 01:46:22 +0100
Subject: Move position set from taint to logically better position at top of
ODECharacter.ProcessTaints() though this makes no practical difference
---
OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index 5ad7616..ca8fef9 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -1250,6 +1250,18 @@ namespace OpenSim.Region.Physics.OdePlugin
internal void ProcessTaints()
{
+ if (m_taintPosition != _position)
+ {
+ if (Body != IntPtr.Zero)
+ {
+ d.BodySetPosition(Body, m_taintPosition.X, m_taintPosition.Y, m_taintPosition.Z);
+
+ _position.X = m_taintPosition.X;
+ _position.Y = m_taintPosition.Y;
+ _position.Z = m_taintPosition.Z;
+ }
+ }
+
if (m_tainted_isPhysical != m_isPhysical)
{
if (m_tainted_isPhysical)
@@ -1309,18 +1321,6 @@ namespace OpenSim.Region.Physics.OdePlugin
+ (Amotor==IntPtr.Zero ? "Amotor ":""));
}
}
-
- if (!m_taintPosition.ApproxEquals(_position, 0.05f))
- {
- if (Body != IntPtr.Zero)
- {
- d.BodySetPosition(Body, m_taintPosition.X, m_taintPosition.Y, m_taintPosition.Z);
-
- _position.X = m_taintPosition.X;
- _position.Y = m_taintPosition.Y;
- _position.Z = m_taintPosition.Z;
- }
- }
}
internal void AddCollisionFrameTime(int p)
--
cgit v1.1
From ef8370fb8e527ca20c13d18aad1cbf7f8a44c70a Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 29 Oct 2011 02:07:28 +0100
Subject: tidy up OdeCharacter so that we just use OpenMetaverse.Vector3
assignment directly where possible, instead of transferring X, Y and Z
components separately
some of this is probably a hold over from using ODE.Vector3, which is still necessary in some places.
---
OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 90 ++++++++++--------------
1 file changed, 39 insertions(+), 51 deletions(-)
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index ca8fef9..09581c3 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -161,17 +161,19 @@ namespace OpenSim.Region.Physics.OdePlugin
{
pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5;
}
+
_position = pos;
- m_taintPosition.X = pos.X;
- m_taintPosition.Y = pos.Y;
- m_taintPosition.Z = pos.Z;
+ m_taintPosition = pos;
}
else
{
- _position = new Vector3(((float)_parent_scene.WorldExtents.X * 0.5f), ((float)_parent_scene.WorldExtents.Y * 0.5f), parent_scene.GetTerrainHeightAtXY(128f, 128f) + 10f);
- m_taintPosition.X = _position.X;
- m_taintPosition.Y = _position.Y;
- m_taintPosition.Z = _position.Z;
+ _position
+ = new Vector3(
+ (float)_parent_scene.WorldExtents.X * 0.5f,
+ (float)_parent_scene.WorldExtents.Y * 0.5f,
+ parent_scene.GetTerrainHeightAtXY(128f, 128f) + 10f);
+ m_taintPosition = _position;
+
m_log.Warn("[PHYSICS]: Got NaN Position on Character Create");
}
@@ -431,10 +433,7 @@ namespace OpenSim.Region.Physics.OdePlugin
value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5;
}
- m_taintPosition.X = value.X;
- m_taintPosition.Y = value.Y;
- m_taintPosition.Z = value.Z;
-
+ m_taintPosition = value;
_parent_scene.AddPhysicsActorTaint(this);
}
else
@@ -582,15 +581,12 @@ namespace OpenSim.Region.Physics.OdePlugin
d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH);
Body = d.BodyCreate(_parent_scene.world);
d.BodySetPosition(Body, npositionX, npositionY, npositionZ);
-
+
_position.X = npositionX;
_position.Y = npositionY;
_position.Z = npositionZ;
-
- m_taintPosition.X = npositionX;
- m_taintPosition.Y = npositionY;
- m_taintPosition.Z = npositionZ;
+ m_taintPosition = _position;
d.BodySetMass(Body, ref ShellMass);
d.Matrix3 m_caprot;
@@ -845,9 +841,7 @@ namespace OpenSim.Region.Physics.OdePlugin
else
{
m_pidControllerActive = true;
- _target_velocity.X += force.X;
- _target_velocity.Y += force.Y;
- _target_velocity.Z += force.Z;
+ _target_velocity += force;
}
}
else
@@ -868,8 +862,6 @@ namespace OpenSim.Region.Physics.OdePlugin
public void doForce(Vector3 force)
{
d.BodyAddForce(Body, force.X, force.Y, force.Z);
- //d.BodySetRotation(Body, ref m_StandUpRotation);
- //standupStraight();
}
public override void SetMomentum(Vector3 momentum)
@@ -1059,69 +1051,66 @@ namespace OpenSim.Region.Physics.OdePlugin
internal void UpdatePositionAndVelocity()
{
// no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit!
- d.Vector3 vec;
+ d.Vector3 newPos;
try
{
- vec = d.BodyGetPosition(Body);
+ newPos = d.BodyGetPosition(Body);
}
catch (NullReferenceException)
{
bad = true;
_parent_scene.BadCharacter(this);
- vec = new d.Vector3(_position.X, _position.Y, _position.Z);
+ newPos = 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);
}
// kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!)
- if (vec.X < 0.0f) vec.X = 0.0f;
- if (vec.Y < 0.0f) vec.Y = 0.0f;
- if (vec.X > (int)_parent_scene.WorldExtents.X - 0.05f) vec.X = (int)_parent_scene.WorldExtents.X - 0.05f;
- if (vec.Y > (int)_parent_scene.WorldExtents.Y - 0.05f) vec.Y = (int)_parent_scene.WorldExtents.Y - 0.05f;
+ if (newPos.X < 0.0f) newPos.X = 0.0f;
+ if (newPos.Y < 0.0f) newPos.Y = 0.0f;
+ if (newPos.X > (int)_parent_scene.WorldExtents.X - 0.05f) newPos.X = (int)_parent_scene.WorldExtents.X - 0.05f;
+ if (newPos.Y > (int)_parent_scene.WorldExtents.Y - 0.05f) newPos.Y = (int)_parent_scene.WorldExtents.Y - 0.05f;
- _position.X = vec.X;
- _position.Y = vec.Y;
- _position.Z = vec.Z;
+ _position.X = newPos.X;
+ _position.Y = newPos.Y;
+ _position.Z = newPos.Z;
// I think we need to update the taintPosition too -- Diva 12/24/10
- m_taintPosition.X = vec.X;
- m_taintPosition.Y = vec.Y;
- m_taintPosition.Z = vec.Z;
+ m_taintPosition = _position;
// 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;
+ _velocity = Vector3.Zero;
// Did we send out the 'stopped' message?
if (!m_lastUpdateSent)
{
m_lastUpdateSent = true;
//base.RequestPhysicsterseUpdate();
-
}
}
else
{
m_lastUpdateSent = false;
+ d.Vector3 newVelocity;
+
try
{
- vec = d.BodyGetLinearVel(Body);
+ newVelocity = d.BodyGetLinearVel(Body);
}
catch (NullReferenceException)
{
- vec.X = _velocity.X;
- vec.Y = _velocity.Y;
- vec.Z = _velocity.Z;
+ newVelocity.X = _velocity.X;
+ newVelocity.Y = _velocity.Y;
+ newVelocity.Z = _velocity.Z;
}
- _velocity.X = (vec.X);
- _velocity.Y = (vec.Y);
- _velocity.Z = (vec.Z);
+ _velocity.X = newVelocity.X;
+ _velocity.Y = newVelocity.Y;
+ _velocity.Z = newVelocity.Z;
if (_velocity.Z < -6 && !m_hackSentFall)
{
@@ -1255,10 +1244,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (Body != IntPtr.Zero)
{
d.BodySetPosition(Body, m_taintPosition.X, m_taintPosition.Y, m_taintPosition.Z);
-
- _position.X = m_taintPosition.X;
- _position.Y = m_taintPosition.Y;
- _position.Z = m_taintPosition.Z;
+ _position = m_taintPosition;
}
}
@@ -1303,8 +1289,10 @@ namespace OpenSim.Region.Physics.OdePlugin
//m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
d.BodyDestroy(Body);
d.GeomDestroy(Shell);
- AvatarGeomAndBodyCreation(_position.X, _position.Y,
- _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
+ AvatarGeomAndBodyCreation(
+ _position.X,
+ _position.Y,
+ _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
// As with Size, we reset velocity. However, this isn't strictly necessary since it doesn't
// appear to stall initial region crossings when done here. Being done for consistency.
--
cgit v1.1
From 9fdd1753fa535ea710afc18753529aa3d12a09c6 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 29 Oct 2011 02:30:33 +0100
Subject: Add taint target velocity for ODECharacters as is already done for
ODECharacter position and position and velocity for ODEPrims.
This is to help stop surprises if the velocity is set in the middle of physics calculations, though this probably isn't a huge problem.
It's more for consistency and for the next step of removing some scene locks
---
OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index 09581c3..f93d7ba 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -74,6 +74,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private bool _zeroFlag = false;
private bool m_lastUpdateSent = false;
private Vector3 _velocity;
+ private Vector3 m_taintTargetVelocity;
private Vector3 _target_velocity;
private Vector3 _acceleration;
private Vector3 m_rotationalVelocity;
@@ -701,7 +702,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// d.BodyAddForceAtRelPos(Body, 0.0f, 0.0f, servo, 0.0f, 0.0f, 1.0f);
// d.BodyAddForceAtRelPos(Body, 0.0f, 0.0f, -servo, 0.0f, 0.0f, -1.0f);
// //d.Matrix3 bodyrotation = d.BodyGetRotation(Body);
-// //m_log.Info("[PHYSICSAV]: Rotation: " + bodyrotation.M00 + " : " + bodyrotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22);
+// //m_log.Info("[PHYSICSAV]: Rotation: " + bodyrotation.M00 + " : " + bodyFArotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22);
// }
public override Vector3 Force
@@ -767,14 +768,15 @@ namespace OpenSim.Region.Physics.OdePlugin
if (value.IsFinite())
{
m_pidControllerActive = true;
- _target_velocity = value;
+ m_taintTargetVelocity = value;
+ _parent_scene.AddPhysicsActorTaint(this);
}
else
{
m_log.Warn("[PHYSICS]: Got a NaN velocity from Scene in a Character");
}
-// m_log.DebugFormat("[PHYSICS]: Set target velocity of {0}", _target_velocity);
+// m_log.DebugFormat("[PHYSICS]: Set target velocity of {0}", m_taintTargetVelocity);
}
}
@@ -834,14 +836,14 @@ namespace OpenSim.Region.Physics.OdePlugin
// If uncommented, things get pushed off world
//
// m_log.Debug("Push!");
- // _target_velocity.X += force.X;
- // _target_velocity.Y += force.Y;
- // _target_velocity.Z += force.Z;
+ // m_taintTargetVelocity.X += force.X;
+ // m_taintTargetVelocity.Y += force.Y;
+ // m_taintTargetVelocity.Z += force.Z;
}
else
{
m_pidControllerActive = true;
- _target_velocity += force;
+ m_taintTargetVelocity += force;
}
}
else
@@ -1248,6 +1250,9 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
+ if (m_taintTargetVelocity != _target_velocity)
+ _target_velocity = m_taintTargetVelocity;
+
if (m_tainted_isPhysical != m_isPhysical)
{
if (m_tainted_isPhysical)
--
cgit v1.1
From 6d97545b6bdf1b9a468f9116fe3070c5d9f9f3c6 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 29 Oct 2011 02:42:53 +0100
Subject: Remove the SyncRoot locking from Scene which was only being done
around the main physics loop and ScenePresence position and velocity setting
This is no longer necessary with ODECharacter taints (ODEPrim was already not taking part in this). BSCharacter was already tainting.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 6 ----
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 38 ++++++++++--------------
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 6 ++--
3 files changed, 18 insertions(+), 32 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 302103a..ff05e95 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -509,12 +509,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- // This gets locked so things stay thread safe.
- public object SyncRoot
- {
- get { return m_sceneGraph.m_syncRoot; }
- }
-
public string DefaultScriptEngine
{
get { return m_defaultScriptEngine; }
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 542bd51..1af18e7 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -84,8 +84,6 @@ namespace OpenSim.Region.Framework.Scenes
protected int m_activeScripts = 0;
protected int m_scriptLPS = 0;
- protected internal object m_syncRoot = new object();
-
protected internal PhysicsScene _PhyScene;
///
@@ -187,26 +185,22 @@ namespace OpenSim.Region.Framework.Scenes
///
protected internal float UpdatePhysics(double elapsed)
{
- lock (m_syncRoot)
- {
- // Here is where the Scene calls the PhysicsScene. This is a one-way
- // interaction; the PhysicsScene cannot access the calling Scene directly.
- // But with joints, we want a PhysicsActor to be able to influence a
- // non-physics SceneObjectPart. In particular, a PhysicsActor that is connected
- // with a joint should be able to move the SceneObjectPart which is the visual
- // representation of that joint (for editing and serialization purposes).
- // However the PhysicsActor normally cannot directly influence anything outside
- // of the PhysicsScene, and the non-physical SceneObjectPart which represents
- // the joint in the Scene does not exist in the PhysicsScene.
- //
- // To solve this, we have an event in the PhysicsScene that is fired when a joint
- // has changed position (because one of its associated PhysicsActors has changed
- // position).
- //
- // Therefore, JointMoved and JointDeactivated events will be fired as a result of the following Simulate().
-
- return _PhyScene.Simulate((float)elapsed);
- }
+ // Here is where the Scene calls the PhysicsScene. This is a one-way
+ // interaction; the PhysicsScene cannot access the calling Scene directly.
+ // But with joints, we want a PhysicsActor to be able to influence a
+ // non-physics SceneObjectPart. In particular, a PhysicsActor that is connected
+ // with a joint should be able to move the SceneObjectPart which is the visual
+ // representation of that joint (for editing and serialization purposes).
+ // However the PhysicsActor normally cannot directly influence anything outside
+ // of the PhysicsScene, and the non-physical SceneObjectPart which represents
+ // the joint in the Scene does not exist in the PhysicsScene.
+ //
+ // To solve this, we have an event in the PhysicsScene that is fired when a joint
+ // has changed position (because one of its associated PhysicsActors has changed
+ // position).
+ //
+ // Therefore, JointMoved and JointDeactivated events will be fired as a result of the following Simulate().
+ return _PhyScene.Simulate((float)elapsed);
}
protected internal void UpdateScenePresenceMovement()
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 0880e21..bb820aa 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -521,8 +521,7 @@ namespace OpenSim.Region.Framework.Scenes
{
try
{
- lock (m_scene.SyncRoot)
- PhysicsActor.Position = value;
+ PhysicsActor.Position = value;
}
catch (Exception e)
{
@@ -572,8 +571,7 @@ namespace OpenSim.Region.Framework.Scenes
{
try
{
- lock (m_scene.SyncRoot)
- PhysicsActor.Velocity = value;
+ PhysicsActor.Velocity = value;
}
catch (Exception e)
{
--
cgit v1.1
From 9bdf118e0da7e6de40abd5ba6c930a3dc355ca69 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 29 Oct 2011 02:45:50 +0100
Subject: Add missing max_listens_per_region to [LL_Functions] config section
in OpenSimDefaults.ini + explanation.
This setting controls the maximum number of listeners in a region
---
bin/OpenSimDefaults.ini | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini
index 16ce125..db2a551 100644
--- a/bin/OpenSimDefaults.ini
+++ b/bin/OpenSimDefaults.ini
@@ -1060,6 +1060,10 @@
AllowGodFunctions = false
+ ; Maximum number of llListen events we allow over the entire region.
+ ; Set this to 0 to have no limit imposed
+ max_listeners_per_region = 1000
+
; Maximum number of llListen events we allow per script
; Set this to 0 to have no limit imposed.
max_listens_per_script = 64
--
cgit v1.1