aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Permissions.cs36
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs139
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneBase.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs14
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs39
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs153
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs925
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs4
8 files changed, 643 insertions, 670 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
index d01cef7..d1d6b6a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
@@ -35,7 +35,7 @@ using OpenSim.Region.Framework.Interfaces;
35namespace OpenSim.Region.Framework.Scenes 35namespace OpenSim.Region.Framework.Scenes
36{ 36{
37 #region Delegates 37 #region Delegates
38 public delegate uint GenerateClientFlagsHandler(UUID userID, UUID objectIDID); 38 public delegate uint GenerateClientFlagsHandler(UUID userID, UUID objectID);
39 public delegate void SetBypassPermissionsHandler(bool value); 39 public delegate void SetBypassPermissionsHandler(bool value);
40 public delegate bool BypassPermissionsHandler(); 40 public delegate bool BypassPermissionsHandler();
41 public delegate bool PropagatePermissionsHandler(); 41 public delegate bool PropagatePermissionsHandler();
@@ -147,28 +147,28 @@ namespace OpenSim.Region.Framework.Scenes
147 147
148 public uint GenerateClientFlags(UUID userID, UUID objectID) 148 public uint GenerateClientFlags(UUID userID, UUID objectID)
149 { 149 {
150 SceneObjectPart part=m_scene.GetSceneObjectPart(objectID); 150 // libomv will moan about PrimFlags.ObjectYouOfficer being
151 // obsolete...
152#pragma warning disable 0612
153 const PrimFlags DEFAULT_FLAGS =
154 PrimFlags.ObjectModify |
155 PrimFlags.ObjectCopy |
156 PrimFlags.ObjectMove |
157 PrimFlags.ObjectTransfer |
158 PrimFlags.ObjectYouOwner |
159 PrimFlags.ObjectAnyOwner |
160 PrimFlags.ObjectOwnerModify |
161 PrimFlags.ObjectYouOfficer;
162#pragma warning restore 0612
163
164 SceneObjectPart part = m_scene.GetSceneObjectPart(objectID);
151 165
152 if (part == null) 166 if (part == null)
153 return 0; 167 return 0;
154 168
155 // libomv will moan about PrimFlags.ObjectYouOfficer being 169 uint perms = part.GetEffectiveObjectFlags() | (uint)DEFAULT_FLAGS;
156 // obsolete...
157 #pragma warning disable 0612
158 uint perms=part.GetEffectiveObjectFlags() |
159 (uint)PrimFlags.ObjectModify |
160 (uint)PrimFlags.ObjectCopy |
161 (uint)PrimFlags.ObjectMove |
162 (uint)PrimFlags.ObjectTransfer |
163 (uint)PrimFlags.ObjectYouOwner |
164 (uint)PrimFlags.ObjectAnyOwner |
165 (uint)PrimFlags.ObjectOwnerModify |
166 (uint)PrimFlags.ObjectYouOfficer;
167 #pragma warning restore 0612
168
169 GenerateClientFlagsHandler handlerGenerateClientFlags =
170 OnGenerateClientFlags;
171 170
171 GenerateClientFlagsHandler handlerGenerateClientFlags = OnGenerateClientFlags;
172 if (handlerGenerateClientFlags != null) 172 if (handlerGenerateClientFlags != null)
173 { 173 {
174 Delegate[] list = handlerGenerateClientFlags.GetInvocationList(); 174 Delegate[] list = handlerGenerateClientFlags.GetInvocationList();
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 7c3875d..a6ee40a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -135,6 +135,11 @@ namespace OpenSim.Region.Framework.Scenes
135 protected SceneCommunicationService m_sceneGridService; 135 protected SceneCommunicationService m_sceneGridService;
136 public bool loginsdisabled = true; 136 public bool loginsdisabled = true;
137 137
138 public new float TimeDilation
139 {
140 get { return m_sceneGraph.PhysicsScene.TimeDilation; }
141 }
142
138 public SceneCommunicationService SceneGridService 143 public SceneCommunicationService SceneGridService
139 { 144 {
140 get { return m_sceneGridService; } 145 get { return m_sceneGridService; }
@@ -252,7 +257,7 @@ namespace OpenSim.Region.Framework.Scenes
252 // Central Update Loop 257 // Central Update Loop
253 258
254 protected int m_fps = 10; 259 protected int m_fps = 10;
255 protected int m_frame; 260 protected uint m_frame;
256 protected float m_timespan = 0.089f; 261 protected float m_timespan = 0.089f;
257 protected DateTime m_lastupdate = DateTime.UtcNow; 262 protected DateTime m_lastupdate = DateTime.UtcNow;
258 263
@@ -269,6 +274,23 @@ namespace OpenSim.Region.Framework.Scenes
269 private int physicsMS2; 274 private int physicsMS2;
270 private int physicsMS; 275 private int physicsMS;
271 private int otherMS; 276 private int otherMS;
277 private int tempOnRezMS;
278 private int eventMS;
279 private int backupMS;
280 private int terrainMS;
281 private int landMS;
282 private int lastCompletedFrame;
283
284 public int MonitorFrameTime { get { return frameMS; } }
285 public int MonitorPhysicsUpdateTime { get { return physicsMS; } }
286 public int MonitorPhysicsSyncTime { get { return physicsMS2; } }
287 public int MonitorOtherTime { get { return otherMS; } }
288 public int MonitorTempOnRezTime { get { return tempOnRezMS; } }
289 public int MonitorEventTime { get { return eventMS; } } // This may need to be divided into each event?
290 public int MonitorBackupTime { get { return backupMS; } }
291 public int MonitorTerrainTime { get { return terrainMS; } }
292 public int MonitorLandTime { get { return landMS; } }
293 public int MonitorLastFrameTick { get { return lastCompletedFrame; } }
272 294
273 private bool m_physics_enabled = true; 295 private bool m_physics_enabled = true;
274 private bool m_scripts_enabled = true; 296 private bool m_scripts_enabled = true;
@@ -1013,36 +1035,25 @@ namespace OpenSim.Region.Framework.Scenes
1013 /// </summary> 1035 /// </summary>
1014 public override void Update() 1036 public override void Update()
1015 { 1037 {
1016 int maintc = 0; 1038 float physicsFPS;
1039 int maintc;
1040
1017 while (!shuttingdown) 1041 while (!shuttingdown)
1018 { 1042 {
1019//#if DEBUG
1020// int w = 0, io = 0;
1021// ThreadPool.GetAvailableThreads(out w, out io);
1022// if ((w < 10) || (io < 10))
1023// m_log.DebugFormat("[WARNING]: ThreadPool reaching exhaustion. workers = {0}; io = {1}", w, io);
1024//#endif
1025 maintc = Environment.TickCount;
1026
1027 TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate; 1043 TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate;
1028 float physicsFPS = 0; 1044 physicsFPS = 0f;
1045
1046 maintc = maintc = otherMS = Environment.TickCount;
1047 int tmpFrameMS = maintc;
1029 1048
1030 frameMS = Environment.TickCount; 1049 // Increment the frame counter
1050 ++m_frame;
1031 1051
1032 try 1052 try
1033 { 1053 {
1034 // Increment the frame counter
1035 m_frame++;
1036
1037 // Loop it
1038 if (m_frame == Int32.MaxValue)
1039 m_frame = 0;
1040
1041 otherMS = Environment.TickCount;
1042
1043 // Check if any objects have reached their targets 1054 // Check if any objects have reached their targets
1044 CheckAtTargets(); 1055 CheckAtTargets();
1045 1056
1046 // Update SceneObjectGroups that have scheduled themselves for updates 1057 // Update SceneObjectGroups that have scheduled themselves for updates
1047 // Objects queue their updates onto all scene presences 1058 // Objects queue their updates onto all scene presences
1048 if (m_frame % m_update_objects == 0) 1059 if (m_frame % m_update_objects == 0)
@@ -1053,62 +1064,92 @@ namespace OpenSim.Region.Framework.Scenes
1053 if (m_frame % m_update_presences == 0) 1064 if (m_frame % m_update_presences == 0)
1054 m_sceneGraph.UpdatePresences(); 1065 m_sceneGraph.UpdatePresences();
1055 1066
1056 physicsMS2 = Environment.TickCount; 1067 int TempPhysicsMS2 = Environment.TickCount;
1057 if ((m_frame % m_update_physics == 0) && m_physics_enabled) 1068 if ((m_frame % m_update_physics == 0) && m_physics_enabled)
1058 m_sceneGraph.UpdatePreparePhysics(); 1069 m_sceneGraph.UpdatePreparePhysics();
1059 physicsMS2 = Environment.TickCount - physicsMS2; 1070 TempPhysicsMS2 = Environment.TickCount - TempPhysicsMS2;
1071 physicsMS2 = TempPhysicsMS2;
1060 1072
1061 if (m_frame % m_update_entitymovement == 0) 1073 if (m_frame % m_update_entitymovement == 0)
1062 m_sceneGraph.UpdateScenePresenceMovement(); 1074 m_sceneGraph.UpdateScenePresenceMovement();
1063 1075
1064 physicsMS = Environment.TickCount; 1076 int TempPhysicsMS = Environment.TickCount;
1065 if ((m_frame % m_update_physics == 0) && m_physics_enabled) 1077 if (m_frame % m_update_physics == 0)
1066 physicsFPS = m_sceneGraph.UpdatePhysics( 1078 {
1067 Math.Max(SinceLastFrame.TotalSeconds, m_timespan) 1079 if (m_physics_enabled)
1068 ); 1080 physicsFPS = m_sceneGraph.UpdatePhysics(Math.Max(SinceLastFrame.TotalSeconds, m_timespan));
1069 if (m_frame % m_update_physics == 0 && SynchronizeScene != null) 1081 if (SynchronizeScene != null)
1070 SynchronizeScene(this); 1082 SynchronizeScene(this);
1071 1083 }
1072 physicsMS = Environment.TickCount - physicsMS; 1084 TempPhysicsMS = Environment.TickCount - TempPhysicsMS;
1073 physicsMS += physicsMS2; 1085 physicsMS = TempPhysicsMS;
1074 1086
1075 // Delete temp-on-rez stuff 1087 // Delete temp-on-rez stuff
1076 if (m_frame % m_update_backup == 0) 1088 if (m_frame % m_update_backup == 0)
1089 {
1090 int tozMS = Environment.TickCount;
1077 CleanTempObjects(); 1091 CleanTempObjects();
1092 tozMS -= Environment.TickCount;
1093 tempOnRezMS = tozMS;
1094 }
1078 1095
1079 if (RegionStatus != RegionStatus.SlaveScene) 1096 if (RegionStatus != RegionStatus.SlaveScene)
1080 { 1097 {
1081 if (m_frame % m_update_events == 0) 1098 if (m_frame % m_update_events == 0)
1099 {
1100 int evMS = Environment.TickCount;
1082 UpdateEvents(); 1101 UpdateEvents();
1102 evMS -= Environment.TickCount;
1103 eventMS = evMS;
1104 }
1083 1105
1084 if (m_frame % m_update_backup == 0) 1106 if (m_frame % m_update_backup == 0)
1107 {
1108 int backMS = Environment.TickCount;
1085 UpdateStorageBackup(); 1109 UpdateStorageBackup();
1110 backMS -= Environment.TickCount;
1111 backupMS = backMS;
1112 }
1086 1113
1087 if (m_frame % m_update_terrain == 0) 1114 if (m_frame % m_update_terrain == 0)
1115 {
1116 int terMS = Environment.TickCount;
1088 UpdateTerrain(); 1117 UpdateTerrain();
1118 terMS -= Environment.TickCount;
1119 terrainMS = terMS;
1120 }
1089 1121
1090 if (m_frame % m_update_land == 0) 1122 if (m_frame % m_update_land == 0)
1123 {
1124 int ldMS = Environment.TickCount;
1091 UpdateLand(); 1125 UpdateLand();
1126 ldMS -= Environment.TickCount;
1127 landMS = ldMS;
1128 }
1129
1130 int tickCount = Environment.TickCount;
1131 otherMS = tickCount - otherMS;
1132 tmpFrameMS -= tickCount;
1133 frameMS = tmpFrameMS;
1134 lastCompletedFrame = tickCount;
1092 1135
1093 otherMS = Environment.TickCount - otherMS;
1094 // if (m_frame%m_update_avatars == 0) 1136 // if (m_frame%m_update_avatars == 0)
1095 // UpdateInWorldTime(); 1137 // UpdateInWorldTime();
1096 StatsReporter.AddPhysicsFPS(physicsFPS); 1138 StatsReporter.AddPhysicsFPS(physicsFPS);
1097 StatsReporter.AddTimeDilation(m_timedilation); 1139 StatsReporter.AddTimeDilation(TimeDilation);
1098 StatsReporter.AddFPS(1); 1140 StatsReporter.AddFPS(1);
1099 StatsReporter.AddInPackets(0);
1100 StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); 1141 StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount());
1101 StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); 1142 StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount());
1102 StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); 1143 StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount());
1103 StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); 1144 StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount());
1104 frameMS = Environment.TickCount - frameMS;
1105 StatsReporter.addFrameMS(frameMS); 1145 StatsReporter.addFrameMS(frameMS);
1106 StatsReporter.addPhysicsMS(physicsMS); 1146 StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
1107 StatsReporter.addOtherMS(otherMS); 1147 StatsReporter.addOtherMS(otherMS);
1108 StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); 1148 StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount());
1109 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); 1149 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
1110 } 1150 }
1111 if (loginsdisabled && (m_frame > 20)) 1151
1152 if (loginsdisabled && m_frame > 20)
1112 { 1153 {
1113 // In 99.9% of cases it is a bad idea to manually force garbage collection. However, 1154 // In 99.9% of cases it is a bad idea to manually force garbage collection. However,
1114 // this is a rare case where we know we have just went through a long cycle of heap 1155 // this is a rare case where we know we have just went through a long cycle of heap
@@ -1141,18 +1182,6 @@ namespace OpenSim.Region.Framework.Scenes
1141 } 1182 }
1142 finally 1183 finally
1143 { 1184 {
1144 //updateLock.ReleaseMutex();
1145 // Get actual time dilation
1146 float tmpval = (m_timespan / (float)SinceLastFrame.TotalSeconds);
1147
1148 // If actual time dilation is greater then one, we're catching up, so subtract
1149 // the amount that's greater then 1 from the time dilation
1150 if (tmpval > 1.0)
1151 {
1152 tmpval = tmpval - (tmpval - 1.0f);
1153 }
1154 m_timedilation = tmpval;
1155
1156 m_lastupdate = DateTime.UtcNow; 1185 m_lastupdate = DateTime.UtcNow;
1157 } 1186 }
1158 maintc = Environment.TickCount - maintc; 1187 maintc = Environment.TickCount - maintc;
@@ -1183,9 +1212,9 @@ namespace OpenSim.Region.Framework.Scenes
1183 { 1212 {
1184 lock (m_groupsWithTargets) 1213 lock (m_groupsWithTargets)
1185 { 1214 {
1186 foreach (KeyValuePair<UUID, SceneObjectGroup> kvp in m_groupsWithTargets) 1215 foreach (SceneObjectGroup entry in m_groupsWithTargets.Values)
1187 { 1216 {
1188 kvp.Value.checkAtTargets(); 1217 entry.checkAtTargets();
1189 } 1218 }
1190 } 1219 }
1191 } 1220 }
@@ -4606,7 +4635,7 @@ namespace OpenSim.Region.Framework.Scenes
4606 SceneObjectPart trackedBody = GetSceneObjectPart(joint.TrackedBodyName); // FIXME: causes a sequential lookup 4635 SceneObjectPart trackedBody = GetSceneObjectPart(joint.TrackedBodyName); // FIXME: causes a sequential lookup
4607 if (trackedBody == null) return; // the actor may have been deleted but the joint still lingers around a few frames waiting for deletion. during this time, trackedBody is NULL to prevent further motion of the joint proxy. 4636 if (trackedBody == null) return; // the actor may have been deleted but the joint still lingers around a few frames waiting for deletion. during this time, trackedBody is NULL to prevent further motion of the joint proxy.
4608 jointProxyObject.Velocity = trackedBody.Velocity; 4637 jointProxyObject.Velocity = trackedBody.Velocity;
4609 jointProxyObject.RotationalVelocity = trackedBody.RotationalVelocity; 4638 jointProxyObject.AngularVelocity = trackedBody.AngularVelocity;
4610 switch (joint.Type) 4639 switch (joint.Type)
4611 { 4640 {
4612 case PhysicsJointType.Ball: 4641 case PhysicsJointType.Ball:
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs
index 82731d1..1547f9a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs
@@ -106,9 +106,8 @@ namespace OpenSim.Region.Framework.Scenes
106 106
107 public float TimeDilation 107 public float TimeDilation
108 { 108 {
109 get { return m_timedilation; } 109 get { return 1.0f; }
110 } 110 }
111 protected float m_timedilation = 1.0f;
112 111
113 protected ulong m_regionHandle; 112 protected ulong m_regionHandle;
114 protected string m_regionName; 113 protected string m_regionName;
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index db055f9..2fdb48d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -369,26 +369,30 @@ namespace OpenSim.Region.Framework.Scenes
369 /// </summary> 369 /// </summary>
370 protected internal void UpdateObjectGroups() 370 protected internal void UpdateObjectGroups()
371 { 371 {
372 Dictionary<UUID, SceneObjectGroup> updates; 372 List<SceneObjectGroup> updates;
373
373 // Some updates add more updates to the updateList. 374 // Some updates add more updates to the updateList.
374 // Get the current list of updates and clear the list before iterating 375 // Get the current list of updates and clear the list before iterating
375 lock (m_updateList) 376 lock (m_updateList)
376 { 377 {
377 updates = new Dictionary<UUID, SceneObjectGroup>(m_updateList); 378 updates = new List<SceneObjectGroup>(m_updateList.Values);
378 m_updateList.Clear(); 379 m_updateList.Clear();
379 } 380 }
381
380 // Go through all updates 382 // Go through all updates
381 foreach (KeyValuePair<UUID, SceneObjectGroup> kvp in updates) 383 for (int i = 0; i < updates.Count; i++)
382 { 384 {
385 SceneObjectGroup sog = updates[i];
386
383 // Don't abort the whole update if one entity happens to give us an exception. 387 // Don't abort the whole update if one entity happens to give us an exception.
384 try 388 try
385 { 389 {
386 kvp.Value.Update(); 390 sog.Update();
387 } 391 }
388 catch (Exception e) 392 catch (Exception e)
389 { 393 {
390 m_log.ErrorFormat( 394 m_log.ErrorFormat(
391 "[INNER SCENE]: Failed to update {0}, {1} - {2}", kvp.Value.Name, kvp.Value.UUID, e); 395 "[INNER SCENE]: Failed to update {0}, {1} - {2}", sog.Name, sog.UUID, e);
392 } 396 }
393 } 397 }
394 } 398 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 38a0cff..c65a665 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1015,9 +1015,9 @@ namespace OpenSim.Region.Framework.Scenes
1015 } 1015 }
1016 } 1016 }
1017 1017
1018 public float GetTimeDilation() 1018 public ushort GetTimeDilation()
1019 { 1019 {
1020 return m_scene.TimeDilation; 1020 return Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
1021 } 1021 }
1022 1022
1023 /// <summary> 1023 /// <summary>
@@ -1857,28 +1857,15 @@ namespace OpenSim.Region.Framework.Scenes
1857 { 1857 {
1858 bool UsePhysics = ((RootPart.Flags & PrimFlags.Physics) != 0); 1858 bool UsePhysics = ((RootPart.Flags & PrimFlags.Physics) != 0);
1859 1859
1860 //if (IsAttachment) 1860 if (UsePhysics && !AbsolutePosition.ApproxEquals(lastPhysGroupPos, 0.02f))
1861 //{
1862 //foreach (SceneObjectPart part in m_parts.Values)
1863 //{
1864 //part.SendScheduledUpdates();
1865 //}
1866 //return;
1867 //}
1868
1869 if (UsePhysics && Util.DistanceLessThan(lastPhysGroupPos, AbsolutePosition, 0.02))
1870 { 1861 {
1871 m_rootPart.UpdateFlag = 1; 1862 m_rootPart.UpdateFlag = 1;
1872 lastPhysGroupPos = AbsolutePosition; 1863 lastPhysGroupPos = AbsolutePosition;
1873 } 1864 }
1874 1865
1875 if (UsePhysics && ((Math.Abs(lastPhysGroupRot.W - GroupRotation.W) > 0.1) 1866 if (UsePhysics && !GroupRotation.ApproxEquals(lastPhysGroupRot, 0.1f))
1876 || (Math.Abs(lastPhysGroupRot.X - GroupRotation.X) > 0.1)
1877 || (Math.Abs(lastPhysGroupRot.Y - GroupRotation.Y) > 0.1)
1878 || (Math.Abs(lastPhysGroupRot.Z - GroupRotation.Z) > 0.1)))
1879 { 1867 {
1880 m_rootPart.UpdateFlag = 1; 1868 m_rootPart.UpdateFlag = 1;
1881
1882 lastPhysGroupRot = GroupRotation; 1869 lastPhysGroupRot = GroupRotation;
1883 } 1870 }
1884 1871
@@ -2959,12 +2946,13 @@ namespace OpenSim.Region.Framework.Scenes
2959 /// <param name="rot"></param> 2946 /// <param name="rot"></param>
2960 public void UpdateGroupRotationR(Quaternion rot) 2947 public void UpdateGroupRotationR(Quaternion rot)
2961 { 2948 {
2962
2963 m_rootPart.UpdateRotation(rot); 2949 m_rootPart.UpdateRotation(rot);
2964 if (m_rootPart.PhysActor != null) 2950
2951 PhysicsActor actor = m_rootPart.PhysActor;
2952 if (actor != null)
2965 { 2953 {
2966 m_rootPart.PhysActor.Orientation = m_rootPart.RotationOffset; 2954 actor.Orientation = m_rootPart.RotationOffset;
2967 m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); 2955 m_scene.PhysicsScene.AddPhysicsActorTaint(actor);
2968 } 2956 }
2969 2957
2970 HasGroupChanged = true; 2958 HasGroupChanged = true;
@@ -2979,11 +2967,14 @@ namespace OpenSim.Region.Framework.Scenes
2979 public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot) 2967 public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot)
2980 { 2968 {
2981 m_rootPart.UpdateRotation(rot); 2969 m_rootPart.UpdateRotation(rot);
2982 if (m_rootPart.PhysActor != null) 2970
2971 PhysicsActor actor = m_rootPart.PhysActor;
2972 if (actor != null)
2983 { 2973 {
2984 m_rootPart.PhysActor.Orientation = m_rootPart.RotationOffset; 2974 actor.Orientation = m_rootPart.RotationOffset;
2985 m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); 2975 m_scene.PhysicsScene.AddPhysicsActorTaint(actor);
2986 } 2976 }
2977
2987 AbsolutePosition = pos; 2978 AbsolutePosition = pos;
2988 2979
2989 HasGroupChanged = true; 2980 HasGroupChanged = true;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 9b11582..2bc7f66 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -253,6 +253,7 @@ namespace OpenSim.Region.Framework.Scenes
253 protected Vector3 m_lastVelocity; 253 protected Vector3 m_lastVelocity;
254 protected Vector3 m_lastAcceleration; 254 protected Vector3 m_lastAcceleration;
255 protected Vector3 m_lastAngularVelocity; 255 protected Vector3 m_lastAngularVelocity;
256 protected int m_lastTerseSent;
256 257
257 // TODO: Those have to be changed into persistent properties at some later point, 258 // TODO: Those have to be changed into persistent properties at some later point,
258 // or sit-camera on vehicles will break on sim-crossing. 259 // or sit-camera on vehicles will break on sim-crossing.
@@ -506,20 +507,17 @@ namespace OpenSim.Region.Framework.Scenes
506 get 507 get
507 { 508 {
508 // If this is a linkset, we don't want the physics engine mucking up our group position here. 509 // If this is a linkset, we don't want the physics engine mucking up our group position here.
509 if (PhysActor != null && _parentID == 0) 510 PhysicsActor actor = PhysActor;
511 if (actor != null && _parentID == 0)
510 { 512 {
511 m_groupPosition.X = PhysActor.Position.X; 513 m_groupPosition = actor.Position;
512 m_groupPosition.Y = PhysActor.Position.Y;
513 m_groupPosition.Z = PhysActor.Position.Z;
514 } 514 }
515 515
516 if (IsAttachment) 516 if (IsAttachment)
517 { 517 {
518 ScenePresence sp = m_parentGroup.Scene.GetScenePresence(AttachedAvatar); 518 ScenePresence sp = m_parentGroup.Scene.GetScenePresence(AttachedAvatar);
519 if (sp != null) 519 if (sp != null)
520 {
521 return sp.AbsolutePosition; 520 return sp.AbsolutePosition;
522 }
523 } 521 }
524 522
525 return m_groupPosition; 523 return m_groupPosition;
@@ -530,26 +528,25 @@ namespace OpenSim.Region.Framework.Scenes
530 528
531 m_groupPosition = value; 529 m_groupPosition = value;
532 530
533 if (PhysActor != null) 531 PhysicsActor actor = PhysActor;
532 if (actor != null)
534 { 533 {
535 try 534 try
536 { 535 {
537 // Root prim actually goes at Position 536 // Root prim actually goes at Position
538 if (_parentID == 0) 537 if (_parentID == 0)
539 { 538 {
540 PhysActor.Position = value; 539 actor.Position = value;
541 } 540 }
542 else 541 else
543 { 542 {
544 // To move the child prim in respect to the group position and rotation we have to calculate 543 // To move the child prim in respect to the group position and rotation we have to calculate
545 Vector3 resultingposition = GetWorldPosition(); 544 actor.Position = GetWorldPosition();
546 PhysActor.Position = resultingposition; 545 actor.Orientation = GetWorldRotation();
547 Quaternion resultingrot = GetWorldRotation();
548 PhysActor.Orientation = resultingrot;
549 } 546 }
550 547
551 // Tell the physics engines that this prim changed. 548 // Tell the physics engines that this prim changed.
552 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 549 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
553 } 550 }
554 catch (Exception e) 551 catch (Exception e)
555 { 552 {
@@ -582,15 +579,14 @@ namespace OpenSim.Region.Framework.Scenes
582 579
583 if (ParentGroup != null && !ParentGroup.IsDeleted) 580 if (ParentGroup != null && !ParentGroup.IsDeleted)
584 { 581 {
585 if (_parentID != 0 && PhysActor != null) 582 PhysicsActor actor = PhysActor;
583 if (_parentID != 0 && actor != null)
586 { 584 {
587 Vector3 resultingposition = GetWorldPosition(); 585 actor.Position = GetWorldPosition();
588 PhysActor.Position = resultingposition; 586 actor.Orientation = GetWorldRotation();
589 Quaternion resultingrot = GetWorldRotation();
590 PhysActor.Orientation = resultingrot;
591 587
592 // Tell the physics engines that this prim changed. 588 // Tell the physics engines that this prim changed.
593 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 589 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
594 } 590 }
595 } 591 }
596 } 592 }
@@ -601,12 +597,13 @@ namespace OpenSim.Region.Framework.Scenes
601 get 597 get
602 { 598 {
603 // We don't want the physics engine mucking up the rotations in a linkset 599 // We don't want the physics engine mucking up the rotations in a linkset
604 if ((_parentID == 0) && (Shape.PCode != 9 || Shape.State == 0) && (PhysActor != null)) 600 PhysicsActor actor = PhysActor;
601 if (_parentID == 0 && (Shape.PCode != 9 || Shape.State == 0) && actor != null)
605 { 602 {
606 if (PhysActor.Orientation.X != 0 || PhysActor.Orientation.Y != 0 603 if (actor.Orientation.X != 0f || actor.Orientation.Y != 0f
607 || PhysActor.Orientation.Z != 0 || PhysActor.Orientation.W != 0) 604 || actor.Orientation.Z != 0f || actor.Orientation.W != 0f)
608 { 605 {
609 m_rotationOffset = PhysActor.Orientation; 606 m_rotationOffset = actor.Orientation;
610 } 607 }
611 } 608 }
612 609
@@ -618,24 +615,25 @@ namespace OpenSim.Region.Framework.Scenes
618 StoreUndoState(); 615 StoreUndoState();
619 m_rotationOffset = value; 616 m_rotationOffset = value;
620 617
621 if (PhysActor != null) 618 PhysicsActor actor = PhysActor;
619 if (actor != null)
622 { 620 {
623 try 621 try
624 { 622 {
625 // Root prim gets value directly 623 // Root prim gets value directly
626 if (_parentID == 0) 624 if (_parentID == 0)
627 { 625 {
628 PhysActor.Orientation = value; 626 actor.Orientation = value;
629 //m_log.Info("[PART]: RO1:" + PhysActor.Orientation.ToString()); 627 //m_log.Info("[PART]: RO1:" + actor.Orientation.ToString());
630 } 628 }
631 else 629 else
632 { 630 {
633 // Child prim we have to calculate it's world rotationwel 631 // Child prim we have to calculate it's world rotationwel
634 Quaternion resultingrotation = GetWorldRotation(); 632 Quaternion resultingrotation = GetWorldRotation();
635 PhysActor.Orientation = resultingrotation; 633 actor.Orientation = resultingrotation;
636 //m_log.Info("[PART]: RO2:" + PhysActor.Orientation.ToString()); 634 //m_log.Info("[PART]: RO2:" + actor.Orientation.ToString());
637 } 635 }
638 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 636 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
639 //} 637 //}
640 } 638 }
641 catch (Exception ex) 639 catch (Exception ex)
@@ -652,16 +650,12 @@ namespace OpenSim.Region.Framework.Scenes
652 { 650 {
653 get 651 get
654 { 652 {
655 //if (PhysActor.Velocity.X != 0 || PhysActor.Velocity.Y != 0 653 PhysicsActor actor = PhysActor;
656 //|| PhysActor.Velocity.Z != 0) 654 if (actor != null)
657 //{
658 if (PhysActor != null)
659 { 655 {
660 if (PhysActor.IsPhysical) 656 if (actor.IsPhysical)
661 { 657 {
662 m_velocity.X = PhysActor.Velocity.X; 658 m_velocity = actor.Velocity;
663 m_velocity.Y = PhysActor.Velocity.Y;
664 m_velocity.Z = PhysActor.Velocity.Z;
665 } 659 }
666 } 660 }
667 661
@@ -671,31 +665,28 @@ namespace OpenSim.Region.Framework.Scenes
671 set 665 set
672 { 666 {
673 m_velocity = value; 667 m_velocity = value;
674 if (PhysActor != null) 668
669 PhysicsActor actor = PhysActor;
670 if (actor != null)
675 { 671 {
676 if (PhysActor.IsPhysical) 672 if (actor.IsPhysical)
677 { 673 {
678 PhysActor.Velocity = value; 674 actor.Velocity = value;
679 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 675 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
680 } 676 }
681 } 677 }
682 } 678 }
683 } 679 }
684 680
685 public Vector3 RotationalVelocity
686 {
687 get { return AngularVelocity; }
688 set { AngularVelocity = value; }
689 }
690
691 /// <summary></summary> 681 /// <summary></summary>
692 public Vector3 AngularVelocity 682 public Vector3 AngularVelocity
693 { 683 {
694 get 684 get
695 { 685 {
696 if ((PhysActor != null) && PhysActor.IsPhysical) 686 PhysicsActor actor = PhysActor;
687 if ((actor != null) && actor.IsPhysical)
697 { 688 {
698 m_angularVelocity.FromBytes(PhysActor.RotationalVelocity.GetBytes(), 0); 689 m_angularVelocity = actor.RotationalVelocity;
699 } 690 }
700 return m_angularVelocity; 691 return m_angularVelocity;
701 } 692 }
@@ -715,9 +706,10 @@ namespace OpenSim.Region.Framework.Scenes
715 set 706 set
716 { 707 {
717 m_description = value; 708 m_description = value;
718 if (PhysActor != null) 709 PhysicsActor actor = PhysActor;
710 if (actor != null)
719 { 711 {
720 PhysActor.SOPDescription = value; 712 actor.SOPDescription = value;
721 } 713 }
722 } 714 }
723 } 715 }
@@ -808,21 +800,23 @@ namespace OpenSim.Region.Framework.Scenes
808 set 800 set
809 { 801 {
810 StoreUndoState(); 802 StoreUndoState();
811if (m_shape != null) { 803 if (m_shape != null)
812 m_shape.Scale = value;
813
814 if (PhysActor != null && m_parentGroup != null)
815 { 804 {
816 if (m_parentGroup.Scene != null) 805 m_shape.Scale = value;
806
807 PhysicsActor actor = PhysActor;
808 if (actor != null && m_parentGroup != null)
817 { 809 {
818 if (m_parentGroup.Scene.PhysicsScene != null) 810 if (m_parentGroup.Scene != null)
819 { 811 {
820 PhysActor.Size = m_shape.Scale; 812 if (m_parentGroup.Scene.PhysicsScene != null)
821 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 813 {
814 actor.Size = m_shape.Scale;
815 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
816 }
822 } 817 }
823 } 818 }
824 } 819 }
825}
826 TriggerScriptChangedEvent(Changed.SCALE); 820 TriggerScriptChangedEvent(Changed.SCALE);
827 } 821 }
828 } 822 }
@@ -1056,8 +1050,6 @@ if (m_shape != null) {
1056 1050
1057 #endregion Public Properties with only Get 1051 #endregion Public Properties with only Get
1058 1052
1059
1060
1061 #region Private Methods 1053 #region Private Methods
1062 1054
1063 private uint ApplyMask(uint val, bool set, uint mask) 1055 private uint ApplyMask(uint val, bool set, uint mask)
@@ -1551,9 +1543,9 @@ if (m_shape != null) {
1551 m_parentGroup.Scene.PhysicsScene.RequestJointDeletion(Name); // FIXME: what if the name changed? 1543 m_parentGroup.Scene.PhysicsScene.RequestJointDeletion(Name); // FIXME: what if the name changed?
1552 1544
1553 // make sure client isn't interpolating the joint proxy object 1545 // make sure client isn't interpolating the joint proxy object
1554 Velocity = new Vector3(0, 0, 0); 1546 Velocity = Vector3.Zero;
1555 RotationalVelocity = new Vector3(0, 0, 0); 1547 AngularVelocity = Vector3.Zero;
1556 Acceleration = new Vector3(0, 0, 0); 1548 Acceleration = Vector3.Zero;
1557 } 1549 }
1558 } 1550 }
1559 } 1551 }
@@ -1816,7 +1808,7 @@ if (m_shape != null) {
1816 } 1808 }
1817 1809
1818 CollisionEventUpdate a = (CollisionEventUpdate)e; 1810 CollisionEventUpdate a = (CollisionEventUpdate)e;
1819 Dictionary<uint, float> collissionswith = a.m_objCollisionList; 1811 Dictionary<uint, ContactPoint> collissionswith = a.m_objCollisionList;
1820 List<uint> thisHitColliders = new List<uint>(); 1812 List<uint> thisHitColliders = new List<uint>();
1821 List<uint> endedColliders = new List<uint>(); 1813 List<uint> endedColliders = new List<uint>();
1822 List<uint> startedColliders = new List<uint>(); 1814 List<uint> startedColliders = new List<uint>();
@@ -2382,8 +2374,8 @@ if (m_shape != null) {
2382 //isattachment = ParentGroup.RootPart.IsAttachment; 2374 //isattachment = ParentGroup.RootPart.IsAttachment;
2383 2375
2384 byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A}; 2376 byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A};
2385 remoteClient.SendPrimitiveToClient(new SendPrimitiveData(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape, 2377 remoteClient.SendPrimitiveToClient(new SendPrimitiveData(m_regionHandle, m_parentGroup.GetTimeDilation(), LocalId, m_shape,
2386 lPos, Velocity, Acceleration, RotationOffset, RotationalVelocity, clientFlags, m_uuid, _ownerID, 2378 lPos, Velocity, Acceleration, RotationOffset, AngularVelocity, clientFlags, m_uuid, _ownerID,
2387 m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment, 2379 m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment,
2388 AttachmentPoint,FromItemID, Sound, SoundGain, SoundFlags, SoundRadius, ParentGroup.GetUpdatePriority(remoteClient))); 2380 AttachmentPoint,FromItemID, Sound, SoundGain, SoundFlags, SoundRadius, ParentGroup.GetUpdatePriority(remoteClient)));
2389 } 2381 }
@@ -2393,17 +2385,20 @@ if (m_shape != null) {
2393 /// </summary> 2385 /// </summary>
2394 public void SendScheduledUpdates() 2386 public void SendScheduledUpdates()
2395 { 2387 {
2396 const float VELOCITY_TOLERANCE = 0.01f; 2388 const float ROTATION_TOLERANCE = 0.01f;
2397 const float POSITION_TOLERANCE = 0.1f; 2389 const float VELOCITY_TOLERANCE = 0.001f;
2390 const float POSITION_TOLERANCE = 0.05f;
2391 const int TIME_MS_TOLERANCE = 3000;
2398 2392
2399 if (m_updateFlag == 1) 2393 if (m_updateFlag == 1)
2400 { 2394 {
2401 // Throw away duplicate or insignificant updates 2395 // Throw away duplicate or insignificant updates
2402 if (RotationOffset != m_lastRotation || 2396 if (!RotationOffset.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
2403 Acceleration != m_lastAcceleration || 2397 !Acceleration.Equals(m_lastAcceleration) ||
2404 (Velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE || 2398 !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
2405 (RotationalVelocity - m_lastAngularVelocity).Length() > VELOCITY_TOLERANCE || 2399 !AngularVelocity.ApproxEquals(m_lastAngularVelocity, VELOCITY_TOLERANCE) ||
2406 (OffsetPosition - m_lastPosition).Length() > POSITION_TOLERANCE) 2400 !OffsetPosition.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
2401 Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
2407 { 2402 {
2408 AddTerseUpdateToAllAvatars(); 2403 AddTerseUpdateToAllAvatars();
2409 ClearUpdateSchedule(); 2404 ClearUpdateSchedule();
@@ -2421,7 +2416,8 @@ if (m_shape != null) {
2421 m_lastRotation = RotationOffset; 2416 m_lastRotation = RotationOffset;
2422 m_lastVelocity = Velocity; 2417 m_lastVelocity = Velocity;
2423 m_lastAcceleration = Acceleration; 2418 m_lastAcceleration = Acceleration;
2424 m_lastAngularVelocity = RotationalVelocity; 2419 m_lastAngularVelocity = AngularVelocity;
2420 m_lastTerseSent = Environment.TickCount;
2425 } 2421 }
2426 } 2422 }
2427 else 2423 else
@@ -3780,10 +3776,9 @@ if (m_shape != null) {
3780 // Causes this thread to dig into the Client Thread Data. 3776 // Causes this thread to dig into the Client Thread Data.
3781 // Remember your locking here! 3777 // Remember your locking here!
3782 remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle, 3778 remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle,
3783 (ushort)(m_parentGroup.GetTimeDilation() * 3779 m_parentGroup.GetTimeDilation(), LocalId, lPos,
3784 (float)ushort.MaxValue), LocalId, lPos,
3785 RotationOffset, Velocity, Acceleration, 3780 RotationOffset, Velocity, Acceleration,
3786 RotationalVelocity, state, FromItemID, 3781 AngularVelocity, state, FromItemID,
3787 OwnerID, (int)AttachmentPoint, null, ParentGroup.GetUpdatePriority(remoteClient))); 3782 OwnerID, (int)AttachmentPoint, null, ParentGroup.GetUpdatePriority(remoteClient)));
3788 } 3783 }
3789 3784
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 87fac0c..6c0d9f2 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -76,8 +76,18 @@ namespace OpenSim.Region.Framework.Scenes
76 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 76 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
77 77
78 private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 }; 78 private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
79 79 private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
80 public static byte[] DefaultTexture; 80 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
81 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
82 /// <summary>
83 /// Experimentally determined "fudge factor" to make sit-target positions
84 /// the same as in SecondLife. Fudge factor was tested for 36 different
85 /// test cases including prims of type box, sphere, cylinder, and torus,
86 /// with varying parameters for sit target location, prim size, prim
87 /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
88 /// issue #1716
89 /// </summary>
90 private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
81 91
82 public UUID currentParcelUUID = UUID.Zero; 92 public UUID currentParcelUUID = UUID.Zero;
83 93
@@ -92,16 +102,18 @@ namespace OpenSim.Region.Framework.Scenes
92 //private SceneObjectPart proxyObjectPart = null; 102 //private SceneObjectPart proxyObjectPart = null;
93 public Vector3 lastKnownAllowedPosition; 103 public Vector3 lastKnownAllowedPosition;
94 public bool sentMessageAboutRestrictedParcelFlyingDown; 104 public bool sentMessageAboutRestrictedParcelFlyingDown;
105 public Vector4 CollisionPlane = Vector4.UnitW;
95 106
96 private Vector3 m_lastPosition; 107 private Vector3 m_lastPosition;
97 private Quaternion m_lastRotation; 108 private Quaternion m_lastRotation;
98 private Vector3 m_lastVelocity; 109 private Vector3 m_lastVelocity;
110 //private int m_lastTerseSent;
99 111
100 private bool m_updateflag; 112 private bool m_updateflag;
101 private byte m_movementflag; 113 private byte m_movementflag;
102 private readonly List<NewForce> m_forcesList = new List<NewForce>(); 114 private Vector3? m_forceToApply;
103 private uint m_requestedSitTargetID; 115 private uint m_requestedSitTargetID;
104 private UUID m_requestedSitTargetUUID = UUID.Zero; 116 private UUID m_requestedSitTargetUUID;
105 private SendCourseLocationsMethod m_sendCourseLocationsMethod; 117 private SendCourseLocationsMethod m_sendCourseLocationsMethod;
106 118
107 private bool m_startAnimationSet; 119 private bool m_startAnimationSet;
@@ -112,30 +124,24 @@ namespace OpenSim.Region.Framework.Scenes
112 124
113 private float m_sitAvatarHeight = 2.0f; 125 private float m_sitAvatarHeight = 2.0f;
114 126
115 // experimentally determined "fudge factor" to make sit-target positions
116 // the same as in SecondLife. Fudge factor was tested for 36 different
117 // test cases including prims of type box, sphere, cylinder, and torus,
118 // with varying parameters for sit target location, prim size, prim
119 // rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
120 // issue #1716
121 private static readonly Vector3 m_sitTargetCorrectionOffset = new Vector3(0.1f, 0.0f, 0.3f);
122 private float m_godlevel; 127 private float m_godlevel;
123 128
124 private bool m_invulnerable = true; 129 private bool m_invulnerable = true;
125 130
126 private Vector3 m_LastChildAgentUpdatePosition; 131 private Vector3 m_lastChildAgentUpdatePosition;
132 private Vector3 m_lastChildAgentUpdateCamPosition;
127 133
128 private int m_perfMonMS; 134 private int m_perfMonMS;
129 135
130 private bool m_setAlwaysRun; 136 private bool m_setAlwaysRun;
131 137
132 private string m_movementAnimation = "DEFAULT"; 138 private string m_movementAnimation = "DEFAULT";
133 private long m_animPersistUntil = 0; 139 private int m_animTickFall;
134 private bool m_allowFalling = false; 140 private int m_animTickJump;
135 private bool m_useFlySlow = false; 141 private bool m_useFlySlow;
136 private bool m_usePreJump = false; 142 private bool m_usePreJump;
137 private bool m_forceFly = false; 143 private bool m_forceFly;
138 private bool m_flyDisabled = false; 144 private bool m_flyDisabled;
139 145
140 private float m_speedModifier = 1.0f; 146 private float m_speedModifier = 1.0f;
141 147
@@ -143,7 +149,7 @@ namespace OpenSim.Region.Framework.Scenes
143 149
144 public bool IsRestrictedToRegion; 150 public bool IsRestrictedToRegion;
145 151
146 public string JID = string.Empty; 152 public string JID = String.Empty;
147 153
148 // Agent moves with a PID controller causing a force to be exerted. 154 // Agent moves with a PID controller causing a force to be exerted.
149 private bool m_newCoarseLocations = true; 155 private bool m_newCoarseLocations = true;
@@ -158,43 +164,43 @@ namespace OpenSim.Region.Framework.Scenes
158 private readonly Vector3[] Dir_Vectors = new Vector3[6]; 164 private readonly Vector3[] Dir_Vectors = new Vector3[6];
159 165
160 // Position of agent's camera in world (region cordinates) 166 // Position of agent's camera in world (region cordinates)
161 protected Vector3 m_CameraCenter = Vector3.Zero; 167 protected Vector3 m_CameraCenter;
162 protected Vector3 m_lastCameraCenter = Vector3.Zero; 168 protected Vector3 m_lastCameraCenter;
163 169
164 protected Timer m_reprioritization_timer; 170 protected Timer m_reprioritization_timer;
165 protected bool m_reprioritizing = false; 171 protected bool m_reprioritizing;
166 protected bool m_reprioritization_called = false; 172 protected bool m_reprioritization_called;
167 173
168 // Use these three vectors to figure out what the agent is looking at 174 // Use these three vectors to figure out what the agent is looking at
169 // Convert it to a Matrix and/or Quaternion 175 // Convert it to a Matrix and/or Quaternion
170 protected Vector3 m_CameraAtAxis = Vector3.Zero; 176 protected Vector3 m_CameraAtAxis;
171 protected Vector3 m_CameraLeftAxis = Vector3.Zero; 177 protected Vector3 m_CameraLeftAxis;
172 protected Vector3 m_CameraUpAxis = Vector3.Zero; 178 protected Vector3 m_CameraUpAxis;
173 private uint m_AgentControlFlags; 179 private AgentManager.ControlFlags m_AgentControlFlags;
174 private Quaternion m_headrotation = Quaternion.Identity; 180 private Quaternion m_headrotation = Quaternion.Identity;
175 private byte m_state; 181 private byte m_state;
176 182
177 //Reuse the Vector3 instead of creating a new one on the UpdateMovement method 183 //Reuse the Vector3 instead of creating a new one on the UpdateMovement method
178 private Vector3 movementvector = Vector3.Zero; 184 private Vector3 movementvector;
179 185
180 private bool m_autopilotMoving; 186 private bool m_autopilotMoving;
181 private Vector3 m_autoPilotTarget = Vector3.Zero; 187 private Vector3 m_autoPilotTarget;
182 private bool m_sitAtAutoTarget; 188 private bool m_sitAtAutoTarget;
183 189
184 private string m_nextSitAnimation = String.Empty; 190 private string m_nextSitAnimation = String.Empty;
185 191
186 //PauPaw:Proper PID Controler for autopilot************ 192 //PauPaw:Proper PID Controler for autopilot************
187 private bool m_moveToPositionInProgress; 193 private bool m_moveToPositionInProgress;
188 private Vector3 m_moveToPositionTarget = Vector3.Zero; 194 private Vector3 m_moveToPositionTarget;
189 195
190 private bool m_followCamAuto = false; 196 private bool m_followCamAuto;
191 197
192 private int m_movementUpdateCount = 0; 198 private int m_movementUpdateCount;
193 199
194 private const int NumMovementsBetweenRayCast = 5; 200 private const int NumMovementsBetweenRayCast = 5;
195 201
196 private bool CameraConstraintActive = false; 202 private bool CameraConstraintActive;
197 //private int m_moveToPositionStateStatus = 0; 203 //private int m_moveToPositionStateStatus;
198 //***************************************************** 204 //*****************************************************
199 205
200 // Agent's Draw distance. 206 // Agent's Draw distance.
@@ -268,11 +274,9 @@ namespace OpenSim.Region.Framework.Scenes
268 get { return m_godlevel; } 274 get { return m_godlevel; }
269 } 275 }
270 276
271 private readonly ulong m_regionHandle;
272
273 public ulong RegionHandle 277 public ulong RegionHandle
274 { 278 {
275 get { return m_regionHandle; } 279 get { return m_rootRegionHandle; }
276 } 280 }
277 281
278 public Vector3 CameraPosition 282 public Vector3 CameraPosition
@@ -379,8 +383,8 @@ namespace OpenSim.Region.Framework.Scenes
379 383
380 public uint AgentControlFlags 384 public uint AgentControlFlags
381 { 385 {
382 get { return m_AgentControlFlags; } 386 get { return (uint)m_AgentControlFlags; }
383 set { m_AgentControlFlags = value; } 387 set { m_AgentControlFlags = (AgentManager.ControlFlags)value; }
384 } 388 }
385 389
386 /// <summary> 390 /// <summary>
@@ -411,31 +415,27 @@ namespace OpenSim.Region.Framework.Scenes
411 } 415 }
412 416
413 /// <summary> 417 /// <summary>
414 /// Absolute position of this avatar in 'region cordinates' 418 /// Position of this avatar relative to the region the avatar is in
415 /// </summary> 419 /// </summary>
416 public override Vector3 AbsolutePosition 420 public override Vector3 AbsolutePosition
417 { 421 {
418 get 422 get
419 { 423 {
420 if (m_physicsActor != null) 424 PhysicsActor actor = m_physicsActor;
421 { 425 if (actor != null)
422 m_pos.X = m_physicsActor.Position.X; 426 m_pos = actor.Position;
423 m_pos.Y = m_physicsActor.Position.Y;
424 m_pos.Z = m_physicsActor.Position.Z;
425 }
426 427
427 return m_parentPosition + m_pos; 428 return m_parentPosition + m_pos;
428 } 429 }
429 set 430 set
430 { 431 {
431 if (m_physicsActor != null) 432 PhysicsActor actor = m_physicsActor;
433 if (actor != null)
432 { 434 {
433 try 435 try
434 { 436 {
435 lock (m_scene.SyncRoot) 437 lock (m_scene.SyncRoot)
436 {
437 m_physicsActor.Position = value; 438 m_physicsActor.Position = value;
438 }
439 } 439 }
440 catch (Exception e) 440 catch (Exception e)
441 { 441 {
@@ -444,7 +444,7 @@ namespace OpenSim.Region.Framework.Scenes
444 } 444 }
445 445
446 m_pos = value; 446 m_pos = value;
447 m_parentPosition = new Vector3(0, 0, 0); 447 m_parentPosition = Vector3.Zero;
448 } 448 }
449 } 449 }
450 450
@@ -455,27 +455,21 @@ namespace OpenSim.Region.Framework.Scenes
455 { 455 {
456 get 456 get
457 { 457 {
458 if (m_physicsActor != null) 458 PhysicsActor actor = m_physicsActor;
459 { 459 if (actor != null)
460 m_velocity.X = m_physicsActor.Velocity.X; 460 m_velocity = actor.Velocity;
461 m_velocity.Y = m_physicsActor.Velocity.Y;
462 m_velocity.Z = m_physicsActor.Velocity.Z;
463 }
464 461
465 return m_velocity; 462 return m_velocity;
466 } 463 }
467 set 464 set
468 { 465 {
469 //m_log.DebugFormat("In {0} setting velocity of {1} to {2}", m_scene.RegionInfo.RegionName, Name, value); 466 PhysicsActor actor = m_physicsActor;
470 467 if (actor != null)
471 if (m_physicsActor != null)
472 { 468 {
473 try 469 try
474 { 470 {
475 lock (m_scene.SyncRoot) 471 lock (m_scene.SyncRoot)
476 { 472 actor.Velocity = value;
477 m_physicsActor.Velocity = value;
478 }
479 } 473 }
480 catch (Exception e) 474 catch (Exception e)
481 { 475 {
@@ -627,7 +621,7 @@ namespace OpenSim.Region.Framework.Scenes
627 { 621 {
628 m_sendCourseLocationsMethod = SendCoarseLocationsDefault; 622 m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
629 CreateSceneViewer(); 623 CreateSceneViewer();
630 m_regionHandle = reginfo.RegionHandle; 624 m_rootRegionHandle = reginfo.RegionHandle;
631 m_controllingClient = client; 625 m_controllingClient = client;
632 m_firstname = m_controllingClient.FirstName; 626 m_firstname = m_controllingClient.FirstName;
633 m_lastname = m_controllingClient.LastName; 627 m_lastname = m_controllingClient.LastName;
@@ -710,25 +704,25 @@ namespace OpenSim.Region.Framework.Scenes
710 704
711 private void SetDirectionVectors() 705 private void SetDirectionVectors()
712 { 706 {
713 Dir_Vectors[0] = new Vector3(1, 0, 0); //FORWARD 707 Dir_Vectors[0] = Vector3.UnitX; //FORWARD
714 Dir_Vectors[1] = new Vector3(-1, 0, 0); //BACK 708 Dir_Vectors[1] = -Vector3.UnitX; //BACK
715 Dir_Vectors[2] = new Vector3(0, 1, 0); //LEFT 709 Dir_Vectors[2] = Vector3.UnitY; //LEFT
716 Dir_Vectors[3] = new Vector3(0, -1, 0); //RIGHT 710 Dir_Vectors[3] = -Vector3.UnitY; //RIGHT
717 Dir_Vectors[4] = new Vector3(0, 0, 1); //UP 711 Dir_Vectors[4] = Vector3.UnitZ; //UP
718 Dir_Vectors[5] = new Vector3(0, 0, -1); //DOWN 712 Dir_Vectors[5] = -Vector3.UnitZ; //DOWN
719 Dir_Vectors[5] = new Vector3(0, 0, -0.5f); //DOWN_Nudge 713 Dir_Vectors[5] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
720 } 714 }
721 715
722 private Vector3[] GetWalkDirectionVectors() 716 private Vector3[] GetWalkDirectionVectors()
723 { 717 {
724 Vector3[] vector = new Vector3[6]; 718 Vector3[] vector = new Vector3[6];
725 vector[0] = new Vector3(m_CameraUpAxis.Z, 0, -m_CameraAtAxis.Z); //FORWARD 719 vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
726 vector[1] = new Vector3(-m_CameraUpAxis.Z, 0, m_CameraAtAxis.Z); //BACK 720 vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
727 vector[2] = new Vector3(0, 1, 0); //LEFT 721 vector[2] = Vector3.UnitY; //LEFT
728 vector[3] = new Vector3(0, -1, 0); //RIGHT 722 vector[3] = -Vector3.UnitY; //RIGHT
729 vector[4] = new Vector3(m_CameraAtAxis.Z, 0, m_CameraUpAxis.Z); //UP 723 vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP
730 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0, -m_CameraUpAxis.Z); //DOWN 724 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
731 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0, -m_CameraUpAxis.Z); //DOWN_Nudge 725 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_Nudge
732 return vector; 726 return vector;
733 } 727 }
734 728
@@ -781,6 +775,8 @@ namespace OpenSim.Region.Framework.Scenes
781 if (gm != null) 775 if (gm != null)
782 m_grouptitle = gm.GetGroupTitle(m_uuid); 776 m_grouptitle = gm.GetGroupTitle(m_uuid);
783 777
778 m_rootRegionHandle = m_scene.RegionInfo.RegionHandle;
779
784 m_scene.SetRootAgentScene(m_uuid); 780 m_scene.SetRootAgentScene(m_uuid);
785 781
786 // Moved this from SendInitialData to ensure that m_appearance is initialized 782 // Moved this from SendInitialData to ensure that m_appearance is initialized
@@ -811,7 +807,6 @@ namespace OpenSim.Region.Framework.Scenes
811 pos = emergencyPos; 807 pos = emergencyPos;
812 } 808 }
813 809
814
815 float localAVHeight = 1.56f; 810 float localAVHeight = 1.56f;
816 if (m_avHeight != 127.0f) 811 if (m_avHeight != 127.0f)
817 { 812 {
@@ -906,6 +901,8 @@ namespace OpenSim.Region.Framework.Scenes
906 m_isChildAgent = true; 901 m_isChildAgent = true;
907 m_scene.SwapRootAgentCount(true); 902 m_scene.SwapRootAgentCount(true);
908 RemoveFromPhysicalScene(); 903 RemoveFromPhysicalScene();
904
905 // FIXME: Set m_rootRegionHandle to the region handle of the scene this agent is moving into
909 906
910 m_scene.EventManager.TriggerOnMakeChildAgent(this); 907 m_scene.EventManager.TriggerOnMakeChildAgent(this);
911 } 908 }
@@ -937,7 +934,7 @@ namespace OpenSim.Region.Framework.Scenes
937 isFlying = m_physicsActor.Flying; 934 isFlying = m_physicsActor.Flying;
938 935
939 RemoveFromPhysicalScene(); 936 RemoveFromPhysicalScene();
940 Velocity = new Vector3(0, 0, 0); 937 Velocity = Vector3.Zero;
941 AbsolutePosition = pos; 938 AbsolutePosition = pos;
942 AddToPhysicalScene(isFlying); 939 AddToPhysicalScene(isFlying);
943 if (m_appearance != null) 940 if (m_appearance != null)
@@ -985,12 +982,13 @@ namespace OpenSim.Region.Framework.Scenes
985 982
986 if (m_avHeight != 127.0f) 983 if (m_avHeight != 127.0f)
987 { 984 {
988 AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (m_avHeight / 6f)); 985 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (m_avHeight / 6f));
989 } 986 }
990 else 987 else
991 { 988 {
992 AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (1.56f / 6f)); 989 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f));
993 } 990 }
991
994 TrySetMovementAnimation("LAND"); 992 TrySetMovementAnimation("LAND");
995 SendFullUpdateToAllClients(); 993 SendFullUpdateToAllClients();
996 } 994 }
@@ -1076,7 +1074,7 @@ namespace OpenSim.Region.Framework.Scenes
1076 } 1074 }
1077 1075
1078 m_isChildAgent = false; 1076 m_isChildAgent = false;
1079 bool m_flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); 1077 bool m_flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1080 MakeRootAgent(AbsolutePosition, m_flying); 1078 MakeRootAgent(AbsolutePosition, m_flying);
1081 1079
1082 if ((m_callbackURI != null) && !m_callbackURI.Equals("")) 1080 if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
@@ -1103,9 +1101,12 @@ namespace OpenSim.Region.Framework.Scenes
1103 /// <param name="distance"></param> 1101 /// <param name="distance"></param>
1104 public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance) 1102 public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance)
1105 { 1103 {
1104 const float POSITION_TOLERANCE = 0.02f;
1105 const float VELOCITY_TOLERANCE = 0.02f;
1106 const float ROTATION_TOLERANCE = 0.02f;
1107
1106 if (m_followCamAuto) 1108 if (m_followCamAuto)
1107 { 1109 {
1108
1109 if (hitYN) 1110 if (hitYN)
1110 { 1111 {
1111 CameraConstraintActive = true; 1112 CameraConstraintActive = true;
@@ -1114,11 +1115,11 @@ namespace OpenSim.Region.Framework.Scenes
1114 Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint); 1115 Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint);
1115 ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); 1116 ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint)));
1116 } 1117 }
1117 else 1118 else
1118 { 1119 {
1119 if ((m_pos - m_lastPosition).Length() > 0.02f || 1120 if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
1120 (m_velocity - m_lastVelocity).Length() > 0.02f || 1121 !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
1121 m_bodyRot != m_lastRotation) 1122 !m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
1122 { 1123 {
1123 if (CameraConstraintActive) 1124 if (CameraConstraintActive)
1124 { 1125 {
@@ -1127,13 +1128,11 @@ namespace OpenSim.Region.Framework.Scenes
1127 } 1128 }
1128 } 1129 }
1129 } 1130 }
1130 } 1131 }
1131 } 1132 }
1132 1133
1133 Array m_dirControlFlags = Enum.GetValues(typeof(Dir_ControlFlags));
1134
1135 /// <summary> 1134 /// <summary>
1136 /// This is the event handler for client movement. If a client is moving, this event is triggering. 1135 /// This is the event handler for client movement. If a client is moving, this event is triggering.
1137 /// </summary> 1136 /// </summary>
1138 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) 1137 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
1139 { 1138 {
@@ -1149,15 +1148,13 @@ namespace OpenSim.Region.Framework.Scenes
1149 if (m_movementUpdateCount < 1) 1148 if (m_movementUpdateCount < 1)
1150 m_movementUpdateCount = 1; 1149 m_movementUpdateCount = 1;
1151 1150
1152 // Must check for standing up even when PhysicsActor is null, 1151 #region Sanity Checking
1153 // since sitting currently removes avatar from physical scene
1154 //m_log.Debug("agentPos:" + AbsolutePosition.ToString());
1155 1152
1156 // This is irritating. Really. 1153 // This is irritating. Really.
1157 if (!AbsolutePosition.IsFinite()) 1154 if (!AbsolutePosition.IsFinite())
1158 { 1155 {
1159 RemoveFromPhysicalScene(); 1156 RemoveFromPhysicalScene();
1160 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error# 9999902"); 1157 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999902");
1161 1158
1162 m_pos = m_LastFinitePos; 1159 m_pos = m_LastFinitePos;
1163 if (!m_pos.IsFinite()) 1160 if (!m_pos.IsFinite())
@@ -1165,7 +1162,7 @@ namespace OpenSim.Region.Framework.Scenes
1165 m_pos.X = 127f; 1162 m_pos.X = 127f;
1166 m_pos.Y = 127f; 1163 m_pos.Y = 127f;
1167 m_pos.Z = 127f; 1164 m_pos.Z = 127f;
1168 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error# 9999903"); 1165 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999903");
1169 } 1166 }
1170 1167
1171 AddToPhysicalScene(false); 1168 AddToPhysicalScene(false);
@@ -1175,18 +1172,11 @@ namespace OpenSim.Region.Framework.Scenes
1175 m_LastFinitePos = m_pos; 1172 m_LastFinitePos = m_pos;
1176 } 1173 }
1177 1174
1178 //m_physicsActor.AddForce(new PhysicsVector(999999999, 99999999, 999999999999999), true); 1175 #endregion Sanity Checking
1179 1176
1180 //ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); 1177 #region Inputs
1181 //if (land != null)
1182 //{
1183 //if (land.landData.landingType == (byte)1 && land.landData.userLocation != Vector3.Zero)
1184 //{
1185 // agent.startpos = land.landData.userLocation;
1186 //}
1187 //}
1188 1178
1189 uint flags = agentData.ControlFlags; 1179 AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
1190 Quaternion bodyRotation = agentData.BodyRotation; 1180 Quaternion bodyRotation = agentData.BodyRotation;
1191 1181
1192 // Camera location in world. We'll need to raytrace 1182 // Camera location in world. We'll need to raytrace
@@ -1207,87 +1197,85 @@ namespace OpenSim.Region.Framework.Scenes
1207 // The Agent's Draw distance setting 1197 // The Agent's Draw distance setting
1208 m_DrawDistance = agentData.Far; 1198 m_DrawDistance = agentData.Far;
1209 1199
1210 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
1211 {
1212 StandUp();
1213 }
1214
1215 // Check if Client has camera in 'follow cam' or 'build' mode. 1200 // Check if Client has camera in 'follow cam' or 'build' mode.
1216 Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation); 1201 Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation);
1217 1202
1218 m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f) 1203 m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f)
1219 && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false; 1204 && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
1220 1205
1206 m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
1207 m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
1208
1209 #endregion Inputs
1210
1211 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
1212 {
1213 StandUp();
1214 }
1215
1221 //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto); 1216 //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
1222 // Raycast from the avatar's head to the camera to see if there's anything blocking the view 1217 // Raycast from the avatar's head to the camera to see if there's anything blocking the view
1223 if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast()) 1218 if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
1224 { 1219 {
1225 if (m_followCamAuto) 1220 if (m_followCamAuto)
1226 { 1221 {
1227 Vector3 headadjustment = new Vector3(0, 0, 0.3f); 1222 Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
1228 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - (m_pos + headadjustment)), Vector3.Distance(m_CameraCenter, (m_pos + headadjustment)) + 0.3f, RayCastCameraCallback); 1223 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback);
1229 } 1224 }
1230 } 1225 }
1231 1226
1232 m_mouseLook = (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
1233 m_leftButtonDown = (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
1234
1235 lock (scriptedcontrols) 1227 lock (scriptedcontrols)
1236 { 1228 {
1237 if (scriptedcontrols.Count > 0) 1229 if (scriptedcontrols.Count > 0)
1238 { 1230 {
1239 SendControlToScripts(flags); 1231 SendControlToScripts((uint)flags);
1240 flags = RemoveIgnoredControls(flags, IgnoredControls); 1232 flags = RemoveIgnoredControls(flags, IgnoredControls);
1241 } 1233 }
1242 } 1234 }
1243 1235
1244 if (PhysicsActor == null)
1245 {
1246 return;
1247 }
1248
1249 if (m_autopilotMoving) 1236 if (m_autopilotMoving)
1250 CheckAtSitTarget(); 1237 CheckAtSitTarget();
1251 1238
1252 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) 1239 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
1253 { 1240 {
1254 // TODO: This doesn't prevent the user from walking yet. 1241 // TODO: This doesn't prevent the user from walking yet.
1255 // Setting parent ID would fix this, if we knew what value 1242 // Setting parent ID would fix this, if we knew what value
1256 // to use. Or we could add a m_isSitting variable. 1243 // to use. Or we could add a m_isSitting variable.
1257
1258 TrySetMovementAnimation("SIT_GROUND_CONSTRAINED"); 1244 TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
1259 } 1245 }
1246
1260 // In the future, these values might need to go global. 1247 // In the future, these values might need to go global.
1261 // Here's where you get them. 1248 // Here's where you get them.
1262
1263 m_AgentControlFlags = flags; 1249 m_AgentControlFlags = flags;
1264 m_headrotation = agentData.HeadRotation; 1250 m_headrotation = agentData.HeadRotation;
1265 m_state = agentData.State; 1251 m_state = agentData.State;
1266 1252
1253 PhysicsActor actor = PhysicsActor;
1254 if (actor == null)
1255 {
1256 return;
1257 }
1258
1267 if (m_allowMovement) 1259 if (m_allowMovement)
1268 { 1260 {
1269 int i = 0; 1261 int i = 0;
1270 bool update_movementflag = false; 1262 bool update_movementflag = false;
1271 bool update_rotation = false; 1263 bool update_rotation = false;
1272 bool DCFlagKeyPressed = false; 1264 bool DCFlagKeyPressed = false;
1273 Vector3 agent_control_v3 = new Vector3(0, 0, 0); 1265 Vector3 agent_control_v3 = Vector3.Zero;
1274 Quaternion q = bodyRotation; 1266 Quaternion q = bodyRotation;
1275 if (PhysicsActor != null)
1276 {
1277 bool oldflying = PhysicsActor.Flying;
1278 1267
1279 if (m_forceFly) 1268 bool oldflying = PhysicsActor.Flying;
1280 PhysicsActor.Flying = true;
1281 else if (m_flyDisabled)
1282 PhysicsActor.Flying = false;
1283 else
1284 PhysicsActor.Flying = ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1285 1269
1286 if (PhysicsActor.Flying != oldflying) 1270 if (m_forceFly)
1287 { 1271 actor.Flying = true;
1288 update_movementflag = true; 1272 else if (m_flyDisabled)
1289 } 1273 actor.Flying = false;
1290 } 1274 else
1275 actor.Flying = ((flags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1276
1277 if (actor.Flying != oldflying)
1278 update_movementflag = true;
1291 1279
1292 if (q != m_bodyRot) 1280 if (q != m_bodyRot)
1293 { 1281 {
@@ -1309,10 +1297,9 @@ namespace OpenSim.Region.Framework.Scenes
1309 else 1297 else
1310 dirVectors = Dir_Vectors; 1298 dirVectors = Dir_Vectors;
1311 1299
1312 1300 foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
1313 foreach (Dir_ControlFlags DCF in m_dirControlFlags)
1314 { 1301 {
1315 if ((flags & (uint)DCF) != 0) 1302 if (((uint)flags & (uint)DCF) != 0)
1316 { 1303 {
1317 bResetMoveToPosition = true; 1304 bResetMoveToPosition = true;
1318 DCFlagKeyPressed = true; 1305 DCFlagKeyPressed = true;
@@ -1358,7 +1345,7 @@ namespace OpenSim.Region.Framework.Scenes
1358 if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving)) 1345 if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving))
1359 { 1346 {
1360 //Check the error term of the current position in relation to the target position 1347 //Check the error term of the current position in relation to the target position
1361 if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 1.5) 1348 if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 1.5f)
1362 { 1349 {
1363 // we are close enough to the target 1350 // we are close enough to the target
1364 m_moveToPositionTarget = Vector3.Zero; 1351 m_moveToPositionTarget = Vector3.Zero;
@@ -1439,8 +1426,8 @@ namespace OpenSim.Region.Framework.Scenes
1439 if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly) 1426 if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly)
1440 { 1427 {
1441 // Are the landing controls requirements filled? 1428 // Are the landing controls requirements filled?
1442 bool controlland = (((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || 1429 bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
1443 ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); 1430 ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
1444 1431
1445 // Are the collision requirements fulfilled? 1432 // Are the collision requirements fulfilled?
1446 bool colliding = (m_physicsActor.IsColliding == true); 1433 bool colliding = (m_physicsActor.IsColliding == true);
@@ -1537,7 +1524,7 @@ namespace OpenSim.Region.Framework.Scenes
1537 if (part != null) 1524 if (part != null)
1538 { 1525 {
1539 AbsolutePosition = part.AbsolutePosition; 1526 AbsolutePosition = part.AbsolutePosition;
1540 Velocity = new Vector3(0, 0, 0); 1527 Velocity = Vector3.Zero;
1541 SendFullUpdateToAllClients(); 1528 SendFullUpdateToAllClients();
1542 1529
1543 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); 1530 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID);
@@ -1607,7 +1594,7 @@ namespace OpenSim.Region.Framework.Scenes
1607 } 1594 }
1608 1595
1609 m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight); 1596 m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight);
1610 m_parentPosition = new Vector3(); 1597 m_parentPosition = Vector3.Zero;
1611 1598
1612 m_parentID = 0; 1599 m_parentID = 0;
1613 SendFullUpdateToAllClients(); 1600 SendFullUpdateToAllClients();
@@ -1834,7 +1821,7 @@ namespace OpenSim.Region.Framework.Scenes
1834 //Quaternion result = (sitTargetOrient * vq) * nq; 1821 //Quaternion result = (sitTargetOrient * vq) * nq;
1835 1822
1836 m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z); 1823 m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
1837 m_pos += m_sitTargetCorrectionOffset; 1824 m_pos += SIT_TARGET_ADJUSTMENT;
1838 m_bodyRot = sitTargetOrient; 1825 m_bodyRot = sitTargetOrient;
1839 //Rotation = sitTargetOrient; 1826 //Rotation = sitTargetOrient;
1840 m_parentPosition = part.AbsolutePosition; 1827 m_parentPosition = part.AbsolutePosition;
@@ -1854,7 +1841,7 @@ namespace OpenSim.Region.Framework.Scenes
1854 } 1841 }
1855 m_parentID = m_requestedSitTargetID; 1842 m_parentID = m_requestedSitTargetID;
1856 1843
1857 Velocity = new Vector3(0, 0, 0); 1844 Velocity = Vector3.Zero;
1858 RemoveFromPhysicalScene(); 1845 RemoveFromPhysicalScene();
1859 1846
1860 TrySetMovementAnimation(sitAnimation); 1847 TrySetMovementAnimation(sitAnimation);
@@ -2011,7 +1998,7 @@ namespace OpenSim.Region.Framework.Scenes
2011 protected void TrySetMovementAnimation(string anim) 1998 protected void TrySetMovementAnimation(string anim)
2012 { 1999 {
2013 //m_log.DebugFormat("Updating movement animation to {0}", anim); 2000 //m_log.DebugFormat("Updating movement animation to {0}", anim);
2014 2001
2015 if (!m_isChildAgent) 2002 if (!m_isChildAgent)
2016 { 2003 {
2017 if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero)) 2004 if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero))
@@ -2046,200 +2033,169 @@ namespace OpenSim.Region.Framework.Scenes
2046 /// </summary> 2033 /// </summary>
2047 public string GetMovementAnimation() 2034 public string GetMovementAnimation()
2048 { 2035 {
2049 if ((m_animPersistUntil > 0) && (m_animPersistUntil > DateTime.Now.Ticks)) 2036 const float FALL_DELAY = 0.33f;
2050 { 2037 const float PREJUMP_DELAY = 0.25f;
2051 //We don't want our existing state to end yet.
2052 return m_movementAnimation;
2053 2038
2054 } 2039 #region Inputs
2055 else if (m_movementflag != 0) 2040
2041 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_AgentControlFlags;
2042 PhysicsActor actor = m_physicsActor;
2043
2044 // Create forward and left vectors from the current avatar rotation
2045 Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_bodyRot);
2046 Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix);
2047 Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
2048
2049 // Check control flags
2050 bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
2051 bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
2052 bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
2053 bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
2054 //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
2055 //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
2056 bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
2057 bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
2058 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
2059 //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
2060
2061 // Direction in which the avatar is trying to move
2062 Vector3 move = Vector3.Zero;
2063 if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
2064 if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
2065 if (heldLeft) { move.X += left.X; move.Y += left.Y; }
2066 if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
2067 if (heldUp) { move.Z += 1; }
2068 if (heldDown) { move.Z -= 1; }
2069
2070 // Is the avatar trying to move?
2071 bool moving = (move != Vector3.Zero);
2072 bool jumping = m_animTickJump != 0;
2073
2074 #endregion Inputs
2075
2076 #region Flying
2077
2078 if (actor != null && actor.Flying)
2056 { 2079 {
2057 //We're moving 2080 m_animTickFall = 0;
2058 m_allowFalling = true; 2081 m_animTickJump = 0;
2059 if (PhysicsActor != null && PhysicsActor.IsColliding) 2082
2083 if (move.X != 0f || move.Y != 0f)
2060 { 2084 {
2061 //And colliding. Can you guess what it is yet? 2085 return (m_useFlySlow ? "FLYSLOW" : "FLY");
2062 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) 2086 }
2063 { 2087 else if (move.Z > 0f)
2064 //Down key is being pressed. 2088 {
2065 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) + (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0) 2089 return "HOVER_UP";
2066 { 2090 }
2067 return "CROUCHWALK"; 2091 else if (move.Z < 0f)
2068 } 2092 {
2069 else 2093 if (actor != null && actor.IsColliding)
2070 { 2094 return "LAND";
2071 return "CROUCH";
2072 }
2073 }
2074 else if (m_setAlwaysRun)
2075 {
2076 return "RUN";
2077 }
2078 else 2095 else
2079 { 2096 return "HOVER_DOWN";
2080 //If we're prejumping then inhibit this, it's a problem
2081 //caused by a false positive on IsColliding
2082 if (m_movementAnimation == "PREJUMP")
2083 {
2084 return "PREJUMP";
2085 }
2086 else
2087 {
2088 return "WALK";
2089 }
2090 }
2091
2092 } 2097 }
2093 else 2098 else
2094 { 2099 {
2095 //We're not colliding. Colliding isn't cool these days. 2100 return "HOVER";
2096 if (PhysicsActor != null && PhysicsActor.Flying) 2101 }
2097 { 2102 }
2098 //Are we moving forwards or backwards?
2099 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0)
2100 {
2101 //Then we really are flying
2102 if (m_setAlwaysRun)
2103 {
2104 return "FLY";
2105 }
2106 else
2107 {
2108 if (m_useFlySlow == false)
2109 {
2110 return "FLY";
2111 }
2112 else
2113 {
2114 return "FLYSLOW";
2115 }
2116 }
2117 }
2118 else
2119 {
2120 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
2121 {
2122 return "HOVER_UP";
2123 }
2124 else
2125 {
2126 return "HOVER_DOWN";
2127 }
2128 }
2129 2103
2130 } 2104 #endregion Flying
2131 else if (m_movementAnimation == "JUMP")
2132 {
2133 //If we were already jumping, continue to jump until we collide
2134 return "JUMP";
2135 2105
2136 } 2106 #region Falling/Floating/Landing
2137 else if (m_movementAnimation == "PREJUMP" && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == 0)
2138 {
2139 //If we were in a prejump, and the UP key is no longer being held down
2140 //then we're not going to fly, so we're jumping
2141 return "JUMP";
2142 2107
2143 } 2108 if (actor == null || !actor.IsColliding)
2144 else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) 2109 {
2145 { 2110 float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
2146 //They're pressing up, so we're either going to fly or jump 2111 float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
2147 return "PREJUMP"; 2112
2148 } 2113 if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f))
2149 else 2114 {
2150 { 2115 // Just started falling
2151 //If we're moving and not flying and not jumping and not colliding.. 2116 m_animTickFall = Environment.TickCount;
2152
2153 if (m_movementAnimation == "WALK" || m_movementAnimation == "RUN")
2154 {
2155 //Let's not enter a FALLDOWN state here, since we're probably
2156 //not colliding because we're going down hill.
2157 return m_movementAnimation;
2158 }
2159 //Record the time we enter this state so we know whether to "land" or not
2160 m_animPersistUntil = DateTime.Now.Ticks;
2161 return "FALLDOWN";
2162
2163 }
2164 } 2117 }
2118 else if (!jumping && fallElapsed > FALL_DELAY)
2119 {
2120 // Falling long enough to trigger the animation
2121 return "FALLDOWN";
2122 }
2123
2124 return m_movementAnimation;
2165 } 2125 }
2166 else 2126
2127 #endregion Falling/Floating/Landing
2128
2129 #region Ground Movement
2130
2131 if (m_movementAnimation == "FALLDOWN")
2167 { 2132 {
2168 //We're not moving. 2133 m_animTickFall = Environment.TickCount;
2169 if (PhysicsActor != null && PhysicsActor.IsColliding)
2170 {
2171 //But we are colliding.
2172 if (m_movementAnimation == "FALLDOWN")
2173 {
2174 //We're re-using the m_animPersistUntil value here to see how long we've been falling
2175 if ((DateTime.Now.Ticks - m_animPersistUntil) > TimeSpan.TicksPerSecond)
2176 {
2177 //Make sure we don't change state for a bit
2178 m_animPersistUntil = DateTime.Now.Ticks + TimeSpan.TicksPerSecond;
2179 return "LAND";
2180 }
2181 else
2182 {
2183 //We haven't been falling very long, we were probably just walking down hill
2184 return "STAND";
2185 }
2186 }
2187 else if (m_movementAnimation == "JUMP" || m_movementAnimation == "HOVER_DOWN")
2188 {
2189 //Make sure we don't change state for a bit
2190 m_animPersistUntil = DateTime.Now.Ticks + (1 * TimeSpan.TicksPerSecond);
2191 return "SOFT_LAND";
2192 2134
2193 } 2135 // TODO: SOFT_LAND support
2194 else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) 2136 return "LAND";
2195 { 2137 }
2196 return "PREJUMP"; 2138 else if (m_movementAnimation == "LAND")
2197 } 2139 {
2198 else if (PhysicsActor != null && PhysicsActor.Flying) 2140 float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
2199 {
2200 m_allowFalling = true;
2201 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
2202 {
2203 return "HOVER_UP";
2204 }
2205 else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0)
2206 {
2207 return "HOVER_DOWN";
2208 }
2209 else
2210 {
2211 return "HOVER";
2212 }
2213 }
2214 else
2215 {
2216 return "STAND";
2217 }
2218 2141
2142 if (landElapsed <= FALL_DELAY)
2143 return "LAND";
2144 }
2145
2146 m_animTickFall = 0;
2147
2148 if (move.Z > 0f)
2149 {
2150 // Jumping
2151 if (!jumping)
2152 {
2153 // Begin prejump
2154 m_animTickJump = Environment.TickCount;
2155 return "PREJUMP";
2219 } 2156 }
2220 else 2157 else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
2221 { 2158 {
2222 //We're not colliding. 2159 // Start actual jump
2223 if (PhysicsActor != null && PhysicsActor.Flying) 2160 if (m_animTickJump == -1)
2224 { 2161 {
2225 2162 // Already jumping! End the current jump
2226 return "HOVER"; 2163 m_animTickJump = 0;
2227 2164 return "JUMP";
2228 } 2165 }
2229 else if ((m_movementAnimation == "JUMP" || m_movementAnimation == "PREJUMP") && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == 0)
2230 {
2231 2166
2232 return "JUMP"; 2167 m_animTickJump = -1;
2168 return "JUMP";
2169 }
2170 }
2171 else
2172 {
2173 // Not jumping
2174 m_animTickJump = 0;
2233 2175
2234 } 2176 if (move.X != 0f || move.Y != 0f)
2177 {
2178 // Walking / crouchwalking / running
2179 if (move.Z < 0f)
2180 return "CROUCHWALK";
2181 else if (m_setAlwaysRun)
2182 return "RUN";
2235 else 2183 else
2236 { 2184 return "WALK";
2237 //Record the time we enter this state so we know whether to "land" or not 2185 }
2238 m_animPersistUntil = DateTime.Now.Ticks; 2186 else
2239 return "FALLDOWN"; // this falling animation is invoked too frequently when capsule tilt correction is used - why? 2187 {
2240 } 2188 // Not walking
2189 if (move.Z < 0f)
2190 return "CROUCH";
2191 else
2192 return "STAND";
2241 } 2193 }
2242 } 2194 }
2195
2196 #endregion Ground Movement
2197
2198 return m_movementAnimation;
2243 } 2199 }
2244 2200
2245 /// <summary> 2201 /// <summary>
@@ -2247,24 +2203,16 @@ namespace OpenSim.Region.Framework.Scenes
2247 /// </summary> 2203 /// </summary>
2248 protected void UpdateMovementAnimations() 2204 protected void UpdateMovementAnimations()
2249 { 2205 {
2250 string movementAnimation = GetMovementAnimation(); 2206 m_movementAnimation = GetMovementAnimation();
2251 2207
2252 if (movementAnimation == "FALLDOWN" && m_allowFalling == false) 2208 if (m_movementAnimation == "PREJUMP" && !m_usePreJump)
2253 {
2254 movementAnimation = m_movementAnimation;
2255 }
2256 else
2257 {
2258 m_movementAnimation = movementAnimation;
2259 }
2260 if (movementAnimation == "PREJUMP" && m_usePreJump == false)
2261 { 2209 {
2262 //This was the previous behavior before PREJUMP 2210 // This was the previous behavior before PREJUMP
2263 TrySetMovementAnimation("JUMP"); 2211 TrySetMovementAnimation("JUMP");
2264 } 2212 }
2265 else 2213 else
2266 { 2214 {
2267 TrySetMovementAnimation(movementAnimation); 2215 TrySetMovementAnimation(m_movementAnimation);
2268 } 2216 }
2269 } 2217 }
2270 2218
@@ -2277,7 +2225,7 @@ namespace OpenSim.Region.Framework.Scenes
2277 { 2225 {
2278 if (m_isChildAgent) 2226 if (m_isChildAgent)
2279 { 2227 {
2280 m_log.Debug("DEBUG: AddNewMovement: child agent, Making root agent!"); 2228 m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!");
2281 2229
2282 // we have to reset the user's child agent connections. 2230 // we have to reset the user's child agent connections.
2283 // Likely, here they've lost the eventqueue for other regions so border 2231 // Likely, here they've lost the eventqueue for other regions so border
@@ -2286,7 +2234,7 @@ namespace OpenSim.Region.Framework.Scenes
2286 List<ulong> regions = new List<ulong>(KnownChildRegionHandles); 2234 List<ulong> regions = new List<ulong>(KnownChildRegionHandles);
2287 regions.Remove(m_scene.RegionInfo.RegionHandle); 2235 regions.Remove(m_scene.RegionInfo.RegionHandle);
2288 2236
2289 MakeRootAgent(new Vector3(127, 127, 127), true); 2237 MakeRootAgent(new Vector3(127f, 127f, 127f), true);
2290 2238
2291 // Async command 2239 // Async command
2292 if (m_scene.SceneGridService != null) 2240 if (m_scene.SceneGridService != null)
@@ -2298,47 +2246,45 @@ namespace OpenSim.Region.Framework.Scenes
2298 System.Threading.Thread.Sleep(500); 2246 System.Threading.Thread.Sleep(500);
2299 } 2247 }
2300 2248
2301
2302 if (m_scene.SceneGridService != null) 2249 if (m_scene.SceneGridService != null)
2303 { 2250 {
2304 m_scene.SceneGridService.EnableNeighbourChildAgents(this, new List<RegionInfo>()); 2251 m_scene.SceneGridService.EnableNeighbourChildAgents(this, new List<RegionInfo>());
2305 } 2252 }
2306 2253
2307
2308
2309 return; 2254 return;
2310 } 2255 }
2311 2256
2312 m_perfMonMS = Environment.TickCount; 2257 m_perfMonMS = Environment.TickCount;
2313 2258
2314 m_rotation = rotation; 2259 m_rotation = rotation;
2315 NewForce newVelocity = new NewForce();
2316 Vector3 direc = vec * rotation; 2260 Vector3 direc = vec * rotation;
2317 direc.Normalize(); 2261 direc.Normalize();
2318 2262
2319 direc *= 0.03f * 128f * m_speedModifier; 2263 direc *= 0.03f * 128f * m_speedModifier;
2320 if (m_physicsActor.Flying) 2264
2321 { 2265 PhysicsActor actor = m_physicsActor;
2322 direc *= 4; 2266 if (actor != null)
2323 //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
2324 //bool colliding = (m_physicsActor.IsColliding==true);
2325 //if (controlland)
2326 // m_log.Info("[AGENT]: landCommand");
2327 //if (colliding)
2328 // m_log.Info("[AGENT]: colliding");
2329 //if (m_physicsActor.Flying && colliding && controlland)
2330 //{
2331 // StopFlying();
2332 // m_log.Info("[AGENT]: Stop FLying");
2333 //}
2334 }
2335 else
2336 { 2267 {
2337 if (!m_physicsActor.Flying && m_physicsActor.IsColliding) 2268 if (actor.Flying)
2269 {
2270 direc *= 4.0f;
2271 //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
2272 //bool colliding = (m_physicsActor.IsColliding==true);
2273 //if (controlland)
2274 // m_log.Info("[AGENT]: landCommand");
2275 //if (colliding)
2276 // m_log.Info("[AGENT]: colliding");
2277 //if (m_physicsActor.Flying && colliding && controlland)
2278 //{
2279 // StopFlying();
2280 // m_log.Info("[AGENT]: Stop FLying");
2281 //}
2282 }
2283 else if (!actor.Flying && actor.IsColliding)
2338 { 2284 {
2339 if (direc.Z > 2.0f) 2285 if (direc.Z > 2.0f)
2340 { 2286 {
2341 direc.Z *= 3; 2287 direc.Z *= 3.0f;
2342 2288
2343 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored. 2289 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
2344 TrySetMovementAnimation("PREJUMP"); 2290 TrySetMovementAnimation("PREJUMP");
@@ -2347,10 +2293,8 @@ namespace OpenSim.Region.Framework.Scenes
2347 } 2293 }
2348 } 2294 }
2349 2295
2350 newVelocity.X = direc.X; 2296 // TODO: Add the force instead of only setting it to support multiple forces per frame?
2351 newVelocity.Y = direc.Y; 2297 m_forceToApply = direc;
2352 newVelocity.Z = direc.Z;
2353 m_forcesList.Add(newVelocity);
2354 2298
2355 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); 2299 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
2356 } 2300 }
@@ -2361,8 +2305,10 @@ namespace OpenSim.Region.Framework.Scenes
2361 2305
2362 public override void Update() 2306 public override void Update()
2363 { 2307 {
2364 const float VELOCITY_TOLERANCE = 0.01f; 2308 const float ROTATION_TOLERANCE = 0.01f;
2365 const float POSITION_TOLERANCE = 10.0f; 2309 const float VELOCITY_TOLERANCE = 0.001f;
2310 const float POSITION_TOLERANCE = 0.05f;
2311 //const int TIME_MS_TOLERANCE = 3000;
2366 2312
2367 SendPrimUpdates(); 2313 SendPrimUpdates();
2368 2314
@@ -2374,17 +2320,25 @@ namespace OpenSim.Region.Framework.Scenes
2374 2320
2375 if (m_isChildAgent == false) 2321 if (m_isChildAgent == false)
2376 { 2322 {
2323 PhysicsActor actor = m_physicsActor;
2324
2325 // NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
2326 // grab the latest PhysicsActor velocity, whereas m_velocity is often
2327 // storing a requested force instead of an actual traveling velocity
2328
2377 // Throw away duplicate or insignificant updates 2329 // Throw away duplicate or insignificant updates
2378 if (m_bodyRot != m_lastRotation || 2330 if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
2379 (m_velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE || 2331 !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
2380 (m_pos - m_lastPosition).Length() > POSITION_TOLERANCE) 2332 !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
2333 //Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
2381 { 2334 {
2382 SendTerseUpdateToAllClients(); 2335 SendTerseUpdateToAllClients();
2383 2336
2384 // Update the "last" values 2337 // Update the "last" values
2385 m_lastPosition = m_pos; 2338 m_lastPosition = m_pos;
2386 m_lastRotation = m_bodyRot; 2339 m_lastRotation = m_bodyRot;
2387 m_lastVelocity = m_velocity; 2340 m_lastVelocity = Velocity;
2341 //m_lastTerseSent = Environment.TickCount;
2388 } 2342 }
2389 2343
2390 // followed suggestion from mic bowman. reversed the two lines below. 2344 // followed suggestion from mic bowman. reversed the two lines below.
@@ -2410,11 +2364,16 @@ namespace OpenSim.Region.Framework.Scenes
2410 { 2364 {
2411 m_perfMonMS = Environment.TickCount; 2365 m_perfMonMS = Environment.TickCount;
2412 2366
2367 PhysicsActor actor = m_physicsActor;
2368 Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero;
2369
2413 Vector3 pos = m_pos; 2370 Vector3 pos = m_pos;
2414 pos.Z -= m_appearance.HipOffset; 2371 pos.Z += m_appearance.HipOffset;
2415 2372
2416 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, 2373 //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
2417 pos, m_velocity, Vector3.Zero, m_bodyRot, Vector4.UnitW, m_uuid, null, GetUpdatePriority(remoteClient))); 2374
2375 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
2376 pos, velocity, Vector3.Zero, m_bodyRot, CollisionPlane, m_uuid, null, GetUpdatePriority(remoteClient)));
2418 2377
2419 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); 2378 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
2420 m_scene.StatsReporter.AddAgentUpdates(1); 2379 m_scene.StatsReporter.AddAgentUpdates(1);
@@ -2510,7 +2469,7 @@ namespace OpenSim.Region.Framework.Scenes
2510 return; 2469 return;
2511 2470
2512 Vector3 pos = m_pos; 2471 Vector3 pos = m_pos;
2513 pos.Z -= m_appearance.HipOffset; 2472 pos.Z += m_appearance.HipOffset;
2514 2473
2515 remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, 2474 remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid,
2516 LocalId, pos, m_appearance.Texture.GetBytes(), 2475 LocalId, pos, m_appearance.Texture.GetBytes(),
@@ -2581,7 +2540,7 @@ namespace OpenSim.Region.Framework.Scenes
2581 // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); 2540 // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
2582 2541
2583 Vector3 pos = m_pos; 2542 Vector3 pos = m_pos;
2584 pos.Z -= m_appearance.HipOffset; 2543 pos.Z += m_appearance.HipOffset;
2585 2544
2586 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, 2545 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
2587 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); 2546 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
@@ -2690,7 +2649,7 @@ namespace OpenSim.Region.Framework.Scenes
2690 } 2649 }
2691 2650
2692 Vector3 pos = m_pos; 2651 Vector3 pos = m_pos;
2693 pos.Z -= m_appearance.HipOffset; 2652 pos.Z += m_appearance.HipOffset;
2694 2653
2695 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, 2654 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
2696 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); 2655 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
@@ -2778,7 +2737,8 @@ namespace OpenSim.Region.Framework.Scenes
2778 } 2737 }
2779 2738
2780 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m 2739 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
2781 if (Util.GetDistanceTo(AbsolutePosition, m_LastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance) 2740 if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
2741 Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
2782 { 2742 {
2783 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); 2743 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
2784 cadu.ActiveGroupID = UUID.Zero.Guid; 2744 cadu.ActiveGroupID = UUID.Zero.Guid;
@@ -2792,7 +2752,7 @@ namespace OpenSim.Region.Framework.Scenes
2792 cadu.godlevel = m_godlevel; 2752 cadu.godlevel = m_godlevel;
2793 cadu.GroupAccess = 0; 2753 cadu.GroupAccess = 0;
2794 cadu.Position = new sLLVector3(AbsolutePosition); 2754 cadu.Position = new sLLVector3(AbsolutePosition);
2795 cadu.regionHandle = m_scene.RegionInfo.RegionHandle; 2755 cadu.regionHandle = m_rootRegionHandle;
2796 float multiplier = 1; 2756 float multiplier = 1;
2797 int innacurateNeighbors = m_scene.GetInaccurateNeighborCount(); 2757 int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
2798 if (innacurateNeighbors != 0) 2758 if (innacurateNeighbors != 0)
@@ -2812,11 +2772,9 @@ namespace OpenSim.Region.Framework.Scenes
2812 agentpos.CopyFrom(cadu); 2772 agentpos.CopyFrom(cadu);
2813 2773
2814 m_scene.SendOutChildAgentUpdates(agentpos, this); 2774 m_scene.SendOutChildAgentUpdates(agentpos, this);
2815
2816 m_LastChildAgentUpdatePosition.X = AbsolutePosition.X;
2817 m_LastChildAgentUpdatePosition.Y = AbsolutePosition.Y;
2818 m_LastChildAgentUpdatePosition.Z = AbsolutePosition.Z;
2819 2775
2776 m_lastChildAgentUpdatePosition = AbsolutePosition;
2777 m_lastChildAgentUpdateCamPosition = CameraPosition;
2820 } 2778 }
2821 } 2779 }
2822 2780
@@ -2941,9 +2899,9 @@ namespace OpenSim.Region.Framework.Scenes
2941 m_inTransit = true; 2899 m_inTransit = true;
2942 2900
2943 if ((m_physicsActor != null) && m_physicsActor.Flying) 2901 if ((m_physicsActor != null) && m_physicsActor.Flying)
2944 m_AgentControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; 2902 m_AgentControlFlags |= AgentManager.ControlFlags.AGENT_CONTROL_FLY;
2945 else if ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0) 2903 else if ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0)
2946 m_AgentControlFlags &= ~(uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; 2904 m_AgentControlFlags &= ~AgentManager.ControlFlags.AGENT_CONTROL_FLY;
2947 } 2905 }
2948 2906
2949 public void NotInTransit() 2907 public void NotInTransit()
@@ -2959,7 +2917,7 @@ namespace OpenSim.Region.Framework.Scenes
2959 public void Reset() 2917 public void Reset()
2960 { 2918 {
2961 // Put the child agent back at the center 2919 // Put the child agent back at the center
2962 AbsolutePosition = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 70); 2920 AbsolutePosition = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
2963 ResetAnimations(); 2921 ResetAnimations();
2964 } 2922 }
2965 2923
@@ -3069,9 +3027,11 @@ namespace OpenSim.Region.Framework.Scenes
3069 int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize; 3027 int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
3070 int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize; 3028 int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
3071 3029
3030 Vector3 offset = new Vector3(shiftx, shifty, 0f);
3031
3072 m_DrawDistance = cAgentData.Far; 3032 m_DrawDistance = cAgentData.Far;
3073 if (cAgentData.Position != new Vector3(-1, -1, -1)) // UGH!! 3033 if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!!
3074 m_pos = new Vector3(cAgentData.Position.X + shiftx, cAgentData.Position.Y + shifty, cAgentData.Position.Z); 3034 m_pos = cAgentData.Position + offset;
3075 3035
3076 if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance) 3036 if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance)
3077 { 3037 {
@@ -3079,8 +3039,7 @@ namespace OpenSim.Region.Framework.Scenes
3079 ReprioritizeUpdates(); 3039 ReprioritizeUpdates();
3080 } 3040 }
3081 3041
3082 // It's hard to say here.. We can't really tell where the camera position is unless it's in world cordinates from the sending region 3042 m_CameraCenter = cAgentData.Center + offset;
3083 m_CameraCenter = cAgentData.Center;
3084 3043
3085 m_avHeight = cAgentData.Size.Z; 3044 m_avHeight = cAgentData.Size.Z;
3086 //SetHeight(cAgentData.AVHeight); 3045 //SetHeight(cAgentData.AVHeight);
@@ -3093,16 +3052,16 @@ namespace OpenSim.Region.Framework.Scenes
3093 m_sceneViewer.Reset(); 3052 m_sceneViewer.Reset();
3094 3053
3095 //cAgentData.AVHeight; 3054 //cAgentData.AVHeight;
3096 //cAgentData.regionHandle; 3055 m_rootRegionHandle = cAgentData.RegionHandle;
3097 //m_velocity = cAgentData.Velocity; 3056 //m_velocity = cAgentData.Velocity;
3098 } 3057 }
3099 3058
3100 public void CopyTo(AgentData cAgent) 3059 public void CopyTo(AgentData cAgent)
3101 { 3060 {
3102 cAgent.AgentID = UUID; 3061 cAgent.AgentID = UUID;
3103 cAgent.RegionHandle = m_scene.RegionInfo.RegionHandle; 3062 cAgent.RegionHandle = m_rootRegionHandle;
3104 3063
3105 cAgent.Position = m_pos; 3064 cAgent.Position = AbsolutePosition;
3106 cAgent.Velocity = m_velocity; 3065 cAgent.Velocity = m_velocity;
3107 cAgent.Center = m_CameraCenter; 3066 cAgent.Center = m_CameraCenter;
3108 // Don't copy the size; it is inferred from apearance parameters 3067 // Don't copy the size; it is inferred from apearance parameters
@@ -3129,7 +3088,7 @@ namespace OpenSim.Region.Framework.Scenes
3129 3088
3130 cAgent.HeadRotation = m_headrotation; 3089 cAgent.HeadRotation = m_headrotation;
3131 cAgent.BodyRotation = m_bodyRot; 3090 cAgent.BodyRotation = m_bodyRot;
3132 cAgent.ControlFlags = m_AgentControlFlags; 3091 cAgent.ControlFlags = (uint)m_AgentControlFlags;
3133 3092
3134 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) 3093 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
3135 cAgent.GodLevel = (byte)m_godlevel; 3094 cAgent.GodLevel = (byte)m_godlevel;
@@ -3199,7 +3158,8 @@ namespace OpenSim.Region.Framework.Scenes
3199 3158
3200 public void CopyFrom(AgentData cAgent) 3159 public void CopyFrom(AgentData cAgent)
3201 { 3160 {
3202 m_rootRegionHandle= cAgent.RegionHandle; 3161 m_rootRegionHandle = cAgent.RegionHandle;
3162
3203 m_callbackURI = cAgent.CallbackURI; 3163 m_callbackURI = cAgent.CallbackURI;
3204 3164
3205 m_pos = cAgent.Position; 3165 m_pos = cAgent.Position;
@@ -3217,7 +3177,7 @@ namespace OpenSim.Region.Framework.Scenes
3217 3177
3218 m_headrotation = cAgent.HeadRotation; 3178 m_headrotation = cAgent.HeadRotation;
3219 m_bodyRot = cAgent.BodyRotation; 3179 m_bodyRot = cAgent.BodyRotation;
3220 m_AgentControlFlags = cAgent.ControlFlags; 3180 m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags;
3221 3181
3222 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) 3182 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
3223 m_godlevel = cAgent.GodLevel; 3183 m_godlevel = cAgent.GodLevel;
@@ -3291,47 +3251,18 @@ namespace OpenSim.Region.Framework.Scenes
3291 /// </summary> 3251 /// </summary>
3292 public override void UpdateMovement() 3252 public override void UpdateMovement()
3293 { 3253 {
3294 lock (m_forcesList) 3254 if (m_forceToApply.HasValue)
3295 { 3255 {
3296 if (m_forcesList.Count > 0) 3256 Vector3 force = m_forceToApply.Value;
3297 {
3298 //we are only interested in the last velocity added to the list [Although they are called forces, they are actually velocities]
3299 NewForce force = m_forcesList[m_forcesList.Count - 1];
3300 3257
3301 m_updateflag = true; 3258 m_updateflag = true;
3302 try 3259 movementvector = force;
3303 { 3260 Velocity = force;
3304 movementvector.X = force.X;
3305 movementvector.Y = force.Y;
3306 movementvector.Z = force.Z;
3307 Velocity = movementvector;
3308 }
3309 catch (NullReferenceException)
3310 {
3311 // Under extreme load, this returns a NullReference Exception that we can ignore.
3312 // Ignoring this causes no movement to be sent to the physics engine...
3313 // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter!
3314 }
3315 3261
3316 m_forcesList.Clear(); 3262 m_forceToApply = null;
3317 }
3318 } 3263 }
3319 } 3264 }
3320 3265
3321 static ScenePresence()
3322 {
3323 Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
3324 DefaultTexture = textu.GetBytes();
3325
3326 }
3327
3328 public class NewForce
3329 {
3330 public float X;
3331 public float Y;
3332 public float Z;
3333 }
3334
3335 public override void SetText(string text, Vector3 color, double alpha) 3266 public override void SetText(string text, Vector3 color, double alpha)
3336 { 3267 {
3337 throw new Exception("Can't set Text on avatar."); 3268 throw new Exception("Can't set Text on avatar.");
@@ -3342,7 +3273,6 @@ namespace OpenSim.Region.Framework.Scenes
3342 /// </summary> 3273 /// </summary>
3343 public void AddToPhysicalScene(bool isFlying) 3274 public void AddToPhysicalScene(bool isFlying)
3344 { 3275 {
3345
3346 PhysicsScene scene = m_scene.PhysicsScene; 3276 PhysicsScene scene = m_scene.PhysicsScene;
3347 3277
3348 Vector3 pVec = AbsolutePosition; 3278 Vector3 pVec = AbsolutePosition;
@@ -3388,15 +3318,48 @@ namespace OpenSim.Region.Framework.Scenes
3388 // as of this comment the interval is set in AddToPhysicalScene 3318 // as of this comment the interval is set in AddToPhysicalScene
3389 UpdateMovementAnimations(); 3319 UpdateMovementAnimations();
3390 3320
3321 CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
3322 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList;
3323
3324 CollisionPlane = Vector4.UnitW;
3325
3326 if (coldata.Count != 0)
3327 {
3328 switch (m_movementAnimation)
3329 {
3330 case "STAND":
3331 case "WALK":
3332 case "RUN":
3333 case "CROUCH":
3334 case "CROUCHWALK":
3335 {
3336 ContactPoint lowest;
3337 lowest.SurfaceNormal = Vector3.Zero;
3338 lowest.Position = Vector3.Zero;
3339 lowest.Position.Z = Single.NaN;
3340
3341 foreach (ContactPoint contact in coldata.Values)
3342 {
3343 if (Single.IsNaN(lowest.Position.Z) || contact.Position.Z < lowest.Position.Z)
3344 {
3345 lowest = contact;
3346 }
3347 }
3348
3349 CollisionPlane = new Vector4(-lowest.SurfaceNormal, -Vector3.Dot(lowest.Position, lowest.SurfaceNormal));
3350 }
3351 break;
3352 }
3353 }
3354
3391 if (m_invulnerable) 3355 if (m_invulnerable)
3392 return; 3356 return;
3393 CollisionEventUpdate collisionData = (CollisionEventUpdate)e; 3357
3394 Dictionary<uint, float> coldata = collisionData.m_objCollisionList;
3395 float starthealth = Health; 3358 float starthealth = Health;
3396 uint killerObj = 0; 3359 uint killerObj = 0;
3397 foreach (uint localid in coldata.Keys) 3360 foreach (uint localid in coldata.Keys)
3398 { 3361 {
3399 if (coldata[localid] <= 0.10f || m_invulnerable) 3362 if (coldata[localid].PenetrationDepth <= 0.10f || m_invulnerable)
3400 continue; 3363 continue;
3401 //if (localid == 0) 3364 //if (localid == 0)
3402 //continue; 3365 //continue;
@@ -3406,9 +3369,9 @@ namespace OpenSim.Region.Framework.Scenes
3406 if (part != null && part.ParentGroup.Damage != -1.0f) 3369 if (part != null && part.ParentGroup.Damage != -1.0f)
3407 Health -= part.ParentGroup.Damage; 3370 Health -= part.ParentGroup.Damage;
3408 else 3371 else
3409 Health -= coldata[localid] * 5; 3372 Health -= coldata[localid].PenetrationDepth * 5.0f;
3410 3373
3411 if (Health <= 0) 3374 if (Health <= 0.0f)
3412 { 3375 {
3413 if (localid != 0) 3376 if (localid != 0)
3414 killerObj = localid; 3377 killerObj = localid;
@@ -3471,11 +3434,6 @@ namespace OpenSim.Region.Framework.Scenes
3471 3434
3472 public ScenePresence() 3435 public ScenePresence()
3473 { 3436 {
3474 if (DefaultTexture == null)
3475 {
3476 Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
3477 DefaultTexture = textu.GetBytes();
3478 }
3479 m_sendCourseLocationsMethod = SendCoarseLocationsDefault; 3437 m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
3480 CreateSceneViewer(); 3438 CreateSceneViewer();
3481 } 3439 }
@@ -3632,19 +3590,10 @@ namespace OpenSim.Region.Framework.Scenes
3632 IgnoredControls &= ~(ScriptControlled)controls; 3590 IgnoredControls &= ~(ScriptControlled)controls;
3633 if (scriptedcontrols.ContainsKey(Script_item_UUID)) 3591 if (scriptedcontrols.ContainsKey(Script_item_UUID))
3634 scriptedcontrols.Remove(Script_item_UUID); 3592 scriptedcontrols.Remove(Script_item_UUID);
3635
3636 } 3593 }
3637 else 3594 else
3638 { 3595 {
3639 3596 scriptedcontrols[Script_item_UUID] = obj;
3640 if (scriptedcontrols.ContainsKey(Script_item_UUID))
3641 {
3642 scriptedcontrols[Script_item_UUID] = obj;
3643 }
3644 else
3645 {
3646 scriptedcontrols.Add(Script_item_UUID, obj);
3647 }
3648 } 3597 }
3649 } 3598 }
3650 ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true); 3599 ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true);
@@ -3662,12 +3611,14 @@ namespace OpenSim.Region.Framework.Scenes
3662 3611
3663 public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID) 3612 public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID)
3664 { 3613 {
3614 ScriptControllers takecontrols;
3615
3665 lock (scriptedcontrols) 3616 lock (scriptedcontrols)
3666 { 3617 {
3667 if (scriptedcontrols.ContainsKey(Script_item_UUID)) 3618 if (scriptedcontrols.TryGetValue(Script_item_UUID, out takecontrols))
3668 { 3619 {
3669 ScriptControllers takecontrolls = scriptedcontrols[Script_item_UUID]; 3620 ScriptControlled sctc = takecontrols.eventControls;
3670 ScriptControlled sctc = takecontrolls.eventControls; 3621
3671 ControllingClient.SendTakeControls((int)sctc, false, false); 3622 ControllingClient.SendTakeControls((int)sctc, false, false);
3672 ControllingClient.SendTakeControls((int)sctc, true, false); 3623 ControllingClient.SendTakeControls((int)sctc, true, false);
3673 3624
@@ -3678,7 +3629,6 @@ namespace OpenSim.Region.Framework.Scenes
3678 IgnoredControls |= scData.ignoreControls; 3629 IgnoredControls |= scData.ignoreControls;
3679 } 3630 }
3680 } 3631 }
3681
3682 } 3632 }
3683 } 3633 }
3684 3634
@@ -3745,9 +3695,11 @@ namespace OpenSim.Region.Framework.Scenes
3745 { 3695 {
3746 lock (scriptedcontrols) 3696 lock (scriptedcontrols)
3747 { 3697 {
3748 foreach (UUID scriptUUID in scriptedcontrols.Keys) 3698 foreach (KeyValuePair<UUID, ScriptControllers> kvp in scriptedcontrols)
3749 { 3699 {
3750 ScriptControllers scriptControlData = scriptedcontrols[scriptUUID]; 3700 UUID scriptUUID = kvp.Key;
3701 ScriptControllers scriptControlData = kvp.Value;
3702
3751 ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us 3703 ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us
3752 ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle 3704 ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
3753 ScriptControlled localChange = localHeld ^ localLast; // the changed bits 3705 ScriptControlled localChange = localHeld ^ localLast; // the changed bits
@@ -3763,37 +3715,40 @@ namespace OpenSim.Region.Framework.Scenes
3763 LastCommands = allflags; 3715 LastCommands = allflags;
3764 } 3716 }
3765 3717
3766 internal static uint RemoveIgnoredControls(uint flags, ScriptControlled Ignored) 3718 internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored)
3767 { 3719 {
3768 if (Ignored == ScriptControlled.CONTROL_ZERO) 3720 if (ignored == ScriptControlled.CONTROL_ZERO)
3769 return flags; 3721 return flags;
3770 if ((Ignored & ScriptControlled.CONTROL_BACK) != 0) 3722
3771 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); 3723 if ((ignored & ScriptControlled.CONTROL_BACK) != 0)
3772 if ((Ignored & ScriptControlled.CONTROL_FWD) != 0) 3724 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
3773 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS); 3725 if ((ignored & ScriptControlled.CONTROL_FWD) != 0)
3774 if ((Ignored & ScriptControlled.CONTROL_DOWN) != 0) 3726 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_AT_POS);
3775 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG); 3727 if ((ignored & ScriptControlled.CONTROL_DOWN) != 0)
3776 if ((Ignored & ScriptControlled.CONTROL_UP) != 0) 3728 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG);
3777 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS); 3729 if ((ignored & ScriptControlled.CONTROL_UP) != 0)
3778 if ((Ignored & ScriptControlled.CONTROL_LEFT) != 0) 3730 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_UP_POS);
3779 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); 3731 if ((ignored & ScriptControlled.CONTROL_LEFT) != 0)
3780 if ((Ignored & ScriptControlled.CONTROL_RIGHT) != 0) 3732 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
3781 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG); 3733 if ((ignored & ScriptControlled.CONTROL_RIGHT) != 0)
3782 if ((Ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0) 3734 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG);
3783 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG); 3735 if ((ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0)
3784 if ((Ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0) 3736 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG);
3785 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS); 3737 if ((ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0)
3786 if ((Ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0) 3738 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS);
3787 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN); 3739 if ((ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0)
3788 if ((Ignored & ScriptControlled.CONTROL_LBUTTON) != 0) 3740 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN);
3789 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN); 3741 if ((ignored & ScriptControlled.CONTROL_LBUTTON) != 0)
3790 //DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS, 3742 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN);
3791 //DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG, 3743
3792 //DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS, 3744 //DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
3793 //DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG, 3745 //DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
3794 //DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS, 3746 //DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
3795 //DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG, 3747 //DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
3796 //DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG 3748 //DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
3749 //DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
3750 //DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
3751
3797 return flags; 3752 return flags;
3798 } 3753 }
3799 3754
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
index 19c0fea..f495022 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
@@ -219,7 +219,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
219 Assert.That(presence.IsChildAgent, Is.True, "Did not change to child agent after MakeChildAgent"); 219 Assert.That(presence.IsChildAgent, Is.True, "Did not change to child agent after MakeChildAgent");
220 220
221 // Accepts 0 but rejects Constants.RegionSize 221 // Accepts 0 but rejects Constants.RegionSize
222 Vector3 pos = new Vector3(0,Constants.RegionSize-1,0); 222 Vector3 pos = new Vector3(0,unchecked(Constants.RegionSize-1),0);
223 presence.MakeRootAgent(pos,true); 223 presence.MakeRootAgent(pos,true);
224 Assert.That(presence.IsChildAgent, Is.False, "Did not go back to root agent"); 224 Assert.That(presence.IsChildAgent, Is.False, "Did not go back to root agent");
225 Assert.That(presence.AbsolutePosition, Is.EqualTo(pos), "Position is not the same one entered"); 225 Assert.That(presence.AbsolutePosition, Is.EqualTo(pos), "Position is not the same one entered");
@@ -246,7 +246,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
246 scene2.AddNewClient(testclient); 246 scene2.AddNewClient(testclient);
247 247
248 ScenePresence presence = scene.GetScenePresence(agent1); 248 ScenePresence presence = scene.GetScenePresence(agent1);
249 presence.MakeRootAgent(new Vector3(0,Constants.RegionSize-1,0), true); 249 presence.MakeRootAgent(new Vector3(0,unchecked(Constants.RegionSize-1),0), true);
250 250
251 ScenePresence presence2 = scene2.GetScenePresence(agent1); 251 ScenePresence presence2 = scene2.GetScenePresence(agent1);
252 252