aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/ChOdePlugin
diff options
context:
space:
mode:
authorKitto Flora2010-07-13 20:37:13 +0000
committerKitto Flora2010-07-13 20:37:13 +0000
commit7ab103c96f3e82cac592f20d61358e1928da8e27 (patch)
tree0dd397de0b82b9eb2109847122d61bd86134b65e /OpenSim/Region/Physics/ChOdePlugin
parentRemoved the CHANGED_COLOR event post from the Color accessor in SOP. This is ... (diff)
downloadopensim-SC-7ab103c96f3e82cac592f20d61358e1928da8e27.zip
opensim-SC-7ab103c96f3e82cac592f20d61358e1928da8e27.tar.gz
opensim-SC-7ab103c96f3e82cac592f20d61358e1928da8e27.tar.bz2
opensim-SC-7ab103c96f3e82cac592f20d61358e1928da8e27.tar.xz
Rewrite collision dictionary handling, cleans up deleted obects/avs. Fixes occasional collision event failure. ChOde only.
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs90
-rw-r--r--OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs67
-rw-r--r--OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs6
3 files changed, 103 insertions, 60 deletions
diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
index 38c38b6..61c16b8 100644
--- a/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
@@ -565,7 +565,29 @@ namespace OpenSim.Region.Physics.OdePlugin
565 CAPSULE_RADIUS = 0.01f; 565 CAPSULE_RADIUS = 0.01f;
566 566
567 } 567 }
568
569 if(Shell != IntPtr.Zero)
570 {
571 try
572 {
573 d.GeomDestroy(Shell);
574 }
575 catch (System.AccessViolationException)
576 {
577 m_log.Error("[PHYSICS]: PrimGeom dead");
578 }
579 // Remove any old entries
580//string tShell;
581//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
582//Console.WriteLine("**** Remove {0}", tShell);
583 if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
584 if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
585 }
586
568 Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH); 587 Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH);
588 _parent_scene.geom_name_map[Shell] = m_name;
589 _parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
590//Console.WriteLine("**** Create {2} Dicts: actor={0} name={1}", _parent_scene.actor_name_map.Count, _parent_scene.geom_name_map.Count, m_name);
569 591
570 d.GeomSetCategoryBits(Shell, (int)m_collisionCategories); 592 d.GeomSetCategoryBits(Shell, (int)m_collisionCategories);
571 d.GeomSetCollideBits(Shell, (int)m_collisionFlags); 593 d.GeomSetCollideBits(Shell, (int)m_collisionFlags);
@@ -931,10 +953,23 @@ namespace OpenSim.Region.Physics.OdePlugin
931 Body = IntPtr.Zero; 953 Body = IntPtr.Zero;
932 } 954 }
933 955
934 if (Shell != IntPtr.Zero) 956 if(Shell != IntPtr.Zero)
935 { 957 {
936 d.GeomDestroy(Shell); 958 try
937 _parent_scene.geom_name_map.Remove(Shell); 959 {
960 d.GeomDestroy(Shell);
961 }
962 catch (System.AccessViolationException)
963 {
964 m_log.Error("[PHYSICS]: PrimGeom dead");
965 }
966 // Remove any old entries
967//string tShell;
968//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
969//Console.WriteLine("**** Remove {0}", tShell);
970
971 if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
972 if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
938 Shell = IntPtr.Zero; 973 Shell = IntPtr.Zero;
939 } 974 }
940 975
@@ -1097,11 +1132,24 @@ namespace OpenSim.Region.Physics.OdePlugin
1097 1132
1098 Body = IntPtr.Zero; 1133 Body = IntPtr.Zero;
1099 } 1134 }
1100 1135
1101 if (Shell != IntPtr.Zero) 1136 if(Shell != IntPtr.Zero)
1102 { 1137 {
1103 d.GeomDestroy(Shell); 1138 try
1104 _parent_scene.geom_name_map.Remove(Shell); 1139 {
1140 d.GeomDestroy(Shell);
1141 }
1142 catch (System.AccessViolationException)
1143 {
1144 m_log.Error("[PHYSICS]: PrimGeom dead");
1145 }
1146 // Remove any old entries
1147//string tShell;
1148//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
1149//Console.WriteLine("**** Remove {0}", tShell);
1150
1151 if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
1152 if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
1105 Shell = IntPtr.Zero; 1153 Shell = IntPtr.Zero;
1106 } 1154 }
1107 } 1155 }
@@ -1277,9 +1325,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1277 + (Amotor!=IntPtr.Zero ? "Amotor ":"")); 1325 + (Amotor!=IntPtr.Zero ? "Amotor ":""));
1278 } 1326 }
1279 AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z, m_tensor); 1327 AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z, m_tensor);
1280
1281 _parent_scene.geom_name_map[Shell] = m_name;
1282 _parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
1283 _parent_scene.AddCharacter(this); 1328 _parent_scene.AddCharacter(this);
1284 } 1329 }
1285 else 1330 else
@@ -1299,17 +1344,28 @@ namespace OpenSim.Region.Physics.OdePlugin
1299 { 1344 {
1300 //kill the body 1345 //kill the body
1301 d.BodyDestroy(Body); 1346 d.BodyDestroy(Body);
1302
1303 Body = IntPtr.Zero; 1347 Body = IntPtr.Zero;
1304 } 1348 }
1305 1349
1306 if (Shell != IntPtr.Zero) 1350 if(Shell != IntPtr.Zero)
1307 { 1351 {
1308 d.GeomDestroy(Shell); 1352 try
1309 _parent_scene.geom_name_map.Remove(Shell); 1353 {
1354 d.GeomDestroy(Shell);
1355 }
1356 catch (System.AccessViolationException)
1357 {
1358 m_log.Error("[PHYSICS]: PrimGeom dead");
1359 }
1360 // Remove any old entries
1361//string tShell;
1362//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
1363//Console.WriteLine("**** Remove {0}", tShell);
1364
1365 if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
1366 if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
1310 Shell = IntPtr.Zero; 1367 Shell = IntPtr.Zero;
1311 } 1368 }
1312
1313 } 1369 }
1314 1370
1315 m_isPhysical = m_tainted_isPhysical; 1371 m_isPhysical = m_tainted_isPhysical;
@@ -1327,13 +1383,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1327 CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH; 1383 CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH;
1328 //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); 1384 //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
1329 d.BodyDestroy(Body); 1385 d.BodyDestroy(Body);
1330 d.GeomDestroy(Shell);
1331 AvatarGeomAndBodyCreation(_position.X, _position.Y, 1386 AvatarGeomAndBodyCreation(_position.X, _position.Y,
1332 _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor); 1387 _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
1333 Velocity = Vector3.Zero; 1388 Velocity = Vector3.Zero;
1334
1335 _parent_scene.geom_name_map[Shell] = m_name;
1336 _parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
1337 } 1389 }
1338 else 1390 else
1339 { 1391 {
diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
index 7ce01dc..6b17ce7 100644
--- a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
@@ -142,7 +142,7 @@ namespace OpenSim.Region.Physics.OdePlugin
142 private OdeScene _parent_scene; 142 private OdeScene _parent_scene;
143 public IntPtr m_targetSpace = IntPtr.Zero; 143 public IntPtr m_targetSpace = IntPtr.Zero;
144 public IntPtr prim_geom; 144 public IntPtr prim_geom;
145 public IntPtr prev_geom; 145// public IntPtr prev_geom;
146 public IntPtr _triMeshData; 146 public IntPtr _triMeshData;
147 147
148 private IntPtr _linkJointGroup = IntPtr.Zero; 148 private IntPtr _linkJointGroup = IntPtr.Zero;
@@ -274,7 +274,7 @@ namespace OpenSim.Region.Physics.OdePlugin
274 274
275 275
276 prim_geom = IntPtr.Zero; 276 prim_geom = IntPtr.Zero;
277 prev_geom = IntPtr.Zero; 277// prev_geom = IntPtr.Zero;
278 278
279 if (!pos.IsFinite()) 279 if (!pos.IsFinite())
280 { 280 {
@@ -776,13 +776,26 @@ namespace OpenSim.Region.Physics.OdePlugin
776 776
777 public void SetGeom(IntPtr geom) 777 public void SetGeom(IntPtr geom)
778 { 778 {
779 prev_geom = prim_geom; 779 if(prim_geom != IntPtr.Zero)
780 {
781 // Remove any old entries
782//string tPA;
783//_parent_scene.geom_name_map.TryGetValue(prim_geom, out tPA);
784//Console.WriteLine("**** Remove {0}", tPA);
785 if(_parent_scene.geom_name_map.ContainsKey(prim_geom)) _parent_scene.geom_name_map.Remove(prim_geom);
786 if(_parent_scene.actor_name_map.ContainsKey(prim_geom)) _parent_scene.actor_name_map.Remove(prim_geom);
787 d.GeomDestroy(prim_geom);
788 }
789
780 prim_geom = geom; 790 prim_geom = geom;
781//Console.WriteLine("SetGeom to " + prim_geom + " for " + m_primName); 791//Console.WriteLine("SetGeom to " + prim_geom + " for " + m_primName);
782 if (prim_geom != IntPtr.Zero) 792 if (prim_geom != IntPtr.Zero)
783 { 793 {
794 _parent_scene.geom_name_map[prim_geom] = this.m_primName;
795 _parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this;
784 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); 796 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
785 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); 797 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
798//Console.WriteLine("**** Create {2} Dicts: actor={0} name={1}", _parent_scene.actor_name_map.Count, _parent_scene.geom_name_map.Count, this.m_primName);
786 } 799 }
787 800
788 if (childPrim) 801 if (childPrim)
@@ -1774,17 +1787,17 @@ namespace OpenSim.Region.Physics.OdePlugin
1774 public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh) 1787 public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh)
1775 { 1788 {
1776//Console.WriteLine("CreateGeom:"); 1789//Console.WriteLine("CreateGeom:");
1777 if (_mesh != null) 1790 if (_mesh != null) // Special - make mesh
1778 { 1791 {
1779 setMesh(_parent_scene, _mesh); 1792 setMesh(_parent_scene, _mesh);
1780 } 1793 }
1781 else 1794 else // not a mesh
1782 { 1795 {
1783 if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1) 1796 if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1) // special profile??
1784 { 1797 {
1785 if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z) 1798 if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z) // Equi-size
1786 { 1799 {
1787 if (((_size.X / 2f) > 0f)) 1800 if (((_size.X / 2f) > 0f)) // Has size
1788 { 1801 {
1789 _parent_scene.waitForSpaceUnlock(m_targetSpace); 1802 _parent_scene.waitForSpaceUnlock(m_targetSpace);
1790 try 1803 try
@@ -1815,7 +1828,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1815 } 1828 }
1816 } 1829 }
1817 } 1830 }
1818 else 1831 else // not equi-size
1819 { 1832 {
1820 _parent_scene.waitForSpaceUnlock(m_targetSpace); 1833 _parent_scene.waitForSpaceUnlock(m_targetSpace);
1821 try 1834 try
@@ -1832,7 +1845,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1832 } 1845 }
1833 } 1846 }
1834 1847
1835 else 1848 else // not special profile
1836 { 1849 {
1837 _parent_scene.waitForSpaceUnlock(m_targetSpace); 1850 _parent_scene.waitForSpaceUnlock(m_targetSpace);
1838 try 1851 try
@@ -1894,9 +1907,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1894 } 1907 }
1895 } 1908 }
1896 1909
1897 _parent_scene.geom_name_map[prim_geom] = this.m_primName;
1898 _parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this;
1899
1900 changeSelectedStatus(timestep); 1910 changeSelectedStatus(timestep);
1901 1911
1902 m_taintadd = false; 1912 m_taintadd = false;
@@ -2045,22 +2055,7 @@ Console.WriteLine(" JointCreateFixed");
2045 { 2055 {
2046 if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim) 2056 if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim)
2047 { 2057 {
2048 2058 _mesh = null;
2049
2050 if (prim_geom != IntPtr.Zero)
2051 {
2052 try
2053 {
2054 d.GeomDestroy(prim_geom);
2055 prim_geom = IntPtr.Zero;
2056 _mesh = null;
2057 }
2058 catch (System.AccessViolationException)
2059 {
2060 prim_geom = IntPtr.Zero;
2061 m_log.Error("[PHYSICS]: PrimGeom dead");
2062 }
2063 }
2064//Console.WriteLine("changePhysicsStatus for " + m_primName ); 2059//Console.WriteLine("changePhysicsStatus for " + m_primName );
2065 changeadd(2f); 2060 changeadd(2f);
2066 } 2061 }
@@ -2120,8 +2115,6 @@ Console.WriteLine(" JointCreateFixed");
2120 _parent_scene.waitForSpaceUnlock(m_targetSpace); 2115 _parent_scene.waitForSpaceUnlock(m_targetSpace);
2121 d.SpaceRemove(m_targetSpace, prim_geom); 2116 d.SpaceRemove(m_targetSpace, prim_geom);
2122 } 2117 }
2123 d.GeomDestroy(prim_geom);
2124 prim_geom = IntPtr.Zero;
2125 // we don't need to do space calculation because the client sends a position update also. 2118 // we don't need to do space calculation because the client sends a position update also.
2126 2119
2127 // Construction of new prim 2120 // Construction of new prim
@@ -2223,16 +2216,8 @@ Console.WriteLine(" JointCreateFixed");
2223 disableBody(); 2216 disableBody();
2224 } 2217 }
2225 } 2218 }
2226 try 2219
2227 { 2220
2228 d.GeomDestroy(prim_geom);
2229 }
2230 catch (System.AccessViolationException)
2231 {
2232 prim_geom = IntPtr.Zero;
2233 m_log.Error("[PHYSICS]: PrimGeom dead");
2234 }
2235 prim_geom = IntPtr.Zero;
2236 // we don't need to do space calculation because the client sends a position update also. 2221 // we don't need to do space calculation because the client sends a position update also.
2237 if (_size.X <= 0) _size.X = 0.01f; 2222 if (_size.X <= 0) _size.X = 0.01f;
2238 if (_size.Y <= 0) _size.Y = 0.01f; 2223 if (_size.Y <= 0) _size.Y = 0.01f;
diff --git a/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs
index 79e2986..ab084fd 100644
--- a/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs
@@ -2206,6 +2206,12 @@ namespace OpenSim.Region.Physics.OdePlugin
2206 { 2206 {
2207 if (prim.prim_geom != IntPtr.Zero) 2207 if (prim.prim_geom != IntPtr.Zero)
2208 { 2208 {
2209
2210//string tPA;
2211//geom_name_map.TryGetValue(prim.prim_geom, out tPA);
2212//Console.WriteLine("**** Remove {0}", tPA);
2213 if(geom_name_map.ContainsKey(prim.prim_geom)) geom_name_map.Remove(prim.prim_geom);
2214 if(actor_name_map.ContainsKey(prim.prim_geom)) actor_name_map.Remove(prim.prim_geom);
2209 d.GeomDestroy(prim.prim_geom); 2215 d.GeomDestroy(prim.prim_geom);
2210 prim.prim_geom = IntPtr.Zero; 2216 prim.prim_geom = IntPtr.Zero;
2211 } 2217 }