* Bigish ODE stability Update. Run Prebuild
parent
12e0d8b316
commit
3588d89b2c
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -986,6 +986,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
public override void CrossingFailure()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue