Vector.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #ifndef CORE_VECTOR_H
  2. #define CORE_VECTOR_H
  3. #include "core/Types.h"
  4. #define CORE_VECTOR_OP2(name) name *r, const name *a
  5. #define CORE_VECTOR_OP3(name) CORE_VECTOR_OP2(name), const name* b
  6. #define CORE_DEFINE_VECTOR(N, name, sname, type) \
  7. typedef struct { \
  8. type data[N]; \
  9. } name; \
  10. name* coreAddSet##sname(CORE_VECTOR_OP2(name)); \
  11. name* coreAdd##sname(CORE_VECTOR_OP3(name)); \
  12. name* coreSubSet##sname(CORE_VECTOR_OP2(name)); \
  13. name* coreSub##sname(CORE_VECTOR_OP3(name)); \
  14. name* coreMulSet##sname(CORE_VECTOR_OP2(name)); \
  15. name* coreMul##sname(CORE_VECTOR_OP3(name)); \
  16. name* coreDivSet##sname(CORE_VECTOR_OP2(name)); \
  17. name* coreDiv##sname(CORE_VECTOR_OP3(name)); \
  18. name* coreMulSet##sname##F(name* r, type f); \
  19. name* coreMul##sname##F(name* r, const name* a, type f); \
  20. name* coreDivSet##sname##F(name* r, type f); \
  21. name* coreDiv##sname##F(name* r, const name* a, type f); \
  22. name* coreInvertSet##sname(name* r); \
  23. name* coreInvert##sname(name* r, const name* a); \
  24. size_t coreToString##sname(const name* a, char* buffer, size_t n);
  25. #define CORE_DEFINE_FVECTOR(N, name) \
  26. float coreDotV##N(const name* a, const name* b); \
  27. float coreSquareLengthV##N(const name* a); \
  28. float coreLengthV##N(const name* a); \
  29. name* coreNormalizeV##N(name* r);
  30. CORE_DEFINE_VECTOR(2, CoreVector2, V2, float)
  31. CORE_DEFINE_VECTOR(3, CoreVector3, V3, float)
  32. CORE_DEFINE_VECTOR(4, CoreVector4, V4, float)
  33. CORE_DEFINE_FVECTOR(2, CoreVector2)
  34. CORE_DEFINE_FVECTOR(3, CoreVector3)
  35. CORE_DEFINE_FVECTOR(4, CoreVector4)
  36. CORE_DEFINE_VECTOR(2, CoreIntVector2, IV2, int)
  37. CORE_DEFINE_VECTOR(3, CoreIntVector3, IV3, int)
  38. CORE_DEFINE_VECTOR(4, CoreIntVector4, IV4, int)
  39. CoreVector3* coreAngles(CoreVector3* r, float lengthAngle, float widthAngle);
  40. CoreVector3* coreCross(CORE_VECTOR_OP3(CoreVector3));
  41. #define CORE_DEFINE_VECTOR_CONVERSION(a, nameA, b, nameB) \
  42. a* coreConvert##nameB(a* r, const b* c); \
  43. b* coreConvert##nameA(b* r, const a* c)
  44. CORE_DEFINE_VECTOR_CONVERSION(CoreVector2, V2, CoreIntVector2, IV2);
  45. CORE_DEFINE_VECTOR_CONVERSION(CoreVector3, V3, CoreIntVector3, IV3);
  46. CORE_DEFINE_VECTOR_CONVERSION(CoreVector4, V4, CoreIntVector4, IV4);
  47. #define CORE_VECTOR2 ((CoreVector2){0})
  48. #define CORE_VECTOR3 ((CoreVector3){0})
  49. #define CORE_VECTOR4 ((CoreVector4){0})
  50. #define CORE_INT_VECTOR2 ((CoreIntVector2){0})
  51. #define CORE_INT_VECTOR3 ((CoreIntVector3){0})
  52. #define CORE_INT_VECTOR4 ((CoreIntVector4){0})
  53. #ifdef IMPORT_CORE
  54. #define Vector2 CoreVector2
  55. #define addSetV2 coreAddSetV2
  56. #define addV2 coreAddV2
  57. #define subSetV2 coreSubSetV2
  58. #define subV2 coreSubV2
  59. #define mulSetV2 coreMulSetV2
  60. #define mulV2 coreMulV2
  61. #define divSetV2 coreDivSetV2
  62. #define divV2 coreDivV2
  63. #define mulSetV2F coreMulSetV2F
  64. #define mulV2F coreMulV2F
  65. #define divSetV2F coreDivSetV2F
  66. #define divV2F coreDivV2F
  67. #define invertSetV2 coreInvertSetV2
  68. #define invertV2 coreInvertV2
  69. #define toStringV2 coreToStringV2
  70. #define Vector3 CoreVector3
  71. #define addSetV3 coreAddSetV3
  72. #define addV3 coreAddV3
  73. #define subSetV3 coreSubSetV3
  74. #define subV3 coreSubV3
  75. #define mulSetV3 coreMulSetV3
  76. #define mulV3 coreMulV3
  77. #define divSetV3 coreDivSetV3
  78. #define divV3 coreDivV3
  79. #define mulSetV3F coreMulSetV3F
  80. #define mulV3F coreMulV3F
  81. #define divSetV3F coreDivSetV3F
  82. #define divV3F coreDivV3F
  83. #define invertSetV3 coreInvertSetV3
  84. #define invertV3 coreInvertV3
  85. #define toStringV3 coreToStringV3
  86. #define Vector4 CoreVector4
  87. #define addSetV4 coreAddSetV4
  88. #define addV4 coreAddV4
  89. #define subSetV4 coreSubSetV4
  90. #define subV4 coreSubV4
  91. #define mulSetV4 coreMulSetV4
  92. #define mulV4 coreMulV4
  93. #define divSetV4 coreDivSetV4
  94. #define divV4 coreDivV4
  95. #define mulSetV4F coreMulSetV4F
  96. #define mulV4F coreMulV4F
  97. #define divSetV4F coreDivSetV4F
  98. #define divV4F coreDivV4F
  99. #define invertSetV4 coreInvertSetV4
  100. #define invertV4 coreInvertV4
  101. #define toStringV4 coreToStringV4
  102. #define IntVector2 CoreIntVector2
  103. #define addSetIV2 coreAddSetIV2
  104. #define addIV2 coreAddIV2
  105. #define subSetIV2 coreSubSetIV2
  106. #define subIV2 coreSubIV2
  107. #define mulSetIV2 coreMulSetIV2
  108. #define mulIV2 coreMulIV2
  109. #define divSetIV2 coreDivSetIV2
  110. #define divIV2 coreDivIV2
  111. #define mulSetIV2F coreMulSetIV2F
  112. #define mulIV2F coreMulIV2F
  113. #define divSetIV2F coreDivSetIV2F
  114. #define divIV2F coreDivIV2F
  115. #define invertSetIV2 coreInvertSetIV2
  116. #define invertIV2 coreInvertIV2
  117. #define toStringIV2 coreToStringIV2
  118. #define IntVector3 CoreIntVector3
  119. #define addSetIV3 coreAddSetIV3
  120. #define addIV3 coreAddIV3
  121. #define subSetIV3 coreSubSetIV3
  122. #define subIV3 coreSubIV3
  123. #define mulSetIV3 coreMulSetIV3
  124. #define mulIV3 coreMulIV3
  125. #define divSetIV3 coreDivSetIV3
  126. #define divIV3 coreDivIV3
  127. #define mulSetIV3F coreMulSetIV3F
  128. #define mulIV3F coreMulIV3F
  129. #define divSetIV3F coreDivSetIV3F
  130. #define divIV3F coreDivIV3F
  131. #define invertSetIV3 coreInvertSetIV3
  132. #define invertIV3 coreInvertIV3
  133. #define toStringIV3 coreToStringIV3
  134. #define IntVector4 CoreIntVector4
  135. #define addSetIV4 coreAddSetIV4
  136. #define addIV4 coreAddIV4
  137. #define subSetIV4 coreSubSetIV4
  138. #define subIV4 coreSubIV4
  139. #define mulSetIV4 coreMulSetIV4
  140. #define mulIV4 coreMulIV4
  141. #define divSetIV4 coreDivSetIV4
  142. #define divIV4 coreDivIV4
  143. #define mulSetIV4F coreMulSetIV4F
  144. #define mulIV4F coreMulIV4F
  145. #define divSetIV4F coreDivSetIV4F
  146. #define divIV4F coreDivIV4F
  147. #define invertSetIV4 coreInvertSetIV4
  148. #define invertIV4 coreInvertIV4
  149. #define toStringIV4 coreToStringIV4
  150. #define dotV2 coreDotV2
  151. #define squareLengthV2 coreSquareLengthV2
  152. #define lengthV2 coreLengthV2
  153. #define normalizeV2 coreNormalizeV2
  154. #define dotV3 coreDotV3
  155. #define squareLengthV3 coreSquareLengthV3
  156. #define lengthV3 coreLengthV3
  157. #define normalizeV3 coreNormalizeV3
  158. #define dotV4 coreDotV4
  159. #define squareLengthV4 coreSquareLengthV4
  160. #define lengthV4 coreLengthV4
  161. #define normalizeV4 coreNormalizeV4
  162. #define angles coreAngles
  163. #define cross coreCross
  164. #define convertV2 coreConvertV2
  165. #define convertIV2 coreConvertIV2
  166. #define convertV3 coreConvertV3
  167. #define convertIV3 coreConvertIV3
  168. #define convertV4 coreConvertV4
  169. #define convertIV4 coreConvertIV4
  170. #define VECTOR2 CORE_VECTOR2
  171. #define VECTOR3 CORE_VECTOR3
  172. #define VECTOR4 CORE_VECTOR4
  173. #define INT_VECTOR2 CORE_INT_VECTOR2
  174. #define INT_VECTOR3 CORE_INT_VECTOR3
  175. #define INT_VECTOR4 CORE_INT_VECTOR4
  176. #define SELECT_VECTOR(_1, _2, _3, _4, name, ...) name
  177. #define V(...) \
  178. ((SELECT_VECTOR(__VA_ARGS__, Vector4, Vector3, Vector2, 0)){{__VA_ARGS__}})
  179. #define IV(...) \
  180. ((SELECT_VECTOR(__VA_ARGS__, IntVector4, IntVector3, IntVector2, 0)){ \
  181. {__VA_ARGS__}})
  182. #endif
  183. #endif