aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r--OpenSim/Framework/Util.cs34
1 files changed, 17 insertions, 17 deletions
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index ccbe75e..5250d30 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -368,13 +368,16 @@ namespace OpenSim.Framework
368 return Utils.UIntsToLong(X, Y); 368 return Utils.UIntsToLong(X, Y);
369 } 369 }
370 370
371 // Regions are identified with a 'handle' made up of its region coordinates packed into a ulong. 371 // Regions are identified with a 'handle' made up of its world coordinates packed into a ulong.
372 // Several places rely on the ability to extract a region's location from its handle. 372 // Region handles are based on the coordinate of the region corner with lower X and Y
373 // Note the location is in 'world coordinates' (see below). 373 // var regions need more work than this to get that right corner from a generic world position
374 // Region handles are based on the lowest coordinate of the region so trim the passed x,y to be the regions 0,0. 374 // this corner must be on a grid point
375 public static ulong RegionWorldLocToHandle(uint X, uint Y) 375 public static ulong RegionWorldLocToHandle(uint X, uint Y)
376 { 376 {
377 return Utils.UIntsToLong(X, Y); 377 ulong handle = X & 0xffffff00; // make sure it matchs grid coord points.
378 handle <<= 32; // to higher half
379 handle |= (Y & 0xffffff00);
380 return handle;
378 } 381 }
379 382
380 public static ulong RegionGridLocToHandle(uint X, uint Y) 383 public static ulong RegionGridLocToHandle(uint X, uint Y)
@@ -387,30 +390,27 @@ namespace OpenSim.Framework
387 public static void RegionHandleToWorldLoc(ulong handle, out uint X, out uint Y) 390 public static void RegionHandleToWorldLoc(ulong handle, out uint X, out uint Y)
388 { 391 {
389 X = (uint)(handle >> 32); 392 X = (uint)(handle >> 32);
390 Y = (uint)(handle & (ulong)uint.MaxValue); 393 Y = (uint)(handle & 0xfffffffful);
391 } 394 }
392 395
393 public static void RegionHandleToRegionLoc(ulong handle, out uint X, out uint Y) 396 public static void RegionHandleToRegionLoc(ulong handle, out uint X, out uint Y)
394 { 397 {
395 uint worldX, worldY; 398 X = (uint)(handle >> 40) & 0x00ffffffu; // bring from higher half, divide by 256 and clean
396 RegionHandleToWorldLoc(handle, out worldX, out worldY); 399 Y = (uint)(handle >> 8) & 0x00ffffffu; // divide by 256 and clean
397 X = WorldToRegionLoc(worldX); 400 // if you trust the uint cast then the clean can be removed.
398 Y = WorldToRegionLoc(worldY);
399 } 401 }
400 402
401 // A region location can be 'world coordinates' (meters from zero) or 'region coordinates' 403 // A region location can be 'world coordinates' (meters) or 'region grid coordinates'
402 // (number of regions from zero). This measurement of regions relies on the legacy 256 region size. 404 // grid coordinates have a fixed step of 256m as defined by viewers
403 // These routines exist to make what is being converted explicit so the next person knows what was meant.
404 // Convert a region's 'world coordinate' to its 'region coordinate'.
405 public static uint WorldToRegionLoc(uint worldCoord) 405 public static uint WorldToRegionLoc(uint worldCoord)
406 { 406 {
407 return worldCoord / Constants.RegionSize; 407 return worldCoord >> 8;
408 } 408 }
409 409
410 // Convert a region's 'region coordinate' to its 'world coordinate'. 410 // Convert a region's 'region grid coordinate' to its 'world coordinate'.
411 public static uint RegionToWorldLoc(uint regionCoord) 411 public static uint RegionToWorldLoc(uint regionCoord)
412 { 412 {
413 return regionCoord * Constants.RegionSize; 413 return regionCoord << 8;
414 } 414 }
415 415
416 public static T Clamp<T>(T x, T min, T max) 416 public static T Clamp<T>(T x, T min, T max)