| 
					
				 | 
			
			
				@@ -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]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |