diff options
author | Justin Clark-Casey (justincc) | 2011-11-21 18:27:41 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2011-11-21 18:27:41 +0000 |
commit | 898904d83d371b69d001b669588f29c2befd6aa9 (patch) | |
tree | 8a6c6722901d44c53370fd6475a370db8dc5b08b | |
parent | Have ODECharacter and ODEPrim both use PhysicsActor.Name instead of maintaini... (diff) | |
download | opensim-SC-898904d83d371b69d001b669588f29c2befd6aa9.zip opensim-SC-898904d83d371b69d001b669588f29c2befd6aa9.tar.gz opensim-SC-898904d83d371b69d001b669588f29c2befd6aa9.tar.bz2 opensim-SC-898904d83d371b69d001b669588f29c2befd6aa9.tar.xz |
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()
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 11 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 22 |
2 files changed, 23 insertions, 10 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 20bc7f6..3e7fadf 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -599,13 +599,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
599 | d.RFromAxisAndAngle(out m_caprot, 0, 0, 1, (float)(Math.PI / 2)); | 599 | d.RFromAxisAndAngle(out m_caprot, 0, 0, 1, (float)(Math.PI / 2)); |
600 | } | 600 | } |
601 | 601 | ||
602 | |||
603 | d.GeomSetRotation(Shell, ref m_caprot); | 602 | d.GeomSetRotation(Shell, ref m_caprot); |
604 | d.BodySetRotation(Body, ref m_caprot); | 603 | d.BodySetRotation(Body, ref m_caprot); |
605 | 604 | ||
606 | d.GeomSetBody(Shell, Body); | 605 | d.GeomSetBody(Shell, Body); |
607 | 606 | ||
608 | |||
609 | // The purpose of the AMotor here is to keep the avatar's physical | 607 | // The purpose of the AMotor here is to keep the avatar's physical |
610 | // surrogate from rotating while moving | 608 | // surrogate from rotating while moving |
611 | Amotor = d.JointCreateAMotor(_parent_scene.world, IntPtr.Zero); | 609 | Amotor = d.JointCreateAMotor(_parent_scene.world, IntPtr.Zero); |
@@ -660,7 +658,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
660 | //standupStraight(); | 658 | //standupStraight(); |
661 | } | 659 | } |
662 | 660 | ||
663 | // | ||
664 | /// <summary> | 661 | /// <summary> |
665 | /// Uses the capped cyllinder volume formula to calculate the avatar's mass. | 662 | /// Uses the capped cyllinder volume formula to calculate the avatar's mass. |
666 | /// This may be used in calculations in the scene/scenepresence | 663 | /// This may be used in calculations in the scene/scenepresence |
@@ -1162,14 +1159,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1162 | { | 1159 | { |
1163 | //kill the body | 1160 | //kill the body |
1164 | d.BodyDestroy(Body); | 1161 | d.BodyDestroy(Body); |
1165 | |||
1166 | Body = IntPtr.Zero; | 1162 | Body = IntPtr.Zero; |
1167 | } | 1163 | } |
1168 | 1164 | ||
1169 | if (Shell != IntPtr.Zero) | 1165 | if (Shell != IntPtr.Zero) |
1170 | { | 1166 | { |
1171 | d.GeomDestroy(Shell); | 1167 | d.GeomDestroy(Shell); |
1172 | _parent_scene.geom_name_map.Remove(Shell); | ||
1173 | Shell = IntPtr.Zero; | 1168 | Shell = IntPtr.Zero; |
1174 | } | 1169 | } |
1175 | } | 1170 | } |
@@ -1279,10 +1274,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1279 | + (Body!=IntPtr.Zero ? "Body ":"") | 1274 | + (Body!=IntPtr.Zero ? "Body ":"") |
1280 | + (Amotor!=IntPtr.Zero ? "Amotor ":"")); | 1275 | + (Amotor!=IntPtr.Zero ? "Amotor ":"")); |
1281 | } | 1276 | } |
1277 | |||
1282 | AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z, m_tensor); | 1278 | AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z, m_tensor); |
1283 | |||
1284 | _parent_scene.geom_name_map[Shell] = Name; | ||
1285 | _parent_scene.actor_name_map[Shell] = this; | ||
1286 | _parent_scene.AddCharacter(this); | 1279 | _parent_scene.AddCharacter(this); |
1287 | } | 1280 | } |
1288 | else | 1281 | else |
@@ -1318,7 +1311,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1318 | // Velocity = Vector3.Zero; | 1311 | // Velocity = Vector3.Zero; |
1319 | 1312 | ||
1320 | _parent_scene.geom_name_map[Shell] = Name; | 1313 | _parent_scene.geom_name_map[Shell] = Name; |
1321 | _parent_scene.actor_name_map[Shell] = (PhysicsActor)this; | 1314 | _parent_scene.actor_name_map[Shell] = this; |
1322 | } | 1315 | } |
1323 | else | 1316 | else |
1324 | { | 1317 | { |
diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index fe2b2b2..9dee07b 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs | |||
@@ -238,8 +238,23 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
238 | private readonly Dictionary<uint, PhysicsActor> _collisionEventPrimChanges = new Dictionary<uint, PhysicsActor>(); | 238 | private readonly Dictionary<uint, PhysicsActor> _collisionEventPrimChanges = new Dictionary<uint, PhysicsActor>(); |
239 | 239 | ||
240 | private readonly HashSet<OdeCharacter> _badCharacter = new HashSet<OdeCharacter>(); | 240 | private readonly HashSet<OdeCharacter> _badCharacter = new HashSet<OdeCharacter>(); |
241 | |||
242 | /// <summary> | ||
243 | /// Maps a unique geometry id (a memory location) to a physics actor name. | ||
244 | /// </summary> | ||
245 | /// <remarks> | ||
246 | /// Only actors participating in collisions have geometries. | ||
247 | /// </remarks> | ||
241 | public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); | 248 | public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); |
249 | |||
250 | /// <summary> | ||
251 | /// Maps a unique geometry id (a memory location) to a physics actor. | ||
252 | /// </summary> | ||
253 | /// <remarks> | ||
254 | /// Only actors participating in collisions have geometries. | ||
255 | /// </remarks> | ||
242 | public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>(); | 256 | public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>(); |
257 | |||
243 | private bool m_NINJA_physics_joints_enabled = false; | 258 | private bool m_NINJA_physics_joints_enabled = false; |
244 | //private Dictionary<String, IntPtr> jointpart_name_map = new Dictionary<String,IntPtr>(); | 259 | //private Dictionary<String, IntPtr> jointpart_name_map = new Dictionary<String,IntPtr>(); |
245 | private readonly Dictionary<String, List<PhysicsJoint>> joints_connecting_actor = new Dictionary<String, List<PhysicsJoint>>(); | 260 | private readonly Dictionary<String, List<PhysicsJoint>> joints_connecting_actor = new Dictionary<String, List<PhysicsJoint>>(); |
@@ -1699,8 +1714,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1699 | if (!_characters.Contains(chr)) | 1714 | if (!_characters.Contains(chr)) |
1700 | { | 1715 | { |
1701 | _characters.Add(chr); | 1716 | _characters.Add(chr); |
1717 | geom_name_map[chr.Shell] = Name; | ||
1718 | actor_name_map[chr.Shell] = chr; | ||
1719 | |||
1702 | if (chr.bad) | 1720 | if (chr.bad) |
1703 | m_log.DebugFormat("[PHYSICS] Added BAD actor {0} to characters list", chr.m_uuid); | 1721 | m_log.ErrorFormat("[PHYSICS] Added BAD actor {0} to characters list", chr.m_uuid); |
1704 | } | 1722 | } |
1705 | } | 1723 | } |
1706 | } | 1724 | } |
@@ -1712,6 +1730,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1712 | if (_characters.Contains(chr)) | 1730 | if (_characters.Contains(chr)) |
1713 | { | 1731 | { |
1714 | _characters.Remove(chr); | 1732 | _characters.Remove(chr); |
1733 | geom_name_map.Remove(chr.Shell); | ||
1734 | actor_name_map.Remove(chr.Shell); | ||
1715 | } | 1735 | } |
1716 | } | 1736 | } |
1717 | } | 1737 | } |