vector4.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. /*
  2. ** Command & Conquer Generals(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /* $Header: /Commando/Code/wwmath/vector4.h 12 12/14/99 11:08a Greg_h $ */
  19. /***************************************************************************
  20. *** Confidential - Westwood Studios ***
  21. ***************************************************************************
  22. * *
  23. * Project Name : Westwood 3D *
  24. * *
  25. * File Name : VECTOR4.H *
  26. * *
  27. * Programmer : Greg Hjelstrom *
  28. * *
  29. * Start Date : 02/24/97 *
  30. * *
  31. * Last Update : June 2, 1997 [GH] *
  32. * *
  33. *-------------------------------------------------------------------------*
  34. * Functions: *
  35. * Scalar Division Operator -- Divide a vector by a scalar *
  36. * Scalar Multiply Operator -- Multiply a vector by a scalar *
  37. * Vector Addition Operator -- Add two vectors *
  38. * Vector Subtraction Operator -- Subract two vectors *
  39. * Vector Inner Product Operator -- Compute the inner or dot product *
  40. * Vector Equality Operator -- Detemine if two vectors are identical *
  41. * Vector Inequality Operator -- Detemine if two vectors are identical *
  42. * Swap -- swap two Vector4's *
  43. * Vector4::Is_Valid -- Vector4::Is_Valid *
  44. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  45. #if defined(_MSC_VER)
  46. #pragma once
  47. #endif
  48. #ifndef VECTOR4_H
  49. #define VECTOR4_H
  50. #include "always.h"
  51. #include "wwmath.h"
  52. #include <math.h>
  53. /*
  54. ** Vector4 - 4 dimensional vectors
  55. */
  56. class Vector4
  57. {
  58. public:
  59. float X;
  60. float Y;
  61. float Z;
  62. float W;
  63. // Constructors
  64. Vector4(void) {};
  65. Vector4(const Vector4 & v) { X = v.X; Y = v.Y; Z = v.Z; W = v.W; }
  66. Vector4(float x, float y, float z, float w) { X = x; Y = y; Z = z; W = w; }
  67. Vector4(const float vector[4]) { X = vector[0]; Y = vector[1]; Z = vector[2]; W = vector[3]; }
  68. // Assignment
  69. Vector4 & operator = (const Vector4 & v) { X = v.X; Y = v.Y; Z = v.Z; W = v.W; return *this; }
  70. void Set(float x, float y, float z, float w) { X = x; Y = y; Z = z; W = w; }
  71. // Array access
  72. float & operator [](int i) { return (&X)[i]; }
  73. const float & operator [](int i) const { return (&X)[i]; }
  74. // normalize, compute length
  75. void Normalize(void);
  76. float Length(void) const;
  77. float Length2(void) const;
  78. // unary operators
  79. Vector4 operator-() const { return(Vector4(-X,-Y,-Z,-W)); }
  80. Vector4 operator+() const { return *this; }
  81. Vector4 & operator += (const Vector4 & v) { X += v.X; Y += v.Y; Z += v.Z; W += v.W; return *this; }
  82. Vector4 & operator -= (const Vector4 & v) { X -= v.X; Y -= v.Y; Z -= v.Z; W += v.W; return *this; }
  83. Vector4 & operator *= (float k) { X = X*k; Y=Y*k; Z=Z*k; W=W*k; return *this; }
  84. Vector4 & operator /= (float k) { k=1.0f/k; X = X*k; Y=Y*k; Z=Z*k; W=W*k; return *this; }
  85. // scalar multiplication, division
  86. friend Vector4 operator * (const Vector4 &a,float k);
  87. friend Vector4 operator * (float k,const Vector4 &a);
  88. friend Vector4 operator / (const Vector4 &a,float k);
  89. // vector addition,subtraction
  90. friend Vector4 operator + (const Vector4 &a,const Vector4 &b);
  91. friend Vector4 operator - (const Vector4 &a,const Vector4 &b);
  92. // dot product / inner product
  93. friend float operator * (const Vector4 &a,const Vector4 &b);
  94. static float Dot_Product(const Vector4 &a,const Vector4 &b);
  95. // Equality operators
  96. friend bool operator == (const Vector4 &a,const Vector4 &b);
  97. friend bool operator != (const Vector4 &a,const Vector4 &b);
  98. // verify that none of the members of this vector are invalid floats
  99. bool Is_Valid(void) const;
  100. };
  101. /**************************************************************************
  102. * Scalar Multiply Operator -- Multiply a vector by a scalar *
  103. * *
  104. * INPUT: *
  105. * *
  106. * OUTPUT: *
  107. * *
  108. * WARNINGS: *
  109. * *
  110. * HISTORY: *
  111. * 02/24/1997 GH : Created. *
  112. *========================================================================*/
  113. inline Vector4 operator * (const Vector4 &a,float k)
  114. {
  115. return Vector4((a.X * k),(a.Y * k),(a.Z * k),(a.W * k));
  116. }
  117. inline Vector4 operator * (float k, const Vector4 &a)
  118. {
  119. return a*k;
  120. }
  121. /**************************************************************************
  122. * Scalar Division Operator -- Divide a vector by a scalar *
  123. * *
  124. * INPUT: *
  125. * *
  126. * OUTPUT: *
  127. * *
  128. * WARNINGS: *
  129. * *
  130. * HISTORY: *
  131. *========================================================================*/
  132. inline Vector4 operator / (const Vector4 &a,float k)
  133. {
  134. float ook=1.0f/k;
  135. return Vector4((a[0] * ook),(a[1] * ook),(a[2] * ook),(a[3] * ook));
  136. }
  137. /**************************************************************************
  138. * Vector Addition Operator -- Add two vectors *
  139. * *
  140. * INPUT: *
  141. * *
  142. * OUTPUT: *
  143. * *
  144. * WARNINGS: *
  145. * *
  146. * HISTORY: *
  147. * 02/24/1997 GH : Created. *
  148. *========================================================================*/
  149. inline Vector4 operator + (const Vector4 &a,const Vector4 &b)
  150. {
  151. return Vector4(
  152. a[0]+b[0],
  153. a[1]+b[1],
  154. a[2]+b[2],
  155. a[3]+b[3]
  156. );
  157. }
  158. /**************************************************************************
  159. * Vector Subtraction Operator -- Subract two vectors *
  160. * *
  161. * INPUT: *
  162. * *
  163. * OUTPUT: *
  164. * *
  165. * WARNINGS: *
  166. * *
  167. * HISTORY: *
  168. * 02/24/1997 GH : Created. *
  169. *========================================================================*/
  170. inline Vector4 operator - (const Vector4 &a,const Vector4 &b)
  171. {
  172. return Vector4(
  173. a[0]-b[0],
  174. a[1]-b[1],
  175. a[2]-b[2],
  176. a[3]-b[3]
  177. );
  178. }
  179. /**************************************************************************
  180. * Vector Inner Product -- Compute the inner or dot product of two vector *
  181. * *
  182. * INPUT: *
  183. * *
  184. * OUTPUT: *
  185. * *
  186. * WARNINGS: *
  187. * *
  188. * HISTORY: *
  189. *========================================================================*/
  190. inline float operator * (const Vector4 &a,const Vector4 &b)
  191. {
  192. return a[0]*b[0] +
  193. a[1]*b[1] +
  194. a[2]*b[2] +
  195. a[3]*b[3];
  196. }
  197. inline float Vector4::Dot_Product(const Vector4 &a,const Vector4 &b)
  198. {
  199. return a*b;
  200. }
  201. /**************************************************************************
  202. * Vector Equality Operator -- Detemine if two vectors are identical *
  203. * *
  204. * INPUT: *
  205. * *
  206. * OUTPUT: *
  207. * *
  208. * WARNINGS: *
  209. * *
  210. * HISTORY: *
  211. *========================================================================*/
  212. inline bool operator == (const Vector4 &a,const Vector4 &b)
  213. {
  214. return ( (a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]) && (a[3] == b[3]));
  215. }
  216. /**************************************************************************
  217. * Vector Inequality Operator -- Detemine if two vectors are identical *
  218. * *
  219. * INPUT: *
  220. * *
  221. * OUTPUT: *
  222. * *
  223. * WARNINGS: *
  224. * *
  225. * HISTORY: *
  226. *========================================================================*/
  227. inline bool operator != (const Vector4 &a,const Vector4 &b)
  228. {
  229. return ( (a[0] != b[0]) || (a[1] != b[1]) || (a[2] != b[2]) || (a[3] != b[3]));
  230. }
  231. /**************************************************************************
  232. * Vector4::Normalize -- Normalizes the vector. *
  233. * *
  234. * INPUT: *
  235. * *
  236. * OUTPUT: *
  237. * *
  238. * WARNINGS: *
  239. * *
  240. * HISTORY: *
  241. *========================================================================*/
  242. inline void Vector4::Normalize()
  243. {
  244. float len2 = Length2();
  245. if (len2 != 0.0f) {
  246. float oolen = WWMath::Inv_Sqrt(len2);
  247. X *= oolen;
  248. Y *= oolen;
  249. Z *= oolen;
  250. W *= oolen;
  251. }
  252. }
  253. inline Vector4 Normalize(const Vector4 & vec)
  254. {
  255. float len2 = vec.Length2();
  256. if (len2 != 0.0f) {
  257. float oolen = WWMath::Inv_Sqrt(len2);
  258. return vec * oolen;
  259. }
  260. }
  261. /**************************************************************************
  262. * Vector4::Length -- Returns the length of the vector *
  263. * *
  264. * INPUT: *
  265. * *
  266. * OUTPUT: *
  267. * *
  268. * WARNINGS: *
  269. * *
  270. * HISTORY: *
  271. *========================================================================*/
  272. inline float Vector4::Length() const
  273. {
  274. return WWMath::Sqrt(Length2());
  275. }
  276. /**************************************************************************
  277. * Vector4::Length -- Returns the square of the length of the vector *
  278. * *
  279. * INPUT: *
  280. * *
  281. * OUTPUT: *
  282. * *
  283. * WARNINGS: *
  284. * *
  285. * HISTORY: *
  286. *========================================================================*/
  287. inline float Vector4::Length2() const
  288. {
  289. return X*X + Y*Y + Z*Z + W*W;
  290. }
  291. /***********************************************************************************************
  292. * Swap -- swap two Vector4's *
  293. * *
  294. * INPUT: *
  295. * *
  296. * OUTPUT: *
  297. * *
  298. * WARNINGS: *
  299. * *
  300. * HISTORY: *
  301. * 06/02/1997 GH : Created. *
  302. *=============================================================================================*/
  303. inline void Swap(Vector4 & a,Vector4 & b)
  304. {
  305. Vector4 tmp(a);
  306. a = b;
  307. b = tmp;
  308. }
  309. /***********************************************************************************************
  310. * Lerp -- linearly interpolate two Vector4's by an interpolation factor. *
  311. * *
  312. * INPUT: *
  313. * *
  314. * OUTPUT: *
  315. * *
  316. * WARNINGS: No checking is done to ensure that alpha is between 0 and 1. *
  317. * *
  318. * HISTORY: *
  319. * 01/14/1999 NH : Created. *
  320. *=============================================================================================*/
  321. inline Vector4 Lerp(const Vector4 & a, const Vector4 & b, float alpha)
  322. {
  323. return Vector4(
  324. (a.X + (b.X - a.X)*alpha),
  325. (a.Y + (b.Y - a.Y)*alpha),
  326. (a.Z + (b.Z - a.Z)*alpha),
  327. (a.W + (b.W - a.W)*alpha)
  328. );
  329. }
  330. /***********************************************************************************************
  331. * Vector4::Is_Valid -- Vector4::Is_Valid *
  332. * *
  333. * verifies that all members of this vector are valid floats *
  334. * *
  335. * *
  336. * INPUT: *
  337. * *
  338. * OUTPUT: *
  339. * *
  340. * WARNINGS: *
  341. * *
  342. * HISTORY: *
  343. * 10/18/99 gth : Created. *
  344. *=============================================================================================*/
  345. inline bool Vector4::Is_Valid(void) const
  346. {
  347. return (WWMath::Is_Valid_Float(X) && WWMath::Is_Valid_Float(Y) && WWMath::Is_Valid_Float(Z) && WWMath::Is_Valid_Float(W));
  348. }
  349. #endif /* VECTOR4_H */