From b6d29aa124cf1ec1c1dbe6874720e6cc39faf06f Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Tue, 4 Dec 2012 02:46:40 +0000
Subject: move characters (avatars) to own collision space, also fixing a
 problem with previus code that was still assuming the avatar is g2

---
 .../Region/Physics/UbitOdePlugin/ODECharacter.cs   | 18 +++++-----
 .../UbitOdePlugin/ODERayCastRequestManager.cs      |  3 ++
 OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs   | 40 +++++++++++++++++++---
 3 files changed, 47 insertions(+), 14 deletions(-)

diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
index f33fdb4..925900f 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
@@ -708,21 +708,21 @@ namespace OpenSim.Region.Physics.OdePlugin
             bot += midsz;
             float topz = bot + topsz * 0.5f;
 
-            _parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
+            _parent_scene.waitForSpaceUnlock(_parent_scene.CharsSpace);
 
-            feetbox = d.CreateBox(_parent_scene.ActiveSpace, feetsx, feetsy, feetsz);
+            feetbox = d.CreateBox(_parent_scene.CharsSpace, feetsx, feetsy, feetsz);
             d.GeomSetCategoryBits(feetbox, (uint)m_collisionCategories);
             d.GeomSetCollideBits(feetbox, (uint)m_collisionFlags);
 
-            midbox = d.CreateBox(_parent_scene.ActiveSpace, midsx, midsy, midsz);
+            midbox = d.CreateBox(_parent_scene.CharsSpace, midsx, midsy, midsz);
             d.GeomSetCategoryBits(midbox, (uint)m_collisionCategories);
             d.GeomSetCollideBits(midbox, (uint)m_collisionFlags);
 
-            topbox = d.CreateBox(_parent_scene.ActiveSpace, topsx, topsy, topsz);
+            topbox = d.CreateBox(_parent_scene.CharsSpace, topsx, topsy, topsz);
             d.GeomSetCategoryBits(topbox, (uint)m_collisionCategories);
             d.GeomSetCollideBits(topbox, (uint)m_collisionFlags);
 
-            bonebox = d.CreateBox(_parent_scene.ActiveSpace, bonesx, bonesy, bonesz);
+            bonebox = d.CreateBox(_parent_scene.CharsSpace, bonesx, bonesy, bonesz);
             d.GeomSetCategoryBits(bonebox, (uint)m_collisionCategories);
             d.GeomSetCollideBits(bonebox, (uint)m_collisionFlags);
 
@@ -828,21 +828,21 @@ namespace OpenSim.Region.Physics.OdePlugin
             if (topbox != IntPtr.Zero)
             {
                 _parent_scene.actor_name_map.Remove(topbox);
-                _parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
+                _parent_scene.waitForSpaceUnlock(_parent_scene.CharsSpace);
                 d.GeomDestroy(topbox);
                 topbox = IntPtr.Zero;
             }
             if (midbox != IntPtr.Zero)
             {
                 _parent_scene.actor_name_map.Remove(midbox);
-                _parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
+                _parent_scene.waitForSpaceUnlock(_parent_scene.CharsSpace);
                 d.GeomDestroy(midbox);
                 midbox = IntPtr.Zero;
             }
             if (feetbox != IntPtr.Zero)
             {
                 _parent_scene.actor_name_map.Remove(feetbox);
-                _parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
+                _parent_scene.waitForSpaceUnlock(_parent_scene.CharsSpace);
                 d.GeomDestroy(feetbox);
                 feetbox = IntPtr.Zero;
             }
