Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.45 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <math.h>
  4.  
  5. #define SMALL_NUMBER (1.e-8f)
  6. #define KINDA_SMALL_NUMBER (1.e-4f)
  7. #define BIG_NUMBER (3.4e+38f)
  8.  
  9. struct VectorCJM
  10. {
  11. public:
  12. float x, y, z;
  13.  
  14. public:
  15.  
  16.  
  17. VectorCJM() : x(0.0f), y(0.0f), z(0.0f) {}
  18. VectorCJM(float inX, float inY, float inZ) : x(inX), y(inY), z(inZ) {}
  19.  
  20. static const VectorCJM ZeroVector;
  21. static const VectorCJM OneVector;
  22. static const VectorCJM UpVector;
  23. static const VectorCJM ForwardVector;
  24. static const VectorCJM RightVector;
  25.  
  26.  
  27. // 벡터 외적
  28. inline VectorCJM operator^(const VectorCJM& v) const
  29. {
  30. return VectorCJM(
  31. y * v.z - z * v.y,
  32. z * v.x - x * v.z,
  33. x * v.y - y * v.x
  34. );
  35. }
  36. inline static VectorCJM Cross(const VectorCJM& a, const VectorCJM& b)
  37. {
  38. return a ^ b;
  39. }
  40.  
  41. // 벡터 내적
  42. inline float operator|(const VectorCJM& v) const
  43. {
  44. return x * v.x + y * v.y + z * v.z;
  45. }
  46. inline static float Dot(const VectorCJM& a, const VectorCJM& b)
  47. {
  48. return a | b;
  49. }
  50.  
  51.  
  52. // 사칙 연산
  53. inline VectorCJM operator+(const VectorCJM& v) const
  54. {
  55. return VectorCJM(x + v.x, y + v.y, z + v.z);
  56. }
  57.  
  58. inline VectorCJM operator-(const VectorCJM& v) const
  59. {
  60. return VectorCJM(x - v.x, y - v.y, z - v.z);
  61. }
  62.  
  63. inline VectorCJM operator*(float scale) const
  64. {
  65. return VectorCJM(x * scale, y * scale, z * scale);
  66. }
  67. inline VectorCJM operator*(const VectorCJM& v) const
  68. {
  69. return VectorCJM(x * v.x, y * v.y, z * v.z);
  70. }
  71.  
  72. inline VectorCJM operator/(float scale) const
  73. {
  74. const float rScale = 1.0f / scale;
  75. return VectorCJM(x * rScale, y * rScale, z * rScale);
  76. }
  77. inline VectorCJM operator/(const VectorCJM& v) const
  78. {
  79. return VectorCJM(x / v.x, y / v.y, z / v.z);
  80. }
  81.  
  82.  
  83. inline bool operator==(const VectorCJM& v) const
  84. {
  85. return x == v.x && y == v.y && z == v.z;
  86. }
  87. inline bool operator!=(const VectorCJM& v) const
  88. {
  89. return x != v.x || y != v.y || z != v.z;
  90. }
  91.  
  92. inline bool Equals(const VectorCJM& v, float tolerance = KINDA_SMALL_NUMBER) const
  93. {
  94. float absX = x - v.x;
  95. float absY = y - v.y;
  96. float absZ = z - v.z;
  97.  
  98. if (absX < 0) absX *= -1.0f;
  99. if (absY < 0) absY *= -1.0f;
  100. if (absZ < 0) absZ *= -1.0f;
  101. return absX <= tolerance && absY <= tolerance && absZ <= tolerance;
  102. }
  103.  
  104. inline VectorCJM operator-() const
  105. {
  106. return VectorCJM(x * -1.0f, y * -1.0f, z * 1.0f);
  107. }
  108.  
  109. inline VectorCJM operator+=(const VectorCJM& v)
  110. {
  111. return VectorCJM(x + v.x, y + v.y, z + v.z);
  112. }
  113.  
  114. inline VectorCJM operator-=(const VectorCJM& v)
  115. {
  116. return VectorCJM(x - v.x, y - v.y, z - v.z);
  117. }
  118.  
  119. inline VectorCJM operator*=(float scale)
  120. {
  121. return VectorCJM(x * scale, y * scale, z * scale);
  122. }
  123.  
  124. inline VectorCJM operator*=(const VectorCJM& v)
  125. {
  126. return VectorCJM(x * v.x, y * v.y, z * v.z);
  127. }
  128.  
  129. inline VectorCJM operator/=(float scale)
  130. {
  131. float rScale = 1.0f / scale;
  132. return VectorCJM(x * rScale, y * rScale, z * rScale);
  133. }
  134.  
  135. inline VectorCJM operator/=(const VectorCJM& v)
  136. {
  137. return VectorCJM(x / v.x, y / v.y, z / v.z);
  138. }
  139.  
  140.  
  141. inline bool IsZero() const
  142. {
  143. return x == 0.0f && y == 0.0f && z == 0.0f;
  144. }
  145.  
  146. inline VectorCJM GetUnsafeNormal() const
  147. {
  148. const float scale = 1.0f / sqrtf(x * x + y * y + z * z);
  149. return VectorCJM(x * scale, y * scale, z * scale);
  150. }
  151.  
  152. inline VectorCJM GetSafeNormal(float tolerance = SMALL_NUMBER) const
  153. {
  154. const float squareSum = x * x + y * y + z * z;
  155.  
  156. if (squareSum == 1.0f)
  157. return *this;
  158. else if (squareSum < tolerance)
  159. return VectorCJM::ZeroVector;
  160. const float scale = 1.0f / sqrtf(squareSum);
  161. return VectorCJM(x*scale, y*scale, z*scale);
  162. }
  163.  
  164.  
  165. inline float Size() const
  166. {
  167. return sqrtf(x * x + y * y + z * z);
  168. }
  169.  
  170. inline float SizeSquared() const
  171. {
  172. return x * x + y * y + z * z;
  173. }
  174.  
  175.  
  176. inline VectorCJM Reciprocal() const
  177. {
  178. VectorCJM recVector;
  179. if (x != 0.0f)
  180. {
  181. recVector.x = 1.0f / x;
  182. }
  183. else
  184. {
  185. recVector.x = BIG_NUMBER;
  186. }
  187. if (y != 0.0f)
  188. {
  189. recVector.y = 1.0f / y;
  190. }
  191. else
  192. {
  193. recVector.y = BIG_NUMBER;
  194. }
  195. if (z != 0.0f)
  196. {
  197. recVector.z = 1.0f / z;
  198. }
  199. else
  200. {
  201. recVector.z = BIG_NUMBER;
  202. }
  203. }
  204.  
  205. inline float DistanceSquared(const VectorCJM& v)
  206. {
  207. float subX = v.x - x;
  208. float subY = v.y - y;
  209. float subZ = v.z - z;
  210.  
  211. return subX * subX + subY * subY + subZ * subZ;
  212. }
  213.  
  214. inline float Distance(const VectorCJM& v)
  215. {
  216. return sqrtf(DistanceSquared(v));
  217. }
  218.  
  219.  
  220.  
  221. };
  222.  
  223. const VectorCJM VectorCJM::ZeroVector(0.0f, 0.0f, 0.0f);
  224. const VectorCJM VectorCJM::OneVector(0.0f, 0.0f, 0.0f);
  225. const VectorCJM VectorCJM::UpVector(0.0f, 0.0f, 0.0f);
  226. const VectorCJM VectorCJM::ForwardVector(0.0f, 0.0f, 0.0f);
  227. const VectorCJM VectorCJM::RightVector(0.0f, 0.0f, 0.0f);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement