Generic.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #ifndef CORE_GENERIC_H
  2. #define CORE_GENERIC_H
  3. #include "core/Matrix.h"
  4. // clang-format off
  5. #define GENERIC_PAIR(type, name) type: name, const type : name
  6. // clang-format on
  7. #define GENERIC_FLOAT_VECTOR(a, name) \
  8. _Generic( \
  9. (a), \
  10. GENERIC_PAIR(Vector2*, name##V2), \
  11. GENERIC_PAIR(Vector3*, name##V3), \
  12. GENERIC_PAIR(Vector4*, name##V4))
  13. #define GENERIC_VECTOR(a, name) \
  14. _Generic( \
  15. (a), \
  16. GENERIC_PAIR(Vector2*, name##V2), \
  17. GENERIC_PAIR(Vector3*, name##V3), \
  18. GENERIC_PAIR(Vector4*, name##V4), \
  19. GENERIC_PAIR(IntVector2*, name##IV2), \
  20. GENERIC_PAIR(IntVector3*, name##IV3), \
  21. GENERIC_PAIR(IntVector4*, name##IV4))
  22. #define ZERO_VECTOR(a) \
  23. _Generic( \
  24. (a), \
  25. GENERIC_PAIR(Matrix*, &(Vector3){0}), \
  26. GENERIC_PAIR(Vector2*, &(Vector2){0}), \
  27. GENERIC_PAIR(Vector3*, &(Vector3){0}), \
  28. GENERIC_PAIR(Vector4*, &(Vector4){0}), \
  29. GENERIC_PAIR(IntVector2*, &(IntVector2){0}), \
  30. GENERIC_PAIR(IntVector3*, &(IntVector3){0}), \
  31. GENERIC_PAIR(IntVector4*, &(IntVector4){0}))
  32. #define GENERIC_FACTOR(b, type, base, factor) \
  33. type: \
  34. _Generic((b), GENERIC_PAIR(type, base), default: factor)
  35. #define SELECT_OP(_1, _2, _3, name, ...) name
  36. #define addSet(a, b) GENERIC_VECTOR(a, addSet)(a, b)
  37. #define add3(a, b, c) GENERIC_VECTOR(a, add)(a, b, c)
  38. #define add2(a, b) add3(ZERO_VECTOR(a), a, b)
  39. #define add(...) SELECT_OP(__VA_ARGS__, add3, add2, 0)(__VA_ARGS__)
  40. #define subSet(a, b) GENERIC_VECTOR(a, subSet)(a, b)
  41. #define sub3(a, b, c) GENERIC_VECTOR(a, sub)(a, b, c)
  42. #define sub2(a, b) sub3(ZERO_VECTOR(a), a, b)
  43. #define sub(...) SELECT_OP(__VA_ARGS__, sub3, sub2, 0)(__VA_ARGS__)
  44. #define mulSet(a, b) \
  45. _Generic( \
  46. (a), \
  47. Matrix *: mulSetMatrix, \
  48. Quaternion *: mulSetQ, \
  49. GENERIC_FACTOR(b, Vector2*, mulSetV2, mulSetV2F), \
  50. GENERIC_FACTOR(b, Vector3*, mulSetV3, mulSetV3F), \
  51. GENERIC_FACTOR(b, Vector4*, mulSetV4, mulSetV4F), \
  52. GENERIC_FACTOR(b, IntVector2*, mulSetIV2, mulSetIV2F), \
  53. GENERIC_FACTOR(b, IntVector3*, mulSetIV3, mulSetIV3F), \
  54. GENERIC_FACTOR(b, IntVector4*, mulSetIV4, mulSetIV4F))(a, b)
  55. #define mul3(a, b, c) \
  56. _Generic( \
  57. (a), \
  58. Matrix *: mulMatrix, \
  59. Quaternion *: mulQ, \
  60. GENERIC_FACTOR(c, Vector2*, mulV2, mulV2F), \
  61. Vector3 *: _Generic( \
  62. (c), \
  63. Vector3 *: _Generic( \
  64. (b), \
  65. GENERIC_PAIR(Quaternion*, mulQV3), \
  66. GENERIC_PAIR(Matrix*, mulMatrixV3), \
  67. default: mulV3), \
  68. default: mulV3F), \
  69. GENERIC_FACTOR(c, Vector4*, mulV4, mulV4F), \
  70. GENERIC_FACTOR(c, IntVector2*, mulIV2, mulIV2F), \
  71. GENERIC_FACTOR(c, IntVector3*, mulIV3, mulIV3F), \
  72. GENERIC_FACTOR(c, IntVector4*, mulIV4, mulIV4F))(a, b, c)
  73. #define mul2(a, b) mul3(ZERO_VECTOR(a), a, b)
  74. #define mul(...) SELECT_OP(__VA_ARGS__, mul3, mul2, 0)(__VA_ARGS__)
  75. #define divSet(a, b) \
  76. _Generic( \
  77. (a), \
  78. GENERIC_FACTOR(b, Vector2*, divSetV2, divSetV2F), \
  79. GENERIC_FACTOR(b, Vector3*, divSetV3, divSetV3F), \
  80. GENERIC_FACTOR(b, Vector4*, divSetV4, divSetV4F), \
  81. GENERIC_FACTOR(b, IntVector2*, divSetIV2, divSetIV2F), \
  82. GENERIC_FACTOR(b, IntVector3*, divSetIV3, divSetIV3F), \
  83. GENERIC_FACTOR(b, IntVector4*, divSetIV4, divSetIV4F))(a, b)
  84. #define div3(a, b, c) \
  85. _Generic( \
  86. (a), \
  87. GENERIC_FACTOR(c, Vector2*, divV2, divV2F), \
  88. GENERIC_FACTOR(c, Vector3*, divV3, divV3F), \
  89. GENERIC_FACTOR(c, Vector4*, divV4, divV4F), \
  90. GENERIC_FACTOR(c, IntVector2*, divIV2, divIV2F), \
  91. GENERIC_FACTOR(c, IntVector3*, divIV3, divIV3F), \
  92. GENERIC_FACTOR(c, IntVector4*, divIV4, divIV4F))(a, b, c)
  93. #define div2(a, b) div3(ZERO_VECTOR(a), a, b)
  94. #define div(...) SELECT_OP(__VA_ARGS__, div3, div2, 0)(__VA_ARGS__)
  95. #define invertSet(a) GENERIC_VECTOR(a, invertSet)(a)
  96. #define invert2(a, b) GENERIC_VECTOR(a, invert)(a, b)
  97. #define invert1(a) invert2(ZERO_VECTOR(a), a)
  98. #define invert(...) SELECT_OP(0, __VA_ARGS__, invert2, invert1, 0)(__VA_ARGS__)
  99. #define dot(a, b) GENERIC_FLOAT_VECTOR(a, dot)(a, b)
  100. #define squareLength(a) GENERIC_FLOAT_VECTOR(a, squareLength)(a)
  101. #define length(a) GENERIC_FLOAT_VECTOR(a, length)(a)
  102. #define normalize(a) GENERIC_FLOAT_VECTOR(a, normalize)(a)
  103. #undef cross
  104. #define SELECT_OP(_1, _2, _3, name, ...) name
  105. #define cross3(a, b, c) cross(a, b, c)
  106. #define cross2(a, b) cross(&(Vector3){0}, a, b)
  107. #define cross(...) SELECT_OP(__VA_ARGS__, cross3, cross2, 0)(__VA_ARGS__)
  108. #define convert(a, b) \
  109. _Generic( \
  110. (a), \
  111. Vector2 *: convertIV2, \
  112. Vector3 *: convertIV3, \
  113. Vector4 *: convertIV4, \
  114. IntVector2 *: convertV2, \
  115. IntVector3 *: convertV3, \
  116. IntVector4 *: convertV4)(a, b)
  117. #endif