From 5a71d03b7ac1de0b599f651c62bf1e33a3d1745d Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Tue, 20 Nov 2007 04:38:08 +0000 Subject: *Huge* structural changes in ODE/OdePrim to get all of the calls in threadlocked code. ODEPrim was almost completely re-written. Copy/Space test needed. --- .../Region/Environment/Scenes/Scene.Inventory.cs | 2 +- OpenSim/Region/Environment/Scenes/Scene.cs | 4 +- .../Region/Environment/Scenes/SceneObjectGroup.cs | 12 +++- .../Region/Environment/Scenes/SceneObjectPart.cs | 78 +++++++++++++--------- .../Region/Environment/Scenes/SceneXmlLoader.cs | 4 +- 5 files changed, 60 insertions(+), 40 deletions(-) (limited to 'OpenSim/Region/Environment') diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index bc0ccb3..3c8dc0a 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -491,7 +491,7 @@ namespace OpenSim.Region.Environment.Scenes new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics); - rootPart.doPhysicsPropertyUpdate(UsePhysics); + rootPart.doPhysicsPropertyUpdate(UsePhysics, true); } rootPart.ScheduleFullUpdate(); diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index dcba9bd..405f2e3 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -604,7 +604,7 @@ namespace OpenSim.Region.Environment.Scenes new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics); - rootPart.doPhysicsPropertyUpdate(UsePhysics); + rootPart.doPhysicsPropertyUpdate(UsePhysics, true); } MainLog.Instance.Verbose("Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)"); } @@ -657,7 +657,7 @@ namespace OpenSim.Region.Environment.Scenes new PhysicsVector(shape.Scale.X, shape.Scale.Y, shape.Scale.Z), new Quaternion(), UsePhysics); // subscribe to physics events. - rootPart.doPhysicsPropertyUpdate(UsePhysics); + rootPart.doPhysicsPropertyUpdate(UsePhysics, true); } } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 38962c1..efee81b 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -150,6 +150,7 @@ namespace OpenSim.Region.Environment.Scenes m_rootPart.PhysActor.Position = new PhysicsVector(m_rootPart.GroupPosition.X, m_rootPart.GroupPosition.Y, m_rootPart.GroupPosition.Z); + m_scene.PhysScene.AddPhysicsActorTaint(m_rootPart.PhysActor); } } } @@ -480,7 +481,7 @@ namespace OpenSim.Region.Environment.Scenes new Quaternion(dupe.RootPart.RotationOffset.W, dupe.RootPart.RotationOffset.X, dupe.RootPart.RotationOffset.Y, dupe.RootPart.RotationOffset.Z), dupe.RootPart.PhysActor.IsPhysical); - dupe.RootPart.doPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical); + dupe.RootPart.doPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true); } // Now we've made a copy that replaces this one, we need to @@ -784,6 +785,7 @@ namespace OpenSim.Region.Environment.Scenes if (linkPart.PhysActor != null) { m_scene.PhysScene.RemovePrim(linkPart.PhysActor); + linkPart.PhysActor = null; } @@ -861,7 +863,7 @@ namespace OpenSim.Region.Environment.Scenes new Quaternion(linkPart.RotationOffset.W, linkPart.RotationOffset.X, linkPart.RotationOffset.Y, linkPart.RotationOffset.Z), m_rootPart.PhysActor.IsPhysical); - m_rootPart.doPhysicsPropertyUpdate(m_rootPart.PhysActor.IsPhysical); + m_rootPart.doPhysicsPropertyUpdate(m_rootPart.PhysActor.IsPhysical, true); } @@ -1170,7 +1172,7 @@ namespace OpenSim.Region.Environment.Scenes m_rootPart.RotationOffset.Y, m_rootPart.RotationOffset.Z), m_rootPart.PhysActor.IsPhysical); bool UsePhysics = ((m_rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0); - m_rootPart.doPhysicsPropertyUpdate(UsePhysics); + m_rootPart.doPhysicsPropertyUpdate(UsePhysics, true); } } @@ -1196,6 +1198,7 @@ namespace OpenSim.Region.Environment.Scenes { m_rootPart.PhysActor.Size = new PhysicsVector(m_rootPart.Scale.X, m_rootPart.Scale.Y, m_rootPart.Scale.Z); + m_scene.PhysScene.AddPhysicsActorTaint(m_rootPart.PhysActor); } } } @@ -1286,6 +1289,7 @@ namespace OpenSim.Region.Environment.Scenes m_rootPart.PhysActor.Orientation = new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y, m_rootPart.RotationOffset.Z); + m_scene.PhysScene.AddPhysicsActorTaint(m_rootPart.PhysActor); } ScheduleGroupForTerseUpdate(); } @@ -1303,6 +1307,7 @@ namespace OpenSim.Region.Environment.Scenes m_rootPart.PhysActor.Orientation = new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y, m_rootPart.RotationOffset.Z); + m_scene.PhysScene.AddPhysicsActorTaint(m_rootPart.PhysActor); } AbsolutePosition = pos; ScheduleGroupForTerseUpdate(); @@ -1346,6 +1351,7 @@ namespace OpenSim.Region.Environment.Scenes m_rootPart.PhysActor.Orientation = new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y, m_rootPart.RotationOffset.Z); + m_scene.PhysScene.AddPhysicsActorTaint(m_rootPart.PhysActor); } foreach (SceneObjectPart prim in m_parts.Values) diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 76fe4b6..7bab3b6 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -170,9 +170,10 @@ namespace OpenSim.Region.Environment.Scenes { try { - //lock (m_scene.SyncRoot) + //lock (m_parentGroup.m_scene.SyncRoot) //{ PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z); + m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor); //} } catch (Exception e) @@ -225,6 +226,7 @@ namespace OpenSim.Region.Environment.Scenes //lock (m_scene.SyncRoot) //{ PhysActor.Orientation = new Quaternion(value.W, value.X, value.Y, value.Z); + m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor); //} } catch (Exception ex) @@ -502,7 +504,7 @@ namespace OpenSim.Region.Environment.Scenes RotationOffset = rotation; ObjectFlags = flags; bool UsePhysics = ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0); - doPhysicsPropertyUpdate(UsePhysics); + doPhysicsPropertyUpdate(UsePhysics, true); ScheduleFullUpdate(); } @@ -518,7 +520,7 @@ namespace OpenSim.Region.Environment.Scenes XmlSerializer serializer = new XmlSerializer(typeof (SceneObjectPart)); SceneObjectPart newobject = (SceneObjectPart) serializer.Deserialize(xmlReader); bool UsePhysics = ((newobject.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0); - newobject.doPhysicsPropertyUpdate(UsePhysics); + newobject.doPhysicsPropertyUpdate(UsePhysics, true); return newobject; } @@ -586,7 +588,7 @@ namespace OpenSim.Region.Environment.Scenes Array.Copy(Shape.ExtraParams, extraP, extraP.Length); dupe.Shape.ExtraParams = extraP; bool UsePhysics = ((dupe.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0); - dupe.doPhysicsPropertyUpdate(UsePhysics); + dupe.doPhysicsPropertyUpdate(UsePhysics, true); return dupe; } @@ -852,7 +854,7 @@ namespace OpenSim.Region.Environment.Scenes AddFlag(LLObject.ObjectFlags.Physics); if (!wasUsingPhysics) { - doPhysicsPropertyUpdate(UsePhysics); + doPhysicsPropertyUpdate(UsePhysics,false); } } @@ -861,7 +863,7 @@ namespace OpenSim.Region.Environment.Scenes RemFlag(LLObject.ObjectFlags.Physics); if (wasUsingPhysics) { - doPhysicsPropertyUpdate(UsePhysics); + doPhysicsPropertyUpdate(UsePhysics, false); } } @@ -892,12 +894,12 @@ namespace OpenSim.Region.Environment.Scenes new PhysicsVector(Scale.X, Scale.Y, Scale.Z), new Quaternion(RotationOffset.W, RotationOffset.X, RotationOffset.Y, RotationOffset.Z), UsePhysics); - doPhysicsPropertyUpdate(UsePhysics); + doPhysicsPropertyUpdate(UsePhysics, true); } else { PhysActor.IsPhysical = UsePhysics; - doPhysicsPropertyUpdate(UsePhysics); + doPhysicsPropertyUpdate(UsePhysics,false); } } @@ -912,36 +914,45 @@ namespace OpenSim.Region.Environment.Scenes // System.Console.WriteLine("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString()); ScheduleFullUpdate(); } - public void doPhysicsPropertyUpdate(bool UsePhysics) + public void doPhysicsPropertyUpdate(bool UsePhysics, bool isNew) { if (PhysActor != null) - { - if (PhysActor.IsPhysical) + { + if (UsePhysics != PhysActor.IsPhysical || isNew) { - PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; - PhysActor.OnOutOfBounds -= PhysicsOutOfBounds; - } - m_parentGroup.m_scene.PhysScene.RemovePrim(PhysActor); - /// that's not wholesome. Had to make m_scene public - PhysActor = null; + + if (PhysActor.IsPhysical) + { + PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; + PhysActor.OnOutOfBounds -= PhysicsOutOfBounds; + } - if ((ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0) - { - PhysActor = m_parentGroup.m_scene.PhysScene.AddPrimShape( - Name, - Shape, - new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y, - AbsolutePosition.Z), - new PhysicsVector(Scale.X, Scale.Y, Scale.Z), - new Quaternion(RotationOffset.W, RotationOffset.X, - RotationOffset.Y, RotationOffset.Z), UsePhysics); - if (UsePhysics) + PhysActor.IsPhysical = UsePhysics; + // If we're not what we're supposed to be in the physics scene, recreate ourselves. + //m_parentGroup.m_scene.PhysScene.RemovePrim(PhysActor); + /// that's not wholesome. Had to make m_scene public + //PhysActor = null; + + + if ((ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0) { - PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; - PhysActor.OnOutOfBounds += PhysicsOutOfBounds; + //PhysActor = m_parentGroup.m_scene.PhysScene.AddPrimShape( + //Name, + //Shape, + //new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y, + //AbsolutePosition.Z), + //new PhysicsVector(Scale.X, Scale.Y, Scale.Z), + //new Quaternion(RotationOffset.W, RotationOffset.X, + //RotationOffset.Y, RotationOffset.Z), UsePhysics); + if (UsePhysics) + { + PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; + PhysActor.OnOutOfBounds += PhysicsOutOfBounds; + } } } + m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor); } } @@ -1195,8 +1206,11 @@ namespace OpenSim.Region.Environment.Scenes public void PhysicsOutOfBounds(PhysicsVector pos) { OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "Physical Object went out of bounds."); - doPhysicsPropertyUpdate(false); - ScheduleFullUpdate(); + RemFlag(LLObject.ObjectFlags.Physics); + doPhysicsPropertyUpdate(false,true); + m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor); + + } diff --git a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs b/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs index 3b5fc57..5c460be 100644 --- a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs +++ b/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs @@ -55,7 +55,7 @@ namespace OpenSim.Region.Environment.Scenes new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics); - rootPart.doPhysicsPropertyUpdate(UsePhysics); + rootPart.doPhysicsPropertyUpdate(UsePhysics, true); } primCount++; @@ -125,7 +125,7 @@ namespace OpenSim.Region.Environment.Scenes new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics); - rootPart.doPhysicsPropertyUpdate(UsePhysics); + rootPart.doPhysicsPropertyUpdate(UsePhysics, true); } } -- cgit v1.1