From d3050724d8fdb0de5b87285b782de9c4d2f9bac7 Mon Sep 17 00:00:00 2001 From: dan miller Date: Fri, 21 Sep 2007 02:31:36 +0000 Subject: [PATCH] physics-related fixes; should stabilize border crossings --- OpenSim/Region/Environment/Scenes/Scene.cs | 3 ++- .../Region/Environment/Scenes/ScenePresence.cs | 17 ++++++++++++++++- OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 14 +++++++++++--- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 5b08155e11..d89ca28649 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -833,6 +833,7 @@ namespace OpenSim.Region.Environment.Scenes if (presence.PhysicsActor != null) { phyScene.RemoveAvatar(presence.PhysicsActor); + presence.PhysicsActor = null; } }); @@ -1028,7 +1029,7 @@ namespace OpenSim.Region.Environment.Scenes { if (m_scenePresences.ContainsKey(agentID)) { - m_scenePresences[agentID].MakeAvatar(position, isFlying); + m_scenePresences[agentID].MakeAvatarPhysical(position, isFlying); } } } diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index c0b9a35d97..1a38244c0d 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -336,7 +336,7 @@ namespace OpenSim.Region.Environment.Scenes } } - public void MakeAvatar(LLVector3 pos, bool isFlying) + public void MakeAvatarPhysical(LLVector3 pos, bool isFlying) { newAvatar = true; childAgent = false; @@ -363,6 +363,7 @@ namespace OpenSim.Region.Environment.Scenes private void RemoveFromPhysicalScene() { m_scene.PhysScene.RemoveAvatar( this.PhysicsActor ); + this.PhysicsActor = null; } /// @@ -429,6 +430,15 @@ namespace OpenSim.Region.Environment.Scenes /// public void HandleAgentUpdate(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation) { + if (childAgent) + { + Console.WriteLine("DEBUG: HandleAgentUpdate: child agent"); + return; + } + if(PhysicsActor==null) { + Console.WriteLine("DEBUG: HandleAgentUpdate: null PhysicsActor!"); + return; + } int i = 0; bool update_movementflag = false; bool update_rotation = false; @@ -501,6 +511,11 @@ namespace OpenSim.Region.Environment.Scenes protected void AddNewMovement(Vector3 vec, Quaternion rotation) { + if (childAgent) + { + Console.WriteLine("DEBUG: AddNewMovement: child agent"); + return; + } NewForce newVelocity = new NewForce(); Vector3 direc = rotation*vec; direc.Normalize(); diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 8b49f70c98..8d142ab7b3 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs @@ -152,9 +152,8 @@ namespace OpenSim.Region.Physics.OdePlugin public override void RemoveAvatar(PhysicsActor actor) { - OdeCharacter och = (OdeCharacter)actor; - d.BodyDestroy(och.BoundingCapsule); - _characters.Remove(och); + ((OdeCharacter)actor).Destroy(); + _characters.Remove((OdeCharacter)actor); } public override void RemovePrim(PhysicsActor prim) @@ -449,6 +448,15 @@ namespace OpenSim.Region.Physics.OdePlugin this._position.Y = vec.Y; this._position.Z = vec.Z; } + + public void Destroy() + { + lock (OdeScene.OdeLock) + { + d.GeomDestroy(this.capsule_geom); + d.BodyDestroy(this.BoundingCapsule); + } + } } public class OdePrim : PhysicsActor