aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODECharacter.cs234
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs1
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdeScene.cs207
3 files changed, 217 insertions, 225 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index cfe64f2..489a23a 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -542,123 +542,6 @@ namespace OpenSim.Region.Physics.OdePlugin
542 } 542 }
543 543
544 /// <summary> 544 /// <summary>
545 /// This creates the Avatar's physical Surrogate in ODE at the position supplied
546 /// </summary>
547 /// <remarks>
548 /// WARNING: This MUST NOT be called outside of ProcessTaints, else we can have unsynchronized access
549 /// to ODE internals. ProcessTaints is called from within thread-locked Simulate(), so it is the only
550 /// place that is safe to call this routine AvatarGeomAndBodyCreation.
551 /// </remarks>
552 /// <param name="npositionX"></param>
553 /// <param name="npositionY"></param>
554 /// <param name="npositionZ"></param>
555 /// <param name="tensor"></param>
556 private void CreateOdeStructures(float npositionX, float npositionY, float npositionZ, float tensor)
557 {
558 int dAMotorEuler = 1;
559// _parent_scene.waitForSpaceUnlock(_parent_scene.space);
560 if (CAPSULE_LENGTH <= 0)
561 {
562 m_log.Warn("[ODE CHARACTER]: The capsule size you specified in opensim.ini is invalid! Setting it to the smallest possible size!");
563 CAPSULE_LENGTH = 0.01f;
564 }
565
566 if (CAPSULE_RADIUS <= 0)
567 {
568 m_log.Warn("[ODE CHARACTER]: The capsule size you specified in opensim.ini is invalid! Setting it to the smallest possible size!");
569 CAPSULE_RADIUS = 0.01f;
570 }
571
572 Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH);
573
574 d.GeomSetCategoryBits(Shell, (int)m_collisionCategories);
575 d.GeomSetCollideBits(Shell, (int)m_collisionFlags);
576
577 d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH);
578 Body = d.BodyCreate(_parent_scene.world);
579 d.BodySetPosition(Body, npositionX, npositionY, npositionZ);
580
581 _position.X = npositionX;
582 _position.Y = npositionY;
583 _position.Z = npositionZ;
584
585 m_taintPosition = _position;
586
587 d.BodySetMass(Body, ref ShellMass);
588 d.Matrix3 m_caprot;
589 // 90 Stand up on the cap of the capped cyllinder
590 if (_parent_scene.IsAvCapsuleTilted)
591 {
592 d.RFromAxisAndAngle(out m_caprot, 1, 0, 1, (float)(Math.PI / 2));
593 }
594 else
595 {
596 d.RFromAxisAndAngle(out m_caprot, 0, 0, 1, (float)(Math.PI / 2));
597 }
598
599 d.GeomSetRotation(Shell, ref m_caprot);
600 d.BodySetRotation(Body, ref m_caprot);
601
602 d.GeomSetBody(Shell, Body);
603
604 // The purpose of the AMotor here is to keep the avatar's physical
605 // surrogate from rotating while moving
606 Amotor = d.JointCreateAMotor(_parent_scene.world, IntPtr.Zero);
607 d.JointAttach(Amotor, Body, IntPtr.Zero);
608 d.JointSetAMotorMode(Amotor, dAMotorEuler);
609 d.JointSetAMotorNumAxes(Amotor, 3);
610 d.JointSetAMotorAxis(Amotor, 0, 0, 1, 0, 0);
611 d.JointSetAMotorAxis(Amotor, 1, 0, 0, 1, 0);
612 d.JointSetAMotorAxis(Amotor, 2, 0, 0, 0, 1);
613 d.JointSetAMotorAngle(Amotor, 0, 0);
614 d.JointSetAMotorAngle(Amotor, 1, 0);
615 d.JointSetAMotorAngle(Amotor, 2, 0);
616
617 // These lowstops and high stops are effectively (no wiggle room)
618 if (_parent_scene.IsAvCapsuleTilted)
619 {
620 d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, -0.000000000001f);
621 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0.000000000001f);
622 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, -0.000000000001f);
623 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, 0.000000000001f);
624 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0.000000000001f);
625 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.000000000001f);
626 }
627 else
628 {
629 #region Documentation of capsule motor LowStop and HighStop parameters
630 // Intentionally introduce some tilt into the capsule by setting
631 // the motor stops to small epsilon values. This small tilt prevents
632 // the capsule from falling into the terrain; a straight-up capsule
633 // (with -0..0 motor stops) falls into the terrain for reasons yet
634 // to be comprehended in their entirety.
635 #endregion
636 AlignAvatarTiltWithCurrentDirectionOfMovement(Vector3.Zero);
637 d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, 0.08f);
638 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0f);
639 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, 0.08f);
640 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, 0.08f); // must be same as lowstop, else a different, spurious tilt is introduced
641 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0f); // same as lowstop
642 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.08f); // same as lowstop
643 }
644
645 // Fudge factor is 1f by default, we're setting it to 0. We don't want it to Fudge or the
646 // capped cyllinder will fall over
647 d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f);
648 d.JointSetAMotorParam(Amotor, (int)dParam.FMax, tensor);
649
650 //d.Matrix3 bodyrotation = d.BodyGetRotation(Body);
651 //d.QfromR(
652 //d.Matrix3 checkrotation = new d.Matrix3(0.7071068,0.5, -0.7071068,
653 //
654 //m_log.Info("[PHYSICSAV]: Rotation: " + bodyrotation.M00 + " : " + bodyrotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22);
655 //standupStraight();
656
657 _parent_scene.geom_name_map[Shell] = Name;
658 _parent_scene.actor_name_map[Shell] = this;
659 }
660
661 /// <summary>
662 /// Uses the capped cyllinder volume formula to calculate the avatar's mass. 545 /// Uses the capped cyllinder volume formula to calculate the avatar's mass.
663 /// This may be used in calculations in the scene/scenepresence 546 /// This may be used in calculations in the scene/scenepresence
664 /// </summary> 547 /// </summary>
@@ -1126,6 +1009,123 @@ namespace OpenSim.Region.Physics.OdePlugin
1126 } 1009 }
1127 1010
1128 /// <summary> 1011 /// <summary>
1012 /// This creates the Avatar's physical Surrogate in ODE at the position supplied
1013 /// </summary>
1014 /// <remarks>
1015 /// WARNING: This MUST NOT be called outside of ProcessTaints, else we can have unsynchronized access
1016 /// to ODE internals. ProcessTaints is called from within thread-locked Simulate(), so it is the only
1017 /// place that is safe to call this routine AvatarGeomAndBodyCreation.
1018 /// </remarks>
1019 /// <param name="npositionX"></param>
1020 /// <param name="npositionY"></param>
1021 /// <param name="npositionZ"></param>
1022 /// <param name="tensor"></param>
1023 private void CreateOdeStructures(float npositionX, float npositionY, float npositionZ, float tensor)
1024 {
1025 int dAMotorEuler = 1;
1026// _parent_scene.waitForSpaceUnlock(_parent_scene.space);
1027 if (CAPSULE_LENGTH <= 0)
1028 {
1029 m_log.Warn("[ODE CHARACTER]: The capsule size you specified in opensim.ini is invalid! Setting it to the smallest possible size!");
1030 CAPSULE_LENGTH = 0.01f;
1031 }
1032
1033 if (CAPSULE_RADIUS <= 0)
1034 {
1035 m_log.Warn("[ODE CHARACTER]: The capsule size you specified in opensim.ini is invalid! Setting it to the smallest possible size!");
1036 CAPSULE_RADIUS = 0.01f;
1037 }
1038
1039 Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH);
1040
1041 d.GeomSetCategoryBits(Shell, (int)m_collisionCategories);
1042 d.GeomSetCollideBits(Shell, (int)m_collisionFlags);
1043
1044 d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH);
1045 Body = d.BodyCreate(_parent_scene.world);
1046 d.BodySetPosition(Body, npositionX, npositionY, npositionZ);
1047
1048 _position.X = npositionX;
1049 _position.Y = npositionY;
1050 _position.Z = npositionZ;
1051
1052 m_taintPosition = _position;
1053
1054 d.BodySetMass(Body, ref ShellMass);
1055 d.Matrix3 m_caprot;
1056 // 90 Stand up on the cap of the capped cyllinder
1057 if (_parent_scene.IsAvCapsuleTilted)
1058 {
1059 d.RFromAxisAndAngle(out m_caprot, 1, 0, 1, (float)(Math.PI / 2));
1060 }
1061 else
1062 {
1063 d.RFromAxisAndAngle(out m_caprot, 0, 0, 1, (float)(Math.PI / 2));
1064 }
1065
1066 d.GeomSetRotation(Shell, ref m_caprot);
1067 d.BodySetRotation(Body, ref m_caprot);
1068
1069 d.GeomSetBody(Shell, Body);
1070
1071 // The purpose of the AMotor here is to keep the avatar's physical
1072 // surrogate from rotating while moving
1073 Amotor = d.JointCreateAMotor(_parent_scene.world, IntPtr.Zero);
1074 d.JointAttach(Amotor, Body, IntPtr.Zero);
1075 d.JointSetAMotorMode(Amotor, dAMotorEuler);
1076 d.JointSetAMotorNumAxes(Amotor, 3);
1077 d.JointSetAMotorAxis(Amotor, 0, 0, 1, 0, 0);
1078 d.JointSetAMotorAxis(Amotor, 1, 0, 0, 1, 0);
1079 d.JointSetAMotorAxis(Amotor, 2, 0, 0, 0, 1);
1080 d.JointSetAMotorAngle(Amotor, 0, 0);
1081 d.JointSetAMotorAngle(Amotor, 1, 0);
1082 d.JointSetAMotorAngle(Amotor, 2, 0);
1083
1084 // These lowstops and high stops are effectively (no wiggle room)
1085 if (_parent_scene.IsAvCapsuleTilted)
1086 {
1087 d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, -0.000000000001f);
1088 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0.000000000001f);
1089 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, -0.000000000001f);
1090 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, 0.000000000001f);
1091 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0.000000000001f);
1092 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.000000000001f);
1093 }
1094 else
1095 {
1096 #region Documentation of capsule motor LowStop and HighStop parameters
1097 // Intentionally introduce some tilt into the capsule by setting
1098 // the motor stops to small epsilon values. This small tilt prevents
1099 // the capsule from falling into the terrain; a straight-up capsule
1100 // (with -0..0 motor stops) falls into the terrain for reasons yet
1101 // to be comprehended in their entirety.
1102 #endregion
1103 AlignAvatarTiltWithCurrentDirectionOfMovement(Vector3.Zero);
1104 d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, 0.08f);
1105 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0f);
1106 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, 0.08f);
1107 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, 0.08f); // must be same as lowstop, else a different, spurious tilt is introduced
1108 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0f); // same as lowstop
1109 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.08f); // same as lowstop
1110 }
1111
1112 // Fudge factor is 1f by default, we're setting it to 0. We don't want it to Fudge or the
1113 // capped cyllinder will fall over
1114 d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f);
1115 d.JointSetAMotorParam(Amotor, (int)dParam.FMax, tensor);
1116
1117 //d.Matrix3 bodyrotation = d.BodyGetRotation(Body);
1118 //d.QfromR(
1119 //d.Matrix3 checkrotation = new d.Matrix3(0.7071068,0.5, -0.7071068,
1120 //
1121 //m_log.Info("[PHYSICSAV]: Rotation: " + bodyrotation.M00 + " : " + bodyrotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22);
1122 //standupStraight();
1123
1124 _parent_scene.geom_name_map[Shell] = Name;
1125 _parent_scene.actor_name_map[Shell] = this;
1126 }
1127
1128 /// <summary>
1129 /// Cleanup the things we use in the scene. 1129 /// Cleanup the things we use in the scene.
1130 /// </summary> 1130 /// </summary>
1131 internal void Destroy() 1131 internal void Destroy()
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index fec4693..94e6185 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -272,7 +272,6 @@ namespace OpenSim.Region.Physics.OdePlugin
272 272
273 m_taintadd = true; 273 m_taintadd = true;
274 _parent_scene.AddPhysicsActorTaint(this); 274 _parent_scene.AddPhysicsActorTaint(this);
275 // don't do .add() here; old geoms get recycled with the same hash
276 } 275 }
277 276
278 public override int PhysicsActorType 277 public override int PhysicsActorType
diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
index e219535..0456f56 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
@@ -377,8 +377,7 @@ namespace OpenSim.Region.Physics.OdePlugin
377 /// <param value="name">Name of the scene. Useful in debug messages.</param> 377 /// <param value="name">Name of the scene. Useful in debug messages.</param>
378 public OdeScene(string name) 378 public OdeScene(string name)
379 { 379 {
380 m_log 380 m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.ToString() + "." + name);
381 = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.ToString() + "." + name);
382 381
383 Name = name; 382 Name = name;
384 383
@@ -769,7 +768,7 @@ namespace OpenSim.Region.Physics.OdePlugin
769 } 768 }
770 catch (AccessViolationException) 769 catch (AccessViolationException)
771 { 770 {
772 m_log.Warn("[PHYSICS]: Unable to collide test a space"); 771 m_log.Warn("[ODE SCENE]: Unable to collide test a space");
773 return; 772 return;
774 } 773 }
775 //Colliding a space or a geom with a space or a geom. so drill down 774 //Colliding a space or a geom with a space or a geom. so drill down
@@ -821,17 +820,17 @@ namespace OpenSim.Region.Physics.OdePlugin
821 820
822 count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf); 821 count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf);
823 if (count > contacts.Length) 822 if (count > contacts.Length)
824 m_log.Error("[PHYSICS]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length); 823 m_log.Error("[ODE SCENE]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length);
825 } 824 }
826 catch (SEHException) 825 catch (SEHException)
827 { 826 {
828 m_log.Error( 827 m_log.Error(
829 "[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."); 828 "[ODE SCENE]: 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.");
830 base.TriggerPhysicsBasedRestart(); 829 base.TriggerPhysicsBasedRestart();
831 } 830 }
832 catch (Exception e) 831 catch (Exception e)
833 { 832 {
834 m_log.WarnFormat("[PHYSICS]: Unable to collide test an object: {0}", e.Message); 833 m_log.WarnFormat("[ODE SCENE]: Unable to collide test an object: {0}", e.Message);
835 return; 834 return;
836 } 835 }
837 836
@@ -1556,7 +1555,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1556 } 1555 }
1557 catch (AccessViolationException) 1556 catch (AccessViolationException)
1558 { 1557 {
1559 m_log.WarnFormat("[PHYSICS]: Unable to space collide {0}", Name); 1558 m_log.WarnFormat("[ODE SCENE]: Unable to space collide {0}", Name);
1560 } 1559 }
1561 1560
1562 //float terrainheight = GetTerrainHeightAtXY(chr.Position.X, chr.Position.Y); 1561 //float terrainheight = GetTerrainHeightAtXY(chr.Position.X, chr.Position.Y);
@@ -1587,13 +1586,13 @@ namespace OpenSim.Region.Physics.OdePlugin
1587 removeprims = new List<OdePrim>(); 1586 removeprims = new List<OdePrim>();
1588 } 1587 }
1589 removeprims.Add(chr); 1588 removeprims.Add(chr);
1590 m_log.Debug("[PHYSICS]: unable to collide test active prim against space. The space was zero, the geom was zero or it was in the process of being removed. Removed it from the active prim list. This needs to be fixed!"); 1589 m_log.Debug("[ODE SCENE]: unable to collide test active prim against space. The space was zero, the geom was zero or it was in the process of being removed. Removed it from the active prim list. This needs to be fixed!");
1591 } 1590 }
1592 } 1591 }
1593 } 1592 }
1594 catch (AccessViolationException) 1593 catch (AccessViolationException)
1595 { 1594 {
1596 m_log.Warn("[PHYSICS]: Unable to space collide"); 1595 m_log.Warn("[ODE SCENE]: Unable to space collide");
1597 } 1596 }
1598 } 1597 }
1599 } 1598 }
@@ -1729,18 +1728,24 @@ namespace OpenSim.Region.Physics.OdePlugin
1729 _characters.Add(chr); 1728 _characters.Add(chr);
1730 1729
1731 if (chr.bad) 1730 if (chr.bad)
1732 m_log.ErrorFormat("[PHYSICS] Added BAD actor {0} to characters list", chr.m_uuid); 1731 m_log.ErrorFormat("[ODE SCENE]: Added BAD actor {0} to characters list", chr.m_uuid);
1732 }
1733 else
1734 {
1735 m_log.ErrorFormat(
1736 "[ODE SCENE]: Tried to add character {0} {1} but they are already in the set!",
1737 chr.Name, chr.LocalID);
1733 } 1738 }
1734 } 1739 }
1735 1740
1736 internal void RemoveCharacter(OdeCharacter chr) 1741 internal void RemoveCharacter(OdeCharacter chr)
1737 { 1742 {
1738 if (_characters.Contains(chr)) 1743 if (_characters.Contains(chr))
1739 {
1740 _characters.Remove(chr); 1744 _characters.Remove(chr);
1741 geom_name_map.Remove(chr.Shell); 1745 else
1742 actor_name_map.Remove(chr.Shell); 1746 m_log.ErrorFormat(
1743 } 1747 "[ODE SCENE]: Tried to remove character {0} {1} but they are not in the list!",
1748 chr.Name, chr.LocalID);
1744 } 1749 }
1745 1750
1746 private PhysicsActor AddPrim(String name, Vector3 position, Vector3 size, Quaternion rotation, 1751 private PhysicsActor AddPrim(String name, Vector3 position, Vector3 size, Quaternion rotation,
@@ -2160,7 +2165,6 @@ namespace OpenSim.Region.Physics.OdePlugin
2160 2165
2161 p.setPrimForRemoval(); 2166 p.setPrimForRemoval();
2162 AddPhysicsActorTaint(prim); 2167 AddPhysicsActorTaint(prim);
2163 //RemovePrimThreadLocked(p);
2164 } 2168 }
2165 } 2169 }
2166 } 2170 }
@@ -2228,7 +2232,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2228 //m_log.Warn(prim.prim_geom); 2232 //m_log.Warn(prim.prim_geom);
2229 2233
2230 if (!prim.RemoveGeom()) 2234 if (!prim.RemoveGeom())
2231 m_log.Warn("[PHYSICS]: Unable to remove prim from physics scene"); 2235 m_log.Warn("[ODE SCENE]: Unable to remove prim from physics scene");
2232 2236
2233 lock (_prims) 2237 lock (_prims)
2234 _prims.Remove(prim); 2238 _prims.Remove(prim);
@@ -2320,7 +2324,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2320 } 2324 }
2321 else 2325 else
2322 { 2326 {
2323 m_log.Info("[Physics]: Invalid Scene passed to 'recalculatespace':" + currentspace + 2327 m_log.Info("[ODE SCENE]: Invalid Scene passed to 'recalculatespace':" + currentspace +
2324 " Geom:" + geom); 2328 " Geom:" + geom);
2325 } 2329 }
2326 } 2330 }
@@ -2336,7 +2340,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2336 } 2340 }
2337 else 2341 else
2338 { 2342 {
2339 m_log.Info("[Physics]: Invalid Scene passed to 'recalculatespace':" + 2343 m_log.Info("[ODE SCENE]: Invalid Scene passed to 'recalculatespace':" +
2340 sGeomIsIn + " Geom:" + geom); 2344 sGeomIsIn + " Geom:" + geom);
2341 } 2345 }
2342 } 2346 }
@@ -2359,7 +2363,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2359 } 2363 }
2360 else 2364 else
2361 { 2365 {
2362 m_log.Info("[Physics]: Invalid Scene passed to 'recalculatespace':" + 2366 m_log.Info("[ODE SCENE]: Invalid Scene passed to 'recalculatespace':" +
2363 currentspace + " Geom:" + geom); 2367 currentspace + " Geom:" + geom);
2364 } 2368 }
2365 } 2369 }
@@ -2379,7 +2383,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2379 } 2383 }
2380 else 2384 else
2381 { 2385 {
2382 m_log.Info("[Physics]: Invalid Scene passed to 'recalculatespace':" + 2386 m_log.Info("[ODE SCENE]: Invalid Scene passed to 'recalculatespace':" +
2383 currentspace + " Geom:" + geom); 2387 currentspace + " Geom:" + geom);
2384 } 2388 }
2385 } 2389 }
@@ -2395,7 +2399,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2395 } 2399 }
2396 else 2400 else
2397 { 2401 {
2398 m_log.Info("[Physics]: Invalid Scene passed to 'recalculatespace':" + 2402 m_log.Info("[ODE SCENE]: Invalid Scene passed to 'recalculatespace':" +
2399 sGeomIsIn + " Geom:" + geom); 2403 sGeomIsIn + " Geom:" + geom);
2400 } 2404 }
2401 } 2405 }
@@ -2607,15 +2611,17 @@ namespace OpenSim.Region.Physics.OdePlugin
2607 2611
2608 /// <summary> 2612 /// <summary>
2609 /// Called after our prim properties are set Scale, position etc. 2613 /// Called after our prim properties are set Scale, position etc.
2614 /// </summary>
2615 /// <remarks>
2610 /// We use this event queue like method to keep changes to the physical scene occuring in the threadlocked mutex 2616 /// We use this event queue like method to keep changes to the physical scene occuring in the threadlocked mutex
2611 /// This assures us that we have no race conditions 2617 /// This assures us that we have no race conditions
2612 /// </summary> 2618 /// </remarks>
2613 /// <param name="prim"></param> 2619 /// <param name="actor"></param>
2614 public override void AddPhysicsActorTaint(PhysicsActor prim) 2620 public override void AddPhysicsActorTaint(PhysicsActor actor)
2615 { 2621 {
2616 if (prim is OdePrim) 2622 if (actor is OdePrim)
2617 { 2623 {
2618 OdePrim taintedprim = ((OdePrim) prim); 2624 OdePrim taintedprim = ((OdePrim)actor);
2619 lock (_taintedPrimLock) 2625 lock (_taintedPrimLock)
2620 { 2626 {
2621 if (!(_taintedPrimH.Contains(taintedprim))) 2627 if (!(_taintedPrimH.Contains(taintedprim)))
@@ -2627,18 +2633,17 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2627 _taintedPrimL.Add(taintedprim); // List for ordered readout 2633 _taintedPrimL.Add(taintedprim); // List for ordered readout
2628 } 2634 }
2629 } 2635 }
2630 return;
2631 } 2636 }
2632 else if (prim is OdeCharacter) 2637 else if (actor is OdeCharacter)
2633 { 2638 {
2634 OdeCharacter taintedchar = ((OdeCharacter)prim); 2639 OdeCharacter taintedchar = ((OdeCharacter)actor);
2635 lock (_taintedActors) 2640 lock (_taintedActors)
2636 { 2641 {
2637 if (!(_taintedActors.Contains(taintedchar))) 2642 if (!(_taintedActors.Contains(taintedchar)))
2638 { 2643 {
2639 _taintedActors.Add(taintedchar); 2644 _taintedActors.Add(taintedchar);
2640 if (taintedchar.bad) 2645 if (taintedchar.bad)
2641 m_log.DebugFormat("[PHYSICS]: Added BAD actor {0} to tainted actors", taintedchar.m_uuid); 2646 m_log.DebugFormat("[ODE SCENE]: Added BAD actor {0} to tainted actors", taintedchar.m_uuid);
2642 } 2647 }
2643 } 2648 }
2644 } 2649 }
@@ -2734,29 +2739,18 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2734 { 2739 {
2735 try 2740 try
2736 { 2741 {
2737 // Insert, remove Characters
2738 bool processedtaints = false;
2739
2740 lock (_taintedActors) 2742 lock (_taintedActors)
2741 { 2743 {
2742 if (_taintedActors.Count > 0) 2744 if (_taintedActors.Count > 0)
2743 { 2745 {
2744 foreach (OdeCharacter character in _taintedActors) 2746 foreach (OdeCharacter character in _taintedActors)
2745 {
2746 character.ProcessTaints(); 2747 character.ProcessTaints();
2747 2748
2748 processedtaints = true; 2749 if (_taintedActors.Count > 0)
2749 //character.m_collisionscore = 0;
2750 }
2751
2752 if (processedtaints)
2753 _taintedActors.Clear(); 2750 _taintedActors.Clear();
2754 } 2751 }
2755 } 2752 }
2756 2753
2757 // Modify other objects in the scene.
2758 processedtaints = false;
2759
2760 lock (_taintedPrimLock) 2754 lock (_taintedPrimLock)
2761 { 2755 {
2762 foreach (OdePrim prim in _taintedPrimL) 2756 foreach (OdePrim prim in _taintedPrimL)
@@ -2772,7 +2766,6 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2772 prim.ProcessTaints(); 2766 prim.ProcessTaints();
2773 } 2767 }
2774 2768
2775 processedtaints = true;
2776 prim.m_collisionscore = 0; 2769 prim.m_collisionscore = 0;
2777 2770
2778 // This loop can block up the Heartbeat for a very long time on large regions. 2771 // This loop can block up the Heartbeat for a very long time on large regions.
@@ -2785,7 +2778,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2785 if (SupportsNINJAJoints) 2778 if (SupportsNINJAJoints)
2786 SimulatePendingNINJAJoints(); 2779 SimulatePendingNINJAJoints();
2787 2780
2788 if (processedtaints) 2781 if (_taintedPrimL.Count > 0)
2789 { 2782 {
2790//Console.WriteLine("Simulate calls Clear of _taintedPrim list"); 2783//Console.WriteLine("Simulate calls Clear of _taintedPrim list");
2791 _taintedPrimH.Clear(); 2784 _taintedPrimH.Clear();
@@ -2853,7 +2846,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2853 } 2846 }
2854 catch (Exception e) 2847 catch (Exception e)
2855 { 2848 {
2856 m_log.ErrorFormat("[PHYSICS]: {0}, {1}, {2}", e.Message, e.TargetSite, e); 2849 m_log.ErrorFormat("[ODE SCENE]: {0}, {1}, {2}", e.Message, e.TargetSite, e);
2857 } 2850 }
2858 2851
2859 timeLeft -= ODE_STEPSIZE; 2852 timeLeft -= ODE_STEPSIZE;
@@ -2862,7 +2855,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2862 foreach (OdeCharacter actor in _characters) 2855 foreach (OdeCharacter actor in _characters)
2863 { 2856 {
2864 if (actor.bad) 2857 if (actor.bad)
2865 m_log.WarnFormat("[PHYSICS]: BAD Actor {0} in _characters list was not removed?", actor.m_uuid); 2858 m_log.WarnFormat("[ODE SCENE]: BAD Actor {0} in _characters list was not removed?", actor.m_uuid);
2866 2859
2867 actor.UpdatePositionAndVelocity(defects); 2860 actor.UpdatePositionAndVelocity(defects);
2868 } 2861 }
@@ -3422,7 +3415,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
3422 { 3415 {
3423 if (Single.IsNaN(resultarr2[y, x]) || Single.IsInfinity(resultarr2[y, x])) 3416 if (Single.IsNaN(resultarr2[y, x]) || Single.IsInfinity(resultarr2[y, x]))
3424 { 3417 {
3425 m_log.Warn("[PHYSICS]: Non finite heightfield element detected. Setting it to 0"); 3418 m_log.Warn("[ODE SCENE]: Non finite heightfield element detected. Setting it to 0");
3426 resultarr2[y, x] = 0; 3419 resultarr2[y, x] = 0;
3427 } 3420 }
3428 returnarr[i] = resultarr2[y, x]; 3421 returnarr[i] = resultarr2[y, x];
@@ -3453,7 +3446,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
3453 private void SetTerrain(float[] heightMap, Vector3 pOffset) 3446 private void SetTerrain(float[] heightMap, Vector3 pOffset)
3454 { 3447 {
3455 int startTime = Util.EnvironmentTickCount(); 3448 int startTime = Util.EnvironmentTickCount();
3456 m_log.DebugFormat("[PHYSICS]: Setting terrain for {0}", Name); 3449 m_log.DebugFormat("[ODE SCENE]: Setting terrain for {0}", Name);
3457 3450
3458 // this._heightmap[i] = (double)heightMap[i]; 3451 // this._heightmap[i] = (double)heightMap[i];
3459 // dbm (danx0r) -- creating a buffer zone of one extra sample all around 3452 // dbm (danx0r) -- creating a buffer zone of one extra sample all around
@@ -3578,7 +3571,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
3578 } 3571 }
3579 3572
3580 m_log.DebugFormat( 3573 m_log.DebugFormat(
3581 "[PHYSICS]: Setting terrain for {0} took {1}ms", Name, Util.EnvironmentTickCountSubtract(startTime)); 3574 "[ODE SCENE]: Setting terrain for {0} took {1}ms", Name, Util.EnvironmentTickCountSubtract(startTime));
3582 } 3575 }
3583 3576
3584 public override void DeleteTerrain() 3577 public override void DeleteTerrain()
@@ -3595,64 +3588,64 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
3595 return true; 3588 return true;
3596 } 3589 }
3597 3590
3598 public override void UnCombine(PhysicsScene pScene) 3591// public override void UnCombine(PhysicsScene pScene)
3599 { 3592// {
3600 IntPtr localGround = IntPtr.Zero; 3593// IntPtr localGround = IntPtr.Zero;
3601// float[] localHeightfield; 3594//// float[] localHeightfield;
3602 bool proceed = false; 3595// bool proceed = false;
3603 List<IntPtr> geomDestroyList = new List<IntPtr>(); 3596// List<IntPtr> geomDestroyList = new List<IntPtr>();
3604 3597//
3605 lock (OdeLock) 3598// lock (OdeLock)
3606 { 3599// {
3607 if (RegionTerrain.TryGetValue(Vector3.Zero, out localGround)) 3600// if (RegionTerrain.TryGetValue(Vector3.Zero, out localGround))
3608 { 3601// {
3609 foreach (IntPtr geom in TerrainHeightFieldHeights.Keys) 3602// foreach (IntPtr geom in TerrainHeightFieldHeights.Keys)
3610 { 3603// {
3611 if (geom == localGround) 3604// if (geom == localGround)
3612 { 3605// {
3613// localHeightfield = TerrainHeightFieldHeights[geom]; 3606//// localHeightfield = TerrainHeightFieldHeights[geom];
3614 proceed = true; 3607// proceed = true;
3615 } 3608// }
3616 else 3609// else
3617 { 3610// {
3618 geomDestroyList.Add(geom); 3611// geomDestroyList.Add(geom);
3619 } 3612// }
3620 } 3613// }
3621 3614//
3622 if (proceed) 3615// if (proceed)
3623 { 3616// {
3624 m_worldOffset = Vector3.Zero; 3617// m_worldOffset = Vector3.Zero;
3625 WorldExtents = new Vector2((int)Constants.RegionSize, (int)Constants.RegionSize); 3618// WorldExtents = new Vector2((int)Constants.RegionSize, (int)Constants.RegionSize);
3626 m_parentScene = null; 3619// m_parentScene = null;
3627 3620//
3628 foreach (IntPtr g in geomDestroyList) 3621// foreach (IntPtr g in geomDestroyList)
3629 { 3622// {
3630 // removingHeightField needs to be done or the garbage collector will 3623// // removingHeightField needs to be done or the garbage collector will
3631 // collect the terrain data before we tell ODE to destroy it causing 3624// // collect the terrain data before we tell ODE to destroy it causing
3632 // memory corruption 3625// // memory corruption
3633 if (TerrainHeightFieldHeights.ContainsKey(g)) 3626// if (TerrainHeightFieldHeights.ContainsKey(g))
3634 { 3627// {
3635// float[] removingHeightField = TerrainHeightFieldHeights[g]; 3628//// float[] removingHeightField = TerrainHeightFieldHeights[g];
3636 TerrainHeightFieldHeights.Remove(g); 3629// TerrainHeightFieldHeights.Remove(g);
3637 3630//
3638 if (RegionTerrain.ContainsKey(g)) 3631// if (RegionTerrain.ContainsKey(g))
3639 { 3632// {
3640 RegionTerrain.Remove(g); 3633// RegionTerrain.Remove(g);
3641 } 3634// }
3642 3635//
3643 d.GeomDestroy(g); 3636// d.GeomDestroy(g);
3644 //removingHeightField = new float[0]; 3637// //removingHeightField = new float[0];
3645 } 3638// }
3646 } 3639// }
3647 3640//
3648 } 3641// }
3649 else 3642// else
3650 { 3643// {
3651 m_log.Warn("[PHYSICS]: Couldn't proceed with UnCombine. Region has inconsistant data."); 3644// m_log.Warn("[PHYSICS]: Couldn't proceed with UnCombine. Region has inconsistant data.");
3652 } 3645// }
3653 } 3646// }
3654 } 3647// }
3655 } 3648// }
3656 3649
3657 public override void SetWaterLevel(float baseheight) 3650 public override void SetWaterLevel(float baseheight)
3658 { 3651 {