When an ODECharacter is removed (e.g. when an avatar leaves a scene), remove the actor reference in OdeScene.actor_name_map rather than leaving it dangling.

This also largely centralizes adds/removes in OdeScene.AddCharacter()/RemoveCharacter()
0.7.2-post-fixes
Justin Clark-Casey (justincc) 2011-11-21 18:27:41 +00:00
parent 5cd33f5e21
commit 1850b778e2
2 changed files with 23 additions and 10 deletions

View File

@ -598,13 +598,11 @@ namespace OpenSim.Region.Physics.OdePlugin
d.RFromAxisAndAngle(out m_caprot, 0, 0, 1, (float)(Math.PI / 2)); d.RFromAxisAndAngle(out m_caprot, 0, 0, 1, (float)(Math.PI / 2));
} }
d.GeomSetRotation(Shell, ref m_caprot); d.GeomSetRotation(Shell, ref m_caprot);
d.BodySetRotation(Body, ref m_caprot); d.BodySetRotation(Body, ref m_caprot);
d.GeomSetBody(Shell, Body); d.GeomSetBody(Shell, Body);
// The purpose of the AMotor here is to keep the avatar's physical // The purpose of the AMotor here is to keep the avatar's physical
// surrogate from rotating while moving // surrogate from rotating while moving
Amotor = d.JointCreateAMotor(_parent_scene.world, IntPtr.Zero); Amotor = d.JointCreateAMotor(_parent_scene.world, IntPtr.Zero);
@ -659,7 +657,6 @@ namespace OpenSim.Region.Physics.OdePlugin
//standupStraight(); //standupStraight();
} }
//
/// <summary> /// <summary>
/// Uses the capped cyllinder volume formula to calculate the avatar's mass. /// Uses the capped cyllinder volume formula to calculate the avatar's mass.
/// This may be used in calculations in the scene/scenepresence /// This may be used in calculations in the scene/scenepresence
@ -1158,14 +1155,12 @@ 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)
{ {
d.GeomDestroy(Shell); d.GeomDestroy(Shell);
_parent_scene.geom_name_map.Remove(Shell);
Shell = IntPtr.Zero; Shell = IntPtr.Zero;
} }
} }
@ -1262,10 +1257,8 @@ namespace OpenSim.Region.Physics.OdePlugin
+ (Body!=IntPtr.Zero ? "Body ":"") + (Body!=IntPtr.Zero ? "Body ":"")
+ (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] = Name;
_parent_scene.actor_name_map[Shell] = this;
_parent_scene.AddCharacter(this); _parent_scene.AddCharacter(this);
} }
else else
@ -1301,7 +1294,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// Velocity = Vector3.Zero; // Velocity = Vector3.Zero;
_parent_scene.geom_name_map[Shell] = Name; _parent_scene.geom_name_map[Shell] = Name;
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this; _parent_scene.actor_name_map[Shell] = this;
} }
else else
{ {

View File

@ -233,8 +233,23 @@ namespace OpenSim.Region.Physics.OdePlugin
private readonly List<PhysicsActor> _collisionEventPrim = new List<PhysicsActor>(); private readonly List<PhysicsActor> _collisionEventPrim = new List<PhysicsActor>();
private readonly HashSet<OdeCharacter> _badCharacter = new HashSet<OdeCharacter>(); private readonly HashSet<OdeCharacter> _badCharacter = new HashSet<OdeCharacter>();
/// <summary>
/// Maps a unique geometry id (a memory location) to a physics actor name.
/// </summary>
/// <remarks>
/// Only actors participating in collisions have geometries.
/// </remarks>
public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>();
/// <summary>
/// Maps a unique geometry id (a memory location) to a physics actor.
/// </summary>
/// <remarks>
/// Only actors participating in collisions have geometries.
/// </remarks>
public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>(); public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>();
private bool m_NINJA_physics_joints_enabled = false; private bool m_NINJA_physics_joints_enabled = false;
//private Dictionary<String, IntPtr> jointpart_name_map = new Dictionary<String,IntPtr>(); //private Dictionary<String, IntPtr> jointpart_name_map = new Dictionary<String,IntPtr>();
private readonly Dictionary<String, List<PhysicsJoint>> joints_connecting_actor = new Dictionary<String, List<PhysicsJoint>>(); private readonly Dictionary<String, List<PhysicsJoint>> joints_connecting_actor = new Dictionary<String, List<PhysicsJoint>>();
@ -1697,8 +1712,11 @@ namespace OpenSim.Region.Physics.OdePlugin
if (!_characters.Contains(chr)) if (!_characters.Contains(chr))
{ {
_characters.Add(chr); _characters.Add(chr);
geom_name_map[chr.Shell] = Name;
actor_name_map[chr.Shell] = chr;
if (chr.bad) if (chr.bad)
m_log.DebugFormat("[PHYSICS] Added BAD actor {0} to characters list", chr.m_uuid); m_log.ErrorFormat("[PHYSICS] Added BAD actor {0} to characters list", chr.m_uuid);
} }
} }
} }
@ -1710,6 +1728,8 @@ namespace OpenSim.Region.Physics.OdePlugin
if (_characters.Contains(chr)) if (_characters.Contains(chr))
{ {
_characters.Remove(chr); _characters.Remove(chr);
geom_name_map.Remove(chr.Shell);
actor_name_map.Remove(chr.Shell);
} }
} }
} }