Vector.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "core/Vector.h"
  2. #include <math.h>
  3. #include "core/ToString.h"
  4. typedef Vector2 V2;
  5. typedef Vector3 V3;
  6. typedef Vector4 V4;
  7. typedef IntVector2 IV2;
  8. typedef IntVector3 IV3;
  9. typedef IntVector4 IV4;
  10. V3* angles(V3* r, float lengthAngle, float widthAngle) {
  11. float sWidth = sinf(widthAngle);
  12. float cWidth = cosf(widthAngle);
  13. float sLength = sinf(lengthAngle);
  14. float cLength = cosf(lengthAngle);
  15. r->x = cWidth * cLength;
  16. r->y = sWidth;
  17. r->z = -sLength * cWidth;
  18. return r;
  19. }
  20. V3* cross(V3* r, const V3* a, const V3* b) {
  21. r->x = a->y * b->z - a->z * b->y;
  22. r->y = a->z * b->x - a->x * b->z;
  23. r->z = a->x * b->y - a->y * b->x;
  24. return r;
  25. }
  26. #define ADD_OP(i) r->data[i] = a->data[i] + b->data[i]
  27. #define SUB_OP(i) r->data[i] = a->data[i] - b->data[i]
  28. #define MUL_OP(i) r->data[i] = a->data[i] * b->data[i]
  29. #define MUL_F_OP(i) r->data[i] = a->data[i] * f
  30. #define DIV_OP(i) r->data[i] = a->data[i] / b->data[i]
  31. #define DIV_F_OP(i) r->data[i] = a->data[i] / f
  32. #define INVERT_OP(i) r->data[i] = -a->data[i];
  33. #define DOT_OP(i) length += a->data[i] * b->data[i];
  34. #define FLOAT_CAST_OP(i) r->data[i] = (float)a->data[i];
  35. #define INT_CAST_OP(i) r->data[i] = (int)a->data[i];
  36. #define DO2(OP) \
  37. OP(0); \
  38. OP(1)
  39. #define DO3(OP) \
  40. DO2(OP); \
  41. OP(2)
  42. #define DO4(OP) \
  43. DO3(OP); \
  44. OP(3)
  45. #define VECTOR_IMPL(T, N, FT) \
  46. T* addSet##T(T* r, const T* a) { \
  47. return add##T(r, r, a); \
  48. } \
  49. \
  50. T* add##T(T* r, const T* a, const T* b) { \
  51. DO##N(ADD_OP); \
  52. return r; \
  53. } \
  54. \
  55. T* subSet##T(T* r, const T* a) { \
  56. return sub##T(r, r, a); \
  57. } \
  58. \
  59. T* sub##T(T* r, const T* a, const T* b) { \
  60. DO##N(SUB_OP); \
  61. return r; \
  62. } \
  63. \
  64. T* mulSet##T(T* r, const T* a) { \
  65. return mul##T(r, r, a); \
  66. } \
  67. \
  68. T* mul##T(T* r, const T* a, const T* b) { \
  69. DO##N(MUL_OP); \
  70. return r; \
  71. } \
  72. \
  73. T* divSet##T(T* r, const T* a) { \
  74. return div##T(r, r, a); \
  75. } \
  76. \
  77. T* div##T(T* r, const T* a, const T* b) { \
  78. DO##N(DIV_OP); \
  79. return r; \
  80. } \
  81. \
  82. T* mulSet##T##F(T* r, FT f) { \
  83. return mul##T##F(r, r, f); \
  84. } \
  85. \
  86. T* mul##T##F(T* r, const T* a, FT f) { \
  87. DO##N(MUL_F_OP); \
  88. return r; \
  89. } \
  90. \
  91. T* divSet##T##F(T* r, FT f) { \
  92. return div##T##F(r, r, f); \
  93. } \
  94. \
  95. T* div##T##F(T* r, const T* a, FT f) { \
  96. DO##N(DIV_F_OP); \
  97. return r; \
  98. } \
  99. \
  100. T* invertSet##T(T* r) { \
  101. return invert##T(r, r); \
  102. } \
  103. \
  104. T* invert##T(T* r, const T* a) { \
  105. DO##N(INVERT_OP); \
  106. return r; \
  107. }
  108. #define VECTOR_IMPL_FLOAT(T, N, CN) \
  109. float dot##T(const T* a, const T* b) { \
  110. float length = 0; \
  111. DO##N(DOT_OP); \
  112. return length; \
  113. } \
  114. \
  115. float squareLength##T(const T* a) { \
  116. return dot##T(a, a); \
  117. } \
  118. \
  119. float length##T(const T* a) { \
  120. return sqrtf(squareLength##T(a)); \
  121. } \
  122. \
  123. T* normalize##T(T* r) { \
  124. return mulSet##T##F(r, 1.0f / length##T(r)); \
  125. } \
  126. \
  127. T* convertI##T(T* r, const CN* a) { \
  128. DO##N(FLOAT_CAST_OP); \
  129. return r; \
  130. } \
  131. \
  132. CN* convert##T(CN* r, const T* a) { \
  133. DO##N(INT_CAST_OP); \
  134. return r; \
  135. }
  136. VECTOR_IMPL(V2, 2, float)
  137. VECTOR_IMPL(V3, 3, float)
  138. VECTOR_IMPL(V4, 4, float)
  139. VECTOR_IMPL(IV2, 2, int)
  140. VECTOR_IMPL(IV3, 3, int)
  141. VECTOR_IMPL(IV4, 4, int)
  142. VECTOR_IMPL_FLOAT(V2, 2, IV2)
  143. VECTOR_IMPL_FLOAT(V3, 3, IV3)
  144. VECTOR_IMPL_FLOAT(V4, 4, IV4)
  145. size_t toStringV2(const V2* a, char* buffer, size_t n) {
  146. return toString(buffer, n, "[%.3f, %.3f]", (double)a->x, (double)a->y);
  147. }
  148. size_t toStringV3(const V3* a, char* buffer, size_t n) {
  149. return toString(
  150. buffer, n, "[%.3f, %.3f, %.3f]", (double)a->x, (double)a->y,
  151. (double)a->z);
  152. }
  153. size_t toStringV4(const V4* a, char* buffer, size_t n) {
  154. return toString(
  155. buffer, n, "[%.3f, %.3f, %.3f, %.3f]", (double)a->x, (double)a->y,
  156. (double)a->z, (double)a->w);
  157. }
  158. size_t toStringIV2(const IV2* a, char* buffer, size_t n) {
  159. return toString(buffer, n, "[%d, %d]", a->x, a->y);
  160. }
  161. size_t toStringIV3(const IV3* a, char* buffer, size_t n) {
  162. return toString(buffer, n, "[%d, %d, %d]", a->x, a->y, a->z);
  163. }
  164. size_t toStringIV4(const IV4* a, char* buffer, size_t n) {
  165. return toString(buffer, n, "[%d, %d, %d, %d]", a->x, a->y, a->z, a->w);
  166. }