Vector.h 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. #endif