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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file v3math.h
  3.  * @brief LLVector3 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_V3MATH_H
  33. #define LL_V3MATH_H
  34. #include "llerror.h"
  35. #include "llmath.h"
  36. #include "llsd.h"
  37. class LLVector2;
  38. class LLVector4;
  39. class LLMatrix3;
  40. class LLVector3d;
  41. class LLQuaternion;
  42. //  LLvector3 = |x y z w|
  43. static const U32 LENGTHOFVECTOR3 = 3;
  44. class LLVector3
  45. {
  46. public:
  47. F32 mV[LENGTHOFVECTOR3];
  48. static const LLVector3 zero;
  49. static const LLVector3 x_axis;
  50. static const LLVector3 y_axis;
  51. static const LLVector3 z_axis;
  52. static const LLVector3 x_axis_neg;
  53. static const LLVector3 y_axis_neg;
  54. static const LLVector3 z_axis_neg;
  55. static const LLVector3 all_one;
  56. inline LLVector3(); // Initializes LLVector3 to (0, 0, 0)
  57. inline LLVector3(const F32 x, const F32 y, const F32 z); // Initializes LLVector3 to (x. y, z)
  58. inline explicit LLVector3(const F32 *vec); // Initializes LLVector3 to (vec[0]. vec[1], vec[2])
  59. explicit LLVector3(const LLVector2 &vec); // Initializes LLVector3 to (vec[0]. vec[1], 0)
  60. explicit LLVector3(const LLVector3d &vec); // Initializes LLVector3 to (vec[0]. vec[1], vec[2])
  61. explicit LLVector3(const LLVector4 &vec); // Initializes LLVector4 to (vec[0]. vec[1], vec[2])
  62. explicit LLVector3(const LLSD& sd);
  63. LLSD getValue() const;
  64. void setValue(const LLSD& sd);
  65. inline BOOL isFinite() const; // checks to see if all values of LLVector3 are finite
  66. BOOL clamp(F32 min, F32 max); // Clamps all values to (min,max), returns TRUE if data changed
  67. BOOL clampLength( F32 length_limit ); // Scales vector to limit length to a value
  68. void quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz); // changes the vector to reflect quatization
  69. void quantize8(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz); // changes the vector to reflect quatization
  70. void  snap(S32 sig_digits); // snaps x,y,z to sig_digits decimal places
  71. BOOL abs(); // sets all values to absolute value of original value (first octant), returns TRUE if changed
  72. inline void clear(); // Clears LLVector3 to (0, 0, 0)
  73. inline void setZero(); // Clears LLVector3 to (0, 0, 0)
  74. inline void clearVec(); // deprecated
  75. inline void zeroVec(); // deprecated
  76. inline void set(F32 x, F32 y, F32 z); // Sets LLVector3 to (x, y, z, 1)
  77. inline void set(const LLVector3 &vec); // Sets LLVector3 to vec
  78. inline void set(const F32 *vec); // Sets LLVector3 to vec
  79. const LLVector3& set(const LLVector4 &vec);
  80. const LLVector3& set(const LLVector3d &vec);// Sets LLVector3 to vec
  81. inline void setVec(F32 x, F32 y, F32 z); // deprecated
  82. inline void setVec(const LLVector3 &vec); // deprecated
  83. inline void setVec(const F32 *vec); // deprecated
  84. const LLVector3& setVec(const LLVector4 &vec);  // deprecated
  85. const LLVector3& setVec(const LLVector3d &vec); // deprecated
  86. F32 length() const; // Returns magnitude of LLVector3
  87. F32 lengthSquared() const; // Returns magnitude squared of LLVector3
  88. F32 magVec() const; // deprecated
  89. F32 magVecSquared() const; // deprecated
  90. inline F32 normalize(); // Normalizes and returns the magnitude of LLVector3
  91. inline F32 normVec(); // deprecated
  92. inline BOOL inRange( F32 min, F32 max ) const; // Returns true if all values of the vector are between min and max
  93. const LLVector3& rotVec(F32 angle, const LLVector3 &vec); // Rotates about vec by angle radians
  94. const LLVector3& rotVec(F32 angle, F32 x, F32 y, F32 z); // Rotates about x,y,z by angle radians
  95. const LLVector3& rotVec(const LLMatrix3 &mat); // Rotates by LLMatrix4 mat
  96. const LLVector3& rotVec(const LLQuaternion &q); // Rotates by LLQuaternion q
  97. const LLVector3& scaleVec(const LLVector3& vec); // scales per component by vec
  98. LLVector3 scaledVec(const LLVector3& vec) const; // get a copy of this vector scaled by vec
  99. BOOL isNull() const; // Returns TRUE if vector has a _very_small_ length
  100. BOOL isExactlyZero() const { return !mV[VX] && !mV[VY] && !mV[VZ]; }
  101. F32 operator[](int idx) const { return mV[idx]; }
  102. F32 &operator[](int idx) { return mV[idx]; }
  103. friend LLVector3 operator+(const LLVector3 &a, const LLVector3 &b); // Return vector a + b
  104. friend LLVector3 operator-(const LLVector3 &a, const LLVector3 &b); // Return vector a minus b
  105. friend F32 operator*(const LLVector3 &a, const LLVector3 &b); // Return a dot b
  106. friend LLVector3 operator%(const LLVector3 &a, const LLVector3 &b); // Return a cross b
  107. friend LLVector3 operator*(const LLVector3 &a, F32 k); // Return a times scaler k
  108. friend LLVector3 operator/(const LLVector3 &a, F32 k); // Return a divided by scaler k
  109. friend LLVector3 operator*(F32 k, const LLVector3 &a); // Return a times scaler k
  110. friend bool operator==(const LLVector3 &a, const LLVector3 &b); // Return a == b
  111. friend bool operator!=(const LLVector3 &a, const LLVector3 &b); // Return a != b
  112. // less than operator useful for using vectors as std::map keys
  113. friend bool operator<(const LLVector3 &a, const LLVector3 &b); // Return a < b
  114. friend const LLVector3& operator+=(LLVector3 &a, const LLVector3 &b); // Return vector a + b
  115. friend const LLVector3& operator-=(LLVector3 &a, const LLVector3 &b); // Return vector a minus b
  116. friend const LLVector3& operator%=(LLVector3 &a, const LLVector3 &b); // Return a cross b
  117. friend const LLVector3& operator*=(LLVector3 &a, const LLVector3 &b); // Returns a * b;
  118. friend const LLVector3& operator*=(LLVector3 &a, F32 k); // Return a times scaler k
  119. friend const LLVector3& operator/=(LLVector3 &a, F32 k); // Return a divided by scaler k
  120. friend const LLVector3& operator*=(LLVector3 &a, const LLQuaternion &b); // Returns a * b;
  121. friend LLVector3 operator-(const LLVector3 &a); // Return vector -a
  122. friend std::ostream&  operator<<(std::ostream& s, const LLVector3 &a); // Stream a
  123. static BOOL parseVector3(const std::string& buf, LLVector3* value);
  124. };
  125. typedef LLVector3 LLSimLocalVec;
  126. // Non-member functions 
  127. F32 angle_between(const LLVector3 &a, const LLVector3 &b); // Returns angle (radians) between a and b
  128. BOOL are_parallel(const LLVector3 &a, const LLVector3 &b, F32 epsilon=F_APPROXIMATELY_ZERO); // Returns TRUE if a and b are very close to parallel
  129. F32 dist_vec(const LLVector3 &a, const LLVector3 &b); // Returns distance between a and b
  130. F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b
  131. F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b ignoring Z component
  132. LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b
  133. LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
  134. inline LLVector3::LLVector3(void)
  135. {
  136. mV[0] = 0.f;
  137. mV[1] = 0.f;
  138. mV[2] = 0.f;
  139. }
  140. inline LLVector3::LLVector3(const F32 x, const F32 y, const F32 z)
  141. {
  142. mV[VX] = x;
  143. mV[VY] = y;
  144. mV[VZ] = z;
  145. }
  146. inline LLVector3::LLVector3(const F32 *vec)
  147. {
  148. mV[VX] = vec[VX];
  149. mV[VY] = vec[VY];
  150. mV[VZ] = vec[VZ];
  151. }
  152. /*
  153. inline LLVector3::LLVector3(const LLVector3 &copy)
  154. {
  155. mV[VX] = copy.mV[VX];
  156. mV[VY] = copy.mV[VY];
  157. mV[VZ] = copy.mV[VZ];
  158. }
  159. */
  160. // Destructors
  161. // checker
  162. inline BOOL LLVector3::isFinite() const
  163. {
  164. return (llfinite(mV[VX]) && llfinite(mV[VY]) && llfinite(mV[VZ]));
  165. }
  166. // Clear and Assignment Functions
  167. inline void LLVector3::clear(void)
  168. {
  169. mV[0] = 0.f;
  170. mV[1] = 0.f;
  171. mV[2] = 0.f;
  172. }
  173. inline void LLVector3::setZero(void)
  174. {
  175. mV[0] = 0.f;
  176. mV[1] = 0.f;
  177. mV[2] = 0.f;
  178. }
  179. inline void LLVector3::clearVec(void)
  180. {
  181. mV[0] = 0.f;
  182. mV[1] = 0.f;
  183. mV[2] = 0.f;
  184. }
  185. inline void LLVector3::zeroVec(void)
  186. {
  187. mV[0] = 0.f;
  188. mV[1] = 0.f;
  189. mV[2] = 0.f;
  190. }
  191. inline void LLVector3::set(F32 x, F32 y, F32 z)
  192. {
  193. mV[VX] = x;
  194. mV[VY] = y;
  195. mV[VZ] = z;
  196. }
  197. inline void LLVector3::set(const LLVector3 &vec)
  198. {
  199. mV[0] = vec.mV[0];
  200. mV[1] = vec.mV[1];
  201. mV[2] = vec.mV[2];
  202. }
  203. inline void LLVector3::set(const F32 *vec)
  204. {
  205. mV[0] = vec[0];
  206. mV[1] = vec[1];
  207. mV[2] = vec[2];
  208. }
  209. // deprecated
  210. inline void LLVector3::setVec(F32 x, F32 y, F32 z)
  211. {
  212. mV[VX] = x;
  213. mV[VY] = y;
  214. mV[VZ] = z;
  215. }
  216. // deprecated
  217. inline void LLVector3::setVec(const LLVector3 &vec)
  218. {
  219. mV[0] = vec.mV[0];
  220. mV[1] = vec.mV[1];
  221. mV[2] = vec.mV[2];
  222. }
  223. // deprecated
  224. inline void LLVector3::setVec(const F32 *vec)
  225. {
  226. mV[0] = vec[0];
  227. mV[1] = vec[1];
  228. mV[2] = vec[2];
  229. }
  230. inline F32 LLVector3::normalize(void)
  231. {
  232. F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
  233. F32 oomag;
  234. if (mag > FP_MAG_THRESHOLD)
  235. {
  236. oomag = 1.f/mag;
  237. mV[0] *= oomag;
  238. mV[1] *= oomag;
  239. mV[2] *= oomag;
  240. }
  241. else
  242. {
  243. mV[0] = 0.f;
  244. mV[1] = 0.f;
  245. mV[2] = 0.f;
  246. mag = 0;
  247. }
  248. return (mag);
  249. }
  250. // deprecated
  251. inline F32 LLVector3::normVec(void)
  252. {
  253. F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
  254. F32 oomag;
  255. if (mag > FP_MAG_THRESHOLD)
  256. {
  257. oomag = 1.f/mag;
  258. mV[0] *= oomag;
  259. mV[1] *= oomag;
  260. mV[2] *= oomag;
  261. }
  262. else
  263. {
  264. mV[0] = 0.f;
  265. mV[1] = 0.f;
  266. mV[2] = 0.f;
  267. mag = 0;
  268. }
  269. return (mag);
  270. }
  271. // LLVector3 Magnitude and Normalization Functions
  272. inline F32 LLVector3::length(void) const
  273. {
  274. return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
  275. }
  276. inline F32 LLVector3::lengthSquared(void) const
  277. {
  278. return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2];
  279. }
  280. inline F32 LLVector3::magVec(void) const
  281. {
  282. return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
  283. }
  284. inline F32 LLVector3::magVecSquared(void) const
  285. {
  286. return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2];
  287. }
  288. inline BOOL LLVector3::inRange( F32 min, F32 max ) const
  289. {
  290. return mV[0] >= min && mV[0] <= max &&
  291.    mV[1] >= min && mV[1] <= max &&
  292.    mV[2] >= min && mV[2] <= max;
  293. }
  294. inline LLVector3 operator+(const LLVector3 &a, const LLVector3 &b)
  295. {
  296. LLVector3 c(a);
  297. return c += b;
  298. }
  299. inline LLVector3 operator-(const LLVector3 &a, const LLVector3 &b)
  300. {
  301. LLVector3 c(a);
  302. return c -= b;
  303. }
  304. inline F32  operator*(const LLVector3 &a, const LLVector3 &b)
  305. {
  306. return (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1] + a.mV[2]*b.mV[2]);
  307. }
  308. inline LLVector3 operator%(const LLVector3 &a, const LLVector3 &b)
  309. {
  310. return LLVector3( a.mV[1]*b.mV[2] - b.mV[1]*a.mV[2], a.mV[2]*b.mV[0] - b.mV[2]*a.mV[0], a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1] );
  311. }
  312. inline LLVector3 operator/(const LLVector3 &a, F32 k)
  313. {
  314. F32 t = 1.f / k;
  315. return LLVector3( a.mV[0] * t, a.mV[1] * t, a.mV[2] * t );
  316. }
  317. inline LLVector3 operator*(const LLVector3 &a, F32 k)
  318. {
  319. return LLVector3( a.mV[0] * k, a.mV[1] * k, a.mV[2] * k );
  320. }
  321. inline LLVector3 operator*(F32 k, const LLVector3 &a)
  322. {
  323. return LLVector3( a.mV[0] * k, a.mV[1] * k, a.mV[2] * k );
  324. }
  325. inline bool operator==(const LLVector3 &a, const LLVector3 &b)
  326. {
  327. return (  (a.mV[0] == b.mV[0])
  328. &&(a.mV[1] == b.mV[1])
  329. &&(a.mV[2] == b.mV[2]));
  330. }
  331. inline bool operator!=(const LLVector3 &a, const LLVector3 &b)
  332. {
  333. return (  (a.mV[0] != b.mV[0])
  334. ||(a.mV[1] != b.mV[1])
  335. ||(a.mV[2] != b.mV[2]));
  336. }
  337. inline bool operator<(const LLVector3 &a, const LLVector3 &b)
  338. {
  339. return (a.mV[0] < b.mV[0]
  340. || (a.mV[0] == b.mV[0]
  341. && (a.mV[1] < b.mV[1]
  342. || ((a.mV[1] == b.mV[1])
  343. && a.mV[2] < b.mV[2]))));
  344. }
  345. inline const LLVector3& operator+=(LLVector3 &a, const LLVector3 &b)
  346. {
  347. a.mV[0] += b.mV[0];
  348. a.mV[1] += b.mV[1];
  349. a.mV[2] += b.mV[2];
  350. return a;
  351. }
  352. inline const LLVector3& operator-=(LLVector3 &a, const LLVector3 &b)
  353. {
  354. a.mV[0] -= b.mV[0];
  355. a.mV[1] -= b.mV[1];
  356. a.mV[2] -= b.mV[2];
  357. return a;
  358. }
  359. inline const LLVector3& operator%=(LLVector3 &a, const LLVector3 &b)
  360. {
  361. LLVector3 ret( a.mV[1]*b.mV[2] - b.mV[1]*a.mV[2], a.mV[2]*b.mV[0] - b.mV[2]*a.mV[0], a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1]);
  362. a = ret;
  363. return a;
  364. }
  365. inline const LLVector3& operator*=(LLVector3 &a, F32 k)
  366. {
  367. a.mV[0] *= k;
  368. a.mV[1] *= k;
  369. a.mV[2] *= k;
  370. return a;
  371. }
  372. inline const LLVector3& operator*=(LLVector3 &a, const LLVector3 &b)
  373. {
  374. a.mV[0] *= b.mV[0];
  375. a.mV[1] *= b.mV[1];
  376. a.mV[2] *= b.mV[2];
  377. return a;
  378. }
  379. inline const LLVector3& operator/=(LLVector3 &a, F32 k)
  380. {
  381. F32 t = 1.f / k;
  382. a.mV[0] *= t;
  383. a.mV[1] *= t;
  384. a.mV[2] *= t;
  385. return a;
  386. }
  387. inline LLVector3 operator-(const LLVector3 &a)
  388. {
  389. return LLVector3( -a.mV[0], -a.mV[1], -a.mV[2] );
  390. }
  391. inline F32 dist_vec(const LLVector3 &a, const LLVector3 &b)
  392. {
  393. F32 x = a.mV[0] - b.mV[0];
  394. F32 y = a.mV[1] - b.mV[1];
  395. F32 z = a.mV[2] - b.mV[2];
  396. return fsqrtf( x*x + y*y + z*z );
  397. }
  398. inline F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b)
  399. {
  400. F32 x = a.mV[0] - b.mV[0];
  401. F32 y = a.mV[1] - b.mV[1];
  402. F32 z = a.mV[2] - b.mV[2];
  403. return x*x + y*y + z*z;
  404. }
  405. inline F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b)
  406. {
  407. F32 x = a.mV[0] - b.mV[0];
  408. F32 y = a.mV[1] - b.mV[1];
  409. return x*x + y*y;
  410. }
  411. inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)
  412. {
  413. LLVector3 project_axis = b;
  414. project_axis.normalize();
  415. return project_axis * (a * project_axis);
  416. }
  417. inline LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u)
  418. {
  419. return LLVector3(
  420. a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u,
  421. a.mV[VY] + (b.mV[VY] - a.mV[VY]) * u,
  422. a.mV[VZ] + (b.mV[VZ] - a.mV[VZ]) * u);
  423. }
  424. inline BOOL LLVector3::isNull() const
  425. {
  426. if ( F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ] )
  427. {
  428. return TRUE;
  429. }
  430. return FALSE;
  431. }
  432. inline void update_min_max(LLVector3& min, LLVector3& max, const LLVector3& pos)
  433. {
  434. for (U32 i = 0; i < 3; i++)
  435. {
  436. if (min.mV[i] > pos.mV[i])
  437. {
  438. min.mV[i] = pos.mV[i];
  439. }
  440. if (max.mV[i] < pos.mV[i])
  441. {
  442. max.mV[i] = pos.mV[i];
  443. }
  444. }
  445. }
  446. inline F32 angle_between(const LLVector3& a, const LLVector3& b)
  447. {
  448. LLVector3 an = a;
  449. LLVector3 bn = b;
  450. an.normalize();
  451. bn.normalize();
  452. F32 cosine = an * bn;
  453. F32 angle = (cosine >= 1.0f) ? 0.0f :
  454. (cosine <= -1.0f) ? F_PI :
  455. (F32)acos(cosine);
  456. return angle;
  457. }
  458. inline BOOL are_parallel(const LLVector3 &a, const LLVector3 &b, F32 epsilon)
  459. {
  460. LLVector3 an = a;
  461. LLVector3 bn = b;
  462. an.normalize();
  463. bn.normalize();
  464. F32 dot = an * bn;
  465. if ( (1.0f - fabs(dot)) < epsilon)
  466. {
  467. return TRUE;
  468. }
  469. return FALSE;
  470. }
  471. inline std::ostream& operator<<(std::ostream& s, const LLVector3 &a) 
  472. {
  473. s << "{ " << a.mV[VX] << ", " << a.mV[VY] << ", " << a.mV[VZ] << " }";
  474. return s;
  475. }
  476. #endif