|
@@ -5,9 +5,12 @@
|
|
|
|
|
|
#include "core/Utility.h"
|
|
|
|
|
|
-#define V2 CoreVector2
|
|
|
-#define V3 CoreVector3
|
|
|
-#define V4 CoreVector4
|
|
|
+typedef CoreVector2 V2;
|
|
|
+typedef CoreVector3 V3;
|
|
|
+typedef CoreVector4 V4;
|
|
|
+typedef CoreIntVector2 IV2;
|
|
|
+typedef CoreIntVector3 IV3;
|
|
|
+typedef CoreIntVector4 IV4;
|
|
|
|
|
|
V3* coreAngles(V3* r, float lengthAngle, float widthAngle) {
|
|
|
lengthAngle = coreDegreeToRadian(lengthAngle);
|
|
@@ -31,85 +34,86 @@ V3* coreCross(V3* r, const V3* a, const V3* b) {
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
-#define VECTOR_IMPL(T, N, SN, F, CN) \
|
|
|
- T* coreAddSet##SN(T* r, const T* a) { \
|
|
|
- return coreAdd##SN(r, r, a); \
|
|
|
+#define VECTOR_IMPL(T, N, FT) \
|
|
|
+ T* coreAddSet##T(T* r, const T* a) { \
|
|
|
+ return coreAdd##T(r, r, a); \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreAdd##SN(T* r, const T* a, const T* b) { \
|
|
|
+ T* coreAdd##T(T* r, const T* a, const T* b) { \
|
|
|
for(int i = 0; i < N; i++) { \
|
|
|
r->data[i] = a->data[i] + b->data[i]; \
|
|
|
} \
|
|
|
return r; \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreSubSet##SN(T* r, const T* a) { \
|
|
|
- return coreSub##SN(r, r, a); \
|
|
|
+ T* coreSubSet##T(T* r, const T* a) { \
|
|
|
+ return coreSub##T(r, r, a); \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreSub##SN(T* r, const T* a, const T* b) { \
|
|
|
+ T* coreSub##T(T* r, const T* a, const T* b) { \
|
|
|
for(int i = 0; i < N; i++) { \
|
|
|
r->data[i] = a->data[i] - b->data[i]; \
|
|
|
} \
|
|
|
return r; \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreMulSet##SN(T* r, const T* a) { \
|
|
|
- return coreMul##SN(r, r, a); \
|
|
|
+ T* coreMulSet##T(T* r, const T* a) { \
|
|
|
+ return coreMul##T(r, r, a); \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreMul##SN(T* r, const T* a, const T* b) { \
|
|
|
+ T* coreMul##T(T* r, const T* a, const T* b) { \
|
|
|
for(int i = 0; i < N; i++) { \
|
|
|
r->data[i] = a->data[i] * b->data[i]; \
|
|
|
} \
|
|
|
return r; \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreDivSet##SN(T* r, const T* a) { \
|
|
|
- return coreDiv##SN(r, r, a); \
|
|
|
+ T* coreDivSet##T(T* r, const T* a) { \
|
|
|
+ return coreDiv##T(r, r, a); \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreDiv##SN(T* r, const T* a, const T* b) { \
|
|
|
+ T* coreDiv##T(T* r, const T* a, const T* b) { \
|
|
|
for(int i = 0; i < N; i++) { \
|
|
|
r->data[i] = a->data[i] / b->data[i]; \
|
|
|
} \
|
|
|
return r; \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreMulSet##SN##F(T* r, float f) { \
|
|
|
- return coreMul##SN##F(r, r, f); \
|
|
|
+ T* coreMulSet##T##F(T* r, FT f) { \
|
|
|
+ return coreMul##T##F(r, r, f); \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreMul##SN##F(T* r, const T* a, float f) { \
|
|
|
+ T* coreMul##T##F(T* r, const T* a, FT f) { \
|
|
|
for(int i = 0; i < N; i++) { \
|
|
|
r->data[i] = a->data[i] * f; \
|
|
|
} \
|
|
|
return r; \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreDivSet##SN##F(T* r, float f) { \
|
|
|
- return coreDiv##SN##F(r, r, f); \
|
|
|
+ T* coreDivSet##T##F(T* r, FT f) { \
|
|
|
+ return coreDiv##T##F(r, r, f); \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreDiv##SN##F(T* r, const T* a, float f) { \
|
|
|
+ T* coreDiv##T##F(T* r, const T* a, FT f) { \
|
|
|
for(int i = 0; i < N; i++) { \
|
|
|
r->data[i] = a->data[i] / f; \
|
|
|
} \
|
|
|
return r; \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreInvertSet##SN(T* r) { \
|
|
|
- return coreInvert##SN(r, r); \
|
|
|
+ T* coreInvertSet##T(T* r) { \
|
|
|
+ return coreInvert##T(r, r); \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreInvert##SN(T* r, const T* a) { \
|
|
|
+ T* coreInvert##T(T* r, const T* a) { \
|
|
|
for(int i = 0; i < N; i++) { \
|
|
|
r->data[i] = -a->data[i]; \
|
|
|
} \
|
|
|
return r; \
|
|
|
- } \
|
|
|
- \
|
|
|
- float coreDot##SN(const T* a, const T* b) { \
|
|
|
+ }
|
|
|
+
|
|
|
+#define VECTOR_IMPL_FLOAT(T, N, CN) \
|
|
|
+ float coreDot##T(const T* a, const T* b) { \
|
|
|
float length = 0; \
|
|
|
for(int i = 0; i < N; i++) { \
|
|
|
length += a->data[i] * b->data[i]; \
|
|
@@ -117,35 +121,41 @@ V3* coreCross(V3* r, const V3* a, const V3* b) {
|
|
|
return length; \
|
|
|
} \
|
|
|
\
|
|
|
- float coreSquareLength##SN(const T* a) { \
|
|
|
- return coreDot##SN(a, a); \
|
|
|
+ float coreSquareLength##T(const T* a) { \
|
|
|
+ return coreDot##T(a, a); \
|
|
|
} \
|
|
|
\
|
|
|
- float coreLength##SN(const T* a) { \
|
|
|
- return sqrtf(coreSquareLength##SN(a)); \
|
|
|
+ float coreLength##T(const T* a) { \
|
|
|
+ return sqrtf(coreSquareLength##T(a)); \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreNormalize##SN(T* r) { \
|
|
|
- return coreMulSet##SN##F(r, 1.0f / coreLength##SN(r)); \
|
|
|
+ T* coreNormalize##T(T* r) { \
|
|
|
+ return coreMulSet##T##F(r, 1.0f / coreLength##T(r)); \
|
|
|
} \
|
|
|
\
|
|
|
- T* coreConvertI##SN(T* r, const CN* a) { \
|
|
|
+ T* coreConvertI##T(T* r, const CN* a) { \
|
|
|
for(int i = 0; i < N; i++) { \
|
|
|
r->data[i] = (float)a->data[i]; \
|
|
|
} \
|
|
|
return r; \
|
|
|
} \
|
|
|
\
|
|
|
- CN* coreConvert##SN(CN* r, const T* a) { \
|
|
|
+ CN* coreConvert##T(CN* r, const T* a) { \
|
|
|
for(int i = 0; i < N; i++) { \
|
|
|
r->data[i] = (int)a->data[i]; \
|
|
|
} \
|
|
|
return r; \
|
|
|
}
|
|
|
|
|
|
-VECTOR_IMPL(CoreVector2, 2, V2, F, CoreIntVector2)
|
|
|
-VECTOR_IMPL(CoreVector3, 3, V3, F, CoreIntVector3)
|
|
|
-VECTOR_IMPL(CoreVector4, 4, V4, F, CoreIntVector4)
|
|
|
+VECTOR_IMPL(V2, 2, float)
|
|
|
+VECTOR_IMPL(V3, 3, float)
|
|
|
+VECTOR_IMPL(V4, 4, float)
|
|
|
+VECTOR_IMPL(IV2, 2, int)
|
|
|
+VECTOR_IMPL(IV3, 3, int)
|
|
|
+VECTOR_IMPL(IV4, 4, int)
|
|
|
+VECTOR_IMPL_FLOAT(V2, 2, IV2)
|
|
|
+VECTOR_IMPL_FLOAT(V3, 3, IV3)
|
|
|
+VECTOR_IMPL_FLOAT(V4, 4, IV4)
|
|
|
|
|
|
void coreToStringV2(const V2* a, char* buffer, size_t n) {
|
|
|
snprintf(buffer, n, "[%.3f, %.3f]", (double)a->data[0], (double)a->data[1]);
|
|
@@ -160,3 +170,16 @@ void coreToStringV4(const V4* a, char* buffer, size_t n) {
|
|
|
snprintf(buffer, n, "[%.3f, %.3f, %.3f, %.3f]", (double)a->data[0],
|
|
|
(double)a->data[1], (double)a->data[2], (double)a->data[3]);
|
|
|
}
|
|
|
+
|
|
|
+void coreToStringIV2(const IV2* a, char* buffer, size_t n) {
|
|
|
+ snprintf(buffer, n, "[%d, %d]", a->data[0], a->data[1]);
|
|
|
+}
|
|
|
+
|
|
|
+void coreToStringIV3(const IV3* a, char* buffer, size_t n) {
|
|
|
+ snprintf(buffer, n, "[%d, %d, %d]", a->data[0], a->data[1], a->data[2]);
|
|
|
+}
|
|
|
+
|
|
|
+void coreToStringIV4(const IV4* a, char* buffer, size_t n) {
|
|
|
+ snprintf(buffer, n, "[%d, %d, %d, %d]", a->data[0], a->data[1], a->data[2],
|
|
|
+ a->data[3]);
|
|
|
+}
|