From 85f578999320ab4b3b87d99c6901e7dfc86f8cc3 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 21 May 2012 12:35:17 +0100 Subject: [PATCH 01/11] try to let avas climb higher steps. Will only work in some cases, may have bad effects, so needs some more testing --- .../Region/Physics/UbitOdePlugin/ODEPrim.cs | 2 +- .../Region/Physics/UbitOdePlugin/OdeScene.cs | 82 +++++++++++++++++-- 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index 62fd279464..459cd277c6 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -2562,10 +2562,10 @@ namespace OpenSim.Region.Physics.OdePlugin { d.Quaternion qtmp; d.GeomCopyQuaternion(prim_geom, out qtmp); - _orientation.W = qtmp.W; _orientation.X = qtmp.X; _orientation.Y = qtmp.Y; _orientation.Z = qtmp.Z; + _orientation.W = qtmp.W; d.Vector3 lpos = d.GeomGetPosition(prim_geom); _position.X = lpos.X; diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index bfcfd21a97..d5968fc3d5 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -1006,16 +1006,82 @@ namespace OpenSim.Region.Physics.OdePlugin else { - if (dop1foot && (p1.Position.Z - curContact.pos.Z) > (p1.Size.Z - avCapRadius) * 0.5f) - p1.IsColliding = true; - if (dop2foot && (p2.Position.Z - curContact.pos.Z) > (p2.Size.Z - avCapRadius) * 0.5f) - p2.IsColliding = true; - if (AvanormOverride && curContact.depth > 0.3f) + if (AvanormOverride) { - curContact.normal.X = normoverride.X; - curContact.normal.Y = normoverride.Y; - curContact.normal.Z = normoverride.Z; + if (curContact.depth > 0.3f) + { + if (dop1foot && (p1.Position.Z - curContact.pos.Z) > (p1.Size.Z - avCapRadius) * 0.5f) + p1.IsColliding = true; + if (dop2foot && (p2.Position.Z - curContact.pos.Z) > (p2.Size.Z - avCapRadius) * 0.5f) + p2.IsColliding = true; + curContact.normal.X = normoverride.X; + curContact.normal.Y = normoverride.Y; + curContact.normal.Z = normoverride.Z; + } + + else + { + if (dop1foot) + { + float sz = p1.Size.Z; + Vector3 vtmp = p1.Position; + float ppos = curContact.pos.Z - vtmp.Z + (sz - avCapRadius) * 0.5f; + if (ppos > 0f) + { + if (!p1.Flying) + { + d.AABB aabb; + d.GeomGetAABB(g2, out aabb); + float tmp = vtmp.Z - sz * .25f; + + if (aabb.MaxZ < tmp) + { + vtmp.X = curContact.pos.X - vtmp.X; + vtmp.Y = curContact.pos.Y - vtmp.Y; + vtmp.Z = -0.2f; + vtmp.Normalize(); + curContact.normal.X = vtmp.X; + curContact.normal.Y = vtmp.Y; + curContact.normal.Z = vtmp.Z; + } + } + } + else + p1.IsColliding = true; + + } + + if (dop2foot) + { + float sz = p2.Size.Z; + Vector3 vtmp = p2.Position; + float ppos = curContact.pos.Z - vtmp.Z + (sz - avCapRadius) * 0.5f; + if (ppos > 0f) + { + if (!p2.Flying) + { + d.AABB aabb; + d.GeomGetAABB(g1, out aabb); + float tmp = vtmp.Z - sz * .25f; + + if (aabb.MaxZ < tmp) + { + vtmp.X = curContact.pos.X - vtmp.X; + vtmp.Y = curContact.pos.Y - vtmp.Y; + vtmp.Z = -0.2f; + vtmp.Normalize(); + curContact.normal.X = vtmp.X; + curContact.normal.Y = vtmp.Y; + curContact.normal.Z = vtmp.Z; + } + } + } + else + p2.IsColliding = true; + + } + } } Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale); From d2260423e5e955b4e0f33f279e64cf74d580dc37 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 21 May 2012 17:11:19 +0100 Subject: [PATCH 02/11] also don't collide sculps or meshs if meshing is OFF --- OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index 459cd277c6..496e7ace48 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -1482,6 +1482,8 @@ namespace OpenSim.Region.Physics.OdePlugin if (!haveMesh) m_NoColide = true; } + else if(_pbs.SculptEntry) + m_NoColide = true; // also don't colide if is a sculp or mesh and meshing is off if (!haveMesh) { From f740c9522aa5fd57ffd2d01fa9c2e244113ac880 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 27 May 2012 14:01:42 +0100 Subject: [PATCH 03/11] Let OOB information usable outside ubitode --- .../Region/Physics/Manager/PhysicsActor.cs | 29 ++++++++++++++++++- .../Physics/UbitOdePlugin/ODECharacter.cs | 23 --------------- .../Region/Physics/UbitOdePlugin/ODEPrim.cs | 10 +++---- 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs index fb90887f6d..aaeae86f3d 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs @@ -294,6 +294,34 @@ namespace OpenSim.Region.Physics.Manager public abstract Vector3 GeometricCenter { get; } public abstract Vector3 CenterOfMass { get; } + public virtual Vector3 OOBsize + { + get + { + Vector3 s=Size; + s.X *=0.5f; + s.Y *=0.5f; + s.Z *=0.5f; + return s; + } + } + + public virtual Vector3 OOBoffset + { + get + { + return Vector3.Zero; + } + } + + public virtual float OOBRadiusSQ + { + get + { + return Size.LengthSquared() * 0.25f; // ((0.5^2) + } + } + /// /// Velocity of this actor. /// @@ -429,7 +457,6 @@ namespace OpenSim.Region.Physics.Manager public override void VehicleFloatParam(int param, float value) { - } public override void VehicleVectorParam(int param, Vector3 value) diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs index 1084b0e2a7..6fb54cb09d 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs @@ -522,29 +522,6 @@ namespace OpenSim.Region.Physics.OdePlugin } } - //UBit mess - /* for later use - public override Vector3 PrimOOBsize - { - get - { - Vector3 s=Size; - s.X *=0.5f; - s.Y *=0.5f; - s.Z *=0.5f; - return s; - } - } - - public override Vector3 PrimOOBoffset - { - get - { - return Vector3.Zero; - } - } - */ - public override PrimitiveBaseShape Shape { set { return; } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index 496e7ace48..1bfe08bdb1 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -504,8 +504,8 @@ namespace OpenSim.Region.Physics.OdePlugin } } } -/* - public override Vector3 PrimOOBsize + + public override Vector3 OOBsize { get { @@ -513,7 +513,7 @@ namespace OpenSim.Region.Physics.OdePlugin } } - public override Vector3 PrimOOBoffset + public override Vector3 OOBoffset { get { @@ -521,14 +521,14 @@ namespace OpenSim.Region.Physics.OdePlugin } } - public override float PrimOOBRadiusSQ + public override float OOBRadiusSQ { get { return primOOBradiusSQ; } } -*/ + public override PrimitiveBaseShape Shape { set From bbaf450c30a0822c8ffcc40bf75961f2c3c214e4 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 28 May 2012 02:14:14 +0200 Subject: [PATCH 04/11] Modify SceneManeger to use a DoubleDictionary and work without locks. Changes to the scenes dictionary are exceedingly rare and using atomic operations makes the chance of collisions nearly nil in any case. --- .../Region/Framework/Scenes/SceneManager.cs | 266 ++++++------------ 1 file changed, 90 insertions(+), 176 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs index e4eaf3a888..e3fed493c4 100644 --- a/OpenSim/Region/Framework/Scenes/SceneManager.cs +++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs @@ -53,12 +53,12 @@ namespace OpenSim.Region.Framework.Scenes get { return m_instance; } } - private readonly List m_localScenes = new List(); + private readonly DoubleDictionary m_localScenes = new DoubleDictionary(); private Scene m_currentScene = null; public List Scenes { - get { return new List(m_localScenes); } + get { return new List(m_localScenes.FindAll(delegate(Scene s) { return true; })); } } public Scene CurrentScene @@ -72,13 +72,10 @@ namespace OpenSim.Region.Framework.Scenes { if (m_currentScene == null) { - lock (m_localScenes) - { - if (m_localScenes.Count > 0) - return m_localScenes[0]; - else - return null; - } + List sceneList = Scenes; + if (sceneList.Count == 0) + return null; + return sceneList[0]; } else { @@ -90,7 +87,7 @@ namespace OpenSim.Region.Framework.Scenes public SceneManager() { m_instance = this; - m_localScenes = new List(); + m_localScenes = new DoubleDictionary(); } public void Close() @@ -98,20 +95,18 @@ namespace OpenSim.Region.Framework.Scenes // collect known shared modules in sharedModules Dictionary sharedModules = new Dictionary(); - lock (m_localScenes) + List sceneList = Scenes; + for (int i = 0; i < sceneList.Count; i++) { - for (int i = 0; i < m_localScenes.Count; i++) + // extract known shared modules from scene + foreach (string k in sceneList[i].Modules.Keys) { - // extract known shared modules from scene - foreach (string k in m_localScenes[i].Modules.Keys) - { - if (m_localScenes[i].Modules[k].IsSharedModule && - !sharedModules.ContainsKey(k)) - sharedModules[k] = m_localScenes[i].Modules[k]; - } - // close scene/region - m_localScenes[i].Close(); + if (sceneList[i].Modules[k].IsSharedModule && + !sharedModules.ContainsKey(k)) + sharedModules[k] = sceneList[i].Modules[k]; } + // close scene/region + sceneList[i].Close(); } // all regions/scenes are now closed, we can now safely @@ -120,31 +115,22 @@ namespace OpenSim.Region.Framework.Scenes { mod.Close(); } + + m_localScenes.Clear(); } public void Close(Scene cscene) { - lock (m_localScenes) - { - if (m_localScenes.Contains(cscene)) - { - for (int i = 0; i < m_localScenes.Count; i++) - { - if (m_localScenes[i].Equals(cscene)) - { - m_localScenes[i].Close(); - } - } - } - } + if (!m_localScenes.ContainsKey(cscene.RegionInfo.RegionID)) + return; + cscene.Close(); } public void Add(Scene scene) { scene.OnRestart += HandleRestart; - lock (m_localScenes) - m_localScenes.Add(scene); + m_localScenes.Add(scene.RegionInfo.RegionID, scene.RegionInfo.RegionName, scene); } public void HandleRestart(RegionInfo rdata) @@ -152,24 +138,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.Error("[SCENEMANAGER]: Got Restart message for region:" + rdata.RegionName + " Sending up to main"); int RegionSceneElement = -1; - lock (m_localScenes) - { - for (int i = 0; i < m_localScenes.Count; i++) - { - if (rdata.RegionName == m_localScenes[i].RegionInfo.RegionName) - { - RegionSceneElement = i; - } - } - - // Now we make sure the region is no longer known about by the SceneManager - // Prevents duplicates. - - if (RegionSceneElement >= 0) - { - m_localScenes.RemoveAt(RegionSceneElement); - } - } + m_localScenes.Remove(rdata.RegionID); // Send signal to main that we're restarting this sim. OnRestartSim(rdata); @@ -179,32 +148,29 @@ namespace OpenSim.Region.Framework.Scenes { RegionInfo Result = null; - lock (m_localScenes) + Scene s = m_localScenes.FindValue(delegate(Scene x) + { + if (x.RegionInfo.RegionHandle == regionHandle) + return true; + return false; + }); + + if (s != null) { - for (int i = 0; i < m_localScenes.Count; i++) + List sceneList = Scenes; + + for (int i = 0; i < sceneList.Count; i++) { - if (m_localScenes[i].RegionInfo.RegionHandle == regionHandle) + if (sceneList[i]!= s) { // Inform other regions to tell their avatar about me - Result = m_localScenes[i].RegionInfo; + //sceneList[i].OtherRegionUp(Result); } } - - if (Result != null) - { - for (int i = 0; i < m_localScenes.Count; i++) - { - if (m_localScenes[i].RegionInfo.RegionHandle != regionHandle) - { - // Inform other regions to tell their avatar about me - //m_localScenes[i].OtherRegionUp(Result); - } - } - } - else - { - m_log.Error("[REGION]: Unable to notify Other regions of this Region coming up"); - } + } + else + { + m_log.Error("[REGION]: Unable to notify Other regions of this Region coming up"); } } @@ -308,8 +274,8 @@ namespace OpenSim.Region.Framework.Scenes { if (m_currentScene == null) { - lock (m_localScenes) - m_localScenes.ForEach(func); + List sceneList = Scenes; + sceneList.ForEach(func); } else { @@ -338,16 +304,12 @@ namespace OpenSim.Region.Framework.Scenes } else { - lock (m_localScenes) + Scene s; + + if (m_localScenes.TryGetValue(regionName, out s)) { - foreach (Scene scene in m_localScenes) - { - if (String.Compare(scene.RegionInfo.RegionName, regionName, true) == 0) - { - m_currentScene = scene; - return true; - } - } + m_currentScene = s; + return true; } return false; @@ -358,16 +320,12 @@ namespace OpenSim.Region.Framework.Scenes { // m_log.Debug("Searching for Region: '" + regionID + "'"); - lock (m_localScenes) + Scene s; + + if (m_localScenes.TryGetValue(regionID, out s)) { - foreach (Scene scene in m_localScenes) - { - if (scene.RegionInfo.RegionID == regionID) - { - m_currentScene = scene; - return true; - } - } + m_currentScene = s; + return true; } return false; @@ -375,52 +333,24 @@ namespace OpenSim.Region.Framework.Scenes public bool TryGetScene(string regionName, out Scene scene) { - lock (m_localScenes) - { - foreach (Scene mscene in m_localScenes) - { - if (String.Compare(mscene.RegionInfo.RegionName, regionName, true) == 0) - { - scene = mscene; - return true; - } - } - } - - scene = null; - return false; + return m_localScenes.TryGetValue(regionName, out scene); } public bool TryGetScene(UUID regionID, out Scene scene) { - lock (m_localScenes) - { - foreach (Scene mscene in m_localScenes) - { - if (mscene.RegionInfo.RegionID == regionID) - { - scene = mscene; - return true; - } - } - } - - scene = null; - return false; + return m_localScenes.TryGetValue(regionID, out scene); } public bool TryGetScene(uint locX, uint locY, out Scene scene) { - lock (m_localScenes) + List sceneList = Scenes; + foreach (Scene mscene in sceneList) { - foreach (Scene mscene in m_localScenes) + if (mscene.RegionInfo.RegionLocX == locX && + mscene.RegionInfo.RegionLocY == locY) { - if (mscene.RegionInfo.RegionLocX == locX && - mscene.RegionInfo.RegionLocY == locY) - { - scene = mscene; - return true; - } + scene = mscene; + return true; } } @@ -430,16 +360,14 @@ namespace OpenSim.Region.Framework.Scenes public bool TryGetScene(IPEndPoint ipEndPoint, out Scene scene) { - lock (m_localScenes) + List sceneList = Scenes; + foreach (Scene mscene in sceneList) { - foreach (Scene mscene in m_localScenes) + if ((mscene.RegionInfo.InternalEndPoint.Equals(ipEndPoint.Address)) && + (mscene.RegionInfo.InternalEndPoint.Port == ipEndPoint.Port)) { - if ((mscene.RegionInfo.InternalEndPoint.Equals(ipEndPoint.Address)) && - (mscene.RegionInfo.InternalEndPoint.Port == ipEndPoint.Port)) - { - scene = mscene; - return true; - } + scene = mscene; + return true; } } @@ -504,15 +432,10 @@ namespace OpenSim.Region.Framework.Scenes public RegionInfo GetRegionInfo(UUID regionID) { - lock (m_localScenes) + Scene s; + if (m_localScenes.TryGetValue(regionID, out s)) { - foreach (Scene scene in m_localScenes) - { - if (scene.RegionInfo.RegionID == regionID) - { - return scene.RegionInfo; - } - } + return s.RegionInfo; } return null; @@ -530,14 +453,12 @@ namespace OpenSim.Region.Framework.Scenes public bool TryGetScenePresence(UUID avatarId, out ScenePresence avatar) { - lock (m_localScenes) + List sceneList = Scenes; + foreach (Scene scene in sceneList) { - foreach (Scene scene in m_localScenes) + if (scene.TryGetScenePresence(avatarId, out avatar)) { - if (scene.TryGetScenePresence(avatarId, out avatar)) - { - return true; - } + return true; } } @@ -547,15 +468,13 @@ namespace OpenSim.Region.Framework.Scenes public bool TryGetRootScenePresence(UUID avatarId, out ScenePresence avatar) { - lock (m_localScenes) + List sceneList = Scenes; + foreach (Scene scene in sceneList) { - foreach (Scene scene in m_localScenes) - { - avatar = scene.GetScenePresence(avatarId); + avatar = scene.GetScenePresence(avatarId); - if (avatar != null && !avatar.IsChildAgent) - return true; - } + if (avatar != null && !avatar.IsChildAgent) + return true; } avatar = null; @@ -564,22 +483,19 @@ namespace OpenSim.Region.Framework.Scenes public void CloseScene(Scene scene) { - lock (m_localScenes) - m_localScenes.Remove(scene); + m_localScenes.Remove(scene.RegionInfo.RegionID); scene.Close(); } public bool TryGetAvatarByName(string avatarName, out ScenePresence avatar) { - lock (m_localScenes) + List sceneList = Scenes; + foreach (Scene scene in sceneList) { - foreach (Scene scene in m_localScenes) + if (scene.TryGetAvatarByName(avatarName, out avatar)) { - if (scene.TryGetAvatarByName(avatarName, out avatar)) - { - return true; - } + return true; } } @@ -589,14 +505,12 @@ namespace OpenSim.Region.Framework.Scenes public bool TryGetRootScenePresenceByName(string firstName, string lastName, out ScenePresence sp) { - lock (m_localScenes) + List sceneList = Scenes; + foreach (Scene scene in sceneList) { - foreach (Scene scene in m_localScenes) - { - sp = scene.GetScenePresence(firstName, lastName); - if (sp != null && !sp.IsChildAgent) - return true; - } + sp = scene.GetScenePresence(firstName, lastName); + if (sp != null && !sp.IsChildAgent) + return true; } sp = null; @@ -605,8 +519,8 @@ namespace OpenSim.Region.Framework.Scenes public void ForEachScene(Action action) { - lock (m_localScenes) - m_localScenes.ForEach(action); + List sceneList = Scenes; + sceneList.ForEach(action); } } } From ca3b229e941512b3d05793f9fbbede7702eeeb38 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 28 May 2012 09:15:24 +0200 Subject: [PATCH 05/11] If a region is not found on a simulator, make the health query return 0 to indicate it's still starting rather than an error. There are other methods that can discover the presence of a region and slow starting regions may cause the watchdog to kill them while they start, --- .../RemoteController/RemoteAdminPlugin.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 49a8e64c28..9e72a98a76 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -1673,16 +1673,25 @@ namespace OpenSim.ApplicationPlugins.RemoteController Hashtable responseData = (Hashtable)response.Value; Hashtable requestData = (Hashtable)request.Params[0]; + int flags = 0; + string text = String.Empty; + int health = 0; responseData["success"] = true; CheckRegionParams(requestData, responseData); Scene scene = null; - GetSceneFromRegionParams(requestData, responseData, out scene); + try + { + GetSceneFromRegionParams(requestData, responseData, out scene); + health = scene.GetHealth(out flags, out text); + } + catch (Exception e) + { + responseData["error"] = null; + } - int flags; - string text; - int health = scene.GetHealth(out flags, out text); + responseData["success"] = true; responseData["health"] = health; responseData["flags"] = flags; responseData["message"] = text; From b70fb7df789ba40b520b8bf0794b32c8099ef202 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 28 May 2012 11:28:46 +0200 Subject: [PATCH 06/11] Place the return back into collision sounds. --- OpenSim/Region/Framework/Scenes/CollisionSounds.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs index 81ca9f1ce9..a02f10843d 100644 --- a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs +++ b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs @@ -188,6 +188,8 @@ namespace OpenSim.Region.Framework.Scenes public static void PartCollisionSound(SceneObjectPart part, List collidersinfolist) { + return; + if (collidersinfolist.Count == 0 || part == null) return; @@ -297,6 +299,8 @@ namespace OpenSim.Region.Framework.Scenes public static void AvatarCollisionSound(ScenePresence av, List collidersinfolist) { + return; + if (collidersinfolist.Count == 0 || av == null) return; From 20baa6334ca21ecd30ce1a46fcc4dbe5d4030854 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 28 May 2012 13:05:50 +0100 Subject: [PATCH 07/11] revert making sculpts phanton if sculpt meshing option is off --- OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index 1bfe08bdb1..5109a6a137 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -1482,8 +1482,6 @@ namespace OpenSim.Region.Physics.OdePlugin if (!haveMesh) m_NoColide = true; } - else if(_pbs.SculptEntry) - m_NoColide = true; // also don't colide if is a sculp or mesh and meshing is off if (!haveMesh) { From 121433d03aad53bfa8d50854115c0496317b00eb Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 28 May 2012 13:10:02 +0100 Subject: [PATCH 08/11] disable collision sounds for now --- OpenSim/Region/Framework/Scenes/CollisionSounds.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs index 81ca9f1ce9..de82ddcf92 100644 --- a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs +++ b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs @@ -188,6 +188,9 @@ namespace OpenSim.Region.Framework.Scenes public static void PartCollisionSound(SceneObjectPart part, List collidersinfolist) { + // disable for now + return; + if (collidersinfolist.Count == 0 || part == null) return; @@ -296,7 +299,10 @@ namespace OpenSim.Region.Framework.Scenes } public static void AvatarCollisionSound(ScenePresence av, List collidersinfolist) - { + { + // disable for now + return; + if (collidersinfolist.Count == 0 || av == null) return; @@ -368,4 +374,4 @@ namespace OpenSim.Region.Framework.Scenes } } } -} +} \ No newline at end of file From 60cebe9a5b91f2683019d645f6bb243a9f7db139 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 28 May 2012 14:32:16 +0100 Subject: [PATCH 09/11] let meshs work indenpendently of mesh_sculpted_prim config option --- .../Region/Physics/UbitOdePlugin/OdeScene.cs | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index d5968fc3d5..b0bc18bd9b 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -1675,41 +1675,43 @@ namespace OpenSim.Region.Physics.OdePlugin /// public bool needsMeshing(PrimitiveBaseShape pbs) { - // most of this is redundant now as the mesher will return null if it cant mesh a prim - // but we still need to check for sculptie meshing being enabled so this is the most - // convenient place to do it for now... - - // //if (pbs.PathCurve == (byte)Primitive.PathCurve.Circle && pbs.ProfileCurve == (byte)Primitive.ProfileCurve.Circle && pbs.PathScaleY <= 0.75f) - // //m_log.Debug("needsMeshing: " + " pathCurve: " + pbs.PathCurve.ToString() + " profileCurve: " + pbs.ProfileCurve.ToString() + " pathScaleY: " + Primitive.UnpackPathScale(pbs.PathScaleY).ToString()); - int iPropertiesNotSupportedDefault = 0; + // check sculpts or meshs if (pbs.SculptEntry) { - if(!meshSculptedPrim) + if (pbs.SculptType == (byte)SculptType.Mesh) // always do meshs + return true; + + if (!meshSculptedPrim) return false; + else + return true; } + int iPropertiesNotSupportedDefault = 0; + + if (forceSimplePrimMeshing) + return true; + // if it's a standard box or sphere with no cuts, hollows, twist or top shear, return false since ODE can use an internal representation for the prim - if (!forceSimplePrimMeshing && !pbs.SculptEntry) - { - if ((pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight) + + if ((pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight) || (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 && pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z)) - { + { - if (pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0 - && pbs.ProfileHollow == 0 - && pbs.PathTwist == 0 && pbs.PathTwistBegin == 0 - && pbs.PathBegin == 0 && pbs.PathEnd == 0 - && pbs.PathTaperX == 0 && pbs.PathTaperY == 0 - && pbs.PathScaleX == 100 && pbs.PathScaleY == 100 - && pbs.PathShearX == 0 && pbs.PathShearY == 0) - { + if (pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0 + && pbs.ProfileHollow == 0 + && pbs.PathTwist == 0 && pbs.PathTwistBegin == 0 + && pbs.PathBegin == 0 && pbs.PathEnd == 0 + && pbs.PathTaperX == 0 && pbs.PathTaperY == 0 + && pbs.PathScaleX == 100 && pbs.PathScaleY == 100 + && pbs.PathShearX == 0 && pbs.PathShearY == 0) + { #if SPAM - m_log.Warn("NonMesh"); + m_log.Warn("NonMesh"); #endif - return false; - } + return false; } } @@ -1717,9 +1719,6 @@ namespace OpenSim.Region.Physics.OdePlugin // and it's odd.. so for now just return true if asked to force meshs // hopefully mesher will fail if doesn't suport so things still get basic boxes - if (forceSimplePrimMeshing) - return true; - if (pbs.ProfileHollow != 0) iPropertiesNotSupportedDefault++; @@ -1787,9 +1786,6 @@ namespace OpenSim.Region.Physics.OdePlugin } } - if (pbs.SculptEntry && meshSculptedPrim) - iPropertiesNotSupportedDefault++; - if (iPropertiesNotSupportedDefault == 0) { #if SPAM From 2122c336b088ebb2900cf6cd061602dda01268e0 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 28 May 2012 14:44:06 +0100 Subject: [PATCH 10/11] a bit cleaner code (?) on sculpts/meshs meshing checking --- OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index b0bc18bd9b..286c7f0721 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -1675,21 +1675,18 @@ namespace OpenSim.Region.Physics.OdePlugin /// public bool needsMeshing(PrimitiveBaseShape pbs) { - // check sculpts or meshs if (pbs.SculptEntry) { + if (meshSculptedPrim) + return true; + if (pbs.SculptType == (byte)SculptType.Mesh) // always do meshs return true; - if (!meshSculptedPrim) - return false; - else - return true; + return false; } - int iPropertiesNotSupportedDefault = 0; - if (forceSimplePrimMeshing) return true; @@ -1719,6 +1716,8 @@ namespace OpenSim.Region.Physics.OdePlugin // and it's odd.. so for now just return true if asked to force meshs // hopefully mesher will fail if doesn't suport so things still get basic boxes + int iPropertiesNotSupportedDefault = 0; + if (pbs.ProfileHollow != 0) iPropertiesNotSupportedDefault++; From dbbfe0cdd78c919b39da52e1ccc0c1fc500b57d5 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 28 May 2012 22:23:32 +0100 Subject: [PATCH 11/11] fix avatars collisions on sim crossings and other few cases where freemove() is called --- OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs index 6fb54cb09d..093bc3c0be 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs @@ -1322,8 +1322,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_iscollidingGround = false; m_iscollidingObj = false; - CollisionEventsThisFrame = new CollisionEventUpdate(); - m_eventsubscription = 0; + CollisionEventsThisFrame.Clear(); } private void changeForce(Vector3 newForce)