Rewrite collision dictionary handling, cleans up deleted obects/avs. Fixes occasional collision event failure. ChOde only.
parent
5f4105d48c
commit
7ab103c96f
|
@ -1,5 +1,6 @@
|
||||||
.project
|
.project
|
||||||
.settings
|
.settings
|
||||||
|
.gitignore
|
||||||
*.csproj
|
*.csproj
|
||||||
*.csproj.user
|
*.csproj.user
|
||||||
*.build
|
*.build
|
||||||
|
@ -10,6 +11,7 @@
|
||||||
*.pidb
|
*.pidb
|
||||||
*.dll.build
|
*.dll.build
|
||||||
*.dll
|
*.dll
|
||||||
|
*.log
|
||||||
*.VisualState.xml
|
*.VisualState.xml
|
||||||
*/*/obj
|
*/*/obj
|
||||||
*/*/*/obj
|
*/*/*/obj
|
||||||
|
@ -23,6 +25,7 @@
|
||||||
*/*/*/*/*/bin
|
*/*/*/*/*/bin
|
||||||
*/*/*/*/*/*/bin
|
*/*/*/*/*/*/bin
|
||||||
*/*/*/*/*/*/*/bin
|
*/*/*/*/*/*/*/bin
|
||||||
|
addon-modules/
|
||||||
bin/Debug/*.dll
|
bin/Debug/*.dll
|
||||||
bin/*.dll.mdb
|
bin/*.dll.mdb
|
||||||
bin/*.db
|
bin/*.db
|
||||||
|
|
|
@ -565,7 +565,29 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
CAPSULE_RADIUS = 0.01f;
|
CAPSULE_RADIUS = 0.01f;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Shell != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
d.GeomDestroy(Shell);
|
||||||
|
}
|
||||||
|
catch (System.AccessViolationException)
|
||||||
|
{
|
||||||
|
m_log.Error("[PHYSICS]: PrimGeom dead");
|
||||||
|
}
|
||||||
|
// Remove any old entries
|
||||||
|
//string tShell;
|
||||||
|
//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tShell);
|
||||||
|
if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
|
||||||
|
if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
|
||||||
|
}
|
||||||
|
|
||||||
Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH);
|
Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH);
|
||||||
|
_parent_scene.geom_name_map[Shell] = m_name;
|
||||||
|
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
|
||||||
|
//Console.WriteLine("**** Create {2} Dicts: actor={0} name={1}", _parent_scene.actor_name_map.Count, _parent_scene.geom_name_map.Count, m_name);
|
||||||
|
|
||||||
d.GeomSetCategoryBits(Shell, (int)m_collisionCategories);
|
d.GeomSetCategoryBits(Shell, (int)m_collisionCategories);
|
||||||
d.GeomSetCollideBits(Shell, (int)m_collisionFlags);
|
d.GeomSetCollideBits(Shell, (int)m_collisionFlags);
|
||||||
|
@ -932,9 +954,22 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Shell != IntPtr.Zero)
|
if(Shell != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
d.GeomDestroy(Shell);
|
d.GeomDestroy(Shell);
|
||||||
_parent_scene.geom_name_map.Remove(Shell);
|
}
|
||||||
|
catch (System.AccessViolationException)
|
||||||
|
{
|
||||||
|
m_log.Error("[PHYSICS]: PrimGeom dead");
|
||||||
|
}
|
||||||
|
// Remove any old entries
|
||||||
|
//string tShell;
|
||||||
|
//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tShell);
|
||||||
|
|
||||||
|
if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
|
||||||
|
if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
|
||||||
Shell = IntPtr.Zero;
|
Shell = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1099,9 +1134,22 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Shell != IntPtr.Zero)
|
if(Shell != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
d.GeomDestroy(Shell);
|
d.GeomDestroy(Shell);
|
||||||
_parent_scene.geom_name_map.Remove(Shell);
|
}
|
||||||
|
catch (System.AccessViolationException)
|
||||||
|
{
|
||||||
|
m_log.Error("[PHYSICS]: PrimGeom dead");
|
||||||
|
}
|
||||||
|
// Remove any old entries
|
||||||
|
//string tShell;
|
||||||
|
//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tShell);
|
||||||
|
|
||||||
|
if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
|
||||||
|
if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
|
||||||
Shell = IntPtr.Zero;
|
Shell = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1277,9 +1325,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
+ (Amotor!=IntPtr.Zero ? "Amotor ":""));
|
+ (Amotor!=IntPtr.Zero ? "Amotor ":""));
|
||||||
}
|
}
|
||||||
AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z, m_tensor);
|
AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z, m_tensor);
|
||||||
|
|
||||||
_parent_scene.geom_name_map[Shell] = m_name;
|
|
||||||
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
|
|
||||||
_parent_scene.AddCharacter(this);
|
_parent_scene.AddCharacter(this);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1299,17 +1344,28 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
//kill the body
|
//kill the body
|
||||||
d.BodyDestroy(Body);
|
d.BodyDestroy(Body);
|
||||||
|
|
||||||
Body = IntPtr.Zero;
|
Body = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Shell != IntPtr.Zero)
|
if(Shell != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
d.GeomDestroy(Shell);
|
d.GeomDestroy(Shell);
|
||||||
_parent_scene.geom_name_map.Remove(Shell);
|
}
|
||||||
|
catch (System.AccessViolationException)
|
||||||
|
{
|
||||||
|
m_log.Error("[PHYSICS]: PrimGeom dead");
|
||||||
|
}
|
||||||
|
// Remove any old entries
|
||||||
|
//string tShell;
|
||||||
|
//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tShell);
|
||||||
|
|
||||||
|
if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
|
||||||
|
if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
|
||||||
Shell = IntPtr.Zero;
|
Shell = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_isPhysical = m_tainted_isPhysical;
|
m_isPhysical = m_tainted_isPhysical;
|
||||||
|
@ -1327,13 +1383,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH;
|
CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH;
|
||||||
//m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
|
//m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
|
||||||
d.BodyDestroy(Body);
|
d.BodyDestroy(Body);
|
||||||
d.GeomDestroy(Shell);
|
|
||||||
AvatarGeomAndBodyCreation(_position.X, _position.Y,
|
AvatarGeomAndBodyCreation(_position.X, _position.Y,
|
||||||
_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
|
_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
|
||||||
Velocity = Vector3.Zero;
|
Velocity = Vector3.Zero;
|
||||||
|
|
||||||
_parent_scene.geom_name_map[Shell] = m_name;
|
|
||||||
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -142,7 +142,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
private OdeScene _parent_scene;
|
private OdeScene _parent_scene;
|
||||||
public IntPtr m_targetSpace = IntPtr.Zero;
|
public IntPtr m_targetSpace = IntPtr.Zero;
|
||||||
public IntPtr prim_geom;
|
public IntPtr prim_geom;
|
||||||
public IntPtr prev_geom;
|
// public IntPtr prev_geom;
|
||||||
public IntPtr _triMeshData;
|
public IntPtr _triMeshData;
|
||||||
|
|
||||||
private IntPtr _linkJointGroup = IntPtr.Zero;
|
private IntPtr _linkJointGroup = IntPtr.Zero;
|
||||||
|
@ -274,7 +274,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
|
|
||||||
prim_geom = IntPtr.Zero;
|
prim_geom = IntPtr.Zero;
|
||||||
prev_geom = IntPtr.Zero;
|
// prev_geom = IntPtr.Zero;
|
||||||
|
|
||||||
if (!pos.IsFinite())
|
if (!pos.IsFinite())
|
||||||
{
|
{
|
||||||
|
@ -776,13 +776,26 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public void SetGeom(IntPtr geom)
|
public void SetGeom(IntPtr geom)
|
||||||
{
|
{
|
||||||
prev_geom = prim_geom;
|
if(prim_geom != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
// Remove any old entries
|
||||||
|
//string tPA;
|
||||||
|
//_parent_scene.geom_name_map.TryGetValue(prim_geom, out tPA);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tPA);
|
||||||
|
if(_parent_scene.geom_name_map.ContainsKey(prim_geom)) _parent_scene.geom_name_map.Remove(prim_geom);
|
||||||
|
if(_parent_scene.actor_name_map.ContainsKey(prim_geom)) _parent_scene.actor_name_map.Remove(prim_geom);
|
||||||
|
d.GeomDestroy(prim_geom);
|
||||||
|
}
|
||||||
|
|
||||||
prim_geom = geom;
|
prim_geom = geom;
|
||||||
//Console.WriteLine("SetGeom to " + prim_geom + " for " + m_primName);
|
//Console.WriteLine("SetGeom to " + prim_geom + " for " + m_primName);
|
||||||
if (prim_geom != IntPtr.Zero)
|
if (prim_geom != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
|
_parent_scene.geom_name_map[prim_geom] = this.m_primName;
|
||||||
|
_parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this;
|
||||||
d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
|
d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
|
||||||
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
|
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
|
||||||
|
//Console.WriteLine("**** Create {2} Dicts: actor={0} name={1}", _parent_scene.actor_name_map.Count, _parent_scene.geom_name_map.Count, this.m_primName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (childPrim)
|
if (childPrim)
|
||||||
|
@ -1774,17 +1787,17 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh)
|
public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh)
|
||||||
{
|
{
|
||||||
//Console.WriteLine("CreateGeom:");
|
//Console.WriteLine("CreateGeom:");
|
||||||
if (_mesh != null)
|
if (_mesh != null) // Special - make mesh
|
||||||
{
|
{
|
||||||
setMesh(_parent_scene, _mesh);
|
setMesh(_parent_scene, _mesh);
|
||||||
}
|
}
|
||||||
else
|
else // not a mesh
|
||||||
{
|
{
|
||||||
if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1)
|
if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1) // special profile??
|
||||||
{
|
{
|
||||||
if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z)
|
if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z) // Equi-size
|
||||||
{
|
{
|
||||||
if (((_size.X / 2f) > 0f))
|
if (((_size.X / 2f) > 0f)) // Has size
|
||||||
{
|
{
|
||||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||||
try
|
try
|
||||||
|
@ -1815,7 +1828,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else // not equi-size
|
||||||
{
|
{
|
||||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||||
try
|
try
|
||||||
|
@ -1832,7 +1845,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else // not special profile
|
||||||
{
|
{
|
||||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||||
try
|
try
|
||||||
|
@ -1894,9 +1907,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_parent_scene.geom_name_map[prim_geom] = this.m_primName;
|
|
||||||
_parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this;
|
|
||||||
|
|
||||||
changeSelectedStatus(timestep);
|
changeSelectedStatus(timestep);
|
||||||
|
|
||||||
m_taintadd = false;
|
m_taintadd = false;
|
||||||
|
@ -2045,22 +2055,7 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
{
|
{
|
||||||
if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim)
|
if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
if (prim_geom != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
d.GeomDestroy(prim_geom);
|
|
||||||
prim_geom = IntPtr.Zero;
|
|
||||||
_mesh = null;
|
_mesh = null;
|
||||||
}
|
|
||||||
catch (System.AccessViolationException)
|
|
||||||
{
|
|
||||||
prim_geom = IntPtr.Zero;
|
|
||||||
m_log.Error("[PHYSICS]: PrimGeom dead");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Console.WriteLine("changePhysicsStatus for " + m_primName );
|
//Console.WriteLine("changePhysicsStatus for " + m_primName );
|
||||||
changeadd(2f);
|
changeadd(2f);
|
||||||
}
|
}
|
||||||
|
@ -2120,8 +2115,6 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||||
d.SpaceRemove(m_targetSpace, prim_geom);
|
d.SpaceRemove(m_targetSpace, prim_geom);
|
||||||
}
|
}
|
||||||
d.GeomDestroy(prim_geom);
|
|
||||||
prim_geom = IntPtr.Zero;
|
|
||||||
// we don't need to do space calculation because the client sends a position update also.
|
// we don't need to do space calculation because the client sends a position update also.
|
||||||
|
|
||||||
// Construction of new prim
|
// Construction of new prim
|
||||||
|
@ -2223,16 +2216,8 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
disableBody();
|
disableBody();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try
|
|
||||||
{
|
|
||||||
d.GeomDestroy(prim_geom);
|
|
||||||
}
|
|
||||||
catch (System.AccessViolationException)
|
|
||||||
{
|
|
||||||
prim_geom = IntPtr.Zero;
|
|
||||||
m_log.Error("[PHYSICS]: PrimGeom dead");
|
|
||||||
}
|
|
||||||
prim_geom = IntPtr.Zero;
|
|
||||||
// we don't need to do space calculation because the client sends a position update also.
|
// we don't need to do space calculation because the client sends a position update also.
|
||||||
if (_size.X <= 0) _size.X = 0.01f;
|
if (_size.X <= 0) _size.X = 0.01f;
|
||||||
if (_size.Y <= 0) _size.Y = 0.01f;
|
if (_size.Y <= 0) _size.Y = 0.01f;
|
||||||
|
|
|
@ -2206,6 +2206,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
if (prim.prim_geom != IntPtr.Zero)
|
if (prim.prim_geom != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//string tPA;
|
||||||
|
//geom_name_map.TryGetValue(prim.prim_geom, out tPA);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tPA);
|
||||||
|
if(geom_name_map.ContainsKey(prim.prim_geom)) geom_name_map.Remove(prim.prim_geom);
|
||||||
|
if(actor_name_map.ContainsKey(prim.prim_geom)) actor_name_map.Remove(prim.prim_geom);
|
||||||
d.GeomDestroy(prim.prim_geom);
|
d.GeomDestroy(prim.prim_geom);
|
||||||
prim.prim_geom = IntPtr.Zero;
|
prim.prim_geom = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue