aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
authorUbitUmarov2012-03-26 23:04:07 +0100
committerUbitUmarov2012-03-26 23:04:07 +0100
commitcaeaa03a6917c6324750eddcc4559ec5de39f14c (patch)
treeecf64b0ddb099890ccf581cd52f646373dd44606 /OpenSim/Region/Framework
parent UbitOde let caller try to build meshs like done in chode. Changing this was ... (diff)
parentMerge branch 'master' into careminster (diff)
downloadopensim-SC_OLD-caeaa03a6917c6324750eddcc4559ec5de39f14c.zip
opensim-SC_OLD-caeaa03a6917c6324750eddcc4559ec5de39f14c.tar.gz
opensim-SC_OLD-caeaa03a6917c6324750eddcc4559ec5de39f14c.tar.bz2
opensim-SC_OLD-caeaa03a6917c6324750eddcc4559ec5de39f14c.tar.xz
Merge branch 'master' of ssh://3dhosting.de/var/git/careminster into ubitwork
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs11
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs231
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs43
4 files changed, 199 insertions, 88 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs b/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs
index bb4c788..bfe1e8d 100644
--- a/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs
@@ -26,12 +26,12 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Reflection;
29using OpenMetaverse; 30using OpenMetaverse;
30 31
31namespace OpenSim.Region.Framework.Interfaces 32namespace OpenSim.Region.Framework.Interfaces
32{ 33{
33 public delegate void ScriptCommand(UUID script, string id, string module, string command, string k); 34 public delegate void ScriptCommand(UUID script, string id, string module, string command, string k);
34 public delegate object ScriptInvocation(UUID script, object[] parms);
35 35
36 /// <summary> 36 /// <summary>
37 /// Interface for communication between OpenSim modules and in-world scripts 37 /// Interface for communication between OpenSim modules and in-world scripts
@@ -46,14 +46,17 @@ namespace OpenSim.Region.Framework.Interfaces
46 /// </summary> 46 /// </summary>
47 event ScriptCommand OnScriptCommand; 47 event ScriptCommand OnScriptCommand;
48 48
49 void RegisterScriptInvocation(string name, ScriptInvocation fn, Type[] csig, Type rsig); 49 void RegisterScriptInvocation(object target, string method);
50 void RegisterScriptInvocation(object target, MethodInfo method);
51 void RegisterScriptInvocation(object target, string[] methods);
52 Delegate[] GetScriptInvocationList();
50 53
51 ScriptInvocation LookupScriptInvocation(string fname); 54 Delegate LookupScriptInvocation(string fname);
52 string LookupModInvocation(string fname); 55 string LookupModInvocation(string fname);
53 Type[] LookupTypeSignature(string fname); 56 Type[] LookupTypeSignature(string fname);
54 Type LookupReturnType(string fname); 57 Type LookupReturnType(string fname);
55 58
56 object InvokeOperation(UUID scriptId, string fname, params object[] parms); 59 object InvokeOperation(UUID hostId, UUID scriptId, string fname, params object[] parms);
57 60
58 /// <summary> 61 /// <summary>
59 /// Send a link_message event to an in-world script 62 /// Send a link_message event to an in-world script
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index cded9be..f5623bd 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -125,7 +125,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
125 125
126 // XXX: For some reason, we store all animations and use them with upper case names, but in LSL animations 126 // XXX: For some reason, we store all animations and use them with upper case names, but in LSL animations
127 // are referenced with lower case names! 127 // are referenced with lower case names!
128 UUID animID = DefaultAvatarAnimations.GetDefaultAnimation(name); 128 UUID animID = DefaultAvatarAnimations.GetDefaultAnimation(name.ToUpper());
129 if (animID == UUID.Zero) 129 if (animID == UUID.Zero)
130 return; 130 return;
131 131
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 44a738e..6ac7846 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -104,6 +104,11 @@ namespace OpenSim.Region.Framework.Scenes
104 public bool m_allowScriptCrossings; 104 public bool m_allowScriptCrossings;
105 public bool m_useFlySlow; 105 public bool m_useFlySlow;
106 106
107 /// <summary>
108 /// Temporarily setting to trigger appearance resends at 60 second intervals.
109 /// </summary>
110 public bool SendPeriodicAppearanceUpdates { get; set; }
111
107 protected float m_defaultDrawDistance = 255.0f; 112 protected float m_defaultDrawDistance = 255.0f;
108 public float DefaultDrawDistance 113 public float DefaultDrawDistance
109 { 114 {
@@ -172,6 +177,11 @@ namespace OpenSim.Region.Framework.Scenes
172 } 177 }
173 178
174 /// <summary> 179 /// <summary>
180 /// Current maintenance run number
181 /// </summary>
182 public uint MaintenanceRun { get; private set; }
183
184 /// <summary>
175 /// The minimum length of time in seconds that will be taken for a scene frame. If the frame takes less time then we 185 /// The minimum length of time in seconds that will be taken for a scene frame. If the frame takes less time then we
176 /// will sleep for the remaining period. 186 /// will sleep for the remaining period.
177 /// </summary> 187 /// </summary>
@@ -181,6 +191,11 @@ namespace OpenSim.Region.Framework.Scenes
181 /// </remarks> 191 /// </remarks>
182 public float MinFrameTime { get; private set; } 192 public float MinFrameTime { get; private set; }
183 193
194 /// <summary>
195 /// The minimum length of time in seconds that will be taken for a maintenance run.
196 /// </summary>
197 public float MinMaintenanceTime { get; private set; }
198
184 private int m_update_physics = 1; 199 private int m_update_physics = 1;
185 private int m_update_entitymovement = 1; 200 private int m_update_entitymovement = 1;
186 private int m_update_objects = 1; 201 private int m_update_objects = 1;
@@ -210,19 +225,22 @@ namespace OpenSim.Region.Framework.Scenes
210 225
211 public bool CombineRegions = false; 226 public bool CombineRegions = false;
212 /// <summary> 227 /// <summary>
228 /// Tick at which the last maintenance run occurred.
229 /// </summary>
230 private int m_lastMaintenanceTick;
231
232 /// <summary>
213 /// Signals whether temporary objects are currently being cleaned up. Needed because this is launched 233 /// Signals whether temporary objects are currently being cleaned up. Needed because this is launched
214 /// asynchronously from the update loop. 234 /// asynchronously from the update loop.
215 /// </summary> 235 /// </summary>
216 private bool m_cleaningTemps = false; 236 private bool m_cleaningTemps = false;
217 237
218 private Object m_heartbeatLock = new Object(); 238// private Object m_heartbeatLock = new Object();
219 239
220 // TODO: Possibly stop other classes being able to manipulate this directly. 240 // TODO: Possibly stop other classes being able to manipulate this directly.
221 private SceneGraph m_sceneGraph; 241 private SceneGraph m_sceneGraph;
222 private volatile int m_bordersLocked; 242 private volatile int m_bordersLocked;
223// private int m_RestartTimerCounter;
224 private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing 243 private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing
225// private int m_incrementsof15seconds;
226 private volatile bool m_backingup; 244 private volatile bool m_backingup;
227 private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>(); 245 private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>();
228 private Dictionary<UUID, SceneObjectGroup> m_groupsWithTargets = new Dictionary<UUID, SceneObjectGroup>(); 246 private Dictionary<UUID, SceneObjectGroup> m_groupsWithTargets = new Dictionary<UUID, SceneObjectGroup>();
@@ -230,16 +248,34 @@ namespace OpenSim.Region.Framework.Scenes
230 private bool m_physics_enabled = true; 248 private bool m_physics_enabled = true;
231 private bool m_scripts_enabled = true; 249 private bool m_scripts_enabled = true;
232 private string m_defaultScriptEngine; 250 private string m_defaultScriptEngine;
251
252 /// <summary>
253 /// Tick at which the last login occurred.
254 /// </summary>
233 private int m_LastLogin; 255 private int m_LastLogin;
234 private Thread HeartbeatThread = null;
235 private volatile bool shuttingdown;
236 256
237 private int m_lastUpdate;
238 private int m_lastIncoming; 257 private int m_lastIncoming;
239 private int m_lastOutgoing; 258 private int m_lastOutgoing;
240 private bool m_firstHeartbeat = true;
241 private int m_hbRestarts = 0; 259 private int m_hbRestarts = 0;
242 260
261
262 /// <summary>
263 /// Thread that runs the scene loop.
264 /// </summary>
265 private Thread m_heartbeatThread;
266
267 /// <summary>
268 /// True if these scene is in the process of shutting down or is shutdown.
269 /// </summary>
270 public bool ShuttingDown
271 {
272 get { return m_shuttingDown; }
273 }
274 private volatile bool m_shuttingDown;
275
276// private int m_lastUpdate;
277 private bool m_firstHeartbeat = true;
278
243 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; 279 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time;
244 private bool m_reprioritizationEnabled = true; 280 private bool m_reprioritizationEnabled = true;
245 private double m_reprioritizationInterval = 5000.0; 281 private double m_reprioritizationInterval = 5000.0;
@@ -566,6 +602,7 @@ namespace OpenSim.Region.Framework.Scenes
566 { 602 {
567 m_config = config; 603 m_config = config;
568 MinFrameTime = 0.089f; 604 MinFrameTime = 0.089f;
605 MinMaintenanceTime = 1;
569 606
570 Random random = new Random(); 607 Random random = new Random();
571 608
@@ -577,7 +614,6 @@ namespace OpenSim.Region.Framework.Scenes
577 m_EstateDataService = estateDataService; 614 m_EstateDataService = estateDataService;
578 m_regionHandle = m_regInfo.RegionHandle; 615 m_regionHandle = m_regInfo.RegionHandle;
579 m_regionName = m_regInfo.RegionName; 616 m_regionName = m_regInfo.RegionName;
580 m_lastUpdate = Util.EnvironmentTickCount();
581 m_lastIncoming = 0; 617 m_lastIncoming = 0;
582 m_lastOutgoing = 0; 618 m_lastOutgoing = 0;
583 619
@@ -759,6 +795,7 @@ namespace OpenSim.Region.Framework.Scenes
759 m_update_presences = startupConfig.GetInt( "UpdateAgentsEveryNFrames", m_update_presences); 795 m_update_presences = startupConfig.GetInt( "UpdateAgentsEveryNFrames", m_update_presences);
760 m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain); 796 m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain);
761 m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNFrames", m_update_temp_cleaning); 797 m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNFrames", m_update_temp_cleaning);
798 SendPeriodicAppearanceUpdates = startupConfig.GetBoolean("SendPeriodicAppearanceUpdates", SendPeriodicAppearanceUpdates);
762 } 799 }
763 } 800 }
764 catch (Exception e) 801 catch (Exception e)
@@ -834,18 +871,13 @@ namespace OpenSim.Region.Framework.Scenes
834 871
835 m_permissions = new ScenePermissions(this); 872 m_permissions = new ScenePermissions(this);
836 873
837 m_lastUpdate = Util.EnvironmentTickCount(); 874// m_lastUpdate = Util.EnvironmentTickCount();
838 } 875 }
839 876
840 #endregion 877 #endregion
841 878
842 #region Startup / Close Methods 879 #region Startup / Close Methods
843 880
844 public bool ShuttingDown
845 {
846 get { return shuttingdown; }
847 }
848
849 /// <value> 881 /// <value>
850 /// The scene graph for this scene 882 /// The scene graph for this scene
851 /// </value> 883 /// </value>
@@ -1107,6 +1139,12 @@ namespace OpenSim.Region.Framework.Scenes
1107 m_physics_enabled = enablePhysics; 1139 m_physics_enabled = enablePhysics;
1108 } 1140 }
1109 1141
1142// if (options.ContainsKey("collisions"))
1143// {
1144// // TODO: Implement. If false, should stop objects colliding, though possibly should still allow
1145// // the avatar themselves to collide with the ground.
1146// }
1147
1110 if (options.ContainsKey("teleport")) 1148 if (options.ContainsKey("teleport"))
1111 { 1149 {
1112 bool enableTeleportDebugging; 1150 bool enableTeleportDebugging;
@@ -1158,8 +1196,7 @@ namespace OpenSim.Region.Framework.Scenes
1158 ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); }); 1196 ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); });
1159 1197
1160 // Stop updating the scene objects and agents. 1198 // Stop updating the scene objects and agents.
1161 //m_heartbeatTimer.Close(); 1199 m_shuttingDown = true;
1162 shuttingdown = true;
1163 1200
1164 m_log.Debug("[SCENE]: Persisting changed objects"); 1201 m_log.Debug("[SCENE]: Persisting changed objects");
1165 EventManager.TriggerSceneShuttingDown(this); 1202 EventManager.TriggerSceneShuttingDown(this);
@@ -1183,16 +1220,16 @@ namespace OpenSim.Region.Framework.Scenes
1183 } 1220 }
1184 1221
1185 /// <summary> 1222 /// <summary>
1186 /// Start the timer which triggers regular scene updates 1223 /// Start the scene
1187 /// </summary> 1224 /// </summary>
1188 public void StartTimer() 1225 public void Start()
1189 { 1226 {
1190// m_log.DebugFormat("[SCENE]: Starting Heartbeat timer for {0}", RegionInfo.RegionName); 1227// m_log.DebugFormat("[SCENE]: Starting Heartbeat timer for {0}", RegionInfo.RegionName);
1191 1228
1192 //m_heartbeatTimer.Enabled = true; 1229 //m_heartbeatTimer.Enabled = true;
1193 //m_heartbeatTimer.Interval = (int)(m_timespan * 1000); 1230 //m_heartbeatTimer.Interval = (int)(m_timespan * 1000);
1194 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); 1231 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat);
1195 if (HeartbeatThread != null) 1232 if (m_heartbeatThread != null)
1196 { 1233 {
1197 m_hbRestarts++; 1234 m_hbRestarts++;
1198 if(m_hbRestarts > 10) 1235 if(m_hbRestarts > 10)
@@ -1208,13 +1245,13 @@ namespace OpenSim.Region.Framework.Scenes
1208//proc.WaitForExit(); 1245//proc.WaitForExit();
1209//Thread.Sleep(1000); 1246//Thread.Sleep(1000);
1210//Environment.Exit(1); 1247//Environment.Exit(1);
1211 HeartbeatThread.Abort(); 1248 m_heartbeatThread.Abort();
1212 Watchdog.AbortThread(HeartbeatThread.ManagedThreadId); 1249 Watchdog.AbortThread(m_heartbeatThread.ManagedThreadId);
1213 HeartbeatThread = null; 1250 m_heartbeatThread = null;
1214 } 1251 }
1215 m_lastUpdate = Util.EnvironmentTickCount(); 1252// m_lastUpdate = Util.EnvironmentTickCount();
1216 1253
1217 HeartbeatThread 1254 m_heartbeatThread
1218 = Watchdog.StartThread( 1255 = Watchdog.StartThread(
1219 Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false); 1256 Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false);
1220 } 1257 }
@@ -1245,34 +1282,107 @@ namespace OpenSim.Region.Framework.Scenes
1245 /// </summary> 1282 /// </summary>
1246 private void Heartbeat() 1283 private void Heartbeat()
1247 { 1284 {
1248 if (!Monitor.TryEnter(m_heartbeatLock)) 1285// if (!Monitor.TryEnter(m_heartbeatLock))
1249 { 1286// {
1250 Watchdog.RemoveThread(); 1287// Watchdog.RemoveThread();
1251 return; 1288// return;
1252 } 1289// }
1253 1290
1254 try 1291// try
1255 { 1292// {
1256 m_eventManager.TriggerOnRegionStarted(this);
1257 1293
1258 // The first frame can take a very long time due to physics actors being added on startup. Therefore, 1294 m_eventManager.TriggerOnRegionStarted(this);
1259 // don't turn on the watchdog alarm for this thread until the second frame, in order to prevent false
1260 // alarms for scenes with many objects.
1261 Update(1);
1262 Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true;
1263 1295
1264 while (!shuttingdown) 1296 // The first frame can take a very long time due to physics actors being added on startup. Therefore,
1265 Update(-1); 1297 // don't turn on the watchdog alarm for this thread until the second frame, in order to prevent false
1266 } 1298 // alarms for scenes with many objects.
1267 finally 1299 Update(1);
1268 { 1300
1269 Monitor.Pulse(m_heartbeatLock); 1301 Watchdog.StartThread(
1270 Monitor.Exit(m_heartbeatLock); 1302 Maintenance, string.Format("Maintenance ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, true);
1271 } 1303
1304 Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true;
1305 Update(-1);
1306
1307// m_lastUpdate = Util.EnvironmentTickCount();
1308// m_firstHeartbeat = false;
1309// }
1310// finally
1311// {
1312// Monitor.Pulse(m_heartbeatLock);
1313// Monitor.Exit(m_heartbeatLock);
1314// }
1315
1316 Watchdog.RemoveThread();
1317 }
1318
1319 private void Maintenance()
1320 {
1321 DoMaintenance(-1);
1272 1322
1273 Watchdog.RemoveThread(); 1323 Watchdog.RemoveThread();
1274 } 1324 }
1275 1325
1326 public void DoMaintenance(int runs)
1327 {
1328 long? endRun = null;
1329 int runtc;
1330 int previousMaintenanceTick;
1331
1332 if (runs >= 0)
1333 endRun = MaintenanceRun + runs;
1334
1335 List<Vector3> coarseLocations;
1336 List<UUID> avatarUUIDs;
1337
1338 while (!m_shuttingDown && (endRun == null || MaintenanceRun < endRun))
1339 {
1340 runtc = Util.EnvironmentTickCount();
1341 ++MaintenanceRun;
1342
1343 // Coarse locations relate to positions of green dots on the mini-map (on a SecondLife client)
1344 if (MaintenanceRun % (m_update_coarse_locations / 10) == 0)
1345 {
1346 SceneGraph.GetCoarseLocations(out coarseLocations, out avatarUUIDs, 60);
1347 // Send coarse locations to clients
1348 ForEachScenePresence(delegate(ScenePresence presence)
1349 {
1350 presence.SendCoarseLocations(coarseLocations, avatarUUIDs);
1351 });
1352 }
1353
1354 if (SendPeriodicAppearanceUpdates && MaintenanceRun % 60 == 0)
1355 {
1356// m_log.DebugFormat("[SCENE]: Sending periodic appearance updates");
1357
1358 if (AvatarFactory != null)
1359 {
1360 ForEachRootScenePresence(sp => AvatarFactory.SendAppearance(sp.UUID));
1361 }
1362 }
1363
1364 Watchdog.UpdateThread();
1365
1366 previousMaintenanceTick = m_lastMaintenanceTick;
1367 m_lastMaintenanceTick = Util.EnvironmentTickCount();
1368 runtc = Util.EnvironmentTickCountSubtract(m_lastMaintenanceTick, runtc);
1369 runtc = (int)(MinMaintenanceTime * 1000) - runtc;
1370
1371 if (runtc > 0)
1372 Thread.Sleep(runtc);
1373
1374 // Optionally warn if a frame takes double the amount of time that it should.
1375 if (DebugUpdates
1376 && Util.EnvironmentTickCountSubtract(
1377 m_lastMaintenanceTick, previousMaintenanceTick) > (int)(MinMaintenanceTime * 1000 * 2))
1378 m_log.WarnFormat(
1379 "[SCENE]: Maintenance took {0} ms (desired max {1} ms) in {2}",
1380 Util.EnvironmentTickCountSubtract(m_lastMaintenanceTick, previousMaintenanceTick),
1381 MinMaintenanceTime * 1000,
1382 RegionInfo.RegionName);
1383 }
1384 }
1385
1276 public override void Update(int frames) 1386 public override void Update(int frames)
1277 { 1387 {
1278 long? endFrame = null; 1388 long? endFrame = null;
@@ -1284,10 +1394,8 @@ namespace OpenSim.Region.Framework.Scenes
1284 int tmpPhysicsMS, tmpPhysicsMS2, tmpAgentMS, tmpTempOnRezMS, evMS, backMS, terMS; 1394 int tmpPhysicsMS, tmpPhysicsMS2, tmpAgentMS, tmpTempOnRezMS, evMS, backMS, terMS;
1285 int previousFrameTick; 1395 int previousFrameTick;
1286 int maintc; 1396 int maintc;
1287 List<Vector3> coarseLocations;
1288 List<UUID> avatarUUIDs;
1289 1397
1290 while (!shuttingdown && (endFrame == null || Frame < endFrame)) 1398 while (!m_shuttingDown && (endFrame == null || Frame < endFrame))
1291 { 1399 {
1292 maintc = Util.EnvironmentTickCount(); 1400 maintc = Util.EnvironmentTickCount();
1293 ++Frame; 1401 ++Frame;
@@ -1337,17 +1445,6 @@ namespace OpenSim.Region.Framework.Scenes
1337 if (Frame % m_update_presences == 0) 1445 if (Frame % m_update_presences == 0)
1338 m_sceneGraph.UpdatePresences(); 1446 m_sceneGraph.UpdatePresences();
1339 1447
1340 // Coarse locations relate to positions of green dots on the mini-map (on a SecondLife client)
1341 if (Frame % m_update_coarse_locations == 0)
1342 {
1343 SceneGraph.GetCoarseLocations(out coarseLocations, out avatarUUIDs, 60);
1344 // Send coarse locations to clients
1345 ForEachScenePresence(delegate(ScenePresence presence)
1346 {
1347 presence.SendCoarseLocations(coarseLocations, avatarUUIDs);
1348 });
1349 }
1350
1351 agentMS += Util.EnvironmentTickCountSubtract(tmpAgentMS); 1448 agentMS += Util.EnvironmentTickCountSubtract(tmpAgentMS);
1352 1449
1353 // Delete temp-on-rez stuff 1450 // Delete temp-on-rez stuff
@@ -1455,7 +1552,6 @@ namespace OpenSim.Region.Framework.Scenes
1455 1552
1456 EventManager.TriggerRegionHeartbeatEnd(this); 1553 EventManager.TriggerRegionHeartbeatEnd(this);
1457 1554
1458 // Tell the watchdog that this thread is still alive
1459 Watchdog.UpdateThread(); 1555 Watchdog.UpdateThread();
1460 1556
1461 previousFrameTick = m_lastFrameTick; 1557 previousFrameTick = m_lastFrameTick;
@@ -1463,15 +1559,11 @@ namespace OpenSim.Region.Framework.Scenes
1463 maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); 1559 maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc);
1464 maintc = (int)(MinFrameTime * 1000) - maintc; 1560 maintc = (int)(MinFrameTime * 1000) - maintc;
1465 1561
1466 m_lastUpdate = Util.EnvironmentTickCount();
1467 m_firstHeartbeat = false; 1562 m_firstHeartbeat = false;
1468 1563
1469 if (maintc > 0) 1564 if (maintc > 0)
1470 Thread.Sleep(maintc); 1565 Thread.Sleep(maintc);
1471 1566
1472 m_lastUpdate = Util.EnvironmentTickCount();
1473 m_firstHeartbeat = false;
1474
1475 // Optionally warn if a frame takes double the amount of time that it should. 1567 // Optionally warn if a frame takes double the amount of time that it should.
1476 if (DebugUpdates 1568 if (DebugUpdates
1477 && Util.EnvironmentTickCountSubtract( 1569 && Util.EnvironmentTickCountSubtract(
@@ -2662,7 +2754,6 @@ namespace OpenSim.Region.Framework.Scenes
2662 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; 2754 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
2663 2755
2664 CheckHeartbeat(); 2756 CheckHeartbeat();
2665 ScenePresence presence;
2666 2757
2667 ScenePresence sp = GetScenePresence(client.AgentId); 2758 ScenePresence sp = GetScenePresence(client.AgentId);
2668 2759
@@ -3253,7 +3344,7 @@ namespace OpenSim.Region.Framework.Scenes
3253 3344
3254 public override void RemoveClient(UUID agentID, bool closeChildAgents) 3345 public override void RemoveClient(UUID agentID, bool closeChildAgents)
3255 { 3346 {
3256 CheckHeartbeat(); 3347// CheckHeartbeat();
3257 bool isChildAgent = false; 3348 bool isChildAgent = false;
3258 ScenePresence avatar = GetScenePresence(agentID); 3349 ScenePresence avatar = GetScenePresence(agentID);
3259 if (avatar != null) 3350 if (avatar != null)
@@ -4700,7 +4791,7 @@ namespace OpenSim.Region.Framework.Scenes
4700 4791
4701 int health=1; // Start at 1, means we're up 4792 int health=1; // Start at 1, means we're up
4702 4793
4703 if (Util.EnvironmentTickCountSubtract(m_lastUpdate) < 1000) 4794 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000)
4704 { 4795 {
4705 health+=1; 4796 health+=1;
4706 flags |= 1; 4797 flags |= 1;
@@ -4737,6 +4828,8 @@ Environment.Exit(1);
4737 // 4828 //
4738 if (Util.EnvironmentTickCountSubtract(m_LastLogin) < 240000) 4829 if (Util.EnvironmentTickCountSubtract(m_LastLogin) < 240000)
4739 health++; 4830 health++;
4831 else
4832 return health;
4740 4833
4741 return health; 4834 return health;
4742 } 4835 }
@@ -4929,8 +5022,8 @@ Environment.Exit(1);
4929 if (m_firstHeartbeat) 5022 if (m_firstHeartbeat)
4930 return; 5023 return;
4931 5024
4932 if (Util.EnvironmentTickCountSubtract(m_lastUpdate) > 5000) 5025 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) > 5000)
4933 StartTimer(); 5026 Start();
4934 } 5027 }
4935 5028
4936 public override ISceneObject DeserializeObject(string representation) 5029 public override ISceneObject DeserializeObject(string representation)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 2346c60..a23dc31 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -233,6 +233,8 @@ namespace OpenSim.Region.Framework.Scenes
233 private bool m_collisionEventFlag = false; 233 private bool m_collisionEventFlag = false;
234 private object m_collisionEventLock = new Object(); 234 private object m_collisionEventLock = new Object();
235 235
236 private int m_movementAnimationUpdateCounter = 0;
237
236 private Vector3 m_prevSitOffset; 238 private Vector3 m_prevSitOffset;
237 239
238 protected AvatarAppearance m_appearance; 240 protected AvatarAppearance m_appearance;
@@ -741,6 +743,26 @@ namespace OpenSim.Region.Framework.Scenes
741 Appearance = appearance; 743 Appearance = appearance;
742 } 744 }
743 745
746 private void RegionHeartbeatEnd(Scene scene)
747 {
748 if (IsChildAgent)
749 return;
750
751 m_movementAnimationUpdateCounter ++;
752 if (m_movementAnimationUpdateCounter >= 2)
753 {
754 m_movementAnimationUpdateCounter = 0;
755 if (Animator != null)
756 {
757 Animator.UpdateMovementAnimations();
758 }
759 else
760 {
761 m_scene.EventManager.OnRegionHeartbeatEnd -= RegionHeartbeatEnd;
762 }
763 }
764 }
765
744 public void RegisterToEvents() 766 public void RegisterToEvents()
745 { 767 {
746 ControllingClient.OnCompleteMovementToRegion += CompleteMovement; 768 ControllingClient.OnCompleteMovementToRegion += CompleteMovement;
@@ -952,6 +974,8 @@ namespace OpenSim.Region.Framework.Scenes
952 MovementFlag = 0; 974 MovementFlag = 0;
953 975
954 m_scene.EventManager.TriggerOnMakeRootAgent(this); 976 m_scene.EventManager.TriggerOnMakeRootAgent(this);
977
978 m_scene.EventManager.OnRegionHeartbeatEnd += RegionHeartbeatEnd;
955 } 979 }
956 980
957 public int GetStateSource() 981 public int GetStateSource()
@@ -979,6 +1003,8 @@ namespace OpenSim.Region.Framework.Scenes
979 /// </remarks> 1003 /// </remarks>
980 public void MakeChildAgent() 1004 public void MakeChildAgent()
981 { 1005 {
1006 m_scene.EventManager.OnRegionHeartbeatEnd -= RegionHeartbeatEnd;
1007
982 m_log.DebugFormat("[SCENE PRESENCE]: Making {0} a child agent in {1}", Name, Scene.RegionInfo.RegionName); 1008 m_log.DebugFormat("[SCENE PRESENCE]: Making {0} a child agent in {1}", Name, Scene.RegionInfo.RegionName);
983 1009
984 // Reset these so that teleporting in and walking out isn't seen 1010 // Reset these so that teleporting in and walking out isn't seen
@@ -2377,14 +2403,15 @@ namespace OpenSim.Region.Framework.Scenes
2377 direc.Z *= 2.6f; 2403 direc.Z *= 2.6f;
2378 2404
2379 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored. 2405 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
2380 Animator.TrySetMovementAnimation("PREJUMP"); 2406// Animator.TrySetMovementAnimation("PREJUMP");
2381 Animator.TrySetMovementAnimation("JUMP"); 2407// Animator.TrySetMovementAnimation("JUMP");
2382 } 2408 }
2383 } 2409 }
2384 } 2410 }
2385 2411
2386 // TODO: Add the force instead of only setting it to support multiple forces per frame? 2412 // TODO: Add the force instead of only setting it to support multiple forces per frame?
2387 m_forceToApply = direc; 2413 m_forceToApply = direc;
2414 Animator.UpdateMovementAnimations();
2388 } 2415 }
2389 2416
2390 #endregion 2417 #endregion
@@ -3334,18 +3361,6 @@ namespace OpenSim.Region.Framework.Scenes
3334 if (IsChildAgent) 3361 if (IsChildAgent)
3335 return; 3362 return;
3336 3363
3337 //if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f))
3338 // The Physics Scene will send updates every 500 ms grep: PhysicsActor.SubscribeEvents(
3339 // as of this comment the interval is set in AddToPhysicalScene
3340 if (Animator != null)
3341 {
3342// if (m_updateCount > 0)
3343// {
3344 Animator.UpdateMovementAnimations();
3345// m_updateCount--;
3346// }
3347 }
3348
3349 CollisionEventUpdate collisionData = (CollisionEventUpdate)e; 3364 CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
3350 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList; 3365 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList;
3351 3366