diff options
author | Kitto Flora | 2010-07-13 20:37:13 +0000 |
---|---|---|
committer | Kitto Flora | 2010-07-13 20:37:13 +0000 |
commit | 7ab103c96f3e82cac592f20d61358e1928da8e27 (patch) | |
tree | 0dd397de0b82b9eb2109847122d61bd86134b65e /OpenSim/Region/Physics/ChOdePlugin | |
parent | Removed the CHANGED_COLOR event post from the Color accessor in SOP. This is ... (diff) | |
download | opensim-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.cs | 90 | ||||
-rw-r--r-- | OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs | 67 | ||||
-rw-r--r-- | OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs | 6 |
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 | } |