123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- #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
|