llregionhandle.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llregionhandle.h
  3.  * @brief Routines for converting positions to/from region handles.
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLREGIONHANDLE_H
  33. #define LL_LLREGIONHANDLE_H
  34. #include "indra_constants.h"
  35. #include "v3math.h"
  36. #include "v3dmath.h"
  37. inline U64 to_region_handle(const U32 x_origin, const U32 y_origin)
  38. {
  39. U64 region_handle;
  40. region_handle =  ((U64)x_origin) << 32;
  41. region_handle |= (U64) y_origin;
  42. return region_handle;
  43. }
  44. inline U64 to_region_handle(const LLVector3d& pos_global)
  45. {
  46. U32 global_x = (U32)pos_global.mdV[VX];
  47. global_x -= global_x % 256;
  48. U32 global_y = (U32)pos_global.mdV[VY];
  49. global_y -= global_y % 256;
  50. return to_region_handle(global_x, global_y);
  51. }
  52. inline U64 to_region_handle_global(const F32 x_global, const F32 y_global)
  53. {
  54. // Round down to the nearest origin
  55. U32 x_origin = (U32)x_global;
  56. x_origin -= x_origin % REGION_WIDTH_U32;
  57. U32 y_origin = (U32)y_global;
  58. y_origin -= y_origin % REGION_WIDTH_U32;
  59. U64 region_handle;
  60. region_handle =  ((U64)x_origin) << 32;
  61. region_handle |= (U64) y_origin;
  62. return region_handle;
  63. }
  64. inline BOOL to_region_handle(const F32 x_pos, const F32 y_pos, U64 *region_handle)
  65. {
  66. U32 x_int, y_int;
  67. if (x_pos < 0.f)
  68. {
  69. // llwarns << "to_region_handle:Clamping negative x position " << x_pos << " to zero!" << llendl;
  70. return FALSE;
  71. }
  72. else
  73. {
  74. x_int = (U32)llround(x_pos);
  75. }
  76. if (y_pos < 0.f)
  77. {
  78. // llwarns << "to_region_handle:Clamping negative y position " << y_pos << " to zero!" << llendl;
  79. return FALSE;
  80. }
  81. else
  82. {
  83. y_int = (U32)llround(y_pos);
  84. }
  85. *region_handle = to_region_handle(x_int, y_int);
  86. return TRUE;
  87. }
  88. // stuff the word-frame XY location of sim's SouthWest corner in x_pos, y_pos
  89. inline void from_region_handle(const U64 &region_handle, F32 *x_pos, F32 *y_pos)
  90. {
  91. *x_pos = (F32)((U32)(region_handle >> 32));
  92. *y_pos = (F32)((U32)(region_handle & 0xFFFFFFFF));
  93. }
  94. // stuff the word-frame XY location of sim's SouthWest corner in x_pos, y_pos
  95. inline void from_region_handle(const U64 &region_handle, U32 *x_pos, U32 *y_pos)
  96. {
  97. *x_pos = ((U32)(region_handle >> 32));
  98. *y_pos = ((U32)(region_handle & 0xFFFFFFFF));
  99. }
  100. // return the word-frame XY location of sim's SouthWest corner in LLVector3d
  101. inline LLVector3d from_region_handle(const U64 &region_handle)
  102. {
  103. return LLVector3d(((U32)(region_handle >> 32)), (U32)(region_handle & 0xFFFFFFFF), 0.f);
  104. }
  105. // grid-based region handle encoding. pass in a grid position
  106. // (eg: 1000,1000) and this will return the region handle.
  107. inline U64 grid_to_region_handle(const U32 grid_x, const U32 grid_y)
  108. {
  109. return to_region_handle(grid_x * REGION_WIDTH_UNITS,
  110. grid_y * REGION_WIDTH_UNITS);
  111. }
  112. inline void grid_from_region_handle(const U64& region_handle, U32* grid_x, U32* grid_y)
  113. {
  114. from_region_handle(region_handle, grid_x, grid_y);
  115. *grid_x /= REGION_WIDTH_UNITS;
  116. *grid_y /= REGION_WIDTH_UNITS;
  117. }
  118. #endif