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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file v4math.h
  3.  * @brief LLVector4 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_V4MATH_H
  33. #define LL_V4MATH_H
  34. #include "llerror.h"
  35. #include "llmath.h"
  36. #include "v3math.h"
  37. class LLMatrix3;
  38. class LLMatrix4;
  39. class LLQuaternion;
  40. //  LLVector4 = |x y z w|
  41. static const U32 LENGTHOFVECTOR4 = 4;
  42. class LLVector4
  43. {
  44. public:
  45. F32 mV[LENGTHOFVECTOR4];
  46. LLVector4(); // Initializes LLVector4 to (0, 0, 0, 1)
  47. explicit LLVector4(const F32 *vec); // Initializes LLVector4 to (vec[0]. vec[1], vec[2], vec[3])
  48. explicit LLVector4(const F64 *vec); // Initialized LLVector4 to ((F32) vec[0], (F32) vec[1], (F32) vec[3], (F32) vec[4]);
  49. explicit LLVector4(const LLVector3 &vec); // Initializes LLVector4 to (vec, 1)
  50. explicit LLVector4(const LLVector3 &vec, F32 w); // Initializes LLVector4 to (vec, w)
  51. LLVector4(F32 x, F32 y, F32 z); // Initializes LLVector4 to (x. y, z, 1)
  52. LLVector4(F32 x, F32 y, F32 z, F32 w);
  53. LLSD getValue() const
  54. {
  55. LLSD ret;
  56. ret[0] = mV[0];
  57. ret[1] = mV[1];
  58. ret[2] = mV[2];
  59. ret[3] = mV[3];
  60. return ret;
  61. }
  62. inline BOOL isFinite() const; // checks to see if all values of LLVector3 are finite
  63. inline void clear(); // Clears LLVector4 to (0, 0, 0, 1)
  64. inline void clearVec(); // deprecated
  65. inline void zeroVec(); // deprecated
  66. inline void set(F32 x, F32 y, F32 z); // Sets LLVector4 to (x, y, z, 1)
  67. inline void set(F32 x, F32 y, F32 z, F32 w); // Sets LLVector4 to (x, y, z, w)
  68. inline void set(const LLVector4 &vec); // Sets LLVector4 to vec
  69. inline void set(const LLVector3 &vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec
  70. inline void set(const F32 *vec); // Sets LLVector4 to vec
  71. inline void setVec(F32 x, F32 y, F32 z); // deprecated
  72. inline void setVec(F32 x, F32 y, F32 z, F32 w); // deprecated
  73. inline void setVec(const LLVector4 &vec); // deprecated
  74. inline void setVec(const LLVector3 &vec, F32 w = 1.f); // deprecated
  75. inline void setVec(const F32 *vec); // deprecated
  76. F32 length() const; // Returns magnitude of LLVector4
  77. F32 lengthSquared() const; // Returns magnitude squared of LLVector4
  78. F32 normalize(); // Normalizes and returns the magnitude of LLVector4
  79. F32 magVec() const; // deprecated
  80. F32 magVecSquared() const; // deprecated
  81. F32 normVec(); // deprecated
  82. // Sets all values to absolute value of their original values
  83. // Returns TRUE if data changed
  84. BOOL abs();
  85. BOOL isExactlyClear() const { return (mV[VW] == 1.0f) && !mV[VX] && !mV[VY] && !mV[VZ]; }
  86. BOOL isExactlyZero() const { return !mV[VW] && !mV[VX] && !mV[VY] && !mV[VZ]; }
  87. const LLVector4& rotVec(F32 angle, const LLVector4 &vec); // Rotates about vec by angle radians
  88. const LLVector4& rotVec(F32 angle, F32 x, F32 y, F32 z); // Rotates about x,y,z by angle radians
  89. const LLVector4& rotVec(const LLMatrix4 &mat); // Rotates by MAT4 mat
  90. const LLVector4& rotVec(const LLQuaternion &q); // Rotates by QUAT q
  91. const LLVector4& scaleVec(const LLVector4& vec); // Scales component-wise by vec
  92. F32 operator[](int idx) const { return mV[idx]; }
  93. F32 &operator[](int idx) { return mV[idx]; }
  94. friend std::ostream&  operator<<(std::ostream& s, const LLVector4 &a); // Print a
  95. friend LLVector4 operator+(const LLVector4 &a, const LLVector4 &b); // Return vector a + b
  96. friend LLVector4 operator-(const LLVector4 &a, const LLVector4 &b); // Return vector a minus b
  97. friend F32  operator*(const LLVector4 &a, const LLVector4 &b); // Return a dot b
  98. friend LLVector4 operator%(const LLVector4 &a, const LLVector4 &b); // Return a cross b
  99. friend LLVector4 operator/(const LLVector4 &a, F32 k); // Return a divided by scaler k
  100. friend LLVector4 operator*(const LLVector4 &a, F32 k); // Return a times scaler k
  101. friend LLVector4 operator*(F32 k, const LLVector4 &a); // Return a times scaler k
  102. friend bool operator==(const LLVector4 &a, const LLVector4 &b); // Return a == b
  103. friend bool operator!=(const LLVector4 &a, const LLVector4 &b); // Return a != b
  104. friend const LLVector4& operator+=(LLVector4 &a, const LLVector4 &b); // Return vector a + b
  105. friend const LLVector4& operator-=(LLVector4 &a, const LLVector4 &b); // Return vector a minus b
  106. friend const LLVector4& operator%=(LLVector4 &a, const LLVector4 &b); // Return a cross b
  107. friend const LLVector4& operator*=(LLVector4 &a, F32 k); // Return a times scaler k
  108. friend const LLVector4& operator/=(LLVector4 &a, F32 k); // Return a divided by scaler k
  109. friend LLVector4 operator-(const LLVector4 &a); // Return vector -a
  110. };
  111. // Non-member functions 
  112. F32 angle_between(const LLVector4 &a, const LLVector4 &b); // Returns angle (radians) between a and b
  113. BOOL are_parallel(const LLVector4 &a, const LLVector4 &b, F32 epsilon=F_APPROXIMATELY_ZERO); // Returns TRUE if a and b are very close to parallel
  114. F32 dist_vec(const LLVector4 &a, const LLVector4 &b); // Returns distance between a and b
  115. F32 dist_vec_squared(const LLVector4 &a, const LLVector4 &b); // Returns distance squared between a and b
  116. LLVector3 vec4to3(const LLVector4 &vec);
  117. LLVector4 vec3to4(const LLVector3 &vec);
  118. LLVector4 lerp(const LLVector4 &a, const LLVector4 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
  119. // Constructors
  120. inline LLVector4::LLVector4(void)
  121. {
  122. mV[VX] = 0.f;
  123. mV[VY] = 0.f;
  124. mV[VZ] = 0.f;
  125. mV[VW] = 1.f;
  126. }
  127. inline LLVector4::LLVector4(F32 x, F32 y, F32 z)
  128. {
  129. mV[VX] = x;
  130. mV[VY] = y;
  131. mV[VZ] = z;
  132. mV[VW] = 1.f;
  133. }
  134. inline LLVector4::LLVector4(F32 x, F32 y, F32 z, F32 w)
  135. {
  136. mV[VX] = x;
  137. mV[VY] = y;
  138. mV[VZ] = z;
  139. mV[VW] = w;
  140. }
  141. inline LLVector4::LLVector4(const F32 *vec)
  142. {
  143. mV[VX] = vec[VX];
  144. mV[VY] = vec[VY];
  145. mV[VZ] = vec[VZ];
  146. mV[VW] = vec[VW];
  147. }
  148. inline LLVector4::LLVector4(const F64 *vec)
  149. {
  150. mV[VX] = (F32) vec[VX];
  151. mV[VY] = (F32) vec[VY];
  152. mV[VZ] = (F32) vec[VZ];
  153. mV[VW] = (F32) vec[VW];
  154. }
  155. inline LLVector4::LLVector4(const LLVector3 &vec)
  156. {
  157. mV[VX] = vec.mV[VX];
  158. mV[VY] = vec.mV[VY];
  159. mV[VZ] = vec.mV[VZ];
  160. mV[VW] = 1.f;
  161. }
  162. inline LLVector4::LLVector4(const LLVector3 &vec, F32 w)
  163. {
  164. mV[VX] = vec.mV[VX];
  165. mV[VY] = vec.mV[VY];
  166. mV[VZ] = vec.mV[VZ];
  167. mV[VW] = w;
  168. }
  169. inline BOOL LLVector4::isFinite() const
  170. {
  171. return (llfinite(mV[VX]) && llfinite(mV[VY]) && llfinite(mV[VZ]) && llfinite(mV[VW]));
  172. }
  173. // Clear and Assignment Functions
  174. inline void LLVector4::clear(void)
  175. {
  176. mV[VX] = 0.f;
  177. mV[VY] = 0.f;
  178. mV[VZ] = 0.f;
  179. mV[VW] = 1.f;
  180. }
  181. // deprecated
  182. inline void LLVector4::clearVec(void)
  183. {
  184. mV[VX] = 0.f;
  185. mV[VY] = 0.f;
  186. mV[VZ] = 0.f;
  187. mV[VW] = 1.f;
  188. }
  189. // deprecated
  190. inline void LLVector4::zeroVec(void)
  191. {
  192. mV[VX] = 0.f;
  193. mV[VY] = 0.f;
  194. mV[VZ] = 0.f;
  195. mV[VW] = 0.f;
  196. }
  197. inline void LLVector4::set(F32 x, F32 y, F32 z)
  198. {
  199. mV[VX] = x;
  200. mV[VY] = y;
  201. mV[VZ] = z;
  202. mV[VW] = 1.f;
  203. }
  204. inline void LLVector4::set(F32 x, F32 y, F32 z, F32 w)
  205. {
  206. mV[VX] = x;
  207. mV[VY] = y;
  208. mV[VZ] = z;
  209. mV[VW] = w;
  210. }
  211. inline void LLVector4::set(const LLVector4 &vec)
  212. {
  213. mV[VX] = vec.mV[VX];
  214. mV[VY] = vec.mV[VY];
  215. mV[VZ] = vec.mV[VZ];
  216. mV[VW] = vec.mV[VW];
  217. }
  218. inline void LLVector4::set(const LLVector3 &vec, F32 w)
  219. {
  220. mV[VX] = vec.mV[VX];
  221. mV[VY] = vec.mV[VY];
  222. mV[VZ] = vec.mV[VZ];
  223. mV[VW] = w;
  224. }
  225. inline void LLVector4::set(const F32 *vec)
  226. {
  227. mV[VX] = vec[VX];
  228. mV[VY] = vec[VY];
  229. mV[VZ] = vec[VZ];
  230. mV[VW] = vec[VW];
  231. }
  232. // deprecated
  233. inline void LLVector4::setVec(F32 x, F32 y, F32 z)
  234. {
  235. mV[VX] = x;
  236. mV[VY] = y;
  237. mV[VZ] = z;
  238. mV[VW] = 1.f;
  239. }
  240. // deprecated
  241. inline void LLVector4::setVec(F32 x, F32 y, F32 z, F32 w)
  242. {
  243. mV[VX] = x;
  244. mV[VY] = y;
  245. mV[VZ] = z;
  246. mV[VW] = w;
  247. }
  248. // deprecated
  249. inline void LLVector4::setVec(const LLVector4 &vec)
  250. {
  251. mV[VX] = vec.mV[VX];
  252. mV[VY] = vec.mV[VY];
  253. mV[VZ] = vec.mV[VZ];
  254. mV[VW] = vec.mV[VW];
  255. }
  256. // deprecated
  257. inline void LLVector4::setVec(const LLVector3 &vec, F32 w)
  258. {
  259. mV[VX] = vec.mV[VX];
  260. mV[VY] = vec.mV[VY];
  261. mV[VZ] = vec.mV[VZ];
  262. mV[VW] = w;
  263. }
  264. // deprecated
  265. inline void LLVector4::setVec(const F32 *vec)
  266. {
  267. mV[VX] = vec[VX];
  268. mV[VY] = vec[VY];
  269. mV[VZ] = vec[VZ];
  270. mV[VW] = vec[VW];
  271. }
  272. // LLVector4 Magnitude and Normalization Functions
  273. inline F32 LLVector4::length(void) const
  274. {
  275. return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
  276. }
  277. inline F32 LLVector4::lengthSquared(void) const
  278. {
  279. return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
  280. }
  281. inline F32 LLVector4::magVec(void) const
  282. {
  283. return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
  284. }
  285. inline F32 LLVector4::magVecSquared(void) const
  286. {
  287. return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
  288. }
  289. // LLVector4 Operators
  290. inline LLVector4 operator+(const LLVector4 &a, const LLVector4 &b)
  291. {
  292. LLVector4 c(a);
  293. return c += b;
  294. }
  295. inline LLVector4 operator-(const LLVector4 &a, const LLVector4 &b)
  296. {
  297. LLVector4 c(a);
  298. return c -= b;
  299. }
  300. inline F32  operator*(const LLVector4 &a, const LLVector4 &b)
  301. {
  302. return (a.mV[VX]*b.mV[VX] + a.mV[VY]*b.mV[VY] + a.mV[VZ]*b.mV[VZ]);
  303. }
  304. inline LLVector4 operator%(const LLVector4 &a, const LLVector4 &b)
  305. {
  306. return LLVector4(a.mV[VY]*b.mV[VZ] - b.mV[VY]*a.mV[VZ], a.mV[VZ]*b.mV[VX] - b.mV[VZ]*a.mV[VX], a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY]);
  307. }
  308. inline LLVector4 operator/(const LLVector4 &a, F32 k)
  309. {
  310. F32 t = 1.f / k;
  311. return LLVector4( a.mV[VX] * t, a.mV[VY] * t, a.mV[VZ] * t );
  312. }
  313. inline LLVector4 operator*(const LLVector4 &a, F32 k)
  314. {
  315. return LLVector4( a.mV[VX] * k, a.mV[VY] * k, a.mV[VZ] * k );
  316. }
  317. inline LLVector4 operator*(F32 k, const LLVector4 &a)
  318. {
  319. return LLVector4( a.mV[VX] * k, a.mV[VY] * k, a.mV[VZ] * k );
  320. }
  321. inline bool operator==(const LLVector4 &a, const LLVector4 &b)
  322. {
  323. return (  (a.mV[VX] == b.mV[VX])
  324. &&(a.mV[VY] == b.mV[VY])
  325. &&(a.mV[VZ] == b.mV[VZ]));
  326. }
  327. inline bool operator!=(const LLVector4 &a, const LLVector4 &b)
  328. {
  329. return (  (a.mV[VX] != b.mV[VX])
  330. ||(a.mV[VY] != b.mV[VY])
  331. ||(a.mV[VZ] != b.mV[VZ])
  332. ||(a.mV[VW] != b.mV[VW]) );
  333. }
  334. inline const LLVector4& operator+=(LLVector4 &a, const LLVector4 &b)
  335. {
  336. a.mV[VX] += b.mV[VX];
  337. a.mV[VY] += b.mV[VY];
  338. a.mV[VZ] += b.mV[VZ];
  339. return a;
  340. }
  341. inline const LLVector4& operator-=(LLVector4 &a, const LLVector4 &b)
  342. {
  343. a.mV[VX] -= b.mV[VX];
  344. a.mV[VY] -= b.mV[VY];
  345. a.mV[VZ] -= b.mV[VZ];
  346. return a;
  347. }
  348. inline const LLVector4& operator%=(LLVector4 &a, const LLVector4 &b)
  349. {
  350. LLVector4 ret(a.mV[VY]*b.mV[VZ] - b.mV[VY]*a.mV[VZ], a.mV[VZ]*b.mV[VX] - b.mV[VZ]*a.mV[VX], a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY]);
  351. a = ret;
  352. return a;
  353. }
  354. inline const LLVector4& operator*=(LLVector4 &a, F32 k)
  355. {
  356. a.mV[VX] *= k;
  357. a.mV[VY] *= k;
  358. a.mV[VZ] *= k;
  359. return a;
  360. }
  361. inline const LLVector4& operator/=(LLVector4 &a, F32 k)
  362. {
  363. F32 t = 1.f / k;
  364. a.mV[VX] *= t;
  365. a.mV[VY] *= t;
  366. a.mV[VZ] *= t;
  367. return a;
  368. }
  369. inline LLVector4 operator-(const LLVector4 &a)
  370. {
  371. return LLVector4( -a.mV[VX], -a.mV[VY], -a.mV[VZ] );
  372. }
  373. inline F32 dist_vec(const LLVector4 &a, const LLVector4 &b)
  374. {
  375. LLVector4 vec = a - b;
  376. return (vec.length());
  377. }
  378. inline F32 dist_vec_squared(const LLVector4 &a, const LLVector4 &b)
  379. {
  380. LLVector4 vec = a - b;
  381. return (vec.lengthSquared());
  382. }
  383. inline LLVector4 lerp(const LLVector4 &a, const LLVector4 &b, F32 u)
  384. {
  385. return LLVector4(
  386. a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u,
  387. a.mV[VY] + (b.mV[VY] - a.mV[VY]) * u,
  388. a.mV[VZ] + (b.mV[VZ] - a.mV[VZ]) * u,
  389. a.mV[VW] + (b.mV[VW] - a.mV[VW]) * u);
  390. }
  391. inline F32 LLVector4::normalize(void)
  392. {
  393. F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
  394. F32 oomag;
  395. if (mag > FP_MAG_THRESHOLD)
  396. {
  397. oomag = 1.f/mag;
  398. mV[VX] *= oomag;
  399. mV[VY] *= oomag;
  400. mV[VZ] *= oomag;
  401. }
  402. else
  403. {
  404. mV[0] = 0.f;
  405. mV[1] = 0.f;
  406. mV[2] = 0.f;
  407. mag = 0;
  408. }
  409. return (mag);
  410. }
  411. // deprecated
  412. inline F32 LLVector4::normVec(void)
  413. {
  414. F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
  415. F32 oomag;
  416. if (mag > FP_MAG_THRESHOLD)
  417. {
  418. oomag = 1.f/mag;
  419. mV[VX] *= oomag;
  420. mV[VY] *= oomag;
  421. mV[VZ] *= oomag;
  422. }
  423. else
  424. {
  425. mV[0] = 0.f;
  426. mV[1] = 0.f;
  427. mV[2] = 0.f;
  428. mag = 0;
  429. }
  430. return (mag);
  431. }
  432. #endif