Vector.h 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #ifndef CORE_VECTOR_H
  2. #define CORE_VECTOR_H
  3. #include "core/Types.h"
  4. #define VECTOR_OP2(name) name *r, const name *a
  5. #define VECTOR_OP3(name) VECTOR_OP2(name), const name* b
  6. #define VECTOR_ARG_Z2(type)
  7. #define VECTOR_ARG_Z3(type) type z;
  8. #define VECTOR_ARG_Z4(type) type z;
  9. #define VECTOR_ARG_W2(type)
  10. #define VECTOR_ARG_W3(type)
  11. #define VECTOR_ARG_W4(type) type w;
  12. #define DEFINE_VECTOR(N, name, sname, type) \
  13. typedef union { \
  14. type data[N]; \
  15. struct { \
  16. type x; \
  17. type y; \
  18. VECTOR_ARG_Z##N(type) VECTOR_ARG_W##N(type) \
  19. }; \
  20. } name; \
  21. name* addSet##sname(VECTOR_OP2(name)); \
  22. name* add##sname(VECTOR_OP3(name)); \
  23. name* subSet##sname(VECTOR_OP2(name)); \
  24. name* sub##sname(VECTOR_OP3(name)); \
  25. name* mulSet##sname(VECTOR_OP2(name)); \
  26. name* mul##sname(VECTOR_OP3(name)); \
  27. name* divSet##sname(VECTOR_OP2(name)); \
  28. name* div##sname(VECTOR_OP3(name)); \
  29. name* mulSet##sname##F(name* r, type f); \
  30. name* mul##sname##F(name* r, const name* a, type f); \
  31. name* divSet##sname##F(name* r, type f); \
  32. name* div##sname##F(name* r, const name* a, type f); \
  33. name* invertSet##sname(name* r); \
  34. name* invert##sname(name* r, const name* a); \
  35. size_t toString##sname(const name* a, char* buffer, size_t n);
  36. #define DEFINE_FVECTOR(N, name) \
  37. float dotV##N(const name* a, const name* b); \
  38. float squareLengthV##N(const name* a); \
  39. float lengthV##N(const name* a); \
  40. name* normalizeV##N(name* r);
  41. DEFINE_VECTOR(2, Vector2, V2, float)
  42. DEFINE_VECTOR(3, Vector3, V3, float)
  43. DEFINE_VECTOR(4, Vector4, V4, float)
  44. DEFINE_FVECTOR(2, Vector2)
  45. DEFINE_FVECTOR(3, Vector3)
  46. DEFINE_FVECTOR(4, Vector4)
  47. DEFINE_VECTOR(2, IntVector2, IV2, int)
  48. DEFINE_VECTOR(3, IntVector3, IV3, int)
  49. DEFINE_VECTOR(4, IntVector4, IV4, int)
  50. Vector3* angles(Vector3* r, float lengthAngle, float widthAngle);
  51. Vector3* cross(VECTOR_OP3(Vector3));
  52. #define DEFINE_VECTOR_CONVERSION(a, nameA, b, nameB) \
  53. a* convert##nameB(a* r, const b* c); \
  54. b* convert##nameA(b* r, const a* c)
  55. DEFINE_VECTOR_CONVERSION(Vector2, V2, IntVector2, IV2);
  56. DEFINE_VECTOR_CONVERSION(Vector3, V3, IntVector3, IV3);
  57. DEFINE_VECTOR_CONVERSION(Vector4, V4, IntVector4, IV4);
  58. #define VECTOR2 ((Vector2){0})
  59. #define VECTOR3 ((Vector3){0})
  60. #define VECTOR4 ((Vector4){0})
  61. #define INT_VECTOR2 ((IntVector2){0})
  62. #define INT_VECTOR3 ((IntVector3){0})
  63. #define INT_VECTOR4 ((IntVector4){0})
  64. #define SELECT_VECTOR(_1, _2, _3, _4, name, ...) name
  65. #define V(...) \
  66. ((SELECT_VECTOR(__VA_ARGS__, Vector4, Vector3, Vector2, 0)){{__VA_ARGS__}})
  67. #define IV(...) \
  68. ((SELECT_VECTOR(__VA_ARGS__, IntVector4, IntVector3, IntVector2, 0)){ \
  69. {__VA_ARGS__}})
  70. #endif