Generic.h 7.2 KB

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