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