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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file v2math.h
  3.  * @brief LLVector2 class header file.
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-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_V2MATH_H
  33. #define LL_V2MATH_H
  34. #include "llmath.h"
  35. #include "v3math.h"
  36. class LLVector4;
  37. class LLMatrix3;
  38. class LLQuaternion;
  39. //  Llvector2 = |x y z w|
  40. static const U32 LENGTHOFVECTOR2 = 2;
  41. class LLVector2
  42. {
  43. public:
  44. F32 mV[LENGTHOFVECTOR2];
  45. static LLVector2 zero;
  46. LLVector2();   // Initializes LLVector2 to (0, 0)
  47. LLVector2(F32 x, F32 y);       // Initializes LLVector2 to (x. y)
  48. LLVector2(const F32 *vec);   // Initializes LLVector2 to (vec[0]. vec[1])
  49.         explicit LLVector2(const LLVector3 &vec); // Initializes LLVector2 to (vec[0]. vec[1])
  50. // Clears LLVector2 to (0, 0).  DEPRECATED - prefer zeroVec.
  51. void clear();
  52. void setZero();
  53. void clearVec(); // deprecated
  54. void zeroVec(); // deprecated
  55. void set(F32 x, F32 y);         // Sets LLVector2 to (x, y)
  56. void set(const LLVector2 &vec); // Sets LLVector2 to vec
  57. void set(const F32 *vec); // Sets LLVector2 to vec
  58. void setVec(F32 x, F32 y);         // deprecated
  59. void setVec(const LLVector2 &vec); // deprecated
  60. void setVec(const F32 *vec); // deprecated
  61. F32 length() const; // Returns magnitude of LLVector2
  62. F32 lengthSquared() const; // Returns magnitude squared of LLVector2
  63. F32 normalize(); // Normalizes and returns the magnitude of LLVector2
  64. F32 magVec() const; // deprecated
  65. F32 magVecSquared() const; // deprecated
  66. F32 normVec(); // deprecated
  67. BOOL abs(); // sets all values to absolute value of original value (first octant), returns TRUE if changed
  68. const LLVector2& scaleVec(const LLVector2& vec); // scales per component by vec
  69. BOOL isNull(); // Returns TRUE if vector has a _very_small_ length
  70. BOOL isExactlyZero() const { return !mV[VX] && !mV[VY]; }
  71. F32 operator[](int idx) const { return mV[idx]; }
  72. F32 &operator[](int idx) { return mV[idx]; }
  73. friend bool operator<(const LLVector2 &a, const LLVector2 &b); // For sorting. x is "more significant" than y
  74. friend LLVector2 operator+(const LLVector2 &a, const LLVector2 &b); // Return vector a + b
  75. friend LLVector2 operator-(const LLVector2 &a, const LLVector2 &b); // Return vector a minus b
  76. friend F32 operator*(const LLVector2 &a, const LLVector2 &b); // Return a dot b
  77. friend LLVector2 operator%(const LLVector2 &a, const LLVector2 &b); // Return a cross b
  78. friend LLVector2 operator/(const LLVector2 &a, F32 k); // Return a divided by scaler k
  79. friend LLVector2 operator*(const LLVector2 &a, F32 k); // Return a times scaler k
  80. friend LLVector2 operator*(F32 k, const LLVector2 &a); // Return a times scaler k
  81. friend bool operator==(const LLVector2 &a, const LLVector2 &b); // Return a == b
  82. friend bool operator!=(const LLVector2 &a, const LLVector2 &b); // Return a != b
  83. friend const LLVector2& operator+=(LLVector2 &a, const LLVector2 &b); // Return vector a + b
  84. friend const LLVector2& operator-=(LLVector2 &a, const LLVector2 &b); // Return vector a minus b
  85. friend const LLVector2& operator%=(LLVector2 &a, const LLVector2 &b); // Return a cross b
  86. friend const LLVector2& operator*=(LLVector2 &a, F32 k); // Return a times scaler k
  87. friend const LLVector2& operator/=(LLVector2 &a, F32 k); // Return a divided by scaler k
  88. friend LLVector2 operator-(const LLVector2 &a); // Return vector -a
  89. friend std::ostream&  operator<<(std::ostream& s, const LLVector2 &a); // Stream a
  90. };
  91. // Non-member functions 
  92. F32 angle_between(const LLVector2 &a, const LLVector2 &b); // Returns angle (radians) between a and b
  93. BOOL are_parallel(const LLVector2 &a, const LLVector2 &b, F32 epsilon=F_APPROXIMATELY_ZERO); // Returns TRUE if a and b are very close to parallel
  94. F32 dist_vec(const LLVector2 &a, const LLVector2 &b); // Returns distance between a and b
  95. F32 dist_vec_squared(const LLVector2 &a, const LLVector2 &b);// Returns distance squared between a and b
  96. F32 dist_vec_squared2D(const LLVector2 &a, const LLVector2 &b);// Returns distance squared between a and b ignoring Z component
  97. LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
  98. // Constructors
  99. inline LLVector2::LLVector2(void)
  100. {
  101. mV[VX] = 0.f;
  102. mV[VY] = 0.f;
  103. }
  104. inline LLVector2::LLVector2(F32 x, F32 y)
  105. {
  106. mV[VX] = x;
  107. mV[VY] = y;
  108. }
  109. inline LLVector2::LLVector2(const F32 *vec)
  110. {
  111. mV[VX] = vec[VX];
  112. mV[VY] = vec[VY];
  113. }
  114. inline LLVector2::LLVector2(const LLVector3 &vec)
  115. {
  116. mV[VX] = vec.mV[VX];
  117. mV[VY] = vec.mV[VY];
  118. }
  119. // Clear and Assignment Functions
  120. inline void LLVector2::clear(void)
  121. {
  122. mV[VX] = 0.f;
  123. mV[VY] = 0.f;
  124. }
  125. inline void LLVector2::setZero(void)
  126. {
  127. mV[VX] = 0.f;
  128. mV[VY] = 0.f;
  129. }
  130. // deprecated
  131. inline void LLVector2::clearVec(void)
  132. {
  133. mV[VX] = 0.f;
  134. mV[VY] = 0.f;
  135. }
  136. // deprecated
  137. inline void LLVector2::zeroVec(void)
  138. {
  139. mV[VX] = 0.f;
  140. mV[VY] = 0.f;
  141. }
  142. inline void LLVector2::set(F32 x, F32 y)
  143. {
  144. mV[VX] = x;
  145. mV[VY] = y;
  146. }
  147. inline void LLVector2::set(const LLVector2 &vec)
  148. {
  149. mV[VX] = vec.mV[VX];
  150. mV[VY] = vec.mV[VY];
  151. }
  152. inline void LLVector2::set(const F32 *vec)
  153. {
  154. mV[VX] = vec[VX];
  155. mV[VY] = vec[VY];
  156. }
  157. // deprecated
  158. inline void LLVector2::setVec(F32 x, F32 y)
  159. {
  160. mV[VX] = x;
  161. mV[VY] = y;
  162. }
  163. // deprecated
  164. inline void LLVector2::setVec(const LLVector2 &vec)
  165. {
  166. mV[VX] = vec.mV[VX];
  167. mV[VY] = vec.mV[VY];
  168. }
  169. // deprecated
  170. inline void LLVector2::setVec(const F32 *vec)
  171. {
  172. mV[VX] = vec[VX];
  173. mV[VY] = vec[VY];
  174. }
  175. // LLVector2 Magnitude and Normalization Functions
  176. inline F32 LLVector2::length(void) const
  177. {
  178. return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
  179. }
  180. inline F32 LLVector2::lengthSquared(void) const
  181. {
  182. return mV[0]*mV[0] + mV[1]*mV[1];
  183. }
  184. inline F32 LLVector2::normalize(void)
  185. {
  186. F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
  187. F32 oomag;
  188. if (mag > FP_MAG_THRESHOLD)
  189. {
  190. oomag = 1.f/mag;
  191. mV[0] *= oomag;
  192. mV[1] *= oomag;
  193. }
  194. else
  195. {
  196. mV[0] = 0.f;
  197. mV[1] = 0.f;
  198. mag = 0;
  199. }
  200. return (mag);
  201. }
  202. // deprecated
  203. inline F32 LLVector2::magVec(void) const
  204. {
  205. return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
  206. }
  207. // deprecated
  208. inline F32 LLVector2::magVecSquared(void) const
  209. {
  210. return mV[0]*mV[0] + mV[1]*mV[1];
  211. }
  212. // deprecated
  213. inline F32 LLVector2::normVec(void)
  214. {
  215. F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
  216. F32 oomag;
  217. if (mag > FP_MAG_THRESHOLD)
  218. {
  219. oomag = 1.f/mag;
  220. mV[0] *= oomag;
  221. mV[1] *= oomag;
  222. }
  223. else
  224. {
  225. mV[0] = 0.f;
  226. mV[1] = 0.f;
  227. mag = 0;
  228. }
  229. return (mag);
  230. }
  231. inline const LLVector2& LLVector2::scaleVec(const LLVector2& vec)
  232. {
  233. mV[VX] *= vec.mV[VX];
  234. mV[VY] *= vec.mV[VY];
  235. return *this;
  236. }
  237. inline BOOL LLVector2::isNull()
  238. {
  239. if ( F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY] )
  240. {
  241. return TRUE;
  242. }
  243. return FALSE;
  244. }
  245. // LLVector2 Operators
  246. // For sorting. By convention, x is "more significant" than y.
  247. inline bool operator<(const LLVector2 &a, const LLVector2 &b)
  248. {
  249. if( a.mV[VX] == b.mV[VX] )
  250. {
  251. return a.mV[VY] < b.mV[VY];
  252. }
  253. else
  254. {
  255. return a.mV[VX] < b.mV[VX];
  256. }
  257. }
  258. inline LLVector2 operator+(const LLVector2 &a, const LLVector2 &b)
  259. {
  260. LLVector2 c(a);
  261. return c += b;
  262. }
  263. inline LLVector2 operator-(const LLVector2 &a, const LLVector2 &b)
  264. {
  265. LLVector2 c(a);
  266. return c -= b;
  267. }
  268. inline F32  operator*(const LLVector2 &a, const LLVector2 &b)
  269. {
  270. return (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1]);
  271. }
  272. inline LLVector2 operator%(const LLVector2 &a, const LLVector2 &b)
  273. {
  274. return LLVector2(a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1], a.mV[1]*b.mV[0] - b.mV[1]*a.mV[0]);
  275. }
  276. inline LLVector2 operator/(const LLVector2 &a, F32 k)
  277. {
  278. F32 t = 1.f / k;
  279. return LLVector2( a.mV[0] * t, a.mV[1] * t );
  280. }
  281. inline LLVector2 operator*(const LLVector2 &a, F32 k)
  282. {
  283. return LLVector2( a.mV[0] * k, a.mV[1] * k );
  284. }
  285. inline LLVector2 operator*(F32 k, const LLVector2 &a)
  286. {
  287. return LLVector2( a.mV[0] * k, a.mV[1] * k );
  288. }
  289. inline bool operator==(const LLVector2 &a, const LLVector2 &b)
  290. {
  291. return (  (a.mV[0] == b.mV[0])
  292. &&(a.mV[1] == b.mV[1]));
  293. }
  294. inline bool operator!=(const LLVector2 &a, const LLVector2 &b)
  295. {
  296. return (  (a.mV[0] != b.mV[0])
  297. ||(a.mV[1] != b.mV[1]));
  298. }
  299. inline const LLVector2& operator+=(LLVector2 &a, const LLVector2 &b)
  300. {
  301. a.mV[0] += b.mV[0];
  302. a.mV[1] += b.mV[1];
  303. return a;
  304. }
  305. inline const LLVector2& operator-=(LLVector2 &a, const LLVector2 &b)
  306. {
  307. a.mV[0] -= b.mV[0];
  308. a.mV[1] -= b.mV[1];
  309. return a;
  310. }
  311. inline const LLVector2& operator%=(LLVector2 &a, const LLVector2 &b)
  312. {
  313. LLVector2 ret(a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1], a.mV[1]*b.mV[0] - b.mV[1]*a.mV[0]);
  314. a = ret;
  315. return a;
  316. }
  317. inline const LLVector2& operator*=(LLVector2 &a, F32 k)
  318. {
  319. a.mV[0] *= k;
  320. a.mV[1] *= k;
  321. return a;
  322. }
  323. inline const LLVector2& operator/=(LLVector2 &a, F32 k)
  324. {
  325. F32 t = 1.f / k;
  326. a.mV[0] *= t;
  327. a.mV[1] *= t;
  328. return a;
  329. }
  330. inline LLVector2 operator-(const LLVector2 &a)
  331. {
  332. return LLVector2( -a.mV[0], -a.mV[1] );
  333. }
  334. inline void update_min_max(LLVector2& min, LLVector2& max, const LLVector2& pos)
  335. {
  336. for (U32 i = 0; i < 2; i++)
  337. {
  338. if (min.mV[i] > pos.mV[i])
  339. {
  340. min.mV[i] = pos.mV[i];
  341. }
  342. if (max.mV[i] < pos.mV[i])
  343. {
  344. max.mV[i] = pos.mV[i];
  345. }
  346. }
  347. }
  348. inline std::ostream& operator<<(std::ostream& s, const LLVector2 &a) 
  349. {
  350. s << "{ " << a.mV[VX] << ", " << a.mV[VY] << " }";
  351. return s;
  352. }
  353. #endif