#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}) #ifdef IMPORT_CORE #define Vector2 CoreVector2 #define addSetV2 coreAddSetV2 #define addV2 coreAddV2 #define subSetV2 coreSubSetV2 #define subV2 coreSubV2 #define mulSetV2 coreMulSetV2 #define mulV2 coreMulV2 #define divSetV2 coreDivSetV2 #define divV2 coreDivV2 #define mulSetV2F coreMulSetV2F #define mulV2F coreMulV2F #define divSetV2F coreDivSetV2F #define divV2F coreDivV2F #define invertSetV2 coreInvertSetV2 #define invertV2 coreInvertV2 #define toStringV2 coreToStringV2 #define Vector3 CoreVector3 #define addSetV3 coreAddSetV3 #define addV3 coreAddV3 #define subSetV3 coreSubSetV3 #define subV3 coreSubV3 #define mulSetV3 coreMulSetV3 #define mulV3 coreMulV3 #define divSetV3 coreDivSetV3 #define divV3 coreDivV3 #define mulSetV3F coreMulSetV3F #define mulV3F coreMulV3F #define divSetV3F coreDivSetV3F #define divV3F coreDivV3F #define invertSetV3 coreInvertSetV3 #define invertV3 coreInvertV3 #define toStringV3 coreToStringV3 #define Vector4 CoreVector4 #define addSetV4 coreAddSetV4 #define addV4 coreAddV4 #define subSetV4 coreSubSetV4 #define subV4 coreSubV4 #define mulSetV4 coreMulSetV4 #define mulV4 coreMulV4 #define divSetV4 coreDivSetV4 #define divV4 coreDivV4 #define mulSetV4F coreMulSetV4F #define mulV4F coreMulV4F #define divSetV4F coreDivSetV4F #define divV4F coreDivV4F #define invertSetV4 coreInvertSetV4 #define invertV4 coreInvertV4 #define toStringV4 coreToStringV4 #define IntVector2 CoreIntVector2 #define addSetIV2 coreAddSetIV2 #define addIV2 coreAddIV2 #define subSetIV2 coreSubSetIV2 #define subIV2 coreSubIV2 #define mulSetIV2 coreMulSetIV2 #define mulIV2 coreMulIV2 #define divSetIV2 coreDivSetIV2 #define divIV2 coreDivIV2 #define mulSetIV2F coreMulSetIV2F #define mulIV2F coreMulIV2F #define divSetIV2F coreDivSetIV2F #define divIV2F coreDivIV2F #define invertSetIV2 coreInvertSetIV2 #define invertIV2 coreInvertIV2 #define toStringIV2 coreToStringIV2 #define IntVector3 CoreIntVector3 #define addSetIV3 coreAddSetIV3 #define addIV3 coreAddIV3 #define subSetIV3 coreSubSetIV3 #define subIV3 coreSubIV3 #define mulSetIV3 coreMulSetIV3 #define mulIV3 coreMulIV3 #define divSetIV3 coreDivSetIV3 #define divIV3 coreDivIV3 #define mulSetIV3F coreMulSetIV3F #define mulIV3F coreMulIV3F #define divSetIV3F coreDivSetIV3F #define divIV3F coreDivIV3F #define invertSetIV3 coreInvertSetIV3 #define invertIV3 coreInvertIV3 #define toStringIV3 coreToStringIV3 #define IntVector4 CoreIntVector4 #define addSetIV4 coreAddSetIV4 #define addIV4 coreAddIV4 #define subSetIV4 coreSubSetIV4 #define subIV4 coreSubIV4 #define mulSetIV4 coreMulSetIV4 #define mulIV4 coreMulIV4 #define divSetIV4 coreDivSetIV4 #define divIV4 coreDivIV4 #define mulSetIV4F coreMulSetIV4F #define mulIV4F coreMulIV4F #define divSetIV4F coreDivSetIV4F #define divIV4F coreDivIV4F #define invertSetIV4 coreInvertSetIV4 #define invertIV4 coreInvertIV4 #define toStringIV4 coreToStringIV4 #define dotV2 coreDotV2 #define squareLengthV2 coreSquareLengthV2 #define lengthV2 coreLengthV2 #define normalizeV2 coreNormalizeV2 #define dotV3 coreDotV3 #define squareLengthV3 coreSquareLengthV3 #define lengthV3 coreLengthV3 #define normalizeV3 coreNormalizeV3 #define dotV4 coreDotV4 #define squareLengthV4 coreSquareLengthV4 #define lengthV4 coreLengthV4 #define normalizeV4 coreNormalizeV4 #define angles coreAngles #define cross coreCross #define convertV2 coreConvertV2 #define convertIV2 coreConvertIV2 #define convertV3 coreConvertV3 #define convertIV3 coreConvertIV3 #define convertV4 coreConvertV4 #define convertIV4 coreConvertIV4 #define VECTOR2 CORE_VECTOR2 #define VECTOR3 CORE_VECTOR3 #define VECTOR4 CORE_VECTOR4 #define INT_VECTOR2 CORE_INT_VECTOR2 #define INT_VECTOR3 CORE_INT_VECTOR3 #define INT_VECTOR4 CORE_INT_VECTOR4 #define SELECT_VECTOR(_1, _2, _3, _4, name, ...) name #define V(...) \ ((SELECT_VECTOR(__VA_ARGS__, Vector4, Vector3, Vector2, 0)){{__VA_ARGS__}}) #define IV(...) \ ((SELECT_VECTOR(__VA_ARGS__, IntVector4, IntVector3, IntVector2, 0)){ \ {__VA_ARGS__}}) #endif #endif