From 6ad0f3250b31c392560af70330269ab7db9664a6 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 19 Aug 2016 21:28:40 +0100 Subject: fix ubOde prims unlink that got broken fixing sleeping bodies collisions, core removes and adds a prim with same LocalID not giving time for physics to actuly delete, so when it did it LocalID was lost --- OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs | 15 ++++++++++++--- OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs | 19 ++++++++++++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) (limited to 'OpenSim/Region/PhysicsModules/ubOde') diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs index 6f2cbbe..4adf87e 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs @@ -306,7 +306,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde public override uint LocalID { get { return m_localID; } - set { m_localID = value; } + set + { + uint oldid = m_localID; + m_localID = value; + _parent_scene.changePrimID(this, oldid); + } } public override PhysicsActor ParentActor @@ -1066,8 +1071,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde public OdePrim(String primName, ODEScene parent_scene, Vector3 pos, Vector3 size, Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical,bool pisPhantom,byte _shapeType,uint plocalID) { + _parent_scene = parent_scene; + Name = primName; - LocalID = plocalID; + m_localID = plocalID; m_vehicle = null; @@ -1113,7 +1120,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde _pbs = pbs; - _parent_scene = parent_scene; m_targetSpace = IntPtr.Zero; if (pos.Z < 0) @@ -1159,6 +1165,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde m_OBBOffset = repData.OBBOffset; UpdatePrimBodyData(); + + AddChange(changes.Add, null); } private void resetCollisionAccounting() @@ -2441,6 +2449,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde private void changeadd() { + _parent_scene.addToPrims(this); } private void changeAngularLock(byte newLocks) diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs index 6c5b405..623e6be 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs @@ -1328,8 +1328,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde { newPrim = new OdePrim(name, this, position, size, rotation, pbs, isphysical, isPhantom, shapeType, localID); - lock (_prims) - _prims[newPrim.LocalID] = newPrim; } return newPrim; } @@ -1350,7 +1348,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, Vector3 size, Quaternion rotation, bool isPhysical, bool isPhantom, byte shapeType, uint localid) { - return AddPrim(primName, position, size, rotation, pbs, isPhysical,isPhantom, shapeType, localid); } @@ -1396,6 +1393,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde } + public void addToPrims(OdePrim prim) + { + lock (_prims) + _prims[prim.LocalID] = prim; + } + public OdePrim getPrim(uint id) { lock (_prims) @@ -1413,6 +1416,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde return _prims.ContainsKey(prm.LocalID); } + public void changePrimID(OdePrim prim,uint oldID) + { + lock (_prims) + { + if(_prims.ContainsKey(oldID)) + _prims.Remove(oldID); + _prims[prim.LocalID] = prim; + } + } + public bool haveActor(PhysicsActor actor) { if (actor is OdePrim) -- cgit v1.1 From 3abd54082f8c757bc77edfaebb37d0ff4807a095 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 22 Aug 2016 07:32:12 +0100 Subject: remove unnecessary lock --- .../Region/PhysicsModules/ubOde/ODECharacter.cs | 52 +++++++++------------- 1 file changed, 21 insertions(+), 31 deletions(-) (limited to 'OpenSim/Region/PhysicsModules/ubOde') diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs index c9489d2..3a5a936 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs @@ -122,8 +122,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde private float m_buoyancy = 0f; private bool m_freemove = false; - // private CollisionLocker ode; - + // private string m_name = String.Empty; // other filter control int m_colliderfilter = 0; @@ -1571,11 +1570,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (CollisionEventsThisFrame != null) { - lock (CollisionEventsThisFrame) - { - CollisionEventsThisFrame.Clear(); - CollisionEventsThisFrame = null; - } + CollisionEventsThisFrame.Clear(); + CollisionEventsThisFrame = null; } m_eventsubscription = 0; _parent_scene.RemoveCollisionEventReporting(this); @@ -1585,11 +1581,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (CollisionEventsThisFrame == null) CollisionEventsThisFrame = new CollisionEventUpdate(); - lock (CollisionEventsThisFrame) - { - CollisionEventsThisFrame.AddCollider(CollidedWith, contact); - _parent_scene.AddCollisionEventReporting(this); - } + CollisionEventsThisFrame.AddCollider(CollidedWith, contact); + _parent_scene.AddCollisionEventReporting(this); } public void SendCollisions(int timestep) @@ -1600,28 +1593,25 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (CollisionEventsThisFrame == null) return; - lock (CollisionEventsThisFrame) - { - if (m_cureventsubscription < m_eventsubscription) - return; + if (m_cureventsubscription < m_eventsubscription) + return; - int ncolisions = CollisionEventsThisFrame.m_objCollisionList.Count; + int ncolisions = CollisionEventsThisFrame.m_objCollisionList.Count; - if (!SentEmptyCollisionsEvent || ncolisions > 0) - { - base.SendCollisionUpdate(CollisionEventsThisFrame); - m_cureventsubscription = 0; + if (!SentEmptyCollisionsEvent || ncolisions > 0) + { + base.SendCollisionUpdate(CollisionEventsThisFrame); + m_cureventsubscription = 0; - if (ncolisions == 0) - { - SentEmptyCollisionsEvent = true; -// _parent_scene.RemoveCollisionEventReporting(this); - } - else - { - SentEmptyCollisionsEvent = false; - CollisionEventsThisFrame.Clear(); - } + if (ncolisions == 0) + { + SentEmptyCollisionsEvent = true; +// _parent_scene.RemoveCollisionEventReporting(this); + } + else + { + SentEmptyCollisionsEvent = false; + CollisionEventsThisFrame.Clear(); } } } -- cgit v1.1 From 133fce98e79eced53bb68adc73749adf176cfccd Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 22 Aug 2016 20:28:15 +0100 Subject: change ODEs topcolliders code ( still bad), plus a few memory leaks --- OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs | 48 +++++++++++-------------- 1 file changed, 21 insertions(+), 27 deletions(-) (limited to 'OpenSim/Region/PhysicsModules/ubOde') diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs index 623e6be..fc08819 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs @@ -30,6 +30,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Threading; @@ -803,14 +804,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde return; } - // update actors collision score - if (p1.CollisionScore >= float.MaxValue - count) - p1.CollisionScore = 0; - p1.CollisionScore += count; - - if (p2.CollisionScore >= float.MaxValue - count) - p2.CollisionScore = 0; - p2.CollisionScore += count; // get first contact d.ContactGeom curContact = new d.ContactGeom(); @@ -1056,6 +1049,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde { uint obj2LocalID = 0; + // update actors collision score + if (p1.CollisionScore < float.MaxValue) + p1.CollisionScore += 1.0f; + if (p2.CollisionScore < float.MaxValue) + p2.CollisionScore += 1.0f; + bool p1events = p1.SubscribedEvents(); bool p2events = p2.SubscribedEvents(); @@ -2569,27 +2568,22 @@ namespace OpenSim.Region.PhysicsModule.ubOde } } + private int compareByCollisionsDesc(OdePrim A, OdePrim B) + { + return -A.CollisionScore.CompareTo(B.CollisionScore); + } + public override Dictionary<uint, float> GetTopColliders() { - Dictionary<uint, float> returncolliders = new Dictionary<uint, float>(); - int cnt = 0; - lock (_prims) - { - foreach (OdePrim prm in _prims.Values) - { - if (prm.CollisionScore > 0) - { - returncolliders.Add(prm.LocalID, prm.CollisionScore); - cnt++; - prm.CollisionScore = 0f; - if (cnt > 25) - { - break; - } - } - } - } - return returncolliders; + Dictionary<uint, float> topColliders; + List<OdePrim> orderedPrims; + lock (_activeprims) + orderedPrims = new List<OdePrim>(_activeprims); + + orderedPrims.Sort(compareByCollisionsDesc); + topColliders = orderedPrims.Take(25).ToDictionary(p => p.LocalID, p => p.CollisionScore); + + return topColliders; } public override bool SupportsRayCast() -- cgit v1.1 From 804d4971e236a0e75a51358f3d9c43313d140e5f Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 28 Aug 2016 03:51:20 +0100 Subject: my broken version of vehicle mouse steer on ubOde (no bank,needs better damp) --- OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs | 142 +++++++++++++++------ 1 file changed, 103 insertions(+), 39 deletions(-) (limited to 'OpenSim/Region/PhysicsModules/ubOde') diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs index d8a2272..456d9e9 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs @@ -648,6 +648,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde break; } + // disable mouse steering + m_flags &= ~(VehicleFlag.MOUSELOOK_STEER | + VehicleFlag.MOUSELOOK_BANK | + VehicleFlag.CAMERA_DECOUPLED); m_lmDecay = (1.0f - 1.0f / m_linearMotorDecayTimescale); m_amDecay = 1.0f - 1.0f / m_angularMotorDecayTimescale; @@ -794,6 +798,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde float ldampZ = 0; + bool mousemode = false; + if((m_flags & (VehicleFlag.MOUSELOOK_STEER |VehicleFlag.MOUSELOOK_BANK)) != 0 ) + mousemode = true; + + float bankingEfficiency; + if(mousemode) + bankingEfficiency = 0; + else + bankingEfficiency = m_bankingEfficiency; + // linear motor if (m_lmEfect > 0.01 && m_linearMotorTimescale < 1000) { @@ -967,7 +981,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde torque.Y += effpitch * ftmp; } - if (m_bankingEfficiency != 0 && Math.Abs(effroll) > 0.01) + if (bankingEfficiency != 0 && Math.Abs(effroll) > 0.01) { float broll = effroll; @@ -1018,58 +1032,108 @@ namespace OpenSim.Region.PhysicsModule.ubOde m_amdampZ = 1 / m_angularFrictionTimescale.Z; } - // angular motor - if (m_amEfect > 0.01 && m_angularMotorTimescale < 1000) + if(mousemode) { - tmpV = m_angularMotorDirection - curLocalAngVel; // velocity error - tmpV *= m_amEfect / m_angularMotorTimescale; // error to correct in this timestep - torque.X += tmpV.X * m_ampwr; - torque.Y += tmpV.Y * m_ampwr; - torque.Z += tmpV.Z; + CameraData cam = rootPrim.TryGetCameraData(); + if(cam.Valid && cam.MouseLook) + { + Vector3 dirv = cam.CameraAtAxis * irotq; - m_amEfect *= m_amDecay; + float tmp; + if(Math.Abs(dirv.X) > 0.01f) + { + if (Math.Abs(dirv.Z) > 0.01) + { + tmp = -(float)Math.Atan2(dirv.Z, dirv.X) * m_angularMotorDirection.Y; + if(tmp < -4f) + tmp = -4f; + else if(tmp > 4f) + tmp = 4f; + torque.Y += (tmp - curLocalAngVel.Y) / m_angularMotorTimescale; + } + + if (Math.Abs(dirv.Y) > 0.01) + { + tmp = (float)Math.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.Z; + if(tmp < -4f) + tmp = -4f; + else if(tmp > 4f) + tmp = 4f; + torque.Z += (tmp - curLocalAngVel.Z) / m_angularMotorTimescale; + } + } + // angular friction + if (curLocalAngVel.X != 0 || curLocalAngVel.Y != 0 || curLocalAngVel.Z != 0) + { + torque.X -= curLocalAngVel.X * m_amdampX; + torque.Y -= curLocalAngVel.Y * m_amdampY; + torque.Z -= curLocalAngVel.Z * m_amdampZ; + } + } + else + { + if (curLocalAngVel.X != 0 || curLocalAngVel.Y != 0 || curLocalAngVel.Z != 0) + { + torque.X -= curLocalAngVel.X * 10f; + torque.Y -= curLocalAngVel.Y * 10f; + torque.Z -= curLocalAngVel.Z * 10f; + } + } } else - m_amEfect = 0; - - // angular deflection - if (m_angularDeflectionEfficiency > 0) { - Vector3 dirv; - - if (curLocalVel.X > 0.01f) - dirv = curLocalVel; - else if (curLocalVel.X < -0.01f) - // use oposite - dirv = -curLocalVel; - else + // angular motor + if (m_amEfect > 0.01 && m_angularMotorTimescale < 1000) { - // make it fall into small positive x case - dirv.X = 0.01f; - dirv.Y = curLocalVel.Y; - dirv.Z = curLocalVel.Z; - } + tmpV = m_angularMotorDirection - curLocalAngVel; // velocity error + tmpV *= m_amEfect / m_angularMotorTimescale; // error to correct in this timestep + torque.X += tmpV.X * m_ampwr; + torque.Y += tmpV.Y * m_ampwr; + torque.Z += tmpV.Z; - float ftmp = m_angularDeflectionEfficiency / m_angularDeflectionTimescale; + m_amEfect *= m_amDecay; + } + else + m_amEfect = 0; - if (Math.Abs(dirv.Z) > 0.01) + // angular deflection + if (m_angularDeflectionEfficiency > 0) { - torque.Y += - (float)Math.Atan2(dirv.Z, dirv.X) * ftmp; + Vector3 dirv; + + if (curLocalVel.X > 0.01f) + dirv = curLocalVel; + else if (curLocalVel.X < -0.01f) + // use oposite + dirv = -curLocalVel; + else + { + // make it fall into small positive x case + dirv.X = 0.01f; + dirv.Y = curLocalVel.Y; + dirv.Z = curLocalVel.Z; + } + + float ftmp = m_angularDeflectionEfficiency / m_angularDeflectionTimescale; + + if (Math.Abs(dirv.Z) > 0.01) + { + torque.Y += - (float)Math.Atan2(dirv.Z, dirv.X) * ftmp; + } + + if (Math.Abs(dirv.Y) > 0.01) + { + torque.Z += (float)Math.Atan2(dirv.Y, dirv.X) * ftmp; + } } - if (Math.Abs(dirv.Y) > 0.01) + if (curLocalAngVel.X != 0 || curLocalAngVel.Y != 0 || curLocalAngVel.Z != 0) { - torque.Z += (float)Math.Atan2(dirv.Y, dirv.X) * ftmp; + torque.X -= curLocalAngVel.X * m_amdampX; + torque.Y -= curLocalAngVel.Y * m_amdampY; + torque.Z -= curLocalAngVel.Z * m_amdampZ; } } - - // angular friction - if (curLocalAngVel.X != 0 || curLocalAngVel.Y != 0 || curLocalAngVel.Z != 0) - { - torque.X -= curLocalAngVel.X * m_amdampX; - torque.Y -= curLocalAngVel.Y * m_amdampY; - torque.Z -= curLocalAngVel.Z * m_amdampZ; - } force *= dmass.mass; -- cgit v1.1 From 155a861a4f53c547ae066123cd50a5028067ae54 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 29 Aug 2016 16:22:16 +0100 Subject: ubOde mouse look steer with some MOUSELOOK_BANK action --- OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs | 69 ++++++++++++++++------ 1 file changed, 51 insertions(+), 18 deletions(-) (limited to 'OpenSim/Region/PhysicsModules/ubOde') diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs index 456d9e9..2b8e3ba 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs @@ -799,12 +799,24 @@ namespace OpenSim.Region.PhysicsModule.ubOde float ldampZ = 0; bool mousemode = false; - if((m_flags & (VehicleFlag.MOUSELOOK_STEER |VehicleFlag.MOUSELOOK_BANK)) != 0 ) - mousemode = true; + bool mousemodebank = false; float bankingEfficiency; - if(mousemode) - bankingEfficiency = 0; + float verticalAttractionTimescale = m_verticalAttractionTimescale; + + if((m_flags & (VehicleFlag.MOUSELOOK_STEER | VehicleFlag.MOUSELOOK_BANK)) != 0 ) + { + mousemode = true; + mousemodebank = (m_flags & VehicleFlag.MOUSELOOK_BANK) != 0; + if(mousemodebank) + { + bankingEfficiency = m_bankingEfficiency; + if(verticalAttractionTimescale < 149.9) + verticalAttractionTimescale *= 2.0f; // reduce current instability + } + else + bankingEfficiency = 0; + } else bankingEfficiency = m_bankingEfficiency; @@ -944,12 +956,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde } // vertical atractor - if (m_verticalAttractionTimescale < 300) + if (verticalAttractionTimescale < 300) { float roll; float pitch; - float ftmp = m_invtimestep / m_verticalAttractionTimescale / m_verticalAttractionTimescale; + float ftmp = m_invtimestep / verticalAttractionTimescale / verticalAttractionTimescale; float ftmp2; ftmp2 = 0.5f * m_verticalAttractionEfficiency * m_invtimestep; @@ -1039,36 +1051,57 @@ namespace OpenSim.Region.PhysicsModule.ubOde { Vector3 dirv = cam.CameraAtAxis * irotq; + float invamts = 1.0f/m_angularMotorTimescale; float tmp; - if(Math.Abs(dirv.X) > 0.01f) + + // get out x == 0 plane + if(Math.Abs(dirv.X) < 0.001f) + dirv.X = 0001f; + + if (Math.Abs(dirv.Z) > 0.01) + { + tmp = -(float)Math.Atan2(dirv.Z, dirv.X) * m_angularMotorDirection.Y; + if(tmp < -4f) + tmp = -4f; + else if(tmp > 4f) + tmp = 4f; + torque.Y += (tmp - curLocalAngVel.Y) * invamts; + torque.Y -= curLocalAngVel.Y * m_amdampY; + } + else + torque.Y -= curLocalAngVel.Y * m_invtimestep; + + if (Math.Abs(dirv.Y) > 0.01) { - if (Math.Abs(dirv.Z) > 0.01) + if(mousemodebank) { - tmp = -(float)Math.Atan2(dirv.Z, dirv.X) * m_angularMotorDirection.Y; + tmp = -(float)Math.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.X; if(tmp < -4f) tmp = -4f; else if(tmp > 4f) tmp = 4f; - torque.Y += (tmp - curLocalAngVel.Y) / m_angularMotorTimescale; + torque.X += (tmp - curLocalAngVel.X) * invamts; } - - if (Math.Abs(dirv.Y) > 0.01) + else { tmp = (float)Math.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.Z; + tmp *= invamts; if(tmp < -4f) tmp = -4f; else if(tmp > 4f) tmp = 4f; - torque.Z += (tmp - curLocalAngVel.Z) / m_angularMotorTimescale; + torque.Z += (tmp - curLocalAngVel.Z) * invamts; } - } - // angular friction - if (curLocalAngVel.X != 0 || curLocalAngVel.Y != 0 || curLocalAngVel.Z != 0) - { torque.X -= curLocalAngVel.X * m_amdampX; - torque.Y -= curLocalAngVel.Y * m_amdampY; torque.Z -= curLocalAngVel.Z * m_amdampZ; } + else + { + if(mousemodebank) + torque.X -= curLocalAngVel.X * m_invtimestep; + else + torque.Z -= curLocalAngVel.Z * m_invtimestep; + } } else { -- cgit v1.1 From 2b1b0134048d9e1f3d2789f0975869c3d93c81ac Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 29 Aug 2016 16:25:46 +0100 Subject: ubOde add a missing decimal dot :) --- OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/PhysicsModules/ubOde') diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs index 2b8e3ba..fa32441 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs @@ -1054,9 +1054,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde float invamts = 1.0f/m_angularMotorTimescale; float tmp; - // get out x == 0 plane + // get out of x == 0 plane if(Math.Abs(dirv.X) < 0.001f) - dirv.X = 0001f; + dirv.X = 0.001f; if (Math.Abs(dirv.Z) > 0.01) { -- cgit v1.1 From 6c6a965320951250e7cbcc8c9875cab4b603bc76 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 1 Sep 2016 16:15:51 +0100 Subject: remove some MegaRegions code from physics --- OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs | 26 ------------------------- 1 file changed, 26 deletions(-) (limited to 'OpenSim/Region/PhysicsModules/ubOde') diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs index fc08819..e23e355 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs @@ -171,7 +171,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public bool m_OSOdeLib = false; - public bool m_suportCombine = false; // mega suport not tested public Scene m_frameWorkScene = null; // private int threadid = 0; @@ -380,8 +379,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde WorldExtents.Y = m_frameWorkScene.RegionInfo.RegionSizeY; m_regionHeight = (uint)WorldExtents.Y; - m_suportCombine = false; - lock (OdeLock) { // Create the world and the first space @@ -1938,12 +1935,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde int offsetX = 0; int offsetY = 0; - if (m_suportCombine) - { - offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize; - offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize; - } - // get region map IntPtr heightFieldGeom = IntPtr.Zero; if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom)) @@ -2076,12 +2067,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde int offsetX = 0; int offsetY = 0; - if (m_suportCombine) - { - offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize; - offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize; - } - // get region map IntPtr heightFieldGeom = IntPtr.Zero; Vector3 norm = new Vector3(0, 0, 1); @@ -2224,12 +2209,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde } } - public override void CombineTerrain(float[] heightMap, Vector3 pOffset) - { - if(m_suportCombine) - SetTerrain(heightMap, pOffset); - } - public void SetTerrain(float[] heightMap, Vector3 pOffset) { if (m_OSOdeLib) @@ -2479,11 +2458,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde return waterlevel; } - public override bool SupportsCombining() - { - return m_suportCombine; - } - public override void SetWaterLevel(float baseheight) { waterlevel = baseheight; -- cgit v1.1 From f6eac5aa7aaa9dd58e9f4e6b156f47d17f3ebc70 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 1 Sep 2016 17:25:29 +0100 Subject: remove some MegaRegions code from ubOde --- OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs | 190 ++++++++---------------- 1 file changed, 66 insertions(+), 124 deletions(-) (limited to 'OpenSim/Region/PhysicsModules/ubOde') diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs index e23e355..e6aa7ef 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs @@ -258,9 +258,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde public ContactData[] m_materialContactsData = new ContactData[8]; - private Dictionary<Vector3, IntPtr> RegionTerrain = new Dictionary<Vector3, IntPtr>(); - private Dictionary<IntPtr, float[]> TerrainHeightFieldHeights = new Dictionary<IntPtr, float[]>(); - private Dictionary<IntPtr, GCHandle> TerrainHeightFieldHeightsHandlers = new Dictionary<IntPtr, GCHandle>(); + private IntPtr TerrainGeom; + private float[] TerrainHeightFieldHeight; + private GCHandle TerrainHeightFieldHeightsHandler = new GCHandle(); private int m_physicsiterations = 15; private const float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag @@ -302,9 +302,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde public int physics_logging_interval = 0; public bool physics_logging_append_existing_logfile = false; - private Vector3 m_worldOffset = Vector3.Zero; public Vector2 WorldExtents = new Vector2((int)Constants.RegionSize, (int)Constants.RegionSize); - private PhysicsScene m_parentScene = null; private ODERayCastRequestManager m_rayCastManager; public ODEMeshWorker m_meshWorker; @@ -1931,24 +1929,15 @@ namespace OpenSim.Region.PhysicsModule.ubOde public float GetTerrainHeightAtXY(float x, float y) { - - int offsetX = 0; - int offsetY = 0; - - // get region map - IntPtr heightFieldGeom = IntPtr.Zero; - if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom)) - return 0f; - - if (heightFieldGeom == IntPtr.Zero) + if (TerrainGeom == IntPtr.Zero) return 0f; - if (!TerrainHeightFieldHeights.ContainsKey(heightFieldGeom)) + if (TerrainHeightFieldHeight == null || TerrainHeightFieldHeight.Length == 0) return 0f; // TerrainHeightField for ODE as offset 1m - x += 1f - offsetX; - y += 1f - offsetY; + x += 1f; + y += 1f; // make position fit into array if (x < 0) @@ -2027,7 +2016,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde iy *= regsize; iy += ix; // all indexes have iy + ix - float[] heights = TerrainHeightFieldHeights[heightFieldGeom]; + float[] heights = TerrainHeightFieldHeight; /* if ((dx + dy) <= 1.0f) { @@ -2064,25 +2053,17 @@ namespace OpenSim.Region.PhysicsModule.ubOde public Vector3 GetTerrainNormalAtXY(float x, float y) { - int offsetX = 0; - int offsetY = 0; - - // get region map - IntPtr heightFieldGeom = IntPtr.Zero; Vector3 norm = new Vector3(0, 0, 1); - if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom)) - return norm; ; - - if (heightFieldGeom == IntPtr.Zero) + if (TerrainGeom == IntPtr.Zero) return norm; - if (!TerrainHeightFieldHeights.ContainsKey(heightFieldGeom)) + if (TerrainHeightFieldHeight == null || TerrainHeightFieldHeight.Length == 0) return norm; // TerrainHeightField for ODE as offset 1m - x += 1f - offsetX; - y += 1f - offsetY; + x += 1f; + y += 1f; // make position fit into array if (x < 0) @@ -2169,7 +2150,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde iy *= regsize; iy += ix; // all indexes have iy + ix - float[] heights = TerrainHeightFieldHeights[heightFieldGeom]; + float[] heights = TerrainHeightFieldHeight; if (firstTri) { @@ -2196,28 +2177,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde public override void SetTerrain(float[] heightMap) { - if (m_worldOffset != Vector3.Zero && m_parentScene != null) - { - if (m_parentScene is ODEScene) - { - ((ODEScene)m_parentScene).SetTerrain(heightMap, m_worldOffset); - } - } - else - { - SetTerrain(heightMap, m_worldOffset); - } - } - - public void SetTerrain(float[] heightMap, Vector3 pOffset) - { if (m_OSOdeLib) - OSSetTerrain(heightMap, pOffset); + OSSetTerrain(heightMap); else - OriSetTerrain(heightMap, pOffset); + OriSetTerrain(heightMap); } - public void OriSetTerrain(float[] heightMap, Vector3 pOffset) + public void OriSetTerrain(float[] heightMap) { // assumes 1m size grid and constante size square regions // needs to know about sims around in future @@ -2282,45 +2248,40 @@ namespace OpenSim.Region.PhysicsModule.ubOde { d.AllocateODEDataForThread(~0U); - IntPtr GroundGeom = IntPtr.Zero; - if (RegionTerrain.TryGetValue(pOffset, out GroundGeom)) + if (TerrainGeom != IntPtr.Zero) { - RegionTerrain.Remove(pOffset); - if (GroundGeom != IntPtr.Zero) - { - actor_name_map.Remove(GroundGeom); - d.GeomDestroy(GroundGeom); + actor_name_map.Remove(TerrainGeom); + d.GeomDestroy(TerrainGeom); - if (TerrainHeightFieldHeights.ContainsKey(GroundGeom)) - { - TerrainHeightFieldHeightsHandlers[GroundGeom].Free(); - TerrainHeightFieldHeightsHandlers.Remove(GroundGeom); - TerrainHeightFieldHeights.Remove(GroundGeom); - } - } } + + if (TerrainHeightFieldHeightsHandler.IsAllocated) + TerrainHeightFieldHeightsHandler.Free(); + IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); - GCHandle _heightmaphandler = GCHandle.Alloc(_heightmap, GCHandleType.Pinned); + GC.Collect(1); - d.GeomHeightfieldDataBuildSingle(HeightmapData, _heightmaphandler.AddrOfPinnedObject(), 0, + TerrainHeightFieldHeightsHandler = GCHandle.Alloc(_heightmap, GCHandleType.Pinned); + + d.GeomHeightfieldDataBuildSingle(HeightmapData, TerrainHeightFieldHeightsHandler.AddrOfPinnedObject(), 0, heightmapHeight, heightmapWidth , (int)heightmapHeightSamples, (int)heightmapWidthSamples, scale, offset, thickness, wrap); d.GeomHeightfieldDataSetBounds(HeightmapData, hfmin - 1, hfmax + 1); - GroundGeom = d.CreateHeightfield(GroundSpace, HeightmapData, 1); + TerrainGeom = d.CreateHeightfield(GroundSpace, HeightmapData, 1); - if (GroundGeom != IntPtr.Zero) + if (TerrainGeom != IntPtr.Zero) { - d.GeomSetCategoryBits(GroundGeom, (uint)(CollisionCategories.Land)); - d.GeomSetCollideBits(GroundGeom, 0); + d.GeomSetCategoryBits(TerrainGeom, (uint)(CollisionCategories.Land)); + d.GeomSetCollideBits(TerrainGeom, 0); PhysicsActor pa = new NullPhysicsActor(); pa.Name = "Terrain"; pa.PhysicsActorType = (int)ActorTypes.Ground; - actor_name_map[GroundGeom] = pa; + actor_name_map[TerrainGeom] = pa; // geom_name_map[GroundGeom] = "Terrain"; @@ -2330,16 +2291,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde q.Z = 0.5f; q.W = 0.5f; - d.GeomSetQuaternion(GroundGeom, ref q); - d.GeomSetPosition(GroundGeom, pOffset.X + m_regionWidth * 0.5f, pOffset.Y + m_regionHeight * 0.5f, 0.0f); - RegionTerrain.Add(pOffset, GroundGeom); - TerrainHeightFieldHeights.Add(GroundGeom, _heightmap); - TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler); + d.GeomSetQuaternion(TerrainGeom, ref q); + d.GeomSetPosition(TerrainGeom, m_regionWidth * 0.5f, m_regionHeight * 0.5f, 0.0f); + TerrainHeightFieldHeight = _heightmap; } + else + TerrainHeightFieldHeightsHandler.Free(); } } - public void OSSetTerrain(float[] heightMap, Vector3 pOffset) + public void OSSetTerrain(float[] heightMap) { // assumes 1m size grid and constante size square regions // needs to know about sims around in future @@ -2393,26 +2354,20 @@ namespace OpenSim.Region.PhysicsModule.ubOde } yt += heightmapWidthSamples; } + lock (OdeLock) { - IntPtr GroundGeom = IntPtr.Zero; - if (RegionTerrain.TryGetValue(pOffset, out GroundGeom)) + if (TerrainGeom != IntPtr.Zero) { - RegionTerrain.Remove(pOffset); - if (GroundGeom != IntPtr.Zero) - { - actor_name_map.Remove(GroundGeom); - d.GeomDestroy(GroundGeom); - - if (TerrainHeightFieldHeights.ContainsKey(GroundGeom)) - { - if (TerrainHeightFieldHeightsHandlers[GroundGeom].IsAllocated) - TerrainHeightFieldHeightsHandlers[GroundGeom].Free(); - TerrainHeightFieldHeightsHandlers.Remove(GroundGeom); - TerrainHeightFieldHeights.Remove(GroundGeom); - } - } + actor_name_map.Remove(TerrainGeom); + d.GeomDestroy(TerrainGeom); } + + if (TerrainHeightFieldHeightsHandler.IsAllocated) + TerrainHeightFieldHeightsHandler.Free(); + + TerrainHeightFieldHeight = null; + IntPtr HeightmapData = d.GeomOSTerrainDataCreate(); const int wrap = 0; @@ -2420,32 +2375,31 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (thickness < 0) thickness = 1; - GCHandle _heightmaphandler = GCHandle.Alloc(_heightmap, GCHandleType.Pinned); + TerrainHeightFieldHeightsHandler = GCHandle.Alloc(_heightmap, GCHandleType.Pinned); - d.GeomOSTerrainDataBuild(HeightmapData, _heightmaphandler.AddrOfPinnedObject(), 0, 1.0f, + d.GeomOSTerrainDataBuild(HeightmapData, TerrainHeightFieldHeightsHandler.AddrOfPinnedObject(), 0, 1.0f, (int)heightmapWidthSamples, (int)heightmapHeightSamples, thickness, wrap); // d.GeomOSTerrainDataSetBounds(HeightmapData, hfmin - 1, hfmax + 1); - GroundGeom = d.CreateOSTerrain(GroundSpace, HeightmapData, 1); - if (GroundGeom != IntPtr.Zero) + TerrainGeom = d.CreateOSTerrain(GroundSpace, HeightmapData, 1); + if (TerrainGeom != IntPtr.Zero) { - d.GeomSetCategoryBits(GroundGeom, (uint)(CollisionCategories.Land)); - d.GeomSetCollideBits(GroundGeom, 0); - + d.GeomSetCategoryBits(TerrainGeom, (uint)(CollisionCategories.Land)); + d.GeomSetCollideBits(TerrainGeom, 0); PhysicsActor pa = new NullPhysicsActor(); pa.Name = "Terrain"; pa.PhysicsActorType = (int)ActorTypes.Ground; - actor_name_map[GroundGeom] = pa; + actor_name_map[TerrainGeom] = pa; // geom_name_map[GroundGeom] = "Terrain"; - d.GeomSetPosition(GroundGeom, pOffset.X + m_regionWidth * 0.5f, pOffset.Y + m_regionHeight * 0.5f, 0.0f); - RegionTerrain.Add(pOffset, GroundGeom); - TerrainHeightFieldHeights.Add(GroundGeom, _heightmap); - TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler); - } + d.GeomSetPosition(TerrainGeom, m_regionWidth * 0.5f, m_regionHeight * 0.5f, 0.0f); + TerrainHeightFieldHeight = _heightmap; + } + else + TerrainHeightFieldHeightsHandler.Free(); } } @@ -2504,26 +2458,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde foreach (OdeCharacter ch in chtorem) ch.DoAChange(changes.Remove, null); + if (TerrainGeom != IntPtr.Zero) + d.GeomDestroy(TerrainGeom); + TerrainGeom = IntPtr.Zero; - foreach (IntPtr GroundGeom in RegionTerrain.Values) - { - if (GroundGeom != IntPtr.Zero) - d.GeomDestroy(GroundGeom); - } - - RegionTerrain.Clear(); - - if (TerrainHeightFieldHeightsHandlers.Count > 0) - { - foreach (GCHandle gch in TerrainHeightFieldHeightsHandlers.Values) - { - if (gch.IsAllocated) - gch.Free(); - } - } + if (TerrainHeightFieldHeightsHandler.IsAllocated) + TerrainHeightFieldHeightsHandler.Free(); - TerrainHeightFieldHeightsHandlers.Clear(); - TerrainHeightFieldHeights.Clear(); + TerrainHeightFieldHeight = null; if (ContactgeomsArray != IntPtr.Zero) { -- cgit v1.1