* Bigish ODE stability Update. Run Prebuild

ThreadPoolClientBranch
Teravus Ovares 2008-02-13 23:14:41 +00:00
parent 12e0d8b316
commit 3588d89b2c
10 changed files with 381 additions and 176 deletions

View File

@ -825,77 +825,92 @@ namespace OpenSim.Region.Communications.OGS1
/// <returns></returns> /// <returns></returns>
public bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData) public bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData)
{ {
RegionInfo regInfo = null; int failures = 0;
try lock (m_deadRegionCache)
{ {
if (m_localBackend.InformRegionOfPrimCrossing(regionHandle, primID, objData)) if (m_deadRegionCache.ContainsKey(regionHandle))
{ {
return true; failures = m_deadRegionCache[regionHandle];
} }
}
regInfo = RequestNeighbourInfo(regionHandle); if (failures <= 3)
if (regInfo != null) {
RegionInfo regInfo = null;
try
{ {
//don't want to be creating a new link to the remote instance every time like we are here if (m_localBackend.InformRegionOfPrimCrossing(regionHandle, primID, objData))
bool retValue = false;
OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting) Activator.GetObject(
typeof (OGS1InterRegionRemoting),
"tcp://" + regInfo.RemotingAddress +
":" + regInfo.RemotingPort +
"/InterRegions");
if (remObject != null)
{ {
retValue = remObject.InformRegionOfPrimCrossing(regionHandle, primID.UUID, objData); return true;
} }
else
regInfo = RequestNeighbourInfo(regionHandle);
if (regInfo != null)
{ {
Console.WriteLine("remoting object not found"); //don't want to be creating a new link to the remote instance every time like we are here
bool retValue = false;
OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject(
typeof(OGS1InterRegionRemoting),
"tcp://" + regInfo.RemotingAddress +
":" + regInfo.RemotingPort +
"/InterRegions");
if (remObject != null)
{
retValue = remObject.InformRegionOfPrimCrossing(regionHandle, primID.UUID, objData);
}
else
{
Console.WriteLine("remoting object not found");
}
remObject = null;
return retValue;
} }
remObject = null; NoteDeadRegion(regionHandle);
return false;
return retValue;
} }
NoteDeadRegion(regionHandle); catch (RemotingException e)
return false; {
} NoteDeadRegion(regionHandle);
catch (RemotingException e) m_log.Warn("Remoting Error: Unable to connect to adjacent region: " + regionHandle);
{ m_log.Debug(e.ToString());
NoteDeadRegion(regionHandle); return false;
m_log.Warn("Remoting Error: Unable to connect to adjacent region: " + regionHandle); }
m_log.Debug(e.ToString()); catch (SocketException e)
return false; {
} NoteDeadRegion(regionHandle);
catch (SocketException e) m_log.Warn("Remoting Error: Unable to connect to adjacent region: " + regionHandle);
{ m_log.Debug(e.ToString());
NoteDeadRegion(regionHandle); return false;
m_log.Warn("Remoting Error: Unable to connect to adjacent region: " + regionHandle); }
m_log.Debug(e.ToString()); catch (InvalidCredentialException e)
return false; {
} NoteDeadRegion(regionHandle);
catch (InvalidCredentialException e) m_log.Warn("Invalid Credential Exception: Invalid Credentials : " + regionHandle);
{ m_log.Debug(e.ToString());
NoteDeadRegion(regionHandle); return false;
m_log.Warn("Invalid Credential Exception: Invalid Credentials : " + regionHandle); }
m_log.Debug(e.ToString()); catch (AuthenticationException e)
return false; {
} NoteDeadRegion(regionHandle);
catch (AuthenticationException e) m_log.Warn("Authentication exception: Unable to connect to adjacent region: " + regionHandle);
{
NoteDeadRegion(regionHandle);
m_log.Warn("Authentication exception: Unable to connect to adjacent region: " + regionHandle);
m_log.Debug(e.ToString()); m_log.Debug(e.ToString());
return false; return false;
}
catch (Exception e)
{
NoteDeadRegion(regionHandle);
m_log.Warn("Unknown exception: Unable to connect to adjacent region: " + regionHandle);
m_log.Debug(e.ToString());
return false;
}
} }
catch (Exception e) else
{ {
NoteDeadRegion(regionHandle);
m_log.Warn("Unknown exception: Unable to connect to adjacent region: " + regionHandle);
m_log.Debug(e.ToString());
return false; return false;
} }
} }

