aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs80
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs44
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs82
3 files changed, 110 insertions, 96 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
index 414b9bf..87ded7b 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
@@ -220,7 +220,7 @@ namespace OpenSim.Region.ClientStack.Linden
220 PollServiceMeshEventArgs args; 220 PollServiceMeshEventArgs args;
221 if (m_pollservices.TryGetValue(user, out args)) 221 if (m_pollservices.TryGetValue(user, out args))
222 { 222 {
223 args.UpdateThrottle(imagethrottle, p); 223 args.UpdateThrottle(imagethrottle);
224 } 224 }
225 } 225 }
226 226
@@ -238,14 +238,13 @@ namespace OpenSim.Region.ClientStack.Linden
238 base(null, uri, null, null, null, null, pId, int.MaxValue) 238 base(null, uri, null, null, null, null, pId, int.MaxValue)
239 { 239 {
240 m_scene = scene; 240 m_scene = scene;
241 m_throttler = new MeshCapsDataThrottler(100000, 1400000, 10000, scene, pId); 241 m_throttler = new MeshCapsDataThrottler(100000);
242 // x is request id, y is userid 242 // x is request id, y is userid
243 HasEvents = (x, y) => 243 HasEvents = (x, y) =>
244 { 244 {
245 lock (responses) 245 lock (responses)
246 { 246 {
247 bool ret = m_throttler.hasEvents(x, responses); 247 bool ret = m_throttler.hasEvents(x, responses);
248 m_throttler.ProcessTime();
249 return ret; 248 return ret;
250 249
251 } 250 }
@@ -271,8 +270,8 @@ namespace OpenSim.Region.ClientStack.Linden
271 } 270 }
272 finally 271 finally
273 { 272 {
274 m_throttler.ProcessTime();
275 responses.Remove(x); 273 responses.Remove(x);
274 m_throttler.PassTime();
276 } 275 }
277 } 276 }
278 }; 277 };
@@ -285,6 +284,7 @@ namespace OpenSim.Region.ClientStack.Linden
285 reqinfo.request = y; 284 reqinfo.request = y;
286 285
287 m_queue.Enqueue(reqinfo); 286 m_queue.Enqueue(reqinfo);
287 m_throttler.PassTime();
288 }; 288 };
289 289
290 // this should never happen except possible on shutdown 290 // this should never happen except possible on shutdown
@@ -364,12 +364,15 @@ namespace OpenSim.Region.ClientStack.Linden
364 }; 364 };
365 365
366 } 366 }
367 m_throttler.ProcessTime(); 367 m_throttler.PassTime();
368 } 368 }
369 369
370 internal void UpdateThrottle(int pimagethrottle, ScenePresence p) 370 internal void UpdateThrottle(int pthrottle)
371 { 371 {
372 m_throttler.UpdateThrottle(pimagethrottle, p); 372 int tmp = 2 * pthrottle;
373 if(tmp < 10000)
374 tmp = 10000;
375 m_throttler.ThrottleBytes = tmp;
373 } 376 }
374 } 377 }
375 378
@@ -423,24 +426,15 @@ namespace OpenSim.Region.ClientStack.Linden
423 426
424 internal sealed class MeshCapsDataThrottler 427 internal sealed class MeshCapsDataThrottler
425 { 428 {
429 private double lastTimeElapsed = 0;
430 private double BytesSent = 0;
426 431
427 private volatile int currenttime = 0; 432 public MeshCapsDataThrottler(int pBytes)
428 private volatile int lastTimeElapsed = 0;
429 private volatile int BytesSent = 0;
430 private int CapSetThrottle = 0;
431 private readonly Scene m_scene;
432 private ThrottleOutPacketType Throttle;
433 private readonly UUID User;
434
435 public MeshCapsDataThrottler(int pBytes, int max, int min, Scene pScene, UUID puser)
436 { 433 {
434 if(pBytes < 10000)
435 pBytes = 10000;
437 ThrottleBytes = pBytes; 436 ThrottleBytes = pBytes;
438 if(ThrottleBytes < 10000) 437 lastTimeElapsed = Util.GetTimeStampMS();
439 ThrottleBytes = 10000;
440 lastTimeElapsed = Util.EnvironmentTickCount();
441 Throttle = ThrottleOutPacketType.Asset;
442 m_scene = pScene;
443 User = puser;
444 } 438 }
445 439
446 public bool hasEvents(UUID key, Dictionary<UUID, aPollResponse> responses) 440 public bool hasEvents(UUID key, Dictionary<UUID, aPollResponse> responses)
@@ -470,46 +464,22 @@ namespace OpenSim.Region.ClientStack.Linden
470 return haskey; 464 return haskey;
471 } 465 }
472 466
473 public void ProcessTime() 467 public void PassTime()
474 { 468 {
475 PassTime(); 469 double currenttime = Util.GetTimeStampMS();
476 } 470 double timeElapsed = currenttime - lastTimeElapsed;
477 471 if(timeElapsed < 50.0)
478 private void PassTime() 472 return;
473 int add = (int)(ThrottleBytes * timeElapsed * 0.001);
474 if (add >= 1000)
479 { 475 {
480 currenttime = Util.EnvironmentTickCount();
481 int timeElapsed = Util.EnvironmentTickCountSubtract(currenttime, lastTimeElapsed);
482 if (timeElapsed >= 100)
483 {
484 lastTimeElapsed = currenttime; 476 lastTimeElapsed = currenttime;
485 BytesSent -= (ThrottleBytes * timeElapsed / 1000); 477 BytesSent -= add;
486 if (BytesSent < 0) BytesSent = 0; 478 if (BytesSent < 0) BytesSent = 0;
487 } 479 }
488 } 480 }
489 481
490 private void AlterThrottle(int setting, ScenePresence p) 482 public int ThrottleBytes;
491 {
492 p.ControllingClient.SetAgentThrottleSilent((int)Throttle,setting);
493 } 483 }
494
495 public int ThrottleBytes
496 {
497 get { return CapSetThrottle; }
498 set
499 {
500 if (value > 10000)
501 CapSetThrottle = value;
502 else
503 CapSetThrottle = 10000;
504 } 484 }
505 }
506
507 internal void UpdateThrottle(int pimagethrottle, ScenePresence p)
508 {
509 // Client set throttle !
510 CapSetThrottle = 2 * pimagethrottle;
511 ProcessTime();
512 }
513 }
514 }
515} 485}
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
index 1a31157..d77cf0c 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
@@ -221,7 +221,7 @@ namespace OpenSim.Region.ClientStack.Linden
221 private HashSet<UUID> dropedResponses = new HashSet<UUID>(); 221 private HashSet<UUID> dropedResponses = new HashSet<UUID>();
222 222
223 private Scene m_scene; 223 private Scene m_scene;
224 private CapsDataThrottler m_throttler = new CapsDataThrottler(100000, 1400000,10000); 224 private CapsDataThrottler m_throttler = new CapsDataThrottler(100000);
225 public PollServiceTextureEventArgs(UUID pId, Scene scene) : 225 public PollServiceTextureEventArgs(UUID pId, Scene scene) :
226 base(null, "", null, null, null, null, pId, int.MaxValue) 226 base(null, "", null, null, null, null, pId, int.MaxValue)
227 { 227 {
@@ -232,7 +232,6 @@ namespace OpenSim.Region.ClientStack.Linden
232 lock (responses) 232 lock (responses)
233 { 233 {
234 bool ret = m_throttler.hasEvents(x, responses); 234 bool ret = m_throttler.hasEvents(x, responses);
235 m_throttler.ProcessTime();
236 return ret; 235 return ret;
237 236
238 } 237 }
@@ -258,6 +257,7 @@ namespace OpenSim.Region.ClientStack.Linden
258 finally 257 finally
259 { 258 {
260 responses.Remove(x); 259 responses.Remove(x);
260 m_throttler.PassTime();
261 } 261 }
262 } 262 }
263 }; 263 };
@@ -282,6 +282,7 @@ namespace OpenSim.Region.ClientStack.Linden
282 } 282 }
283 } 283 }
284 m_queue.Enqueue(reqinfo); 284 m_queue.Enqueue(reqinfo);
285 m_throttler.PassTime();
285 }; 286 };
286 287
287 // this should never happen except possible on shutdown 288 // this should never happen except possible on shutdown
@@ -381,14 +382,15 @@ namespace OpenSim.Region.ClientStack.Linden
381 response = response 382 response = response
382 }; 383 };
383 } 384 }
384 m_throttler.ProcessTime(); 385 m_throttler.PassTime();
385 } 386 }
386 387
387 internal void UpdateThrottle(int pimagethrottle) 388 internal void UpdateThrottle(int pimagethrottle)
388 { 389 {
389 m_throttler.ThrottleBytes = 2 * pimagethrottle; 390 int tmp = 2 * pimagethrottle;
390 if(m_throttler.ThrottleBytes < 10000) 391 if(tmp < 10000)
391 m_throttler.ThrottleBytes = 10000; 392 tmp = 10000;
393 m_throttler.ThrottleBytes = tmp;
392 } 394 }
393 } 395 }
394 396
@@ -456,15 +458,14 @@ namespace OpenSim.Region.ClientStack.Linden
456 458
457 internal sealed class CapsDataThrottler 459 internal sealed class CapsDataThrottler
458 { 460 {
459 private volatile int currenttime = 0; 461 private double lastTimeElapsed = 0;
460 private volatile int lastTimeElapsed = 0;
461 private volatile int BytesSent = 0; 462 private volatile int BytesSent = 0;
462 public CapsDataThrottler(int pBytes, int max, int min) 463 public CapsDataThrottler(int pBytes)
463 { 464 {
465 if(pBytes < 10000)
466 pBytes = 10000;
464 ThrottleBytes = pBytes; 467 ThrottleBytes = pBytes;
465 if(ThrottleBytes < 10000) 468 lastTimeElapsed = Util.GetTimeStampMS();
466 ThrottleBytes = 10000;
467 lastTimeElapsed = Util.EnvironmentTickCount();
468 } 469 }
469 public bool hasEvents(UUID key, Dictionary<UUID, GetTextureModule.aPollResponse> responses) 470 public bool hasEvents(UUID key, Dictionary<UUID, GetTextureModule.aPollResponse> responses)
470 { 471 {
@@ -497,20 +498,17 @@ namespace OpenSim.Region.ClientStack.Linden
497 return haskey; 498 return haskey;
498 } 499 }
499 500
500 public void ProcessTime() 501 public void PassTime()
501 { 502 {
502 PassTime(); 503 double currenttime = Util.GetTimeStampMS();
503 } 504 double timeElapsed = currenttime - lastTimeElapsed;
504 505 if(timeElapsed < 50.0)
505 private void PassTime() 506 return;
507 int add = (int)(ThrottleBytes * timeElapsed * 0.001);
508 if (add >= 1000)
506 { 509 {
507 currenttime = Util.EnvironmentTickCount();
508 int timeElapsed = Util.EnvironmentTickCountSubtract(currenttime, lastTimeElapsed);
509 //processTimeBasedActions(responses);
510 if (timeElapsed >= 100)
511 {
512 lastTimeElapsed = currenttime; 510 lastTimeElapsed = currenttime;
513 BytesSent -= (ThrottleBytes * timeElapsed / 1000); 511 BytesSent -= add;
514 if (BytesSent < 0) BytesSent = 0; 512 if (BytesSent < 0) BytesSent = 0;
515 } 513 }
516 } 514 }
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 01c1fb9..861b79e 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -4137,6 +4137,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4137 Vector3 mypos = Vector3.Zero; 4137 Vector3 mypos = Vector3.Zero;
4138 ScenePresence mysp = (ScenePresence)SceneAgent; 4138 ScenePresence mysp = (ScenePresence)SceneAgent;
4139 4139
4140 bool orderedDequeue = m_scene.UpdatePrioritizationScheme == UpdatePrioritizationSchemes.SimpleAngularDistance;
4140 // we should have a presence 4141 // we should have a presence
4141 if(mysp == null) 4142 if(mysp == null)
4142 return; 4143 return;
@@ -4151,8 +4152,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4151 while (maxUpdatesBytes > 0) 4152 while (maxUpdatesBytes > 0)
4152 { 4153 {
4153 lock (m_entityUpdates.SyncRoot) 4154 lock (m_entityUpdates.SyncRoot)
4154 if (!m_entityUpdates.TryDequeue(out update, out timeinqueue)) 4155 {
4155 break; 4156 if(orderedDequeue)
4157 {
4158 if (!m_entityUpdates.TryOrderedDequeue(out update, out timeinqueue))
4159 break;
4160 }
4161 else
4162 {
4163 if (!m_entityUpdates.TryDequeue(out update, out timeinqueue))
4164 break;
4165 }
4166 }
4156 4167
4157 PrimUpdateFlags updateFlags = (PrimUpdateFlags)update.Flags; 4168 PrimUpdateFlags updateFlags = (PrimUpdateFlags)update.Flags;
4158 4169
@@ -4850,6 +4861,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4850// OpenSim.Framework.Lazy<List<ObjectPropertyUpdate>> propertyUpdates = 4861// OpenSim.Framework.Lazy<List<ObjectPropertyUpdate>> propertyUpdates =
4851// new OpenSim.Framework.Lazy<List<ObjectPropertyUpdate>>(); 4862// new OpenSim.Framework.Lazy<List<ObjectPropertyUpdate>>();
4852 4863
4864 bool orderedDequeue = m_scene.UpdatePrioritizationScheme == UpdatePrioritizationSchemes.SimpleAngularDistance;
4853 4865
4854 EntityUpdate iupdate; 4866 EntityUpdate iupdate;
4855 Int32 timeinqueue; // this is just debugging code & can be dropped later 4867 Int32 timeinqueue; // this is just debugging code & can be dropped later
@@ -4857,8 +4869,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4857 while (maxUpdateBytes > 0) 4869 while (maxUpdateBytes > 0)
4858 { 4870 {
4859 lock (m_entityProps.SyncRoot) 4871 lock (m_entityProps.SyncRoot)
4860 if (!m_entityProps.TryDequeue(out iupdate, out timeinqueue)) 4872 {
4861 break; 4873 if(orderedDequeue)
4874 {
4875 if (!m_entityProps.TryOrderedDequeue(out iupdate, out timeinqueue))
4876 break;
4877 }
4878 else
4879 {
4880 if (!m_entityProps.TryDequeue(out iupdate, out timeinqueue))
4881 break;
4882 }
4883 }
4862 4884
4863 ObjectPropertyUpdate update = (ObjectPropertyUpdate)iupdate; 4885 ObjectPropertyUpdate update = (ObjectPropertyUpdate)iupdate;
4864 if (update.SendFamilyProps) 4886 if (update.SendFamilyProps)
@@ -5526,6 +5548,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5526 #endregion 5548 #endregion
5527 5549
5528 #region Helper Methods 5550 #region Helper Methods
5551 private void ClampVectorForUint(ref Vector3 v, float max)
5552 {
5553 float a,b;
5554
5555 a = Math.Abs(v.X);
5556 b = Math.Abs(v.Y);
5557 if(b > a)
5558 a = b;
5559 b= Math.Abs(v.Z);
5560 if(b > a)
5561 a = b;
5562
5563 if (a > max)
5564 {
5565 a = max / a;
5566 v.X *= a;
5567 v.Y *= a;
5568 v.Z *= a;
5569 }
5570 }
5529 5571
5530 protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(ISceneEntity entity, bool sendTexture) 5572 protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(ISceneEntity entity, bool sendTexture)
5531 { 5573 {
@@ -5616,11 +5658,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5616 pos += 12; 5658 pos += 12;
5617 5659
5618 // Velocity 5660 // Velocity
5661 ClampVectorForUint(ref velocity, 128f);
5619 Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.X, -128.0f, 128.0f), data, pos); pos += 2; 5662 Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.X, -128.0f, 128.0f), data, pos); pos += 2;
5620 Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.Y, -128.0f, 128.0f), data, pos); pos += 2; 5663 Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.Y, -128.0f, 128.0f), data, pos); pos += 2;
5621 Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.Z, -128.0f, 128.0f), data, pos); pos += 2; 5664 Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.Z, -128.0f, 128.0f), data, pos); pos += 2;
5622 5665
5623 // Acceleration 5666 // Acceleration
5667 ClampVectorForUint(ref acceleration, 64f);
5624 Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.X, -64.0f, 64.0f), data, pos); pos += 2; 5668 Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.X, -64.0f, 64.0f), data, pos); pos += 2;
5625 Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.Y, -64.0f, 64.0f), data, pos); pos += 2; 5669 Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.Y, -64.0f, 64.0f), data, pos); pos += 2;
5626 Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.Z, -64.0f, 64.0f), data, pos); pos += 2; 5670 Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.Z, -64.0f, 64.0f), data, pos); pos += 2;
@@ -5632,6 +5676,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5632 Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.W, -1.0f, 1.0f), data, pos); pos += 2; 5676 Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.W, -1.0f, 1.0f), data, pos); pos += 2;
5633 5677
5634 // Angular Velocity 5678 // Angular Velocity
5679 ClampVectorForUint(ref angularVelocity, 64f);
5635 Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.X, -64.0f, 64.0f), data, pos); pos += 2; 5680 Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.X, -64.0f, 64.0f), data, pos); pos += 2;
5636 Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Y, -64.0f, 64.0f), data, pos); pos += 2; 5681 Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Y, -64.0f, 64.0f), data, pos); pos += 2;
5637 Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Z, -64.0f, 64.0f), data, pos); pos += 2; 5682 Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Z, -64.0f, 64.0f), data, pos); pos += 2;
@@ -5753,7 +5798,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5753 //update.JointPivot = Vector3.Zero; 5798 //update.JointPivot = Vector3.Zero;
5754 //update.JointType = 0; 5799 //update.JointType = 0;
5755 update.Material = part.Material; 5800 update.Material = part.Material;
5756 update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim
5757/* 5801/*
5758 if (data.ParentGroup.IsAttachment) 5802 if (data.ParentGroup.IsAttachment)
5759 { 5803 {
@@ -5832,8 +5876,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5832 update.TextureAnim = part.TextureAnimation ?? Utils.EmptyBytes; 5876 update.TextureAnim = part.TextureAnimation ?? Utils.EmptyBytes;
5833 update.TextureEntry = part.Shape.TextureEntry ?? Utils.EmptyBytes; 5877 update.TextureEntry = part.Shape.TextureEntry ?? Utils.EmptyBytes;
5834 update.Scale = part.Shape.Scale; 5878 update.Scale = part.Shape.Scale;
5835 update.Text = Util.StringToBytes256(part.Text); 5879 update.Text = Util.StringToBytes(part.Text, 255);
5836 update.MediaURL = Util.StringToBytes256(part.MediaUrl); 5880 update.MediaURL = Util.StringToBytes(part.MediaUrl, 255);
5837 5881
5838 #region PrimFlags 5882 #region PrimFlags
5839 5883
@@ -6234,20 +6278,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6234 /// <param name='x'></param> 6278 /// <param name='x'></param>
6235 private bool CheckAgentCameraUpdateSignificance(AgentUpdatePacket.AgentDataBlock x) 6279 private bool CheckAgentCameraUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
6236 { 6280 {
6237 float vdelta = Vector3.Distance(x.CameraAtAxis, m_thisAgentUpdateArgs.CameraAtAxis); 6281 if(Math.Abs(x.CameraCenter.X - m_thisAgentUpdateArgs.CameraCenter.X) > VDELTA ||
6238 if((vdelta > VDELTA)) 6282 Math.Abs(x.CameraCenter.Y - m_thisAgentUpdateArgs.CameraCenter.Y) > VDELTA ||
6239 return true; 6283 Math.Abs(x.CameraCenter.Z - m_thisAgentUpdateArgs.CameraCenter.Z) > VDELTA ||
6240 6284
6241 vdelta = Vector3.Distance(x.CameraCenter, m_thisAgentUpdateArgs.CameraCenter); 6285 Math.Abs(x.CameraAtAxis.X - m_thisAgentUpdateArgs.CameraAtAxis.X) > VDELTA ||
6242 if((vdelta > VDELTA)) 6286 Math.Abs(x.CameraAtAxis.Y - m_thisAgentUpdateArgs.CameraAtAxis.Y) > VDELTA ||
6243 return true; 6287// Math.Abs(x.CameraAtAxis.Z - m_thisAgentUpdateArgs.CameraAtAxis.Z) > VDELTA ||
6244 6288
6245 vdelta = Vector3.Distance(x.CameraLeftAxis, m_thisAgentUpdateArgs.CameraLeftAxis); 6289 Math.Abs(x.CameraLeftAxis.X - m_thisAgentUpdateArgs.CameraLeftAxis.X) > VDELTA ||
6246 if((vdelta > VDELTA)) 6290 Math.Abs(x.CameraLeftAxis.Y - m_thisAgentUpdateArgs.CameraLeftAxis.Y) > VDELTA ||
6247 return true; 6291// Math.Abs(x.CameraLeftAxis.Z - m_thisAgentUpdateArgs.CameraLeftAxis.Z) > VDELTA ||
6248 6292
6249 vdelta = Vector3.Distance(x.CameraUpAxis, m_thisAgentUpdateArgs.CameraUpAxis); 6293 Math.Abs(x.CameraUpAxis.X - m_thisAgentUpdateArgs.CameraUpAxis.X) > VDELTA ||
6250 if((vdelta > VDELTA)) 6294 Math.Abs(x.CameraUpAxis.Y - m_thisAgentUpdateArgs.CameraUpAxis.Y) > VDELTA
6295// Math.Abs(x.CameraLeftAxis.Z - m_thisAgentUpdateArgs.CameraLeftAxis.Z) > VDELTA ||
6296 )
6251 return true; 6297 return true;
6252 6298
6253 return false; 6299 return false;