#ifndef CORE_VECTOR_H #define CORE_VECTOR_H #include "core/Types.h" #define CORE_VECTOR_OP2(name) name *r, const name *a #define CORE_VECTOR_OP3(name) CORE_VECTOR_OP2(name), const name* b #define CORE_DEFINE_VECTOR(N, name, sname, type) \ typedef struct { \ type data[N]; \ } name; \ name* coreAddSet##sname(CORE_VECTOR_OP2(name)); \ name* coreAdd##sname(CORE_VECTOR_OP3(name)); \ name* coreSubSet##sname(CORE_VECTOR_OP2(name)); \ name* coreSub##sname(CORE_VECTOR_OP3(name)); \ name* coreMulSet##sname(CORE_VECTOR_OP2(name)); \ name* coreMul##sname(CORE_VECTOR_OP3(name)); \ name* coreDivSet##sname(CORE_VECTOR_OP2(name)); \ name* coreDiv##sname(CORE_VECTOR_OP3(name)); \ name* coreMulSet##sname##F(name* r, type f); \ name* coreMul##sname##F(name* r, const name* a, type f); \ name* coreDivSet##sname##F(name* r, type f); \ name* coreDiv##sname##F(name* r, const name* a, type f); \ name* coreInvertSet##sname(name* r); \ name* coreInvert##sname(name* r, const name* a); \ size_t coreToString##sname(const name* a, char* buffer, size_t n); #define CORE_DEFINE_FVECTOR(N, name) \ float coreDotV##N(const name* a, const name* b); \ float coreSquareLengthV##N(const name* a); \ float coreLengthV##N(const name* a); \ name* coreNormalizeV##N(name* r); CORE_DEFINE_VECTOR(2, CoreVector2, V2, float) CORE_DEFINE_VECTOR(3, CoreVector3, V3, float) CORE_DEFINE_VECTOR(4, CoreVector4, V4, float) CORE_DEFINE_FVECTOR(2, CoreVector2) CORE_DEFINE_FVECTOR(3, CoreVector3) CORE_DEFINE_FVECTOR(4, CoreVector4) CORE_DEFINE_VECTOR(2, CoreIntVector2, IV2, int) CORE_DEFINE_VECTOR(3, CoreIntVector3, IV3, int) CORE_DEFINE_VECTOR(4, CoreIntVector4, IV4, int) CoreVector3* coreAngles(CoreVector3* r, float lengthAngle, float widthAngle); CoreVector3* coreCross(CORE_VECTOR_OP3(CoreVector3)); #define CORE_DEFINE_VECTOR_CONVERSION(a, nameA, b, nameB) \ a* coreConvert##nameB(a* r, const b* c); \ b* coreConvert##nameA(b* r, const a* c) CORE_DEFINE_VECTOR_CONVERSION(CoreVector2, V2, CoreIntVector2, IV2); CORE_DEFINE_VECTOR_CONVERSION(CoreVector3, V3, CoreIntVector3, IV3); CORE_DEFINE_VECTOR_CONVERSION(CoreVector4, V4, CoreIntVector4, IV4); #define CORE_VECTOR2 ((CoreVector2){0}) #define CORE_VECTOR3 ((CoreVector3){0}) #define CORE_VECTOR4 ((CoreVector4){0}) #define CORE_INT_VECTOR2 ((CoreIntVector2){0}) #define CORE_INT_VECTOR3 ((CoreIntVector3){0}) #define CORE_INT_VECTOR4 ((CoreIntVector4){0}) #endif