@@ -850,7 +850,7 @@ namespace OpenSim.Region.Physics.OdePlugin
             if (bonebox != IntPtr.Zero)
             {
                 _parent_scene.actor_name_map.Remove(bonebox);
-                _parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
+                _parent_scene.waitForSpaceUnlock(_parent_scene.CharsSpace);
                 d.GeomDestroy(bonebox);
                 bonebox = IntPtr.Zero;
             }
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
index 799a324..f449099 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
@@ -324,7 +324,10 @@ namespace OpenSim.Region.Physics.OdePlugin
         {
             // Collide tests
             if ((CurrentRayFilter & FilterActiveSpace) != 0)
+            {
                 d.SpaceCollide2(ray, m_scene.ActiveSpace, IntPtr.Zero, nearCallback);
+                d.SpaceCollide2(ray, m_scene.CharsSpace, IntPtr.Zero, nearCallback);
+            }
             if ((CurrentRayFilter & FilterStaticSpace) != 0 && (m_contactResults.Count < CurrentMaxCount))
                 d.SpaceCollide2(ray, m_scene.StaticSpace, IntPtr.Zero, nearCallback);
             if ((CurrentRayFilter & RayFilterFlags.land) != 0 && (m_contactResults.Count < CurrentMaxCount))
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index 003a91c..07987d1 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -299,6 +299,7 @@ namespace OpenSim.Region.Physics.OdePlugin
 
         public IntPtr TopSpace; // the global space
         public IntPtr ActiveSpace; // space for active prims
+        public IntPtr CharsSpace; // space for active prims
         public IntPtr StaticSpace; // space for the static things around
         public IntPtr GroundSpace; // space for ground
 
@@ -372,21 +373,25 @@ namespace OpenSim.Region.Physics.OdePlugin
 
                     // now the major subspaces
                     ActiveSpace = d.HashSpaceCreate(TopSpace);
+                    CharsSpace = d.HashSpaceCreate(TopSpace);
                     StaticSpace = d.HashSpaceCreate(TopSpace);
                     GroundSpace = d.HashSpaceCreate(TopSpace);
                     }
                 catch
                     {
                     // i must RtC#FM 
+                    // i did!
                     }
 
                 d.HashSpaceSetLevels(TopSpace, -2, 8);
                 d.HashSpaceSetLevels(ActiveSpace, -2, 8);
+                d.HashSpaceSetLevels(CharsSpace, -4, 3);
                 d.HashSpaceSetLevels(StaticSpace, -2, 8);
                 d.HashSpaceSetLevels(GroundSpace, 0, 8);
 
                 // demote to second level
                 d.SpaceSetSublevel(ActiveSpace, 1);
+                d.SpaceSetSublevel(CharsSpace, 1);
                 d.SpaceSetSublevel(StaticSpace, 1);
                 d.SpaceSetSublevel(GroundSpace, 1);
 
@@ -396,11 +401,24 @@ namespace OpenSim.Region.Physics.OdePlugin
                                                         CollisionCategories.Phantom |
                                                         CollisionCategories.VolumeDtc
                                                         ));
-                d.GeomSetCollideBits(ActiveSpace, 0);
+                d.GeomSetCollideBits(ActiveSpace, (uint)(CollisionCategories.Space |
+                                                        CollisionCategories.Geom |
+                                                        CollisionCategories.Character |
+                                                        CollisionCategories.Phantom |
+                                                        CollisionCategories.VolumeDtc
+                                                        ));
+                d.GeomSetCategoryBits(CharsSpace, (uint)(CollisionCategories.Space |
+                                        CollisionCategories.Geom |
+                                        CollisionCategories.Character |
+                                        CollisionCategories.Phantom |
+                                        CollisionCategories.VolumeDtc
+                                        ));
+                d.GeomSetCollideBits(CharsSpace, 0);
+
                 d.GeomSetCategoryBits(StaticSpace, (uint)(CollisionCategories.Space |
                                                         CollisionCategories.Geom |
-                                                        CollisionCategories.Land |
-                                                        CollisionCategories.Water |
+//                                                        CollisionCategories.Land |
+//                                                        CollisionCategories.Water |
                                                         CollisionCategories.Phantom |
                                                         CollisionCategories.VolumeDtc
                                                         ));
@@ -1271,6 +1289,9 @@ namespace OpenSim.Region.Physics.OdePlugin
                         d.SpaceCollide2(StaticSpace, chr.midbox, IntPtr.Zero, nearCallback);
                         d.SpaceCollide2(StaticSpace, chr.feetbox, IntPtr.Zero, nearCallback);
                         d.SpaceCollide2(StaticSpace, chr.bonebox, IntPtr.Zero, nearCallback);
+
+                        // chars with chars
+                        d.SpaceCollide(CharsSpace, IntPtr.Zero, nearCallback);
                         // no coll with gnd
                     }
                 }
@@ -1312,16 +1333,25 @@ namespace OpenSim.Region.Physics.OdePlugin
                     m_log.Warn("[PHYSICS]: Unable to collide Active prim to static space");
                 }
             }
-            // finally colide active things amoung them
+            // colide active amoung them
             try
             {
                 d.SpaceCollide(ActiveSpace, IntPtr.Zero, nearCallback);
             }
             catch (AccessViolationException)
             {
+                m_log.Warn("[PHYSICS]: Unable to collide Active with Characters space");
+            }
+            // and with chars
+            try
+            {
+                d.SpaceCollide2(ActiveSpace, CharsSpace,IntPtr.Zero, nearCallback);
+            }
+            catch (AccessViolationException)
+            {
                 m_log.Warn("[PHYSICS]: Unable to collide in Active space");
             }
-//            _perloopContact.Clear();
+            //            _perloopContact.Clear();
         }
 
         #endregion
-- 
cgit v1.1