View File

@ -351,5 +351,9 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
public override void SetMomentum(PhysicsVector momentum) public override void SetMomentum(PhysicsVector momentum)
{ {
} }
public override void CrossingFailure()
{
}
} }
} }

View File

@ -986,6 +986,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin
} }
#endregion #endregion
public override void CrossingFailure()
{
}
} }
/// <summary> /// <summary>

View File

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace OpenSim.Region.Physics.Manager
{
public class CollisionLocker
{
private bool locked = false;
private List<IntPtr> worldlock = new List<IntPtr>();
public CollisionLocker()
{
}
public void dlock(IntPtr world)
{
lock (worldlock)
{
worldlock.Add(world);
}
}
public void dunlock(IntPtr world)
{
lock (worldlock)
{
worldlock.Remove(world);
}
}
public bool lockquery()
{
return (worldlock.Count > 0);
}
public void drelease(IntPtr world)
{
lock (worldlock)
{
if (worldlock.Contains(world))
worldlock.Remove(world);
}
}
}
}

View File

@ -126,6 +126,8 @@ namespace OpenSim.Region.Physics.Manager
public abstract bool Selected { set; } public abstract bool Selected { set; }
public abstract void CrossingFailure();
public virtual void RequestPhysicsterseUpdate() public virtual void RequestPhysicsterseUpdate()
{ {
// Make a temporary copy of the event to avoid possibility of // Make a temporary copy of the event to avoid possibility of
@ -279,6 +281,11 @@ namespace OpenSim.Region.Physics.Manager
get { return 0f; } get { return 0f; }
} }
public override void CrossingFailure()
{
}
public override Quaternion Orientation public override Quaternion Orientation
{ {

View File

@ -16,7 +16,7 @@
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMEd. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
@ -35,7 +35,7 @@ using OpenSim.Region.Physics.Manager;
namespace OpenSim.Region.Physics.OdePlugin namespace OpenSim.Region.Physics.OdePlugin
{ {
/// <summary> /// <summary>
/// Various properties that ODE uses for AMotors but isn't exposed in ODE.NET so we must define them ourselves. /// Various properties that ODE uses for AMotors but isn't exposed in d.NET so we must define them ourselves.
/// </summary> /// </summary>
public enum dParam : int public enum dParam : int
@ -87,6 +87,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private bool m_hackSentFall = false; private bool m_hackSentFall = false;
private bool m_hackSentFly = false; private bool m_hackSentFly = false;
private bool m_foundDebian = false; private bool m_foundDebian = false;
private CollisionLocker ode;
private string m_name = String.Empty; private string m_name = String.Empty;
@ -103,8 +104,9 @@ namespace OpenSim.Region.Physics.OdePlugin
public d.Mass ShellMass; public d.Mass ShellMass;
public bool collidelock = false; public bool collidelock = false;
public OdeCharacter(String avName, OdeScene parent_scene, PhysicsVector pos) public OdeCharacter(String avName, OdeScene parent_scene, PhysicsVector pos, CollisionLocker dode)
{ {
ode = dode;
_velocity = new PhysicsVector(); _velocity = new PhysicsVector();
_target_velocity = new PhysicsVector(); _target_velocity = new PhysicsVector();
_position = pos; _position = pos;
@ -801,5 +803,9 @@ namespace OpenSim.Region.Physics.OdePlugin
d.BodyDestroy(Body); d.BodyDestroy(Body);
} }
} }
public override void CrossingFailure()
{
}
} }
} }

