From 7b46506822be1dd1559661453ebc580336487683 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 28 Oct 2011 23:15:51 +0100 Subject: [PATCH 01/10] fetch SOP.RotationOffset once in UpdateRotation() and compare rather than fetch four separate times. No functional change. --- .../Framework/Scenes/SceneObjectPart.cs | 25 +++++++++++++++---- .../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 c8ecc9bf90..2ff3fb7f63 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 ee6c708d3f..38cdd77e5c 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); From 9bf8c3e7b73da735a6e8aa865e5d19f16453981c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 28 Oct 2011 23:38:57 +0100 Subject: [PATCH 02/10] 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 2d6d4ec045..f6d3293778 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) From c2da1c4580302a3f1a30b7ad2e70f590aff76167 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 28 Oct 2011 23:43:31 +0100 Subject: [PATCH 03/10] set grp.RootPart.GroupPosition for code consistency (and readability) rather than calling SOP.OffsetForNewRegion --- .../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 f4d2fda3d0..7324b26afc 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 f6d3293778..64810d2c64 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 From 61e97ee4c85d79098731eb7ddc074af388c61380 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 29 Oct 2011 00:39:01 +0100 Subject: [PATCH 04/10] Remove completely unused SOG.Rotation parameter We always use SOP.Rotation instead --- .../Framework/Scenes/SceneObjectGroup.cs | 8 -------- .../Scenes/Tests/SceneObjectLinkingTests.cs | 18 +++++++++--------- .../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 64810d2c64..2ea9854ef2 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 2912a46d7d..90cdd7baf4 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 654f1689a7..f3206ac826 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; } From 5ae8de3c00cdf5d200b3158116a1e1fd9a404229 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 29 Oct 2011 01:39:48 +0100 Subject: [PATCH 05/10] 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 9f24ee7de9..a7f83f915b 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 c22d27fdff..5ad7616669 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 From a5ea9f883092ca7b54aeb1c6e3abb8a5ebed1dc7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 29 Oct 2011 01:46:22 +0100 Subject: [PATCH 06/10] Move position set from taint to logically better position at top of ODECharacter.ProcessTaints() though this makes no practical difference --- .../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 5ad7616669..ca8fef96ca 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) From ef8370fb8e527ca20c13d18aad1cbf7f8a44c70a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 29 Oct 2011 02:07:28 +0100 Subject: [PATCH 07/10] 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. --- .../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 ca8fef96ca..09581c3341 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. From 9fdd1753fa535ea710afc18753529aa3d12a09c6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 29 Oct 2011 02:30:33 +0100 Subject: [PATCH 08/10] 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 --- .../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 09581c3341..f93d7bac0e 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) From 6d97545b6bdf1b9a468f9116fe3070c5d9f9f3c6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 29 Oct 2011 02:42:53 +0100 Subject: [PATCH 09/10] 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 ++++++++----------- .../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 302103ae78..ff05e95a42 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 542bd51274..1af18e7309 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 0880e21724..bb820aa733 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) { From 9bdf118e0da7e6de40abd5ba6c930a3dc355ca69 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 29 Oct 2011 02:45:50 +0100 Subject: [PATCH 10/10] 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 16ce1256aa..db2a551b27 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