aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/OdeScene.cs')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdeScene.cs152
1 files changed, 72 insertions, 80 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
index ffcb004..03ff6d8 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
@@ -105,8 +105,6 @@ namespace OpenSim.Region.Physics.OdePlugin
105 private readonly ILog m_log; 105 private readonly ILog m_log;
106 // private Dictionary<string, sCollisionData> m_storedCollisions = new Dictionary<string, sCollisionData>(); 106 // private Dictionary<string, sCollisionData> m_storedCollisions = new Dictionary<string, sCollisionData>();
107 107
108 CollisionLocker ode;
109
110 private Random fluidRandomizer = new Random(Environment.TickCount); 108 private Random fluidRandomizer = new Random(Environment.TickCount);
111 109
112 private const uint m_regionWidth = Constants.RegionSize; 110 private const uint m_regionWidth = Constants.RegionSize;
@@ -312,13 +310,12 @@ namespace OpenSim.Region.Physics.OdePlugin
312 /// Sets many properties that ODE requires to be stable 310 /// Sets many properties that ODE requires to be stable
313 /// These settings need to be tweaked 'exactly' right or weird stuff happens. 311 /// These settings need to be tweaked 'exactly' right or weird stuff happens.
314 /// </summary> 312 /// </summary>
315 public OdeScene(CollisionLocker dode, string sceneIdentifier) 313 public OdeScene(string sceneIdentifier)
316 { 314 {
317 m_log 315 m_log
318 = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.ToString() + "." + sceneIdentifier); 316 = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.ToString() + "." + sceneIdentifier);
319 317
320 OdeLock = new Object(); 318 OdeLock = new Object();
321 ode = dode;
322 nearCallback = near; 319 nearCallback = near;
323 triCallback = TriCallback; 320 triCallback = TriCallback;
324 triArrayCallback = TriArrayCallback; 321 triArrayCallback = TriArrayCallback;
@@ -767,8 +764,8 @@ namespace OpenSim.Region.Physics.OdePlugin
767 } 764 }
768 catch (SEHException) 765 catch (SEHException)
769 { 766 {
770 m_log.Error("[PHYSICS]: The Operating system shut down ODE because of corrupt memory. This could be a result of really irregular terrain. If this repeats continuously, restart using Basic Physics and terrain fill your terrain. Restarting the sim."); 767 m_log.Error(
771 ode.drelease(world); 768 "[PHYSICS]: The Operating system shut down ODE because of corrupt memory. This could be a result of really irregular terrain. If this repeats continuously, restart using Basic Physics and terrain fill your terrain. Restarting the sim.");
772 base.TriggerPhysicsBasedRestart(); 769 base.TriggerPhysicsBasedRestart();
773 } 770 }
774 catch (Exception e) 771 catch (Exception e)
@@ -1665,7 +1662,13 @@ namespace OpenSim.Region.Physics.OdePlugin
1665 pos.X = position.X; 1662 pos.X = position.X;
1666 pos.Y = position.Y; 1663 pos.Y = position.Y;
1667 pos.Z = position.Z; 1664 pos.Z = position.Z;
1668 OdeCharacter newAv = new OdeCharacter(avName, this, pos, ode, size, avPIDD, avPIDP, avCapRadius, avStandupTensor, avDensity, avHeightFudgeFactor, avMovementDivisorWalk, avMovementDivisorRun); 1665
1666 OdeCharacter newAv
1667 = new OdeCharacter(
1668 avName, this, pos, size, avPIDD, avPIDP,
1669 avCapRadius, avStandupTensor, avDensity, avHeightFudgeFactor,
1670 avMovementDivisorWalk, avMovementDivisorRun);
1671
1669 newAv.Flying = isFlying; 1672 newAv.Flying = isFlying;
1670 newAv.MinimumGroundFlightOffset = minimumGroundFlightOffset; 1673 newAv.MinimumGroundFlightOffset = minimumGroundFlightOffset;
1671 1674
@@ -1721,7 +1724,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1721 OdePrim newPrim; 1724 OdePrim newPrim;
1722 lock (OdeLock) 1725 lock (OdeLock)
1723 { 1726 {
1724 newPrim = new OdePrim(name, this, pos, siz, rot, pbs, isphysical, ode); 1727 newPrim = new OdePrim(name, this, pos, siz, rot, pbs, isphysical);
1725 1728
1726 lock (_prims) 1729 lock (_prims)
1727 _prims.Add(newPrim); 1730 _prims.Add(newPrim);
@@ -2158,84 +2161,80 @@ namespace OpenSim.Region.Physics.OdePlugin
2158 lock (prim) 2161 lock (prim)
2159 { 2162 {
2160 RemoveCollisionEventReporting(prim); 2163 RemoveCollisionEventReporting(prim);
2161 lock (ode) 2164
2165 if (prim.prim_geom != IntPtr.Zero)
2162 { 2166 {
2163 if (prim.prim_geom != IntPtr.Zero) 2167 prim.ResetTaints();
2164 {
2165 prim.ResetTaints();
2166 2168
2167 if (prim.IsPhysical) 2169 if (prim.IsPhysical)
2170 {
2171 prim.disableBody();
2172 if (prim.childPrim)
2168 { 2173 {
2169 prim.disableBody(); 2174 prim.childPrim = false;
2170 if (prim.childPrim) 2175 prim.Body = IntPtr.Zero;
2171 { 2176 prim.m_disabled = true;
2172 prim.childPrim = false; 2177 prim.IsPhysical = false;
2173 prim.Body = IntPtr.Zero; 2178 }
2174 prim.m_disabled = true;
2175 prim.IsPhysical = false;
2176 }
2177 2179
2178 2180
2179 } 2181 }
2180 // we don't want to remove the main space 2182 // we don't want to remove the main space
2181 2183
2182 // If the geometry is in the targetspace, remove it from the target space 2184 // If the geometry is in the targetspace, remove it from the target space
2183 //m_log.Warn(prim.m_targetSpace); 2185 //m_log.Warn(prim.m_targetSpace);
2184 2186
2185 //if (prim.m_targetSpace != IntPtr.Zero) 2187 //if (prim.m_targetSpace != IntPtr.Zero)
2186 //{ 2188 //{
2187 //if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom)) 2189 //if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom))
2188 //{ 2190 //{
2189 2191
2190 //if (d.GeomIsSpace(prim.m_targetSpace)) 2192 //if (d.GeomIsSpace(prim.m_targetSpace))
2191 //{ 2193 //{
2192 //waitForSpaceUnlock(prim.m_targetSpace); 2194 //waitForSpaceUnlock(prim.m_targetSpace);
2193 //d.SpaceRemove(prim.m_targetSpace, prim.prim_geom); 2195 //d.SpaceRemove(prim.m_targetSpace, prim.prim_geom);
2194 prim.m_targetSpace = IntPtr.Zero; 2196 prim.m_targetSpace = IntPtr.Zero;
2195 //} 2197 //}
2196 //else 2198 //else
2197 //{ 2199 //{
2198 // m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + 2200 // m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" +
2199 //((OdePrim)prim).m_targetSpace.ToString()); 2201 //((OdePrim)prim).m_targetSpace.ToString());
2200 //} 2202 //}
2201 2203
2202 //} 2204 //}
2203 //} 2205 //}
2204 //m_log.Warn(prim.prim_geom); 2206 //m_log.Warn(prim.prim_geom);
2205 2207
2206 if (!prim.RemoveGeom()) 2208 if (!prim.RemoveGeom())
2207 m_log.Warn("[PHYSICS]: Unable to remove prim from physics scene"); 2209 m_log.Warn("[PHYSICS]: Unable to remove prim from physics scene");
2208 2210
2209 lock (_prims) 2211 lock (_prims)
2210 _prims.Remove(prim); 2212 _prims.Remove(prim);
2211 2213
2212 //If there are no more geometries in the sub-space, we don't need it in the main space anymore 2214 //If there are no more geometries in the sub-space, we don't need it in the main space anymore
2213 //if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0) 2215 //if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0)
2214 //{ 2216 //{
2215 //if (prim.m_targetSpace != null) 2217 //if (prim.m_targetSpace != null)
2216 //{ 2218 //{
2217 //if (d.GeomIsSpace(prim.m_targetSpace)) 2219 //if (d.GeomIsSpace(prim.m_targetSpace))
2218 //{ 2220 //{
2219 //waitForSpaceUnlock(prim.m_targetSpace); 2221 //waitForSpaceUnlock(prim.m_targetSpace);
2220 //d.SpaceRemove(space, prim.m_targetSpace); 2222 //d.SpaceRemove(space, prim.m_targetSpace);
2221 // free up memory used by the space. 2223 // free up memory used by the space.
2222 //d.SpaceDestroy(prim.m_targetSpace); 2224 //d.SpaceDestroy(prim.m_targetSpace);
2223 //int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position); 2225 //int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position);
2224 //resetSpaceArrayItemToZero(xyspace[0], xyspace[1]); 2226 //resetSpaceArrayItemToZero(xyspace[0], xyspace[1]);
2225 //} 2227 //}
2226 //else 2228 //else
2227 //{ 2229 //{
2228 //m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + 2230 //m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" +
2229 //((OdePrim) prim).m_targetSpace.ToString()); 2231 //((OdePrim) prim).m_targetSpace.ToString());
2230 //} 2232 //}
2231 //} 2233 //}
2232 //} 2234 //}
2233 2235
2234 if (SupportsNINJAJoints) 2236 if (SupportsNINJAJoints)
2235 { 2237 RemoveAllJointsConnectedToActorThreadLocked(prim);
2236 RemoveAllJointsConnectedToActorThreadLocked(prim);
2237 }
2238 }
2239 } 2238 }
2240 } 2239 }
2241 } 2240 }
@@ -2835,16 +2834,9 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2835 catch (Exception e) 2834 catch (Exception e)
2836 { 2835 {
2837 m_log.ErrorFormat("[PHYSICS]: {0}, {1}, {2}", e.Message, e.TargetSite, e); 2836 m_log.ErrorFormat("[PHYSICS]: {0}, {1}, {2}", e.Message, e.TargetSite, e);
2838 ode.dunlock(world);
2839 } 2837 }
2840 2838
2841 step_time -= ODE_STEPSIZE; 2839 step_time -= ODE_STEPSIZE;
2842 //}
2843 //else
2844 //{
2845 //fps = 0;
2846 //}
2847 //}
2848 } 2840 }
2849 2841
2850 lock (_characters) 2842 lock (_characters)