View File

@ -16,7 +16,7 @@
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMEd. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
@ -56,6 +56,8 @@ namespace OpenSim.Region.Physics.OdePlugin
public bool m_taintremove = false; public bool m_taintremove = false;
public bool m_taintdisable = false; public bool m_taintdisable = false;
public bool m_disabled = false; public bool m_disabled = false;
public bool m_taintadd = false;
private CollisionLocker ode;
private bool m_taintforce = false; private bool m_taintforce = false;
private List<PhysicsVector> m_forcelist = new List<PhysicsVector>(); private List<PhysicsVector> m_forcelist = new List<PhysicsVector>();
@ -74,6 +76,7 @@ namespace OpenSim.Region.Physics.OdePlugin
public int m_interpenetrationcount = 0; public int m_interpenetrationcount = 0;
public int m_collisionscore = 0; public int m_collisionscore = 0;
public int m_roundsUnderMotionThreshold = 0; public int m_roundsUnderMotionThreshold = 0;
private int m_crossingfailures = 0;
public bool outofBounds = false; public bool outofBounds = false;
private float m_density = 10.000006836f; // Aluminum g/cm3; private float m_density = 10.000006836f; // Aluminum g/cm3;
@ -90,9 +93,9 @@ namespace OpenSim.Region.Physics.OdePlugin
private int debugcounter = 0; private int debugcounter = 0;
public OdePrim(String primName, OdeScene parent_scene, IntPtr targetSpace, PhysicsVector pos, PhysicsVector size, public OdePrim(String primName, OdeScene parent_scene, IntPtr targetSpace, PhysicsVector pos, PhysicsVector size,
Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical) Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode)
{ {
ode = dode;
_velocity = new PhysicsVector(); _velocity = new PhysicsVector();
_position = pos; _position = pos;
m_taintposition = pos; m_taintposition = pos;
@ -136,86 +139,11 @@ namespace OpenSim.Region.Physics.OdePlugin
m_targetSpace = _parent_scene.space; m_targetSpace = _parent_scene.space;
} }
m_primName = primName; m_primName = primName;
if (mesh != null) m_taintadd = true;
{ _parent_scene.AddPhysicsActorTaint(this);
} // don't do .add() here; old geoms get recycled with the same hash
else parent_scene.geom_name_map[prim_geom] = primName;
{ parent_scene.actor_name_map[prim_geom] = (PhysicsActor) this;
if (_parent_scene.needsMeshing(_pbs))
{
// Don't need to re-enable body.. it's done in SetMesh
mesh = _parent_scene.mesher.CreateMesh(m_primName, _pbs, _size);
// createmesh returns null when it's a shape that isn't a cube.
}
}
lock (OdeScene.OdeLock)
{
if (mesh != null)
{
setMesh(parent_scene, mesh);
}
else
{
if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1)
{
if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z)
{
if (((_size.X / 2f) > 0f))
{
_parent_scene.waitForSpaceUnlock(m_targetSpace);
prim_geom = d.CreateSphere(m_targetSpace, _size.X / 2);
}
else
{
_parent_scene.waitForSpaceUnlock(m_targetSpace);
prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
}
}
else
{
_parent_scene.waitForSpaceUnlock(m_targetSpace);
prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
}
}
//else if (pbs.ProfileShape == ProfileShape.Circle && pbs.PathCurve == (byte)Extrusion.Straight)
//{
//Cyllinder
//if (_size.X == _size.Y)
//{
//prim_geom = d.CreateCylinder(m_targetSpace, _size.X / 2, _size.Z);
//}
//else
//{
//prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
//}
//}
else
{
_parent_scene.waitForSpaceUnlock(m_targetSpace);
prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
}
}
d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
d.Quaternion myrot = new d.Quaternion();
myrot.W = rotation.w;
myrot.X = rotation.x;
myrot.Y = rotation.y;
myrot.Z = rotation.z;
d.GeomSetQuaternion(prim_geom, ref myrot);
if (m_isphysical && Body == (IntPtr) 0)
{
enableBody();
}
parent_scene.geom_name_map[prim_geom] = primName;
parent_scene.actor_name_map[prim_geom] = (PhysicsActor) this;
// don't do .add() here; old geoms get recycled with the same hash
}
} }
/// <summary> /// <summary>
@ -399,15 +327,18 @@ namespace OpenSim.Region.Physics.OdePlugin
public void setMesh(OdeScene parent_scene, IMesh mesh) public void setMesh(OdeScene parent_scene, IMesh mesh)
{ {
// This sleeper is there to moderate how long it takes between
// setting up the mesh and pre-processing it when we get rapid fire mesh requests on a single object
System.Threading.Thread.Sleep(10);
//Kill Body so that mesh can re-make the geom //Kill Body so that mesh can re-make the geom
if (IsPhysical && Body != (IntPtr) 0) if (IsPhysical && Body != (IntPtr) 0)
{ {
disableBody(); disableBody();
} }
// This sleeper is there to moderate how long it takes between
// setting up the mesh and pre-processing it when we get rapid fire mesh requests on a single object
System.Threading.Thread.Sleep(10);
float[] vertexList = mesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory float[] vertexList = mesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory
@ -448,6 +379,10 @@ namespace OpenSim.Region.Physics.OdePlugin
public void ProcessTaints(float timestep) public void ProcessTaints(float timestep)
{ {
System.Threading.Thread.Sleep(5); System.Threading.Thread.Sleep(5);
if (m_taintadd)
changeadd(timestep);
if (m_taintposition != _position) if (m_taintposition != _position)
Move(timestep); Move(timestep);
@ -477,8 +412,124 @@ namespace OpenSim.Region.Physics.OdePlugin
changevelocity(timestep); changevelocity(timestep);
} }
public void changeadd(float timestep)
{
if (_mesh != null)
{
}
else
{
if (_parent_scene.needsMeshing(_pbs))
{
// Don't need to re-enable body.. it's done in SetMesh
_mesh = _parent_scene.mesher.CreateMesh(m_primName, _pbs, _size);
// createmesh returns null when it's a shape that isn't a cube.
}
}
lock (OdeScene.OdeLock)
{
if (_mesh != null)
{
setMesh(_parent_scene, _mesh);
}
else
{
if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1)
{
if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z)
{
if (((_size.X / 2f) > 0f))
{
_parent_scene.waitForSpaceUnlock(m_targetSpace);
try
{
prim_geom = d.CreateSphere(m_targetSpace, _size.X / 2);
}
catch (System.AccessViolationException)
{
m_log.Warn("[PHYSICS]: Unable to create physics proxy for object");
return;
}
}
else
{
_parent_scene.waitForSpaceUnlock(m_targetSpace);
try
{
prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
}
catch (System.AccessViolationException)
{
m_log.Warn("[PHYSICS]: Unable to create physics proxy for object");
return;
}
}
}
else
{
_parent_scene.waitForSpaceUnlock(m_targetSpace);
try
{
prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
}
catch (System.AccessViolationException)
{
return;
m_log.Warn("[PHYSICS]: Unable to create physics proxy for object");
}
}
}
//else if (pbs.ProfileShape == ProfileShape.Circle && pbs.PathCurve == (byte)Extrusion.Straight)
//{
//Cyllinder
//if (_size.X == _size.Y)
//{
//prim_geom = d.CreateCylinder(m_targetSpace, _size.X / 2, _size.Z);
//}
//else
//{
//prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
//}
//}
else
{
_parent_scene.waitForSpaceUnlock(m_targetSpace);
try
{
prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
}
catch (System.AccessViolationException)
{
m_log.Warn("[PHYSICS]: Unable to create physics proxy for object");
return;
}
}
}
d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
d.Quaternion myrot = new d.Quaternion();
myrot.W = _orientation.w;
myrot.X = _orientation.x;
myrot.Y = _orientation.y;
myrot.Z = _orientation.z;
d.GeomSetQuaternion(prim_geom, ref myrot);
if (m_isphysical && Body == (IntPtr)0)
{
enableBody();
}
}
m_taintadd = false;
}
public void Move(float timestep) public void Move(float timestep)
{ {
if (m_isphysical) if (m_isphysical)
@ -941,7 +992,15 @@ namespace OpenSim.Region.Physics.OdePlugin
} }
set { m_rotationalVelocity = value; } set { m_rotationalVelocity = value; }
} }
public override void CrossingFailure()
{
m_crossingfailures++;
if (m_crossingfailures >= 5)
{
m_log.Warn("[PHYSICS]: Too many crossing failures for: " + m_primName);
}
}
public void UpdatePositionAndVelocity() public void UpdatePositionAndVelocity()
{ {
// no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit!
@ -969,7 +1028,10 @@ namespace OpenSim.Region.Physics.OdePlugin
if (l_position.X > 257f || l_position.X < -1f || l_position.Y > 257f || l_position.Y < -1f) if (l_position.X > 257f || l_position.X < -1f || l_position.Y > 257f || l_position.Y < -1f)
{ {
base.RequestPhysicsterseUpdate(); if (m_crossingfailures < 5)
{
base.RequestPhysicsterseUpdate();
}
} }
if (l_position.Z < 0) if (l_position.Z < 0)

View File

@ -16,7 +16,7 @@
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMEd. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
@ -46,10 +46,12 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private CollisionLocker ode;
private OdeScene _mScene; private OdeScene _mScene;
public OdePlugin() public OdePlugin()
{ {
ode = new CollisionLocker();
} }
public bool Init() public bool Init()
@ -61,7 +63,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
if (_mScene == null) if (_mScene == null)
{ {
_mScene = new OdeScene(); _mScene = new OdeScene(ode);
} }
return (_mScene); return (_mScene);
} }
@ -74,7 +76,7 @@ namespace OpenSim.Region.Physics.OdePlugin
public void Dispose() public void Dispose()
{ {
d.CloseODE();
} }
} }
@ -82,6 +84,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
CollisionLocker ode;
// TODO: this should be hard-coded in some common place // TODO: this should be hard-coded in some common place
private const uint m_regionWidth = 256; private const uint m_regionWidth = 256;
private const uint m_regionHeight = 256; private const uint m_regionHeight = 256;
@ -137,8 +140,9 @@ namespace OpenSim.Region.Physics.OdePlugin
/// Sets many properties that ODE requires to be stable /// Sets many properties that ODE requires to be stable
/// These settings need to be tweaked 'exactly' right or weird stuff happens. /// These settings need to be tweaked 'exactly' right or weird stuff happens.
/// </summary> /// </summary>
public OdeScene() public OdeScene(CollisionLocker dode)
{ {
ode = dode;
nearCallback = near; nearCallback = near;
triCallback = TriCallback; triCallback = TriCallback;
triArrayCallback = TriArrayCallback; triArrayCallback = TriArrayCallback;
@ -178,6 +182,7 @@ namespace OpenSim.Region.Physics.OdePlugin
lock (OdeLock) lock (OdeLock)
{ {
// Creat the world and the first space // Creat the world and the first space
world = d.WorldCreate(); world = d.WorldCreate();
space = d.HashSpaceCreate(IntPtr.Zero); space = d.HashSpaceCreate(IntPtr.Zero);
@ -268,8 +273,14 @@ namespace OpenSim.Region.Physics.OdePlugin
// We'll be calling near recursivly if one // We'll be calling near recursivly if one
// of them is a space to find all of the // of them is a space to find all of the
// contact points in the space // contact points in the space
try
d.SpaceCollide2(g1, g2, IntPtr.Zero, nearCallback); {
d.SpaceCollide2(g1, g2, IntPtr.Zero, nearCallback);
}
catch (System.AccessViolationException)
{
m_log.Warn("[PHYSICS]: Unable to collide test a space");
}
//Colliding a space or a geom with a space or a geom. so drill down //Colliding a space or a geom with a space or a geom. so drill down
//Collide all geoms in each space.. //Collide all geoms in each space..
@ -304,7 +315,7 @@ namespace OpenSim.Region.Physics.OdePlugin
name2 = "null"; name2 = "null";
} }
//if (id == d.GeomClassID.TriMeshClass) //if (id == d.GeomClassId.TriMeshClass)
//{ //{
// m_log.Info("near: A collision was detected between {1} and {2}", 0, name1, name2); // m_log.Info("near: A collision was detected between {1} and {2}", 0, name1, name2);
//System.Console.WriteLine("near: A collision was detected between {1} and {2}", 0, name1, name2); //System.Console.WriteLine("near: A collision was detected between {1} and {2}", 0, name1, name2);
@ -321,6 +332,10 @@ namespace OpenSim.Region.Physics.OdePlugin
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."); 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.");
base.TriggerPhysicsBasedRestart(); base.TriggerPhysicsBasedRestart();
} }
catch (System.AccessViolationException)
{
m_log.Warn("[PHYSICS]: Unable to collide test an object");
}
PhysicsActor p1; PhysicsActor p1;
PhysicsActor p2; PhysicsActor p2;
@ -438,7 +453,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (contacts[i].depth >= 0.25f) if (contacts[i].depth >= 0.25f)
{ {
// Don't collide, one or both prim will explode. // Don't collide, one or both prim will expld.
op1.m_interpenetrationcount++; op1.m_interpenetrationcount++;
@ -596,8 +611,14 @@ namespace OpenSim.Region.Physics.OdePlugin
// And we'll run this again against the avatar and the space segment // And we'll run this again against the avatar and the space segment
// This will return with a bunch of possible objects in the space segment // This will return with a bunch of possible objects in the space segment
// and we'll run it again on all of them. // and we'll run it again on all of them.
try
d.SpaceCollide2(space, chr.Shell, IntPtr.Zero, nearCallback); {
d.SpaceCollide2(space, chr.Shell, IntPtr.Zero, nearCallback);
}
catch (AccessViolationException)
{
m_log.Warn("[PHYSICS]: Unable to space collide");
}
//float terrainheight = GetTerrainHeightAtXY(chr.Position.X, chr.Position.Y); //float terrainheight = GetTerrainHeightAtXY(chr.Position.X, chr.Position.Y);
//if (chr.Position.Z + (chr.Velocity.Z * timeStep) < terrainheight + 10) //if (chr.Position.Z + (chr.Velocity.Z * timeStep) < terrainheight + 10)
//{ //{
@ -616,8 +637,14 @@ namespace OpenSim.Region.Physics.OdePlugin
// This if may not need to be there.. it might be skipped anyway. // This if may not need to be there.. it might be skipped anyway.
if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled)) if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled))
{ {
try
d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); {
d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback);
}
catch (AccessViolationException)
{
m_log.Warn("[PHYSICS]: Unable to space collide");
}
//calculateSpaceForGeom(chr.Position) //calculateSpaceForGeom(chr.Position)
//foreach (OdePrim ch2 in _prims) //foreach (OdePrim ch2 in _prims)
/// should be a separate space -- lots of avatars will be N**2 slow /// should be a separate space -- lots of avatars will be N**2 slow
@ -634,7 +661,14 @@ namespace OpenSim.Region.Physics.OdePlugin
//} //}
//} //}
} }
d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback); try
{
d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback);
}
catch (AccessViolationException)
{
m_log.Warn("[PHYSICS]: Unable to space collide");
}
} }
} }
else else
@ -663,7 +697,7 @@ namespace OpenSim.Region.Physics.OdePlugin
pos.X = position.X; pos.X = position.X;
pos.Y = position.Y; pos.Y = position.Y;
pos.Z = position.Z; pos.Z = position.Z;
OdeCharacter newAv = new OdeCharacter(avName, this, pos); OdeCharacter newAv = new OdeCharacter(avName, this, pos, ode);
_characters.Add(newAv); _characters.Add(newAv);
return newAv; return newAv;
} }
@ -1007,7 +1041,7 @@ namespace OpenSim.Region.Physics.OdePlugin
OdePrim newPrim; OdePrim newPrim;
lock (OdeLock) lock (OdeLock)
{ {
newPrim = new OdePrim(name, this, targetspace, pos, siz, rot, mesh, pbs, isphysical); newPrim = new OdePrim(name, this, targetspace, pos, siz, rot, mesh, pbs, isphysical, ode);
_prims.Add(newPrim); _prims.Add(newPrim);
} }
@ -1203,8 +1237,15 @@ namespace OpenSim.Region.Physics.OdePlugin
actor.Move(timeStep); actor.Move(timeStep);
actor.collidelock = true; actor.collidelock = true;
} }
ode.dlock(world);
collision_optimized(timeStep); collision_optimized(timeStep);
ode.dunlock(world);
try try
{ {
d.WorldQuickStep(world, ODE_STEPSIZE); d.WorldQuickStep(world, ODE_STEPSIZE);
@ -1228,25 +1269,28 @@ namespace OpenSim.Region.Physics.OdePlugin
actor.UpdatePositionAndVelocity(); actor.UpdatePositionAndVelocity();
} }
bool processedtaints = false; if (!ode.lockquery())
foreach (OdePrim prim in _taintedPrim)
{ {
prim.ProcessTaints(timeStep); bool processedtaints = false;
if (prim.m_taintremove) foreach (OdePrim prim in _taintedPrim)
{ {
RemovePrimThreadLocked(prim); prim.ProcessTaints(timeStep);
} if (prim.m_taintremove)
processedtaints = true; {
prim.m_collisionscore = 0; RemovePrimThreadLocked(prim);
}
processedtaints = true;
prim.m_collisionscore = 0;
}
if (processedtaints)
_taintedPrim = new List<OdePrim>();
} }
foreach (OdePrim prim in _activeprims) foreach (OdePrim prim in _activeprims)
{ {
prim.m_collisionscore = 0; prim.m_collisionscore = 0;
} }
if (processedtaints)
_taintedPrim = new List<OdePrim>();
if (timeStep < 0.2f) if (timeStep < 0.2f)
{ {

View File

@ -480,6 +480,10 @@ namespace OpenSim.Region.Physics.POSPlugin
public override void SetMomentum(PhysicsVector momentum) public override void SetMomentum(PhysicsVector momentum)
{ {
} }
public override void CrossingFailure()
{
}
} }
public class POSPrim : PhysicsActor public class POSPrim : PhysicsActor
@ -640,6 +644,10 @@ namespace OpenSim.Region.Physics.POSPlugin
{ {
set { return; } set { return; }
} }
public override void CrossingFailure()
{
}
} }
} }

View File

@ -393,6 +393,10 @@ namespace OpenSim.Region.Physics.PhysXPlugin
_position.Y = vec.Y; _position.Y = vec.Y;
_position.Z = vec.Z; _position.Z = vec.Z;
} }
public override void CrossingFailure()
{
}
} }
@ -577,5 +581,9 @@ namespace OpenSim.Region.Physics.PhysXPlugin
{ {
get { return PhysicsVector.Zero; } get { return PhysicsVector.Zero; }
} }
public override void CrossingFailure()
{
}
} }
} }