aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdeScene.cs64
1 files changed, 36 insertions, 28 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
index 9d41b15..c436fca 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
@@ -2738,7 +2738,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2738 } 2738 }
2739 2739
2740 if (SupportsNINJAJoints) 2740 if (SupportsNINJAJoints)
2741 SimulateNINJAJoints(); 2741 SimulatePendingNINJAJoints();
2742 2742
2743 if (processedtaints) 2743 if (processedtaints)
2744//Console.WriteLine("Simulate calls Clear of _taintedPrim list"); 2744//Console.WriteLine("Simulate calls Clear of _taintedPrim list");
@@ -2839,6 +2839,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2839 { 2839 {
2840 if (actor.bad) 2840 if (actor.bad)
2841 m_log.WarnFormat("[PHYSICS]: BAD Actor {0} in _characters list was not removed?", actor.m_uuid); 2841 m_log.WarnFormat("[PHYSICS]: BAD Actor {0} in _characters list was not removed?", actor.m_uuid);
2842
2842 actor.UpdatePositionAndVelocity(); 2843 actor.UpdatePositionAndVelocity();
2843 } 2844 }
2844 } 2845 }
@@ -2852,6 +2853,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2852 { 2853 {
2853 RemoveCharacter(chr); 2854 RemoveCharacter(chr);
2854 } 2855 }
2856
2855 _badCharacter.Clear(); 2857 _badCharacter.Clear();
2856 } 2858 }
2857 } 2859 }
@@ -2867,30 +2869,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2867 actor.UpdatePositionAndVelocity(); 2869 actor.UpdatePositionAndVelocity();
2868 2870
2869 if (SupportsNINJAJoints) 2871 if (SupportsNINJAJoints)
2870 { 2872 SimulateActorPendingJoints(actor);
2871 // If an actor moved, move its joint proxy objects as well.
2872 // There seems to be an event PhysicsActor.OnPositionUpdate that could be used
2873 // for this purpose but it is never called! So we just do the joint
2874 // movement code here.
2875
2876 if (actor.SOPName != null &&
2877 joints_connecting_actor.ContainsKey(actor.SOPName) &&
2878 joints_connecting_actor[actor.SOPName] != null &&
2879 joints_connecting_actor[actor.SOPName].Count > 0)
2880 {
2881 foreach (PhysicsJoint affectedJoint in joints_connecting_actor[actor.SOPName])
2882 {
2883 if (affectedJoint.IsInPhysicsEngine)
2884 {
2885 DoJointMoved(affectedJoint);
2886 }
2887 else
2888 {
2889 DoJointErrorMessage(affectedJoint, "a body connected to a joint was moved, but the joint doesn't exist yet! this will lead to joint error. joint was: " + affectedJoint.ObjectNameInScene + " parms:" + affectedJoint.RawParams);
2890 }
2891 }
2892 }
2893 }
2894 } 2873 }
2895 } 2874 }
2896 } 2875 }
@@ -2901,7 +2880,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2901 // Finished with all sim stepping. If requested, dump world state to file for debugging. 2880 // Finished with all sim stepping. If requested, dump world state to file for debugging.
2902 // TODO: This call to the export function is already inside lock (OdeLock) - but is an extra lock needed? 2881 // TODO: This call to the export function is already inside lock (OdeLock) - but is an extra lock needed?
2903 // TODO: This overwrites all dump files in-place. Should this be a growing logfile, or separate snapshots? 2882 // TODO: This overwrites all dump files in-place. Should this be a growing logfile, or separate snapshots?
2904 if (physics_logging && (physics_logging_interval>0) && (framecount % physics_logging_interval == 0)) 2883 if (physics_logging && (physics_logging_interval > 0) && (framecount % physics_logging_interval == 0))
2905 { 2884 {
2906 string fname = "state-" + world.ToString() + ".DIF"; // give each physics world a separate filename 2885 string fname = "state-" + world.ToString() + ".DIF"; // give each physics world a separate filename
2907 string prefix = "world" + world.ToString(); // prefix for variable names in exported .DIF file 2886 string prefix = "world" + world.ToString(); // prefix for variable names in exported .DIF file
@@ -2925,7 +2904,9 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2925 // If Physics stalls, it takes longer which makes the tick count ms larger. 2904 // If Physics stalls, it takes longer which makes the tick count ms larger.
2926 2905
2927 if (latertickcount < 100) 2906 if (latertickcount < 100)
2907 {
2928 m_timeDilation = 1.0f; 2908 m_timeDilation = 1.0f;
2909 }
2929 else 2910 else
2930 { 2911 {
2931 m_timeDilation = 100f / latertickcount; 2912 m_timeDilation = 100f / latertickcount;
@@ -2939,12 +2920,12 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
2939 } 2920 }
2940 2921
2941 /// <summary> 2922 /// <summary>
2942 /// Simulate NINJA joints. 2923 /// Simulate pending NINJA joints.
2943 /// </summary> 2924 /// </summary>
2944 /// <remarks> 2925 /// <remarks>
2945 /// Called by the main Simulate() loop if NINJA joints are active. Should not be called from anywhere else. 2926 /// Called by the main Simulate() loop if NINJA joints are active. Should not be called from anywhere else.
2946 /// </remarks> 2927 /// </remarks>
2947 protected void SimulateNINJAJoints() 2928 protected void SimulatePendingNINJAJoints()
2948 { 2929 {
2949 // Create pending joints, if possible 2930 // Create pending joints, if possible
2950 2931
@@ -3007,6 +2988,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
3007 } 2988 }
3008 } 2989 }
3009 } 2990 }
2991
3010 if (allJointBodiesAreReady) 2992 if (allJointBodiesAreReady)
3011 { 2993 {
3012 //DoJointErrorMessage(joint, "allJointBodiesAreReady for " + joint.ObjectNameInScene + " with parms " + joint.RawParams); 2994 //DoJointErrorMessage(joint, "allJointBodiesAreReady for " + joint.ObjectNameInScene + " with parms " + joint.RawParams);
@@ -3126,6 +3108,32 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
3126 } 3108 }
3127 } 3109 }
3128 3110
3111 protected void SimulateActorPendingJoints(OdePrim actor)
3112 {
3113 // If an actor moved, move its joint proxy objects as well.
3114 // There seems to be an event PhysicsActor.OnPositionUpdate that could be used
3115 // for this purpose but it is never called! So we just do the joint
3116 // movement code here.
3117
3118 if (actor.SOPName != null &&
3119 joints_connecting_actor.ContainsKey(actor.SOPName) &&
3120 joints_connecting_actor[actor.SOPName] != null &&
3121 joints_connecting_actor[actor.SOPName].Count > 0)
3122 {
3123 foreach (PhysicsJoint affectedJoint in joints_connecting_actor[actor.SOPName])
3124 {
3125 if (affectedJoint.IsInPhysicsEngine)
3126 {
3127 DoJointMoved(affectedJoint);
3128 }
3129 else
3130 {
3131 DoJointErrorMessage(affectedJoint, "a body connected to a joint was moved, but the joint doesn't exist yet! this will lead to joint error. joint was: " + affectedJoint.ObjectNameInScene + " parms:" + affectedJoint.RawParams);
3132 }
3133 }
3134 }
3135 }
3136
3129 public override void GetResults() 3137 public override void GetResults()
3130 { 3138 {
3131 } 3139 }