| 
					
				 | 
			
			
				@@ -23,14 +23,30 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_PAIR(IntVector3*, name##IV3),                                  \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_PAIR(IntVector4*, name##IV4)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define ZERO_VECTOR(a)                                                         \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _Generic((a),                                                              \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GENERIC_PAIR(Vector2*, &(Vector2){0}),                                 \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GENERIC_PAIR(Vector3*, &(Vector3){0}),                                 \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GENERIC_PAIR(Vector4*, &(Vector4){0}),                                 \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GENERIC_PAIR(IntVector2*, &(IntVector2){0}),                           \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GENERIC_PAIR(IntVector3*, &(IntVector3){0}),                           \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GENERIC_PAIR(IntVector4*, &(IntVector4){0})) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define GENERIC_FACTOR(b, type, base, factor)                                  \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     type:                                                                      \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _Generic((b), GENERIC_PAIR(type, base), default: factor) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define SELECT_OP(_1, _2, _3, name, ...) name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define addSet(a, b) GENERIC_VECTOR(a, addSet)(a, b) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define add(a, b, c) GENERIC_VECTOR(a, add)(a, b, c) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define add3(a, b, c) GENERIC_VECTOR(a, add)(a, b, c) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define add2(a, b) add3(ZERO_VECTOR(a), a, b) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define add(...) SELECT_OP(__VA_ARGS__, add3, add2, 0)(__VA_ARGS__) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define subSet(a, b) GENERIC_VECTOR(a, subSet)(a, b) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define sub(a, b, c) GENERIC_VECTOR(a, sub)(a, b, c) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define sub3(a, b, c) GENERIC_VECTOR(a, sub)(a, b, c) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define sub2(a, b) sub3(ZERO_VECTOR(a), a, b) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define sub(...) SELECT_OP(__VA_ARGS__, sub3, sub2, 0)(__VA_ARGS__) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define mulSet(a, b)                                                           \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _Generic((a),                                                              \ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -43,7 +59,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(b, IntVector3*, mulSetIV3, mulSetIV3F),                 \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(b, IntVector4*, mulSetIV4, mulSetIV4F))(a, b) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define mul(a, b, c)                                                           \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define mul3(a, b, c)                                                          \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _Generic((a),                                                              \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Matrix *: mulMatrix,                                                   \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Quaternion *: mulQ,                                                    \ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -58,6 +74,8 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(c, IntVector2*, mulIV2, mulIV2F),                       \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(c, IntVector3*, mulIV3, mulIV3F),                       \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(c, IntVector4*, mulIV4, mulIV4F))(a, b, c) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define mul2(a, b) mul3(ZERO_VECTOR(a), a, b) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define mul(...) SELECT_OP(__VA_ARGS__, mul3, mul2, 0)(__VA_ARGS__) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define divSet(a, b)                                                           \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _Generic((a),                                                              \ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -68,7 +86,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(b, IntVector3*, divSetIV3, divSetIV3F),                 \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(b, IntVector4*, divSetIV4, divSetIV4F))(a, b) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define div(a, b, c)                                                           \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define div3(a, b, c)                                                          \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _Generic((a),                                                              \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(c, Vector2*, divV2, divV2F),                            \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(c, Vector3*, divV3, divV3F),                            \ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -76,6 +94,8 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(c, IntVector2*, divIV2, divIV2F),                       \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(c, IntVector3*, divIV3, divIV3F),                       \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GENERIC_FACTOR(c, IntVector4*, divIV4, divIV4F))(a, b, c) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define div2(a, b) div3(ZERO_VECTOR(a), a, b) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define div(...) SELECT_OP(__VA_ARGS__, div3, div2, 0)(__VA_ARGS__) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define invertSet(a) GENERIC_VECTOR(a, invertSet)(a) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define invert(a, b) GENERIC_VECTOR(a, invert)(a, b) 
			 |