Changeset c62013e
- Timestamp:
- Jul 14, 2026, 9:26:24 PM (4 hours ago)
- Branches:
- master
- Children:
- a12816e7
- Parents:
- f41b161
- Files:
-
- 5 edited
-
libcfa/src/vec/vec.hfa (modified) (1 diff)
-
libcfa/src/vec/vec2.hfa (modified) (2 diffs)
-
libcfa/src/vec/vec3.hfa (modified) (3 diffs)
-
libcfa/src/vec/vec4.hfa (modified) (4 diffs)
-
tests/enum_tests/planet.cfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/vec/vec.hfa
rf41b161 rc62013e 59 59 }; 60 60 forall(T) 61 trait sqrt {61 trait sqrt { 62 62 T sqrt(T); 63 63 }; 64 64 65 65 static inline { 66 // int67 int ?=?(int& n, zero_t) { return n = 0.f; }68 // unsigned int69 int ?=?(unsigned int& n, zero_t) { return n = 0.f; }70 /* float */ 71 void ?{}(float& a, int b) { a = b; }72 float ?=?(float& n, zero_t) { return n = 0.f; }73 /* double */ 74 void ?{}(double& a, int b) { a = b; }75 double ?=?(double& n, zero_t) { return n = 0L; }76 // long double77 void ?{}(long double& a, int b) { a = b; }78 long double ?=?(long double& n, zero_t) { return n = 0L; }79 } 66 // int 67 int ?=?( int& n, zero_t ) { return n = 0.f; } 68 // unsigned int 69 int ?=?( unsigned int& n, zero_t ) { return n = 0.f; } 70 // float 71 void ?{}( float& a, int b ) { a = b; } 72 float ?=?( float& n, zero_t ) { return n = 0.f; } 73 // double 74 void ?{}( double& a, int b ) { a = b; } 75 double ?=?( double& n, zero_t ) { return n = 0L; } 76 // long double 77 void ?{}( long double& a, int b ) { a = b; } 78 long double ?=?( long double& n, zero_t ) { return n = 0L; } 79 } // static inline 80 80 81 forall( V, T)81 forall( V, T ) 82 82 trait dottable { 83 T dot( V, V);83 T dot( V, V ); 84 84 }; 85 85 86 86 static inline { 87 forall( T | sqrt( T ), V | dottable( V, T ) ) 88 T length( V v ) { 89 return sqrt( dot( v, v ) ); 90 } 87 91 88 forall(T | sqrt(T), V | dottable(V, T))89 T length(V v) {90 return sqrt(dot(v, v));91 }92 forall( T, V | dottable( V, T ) ) 93 T length_squared( V v ) { 94 return dot( v, v ); 95 } 92 96 93 forall(T, V | dottable(V, T))94 T length_squared(V v) {95 return dot(v, v);96 }97 forall( T, V | { T length( V ); } | subtract( V ) ) 98 T distance( V v1, V v2 ) { 99 return length( v1 - v2 ); 100 } 97 101 98 forall(T, V | { T length(V); } | subtract(V))99 T distance(V v1, V v2) {100 return length(v1 - v2);101 }102 forall( T, V | { T length( V ); V ?/?( V, T ); }) 103 V normalize( V v ) { 104 return v / length( v ); 105 } 102 106 103 forall(T, V | { T length(V); V ?/?(V, T); }) 104 V normalize(V v) { 105 return v / length(v); 106 } 107 // Project vector u onto vector v 108 forall( T, V | dottable( V, T ) | { V normalize( V ); V ?*?( V, T ); }) 109 V project( V u, V v ) { 110 V v_norm = normalize( v ); 111 return v_norm * dot( u, v_norm ); 112 } 107 113 108 // Project vector u onto vector v 109 forall(T, V | dottable(V, T) | { V normalize(V); V ?*?(V, T); }) 110 V project(V u, V v) { 111 V v_norm = normalize(v); 112 return v_norm * dot(u, v_norm); 113 } 114 // Reflect incident vector v with respect to surface with normal n 115 forall( T | fromint( T ), V | { V project( V, V ); V ?*?( T, V ); V ?-?( V,V ); }) 116 V reflect( V v, V n ) { 117 return v - ( T ){2} * project( v, n ); 118 } 114 119 115 // Reflect incident vector v with respect to surface with normal n 116 forall(T | fromint(T), V | { V project(V, V); V ?*?(T, V); V ?-?(V,V); }) 117 V reflect(V v, V n) { 118 return v - (T){2} * project(v, n); 119 } 120 #pragma GCC diagnostic push 121 // FIX ME: false positive with gcc > 11, so disable. 122 #pragma GCC diagnostic ignored "-Wdangling-pointer" 120 123 121 // Refract incident vector v with respect to surface with normal n 122 // eta is the ratio of indices of refraction between starting material and 123 // entering material (i.e., from air to water, eta = 1/1.33) 124 // v and n must already be normalized 125 forall(T | fromint(T) | subtract(T) | multiply(T) | add(T) | lessthan(T) | sqrt(T), 126 V | dottable(V, T) | { V ?*?(T, V); V ?-?(V,V); void ?{}(V&, zero_t); }) 127 V refract(V v, V n, T eta) { 128 T dotValue = dot(n, v); 129 T k = (T){1} - eta * eta * ((T){1} - dotValue * dotValue); 130 if (k < (T){0}) { 131 return 0; 132 } 133 return eta * v - (eta * dotValue + sqrt(k)) * n; 134 } 124 // Refract incident vector v with respect to surface with normal n eta is the ratio of indices of refraction between 125 // starting material and entering material ( i.e., from air to water, eta = 1/1.33 ) v and n must already be 126 // normalized 127 forall( T | fromint( T ) | subtract( T ) | multiply( T ) | add( T ) | lessthan( T ) | sqrt( T ), 128 V | dottable( V, T ) | { V ?*?( T, V ); V ?-?( V,V ); void ?{}( V&, zero_t ); }) 129 V refract( V v, V n, T eta ) { 130 T dotValue = dot( n, v ); 131 T k = (T){1} - eta * eta * ((T){1} - dotValue * dotValue ); 132 if ( k < (T){0}) { 133 return 0; 134 } 135 return eta * v - ( eta * dotValue + sqrt( k ) ) * n; 136 } 135 137 136 // Given a perturbed normal and a geometric normal, 137 // flip the perturbed normal if the geometric normal is pointing away 138 // from the observer. 139 // n is the perturbed vector that we want to align 140 // i is the incident vector 141 // ng is the geometric normal of the surface 142 forall(T | lessthan(T) | zeroinit(T), V | dottable(V, T) | negate(V)) 143 V faceforward(V n, V i, V ng) { 144 return dot(ng, i) < (T){0} ? n : -n; 145 } 138 #pragma GCC diagnostic pop 146 139 147 } // inline 140 // Given a perturbed normal and a geometric normal, flip the perturbed normal if the geometric normal is pointing 141 // away from the observer. n is the perturbed vector that we want to align i is the incident vector ng is the 142 // geometric normal of the surface 143 forall( T | lessthan( T ) | zeroinit( T ), V | dottable( V, T ) | negate( V ) ) 144 V faceforward( V n, V i, V ng ) { 145 return dot( ng, i ) < (T){0} ? n : -n; 146 } 147 } // static inline -
libcfa/src/vec/vec2.hfa
rf41b161 rc62013e 19 19 #include "vec.hfa" 20 20 21 forall (T) {21 forall( T ) { 22 22 struct vec2 { 23 23 T x, y; … … 25 25 } 26 26 27 forall (T) { 28 static inline { 29 30 void ?{}(vec2(T)& v, T x, T y) { 31 v.[x, y] = [x, y]; 32 } 33 34 forall(| zero_assign(T)) 35 void ?{}(vec2(T)& vec, zero_t) with (vec) { 36 x = y = 0; 37 } 38 39 void ?{}(vec2(T)& vec, T val) with (vec) { 40 x = y = val; 41 } 42 43 void ?{}(vec2(T)& vec, vec2(T) other) with (vec) { 44 [x,y] = other.[x,y]; 45 } 46 47 void ?=?(vec2(T)& vec, vec2(T) other) with (vec) { 48 [x,y] = other.[x,y]; 49 } 50 forall(| zero_assign(T)) 51 void ?=?(vec2(T)& vec, zero_t) with (vec) { 52 x = y = 0; 53 } 54 55 // Primitive mathematical operations 56 57 // - 58 forall(| subtract(T)) { 59 vec2(T) ?-?(vec2(T) u, vec2(T) v) { 60 return [u.x - v.x, u.y - v.y]; 61 } 62 vec2(T)& ?-=?(vec2(T)& u, vec2(T) v) { 63 u = u - v; 64 return u; 65 } 66 } 67 forall(| negate(T)) 68 vec2(T) -?(vec2(T) v) with (v) { 69 return [-x, -y]; 70 } 71 72 forall(| { T --?(T&); }) { 73 vec2(T)& --?(vec2(T)& v) { 74 --v.x; 75 --v.y; 76 return v; 77 } 78 vec2(T) ?--(vec2(T)& v) { 79 vec2(T) copy = v; 80 --v; 81 return copy; 82 } 83 } 84 85 // + 86 forall(| add(T)) { 87 vec2(T) ?+?(vec2(T) u, vec2(T) v) { 88 return [u.x + v.x, u.y + v.y]; 89 } 90 vec2(T)& ?+=?(vec2(T)& u, vec2(T) v) { 91 u = u + v; 92 return u; 93 } 94 } 95 96 forall(| { T ++?(T&); }) { 97 vec2(T)& ++?(vec2(T)& v) { 98 ++v.x; 99 ++v.y; 100 return v; 101 } 102 vec2(T) ?++(vec2(T)& v) { 103 vec2(T) copy = v; 104 ++v; 105 return copy; 106 } 107 } 108 109 // * 110 forall(| multiply(T)) { 111 vec2(T) ?*?(vec2(T) v, T scalar) with (v) { 112 return [x * scalar, y * scalar]; 113 } 114 vec2(T) ?*?(T scalar, vec2(T) v) { 115 return v * scalar; 116 } 117 vec2(T) ?*?(vec2(T) u, vec2(T) v) { 118 return [u.x * v.x, u.y * v.y]; 119 } 120 vec2(T)& ?*=?(vec2(T)& v, T scalar) { 121 v = v * scalar; 122 return v; 123 } 124 vec2(T) ?*=?(vec2(T)& u, vec2(T) v) { 125 u = u * v; 126 return u; 127 } 128 } 129 130 // / 131 forall(| divide(T)) { 132 vec2(T) ?/?(vec2(T) v, T scalar) with (v) { 133 return [x / scalar, y / scalar]; 134 } 135 vec2(T) ?/?(vec2(T) u, vec2(T) v) { 136 return [u.x / v.x, u.y / v.y]; 137 } 138 vec2(T)& ?/=?(vec2(T)& v, T scalar) { 139 v = v / scalar; 140 return v; 141 } 142 vec2(T) ?/=?(vec2(T)& u, vec2(T) v) { 143 u = u / v; 144 return u; 145 } 146 } 147 148 // % 149 forall(| { T ?%?(T,T); }) { 150 vec2(T) ?%?(vec2(T) v, T scalar) with (v) { 151 return [x % scalar, y % scalar]; 152 } 153 vec2(T)& ?%=?(vec2(T)& u, T scalar) { 154 u = u % scalar; 155 return u; 156 } 157 vec2(T) ?%?(vec2(T) u, vec2(T) v) { 158 return [u.x % v.x, u.y % v.y]; 159 } 160 vec2(T)& ?%=?(vec2(T)& u, vec2(T) v) { 161 u = u % v; 162 return u; 163 } 164 } 165 166 // & 167 forall(| { T ?&?(T,T); }) { 168 vec2(T) ?&?(vec2(T) v, T scalar) with (v) { 169 return [x & scalar, y & scalar]; 170 } 171 vec2(T)& ?&=?(vec2(T)& u, T scalar) { 172 u = u & scalar; 173 return u; 174 } 175 vec2(T) ?&?(vec2(T) u, vec2(T) v) { 176 return [u.x & v.x, u.y & v.y]; 177 } 178 vec2(T)& ?&=?(vec2(T)& u, vec2(T) v) { 179 u = u & v; 180 return u; 181 } 182 } 183 184 // | 185 forall(| { T ?|?(T,T); }) { 186 vec2(T) ?|?(vec2(T) v, T scalar) with (v) { 187 return [x | scalar, y | scalar]; 188 } 189 vec2(T)& ?|=?(vec2(T)& u, T scalar) { 190 u = u | scalar; 191 return u; 192 } 193 vec2(T) ?|?(vec2(T) u, vec2(T) v) { 194 return [u.x | v.x, u.y | v.y]; 195 } 196 vec2(T)& ?|=?(vec2(T)& u, vec2(T) v) { 197 u = u | v; 198 return u; 199 } 200 } 201 202 // ^ 203 forall(| { T ?^?(T,T); }) { 204 vec2(T) ?^?(vec2(T) v, T scalar) with (v) { 205 return [x ^ scalar, y ^ scalar]; 206 } 207 vec2(T)& ?^=?(vec2(T)& u, T scalar) { 208 u = u ^ scalar; 209 return u; 210 } 211 vec2(T) ?^?(vec2(T) u, vec2(T) v) { 212 return [u.x ^ v.x, u.y ^ v.y]; 213 } 214 vec2(T)& ?^=?(vec2(T)& u, vec2(T) v) { 215 u = u ^ v; 216 return u; 217 } 218 } 219 220 // << 221 forall(| { T ?<<?(T,T); }) { 222 vec2(T) ?<<?(vec2(T) v, T scalar) with (v) { 223 return [x << scalar, y << scalar]; 224 } 225 vec2(T)& ?<<=?(vec2(T)& u, T scalar) { 226 u = u << scalar; 227 return u; 228 } 229 vec2(T) ?<<?(vec2(T) u, vec2(T) v) { 230 return [u.x << v.x, u.y << v.y]; 231 } 232 vec2(T)& ?<<=?(vec2(T)& u, vec2(T) v) { 233 u = u << v; 234 return u; 235 } 236 } 237 238 // >> 239 forall(| { T ?>>?(T,T); }) { 240 vec2(T) ?>>?(vec2(T) v, T scalar) with (v) { 241 return [x >> scalar, y >> scalar]; 242 } 243 vec2(T)& ?>>=?(vec2(T)& u, T scalar) { 244 u = u >> scalar; 245 return u; 246 } 247 vec2(T) ?>>?(vec2(T) u, vec2(T) v) { 248 return [u.x >> v.x, u.y >> v.y]; 249 } 250 vec2(T)& ?>>=?(vec2(T)& u, vec2(T) v) { 251 u = u >> v; 252 return u; 253 } 254 } 255 256 // ~ 257 forall(| { T ~?(T); }) 258 vec2(T) ~?(vec2(T) v) with (v) { 259 return [~v.x, ~v.y]; 260 } 261 262 // relational 263 forall(| equality(T)) { 264 bool ?==?(vec2(T) u, vec2(T) v) with (u) { 265 return x == v.x && y == v.y; 266 } 267 bool ?!=?(vec2(T) u, vec2(T) v) { 268 return !(u == v); 269 } 270 } 271 272 // Geometric functions 273 forall(| add(T) | multiply(T)) 274 T dot(vec2(T) u, vec2(T) v) { 275 return u.x * v.x + u.y * v.y; 276 } 277 278 } // static inline 279 } 280 281 forall(ostype &, T | writeable(T, ostype)) { 282 ostype & ?|?(ostype & os, vec2(T) v) with (v) { 27 static inline forall( T ) { 28 29 void ?{}( vec2( T )& v, T x, T y ) { 30 v.[x, y] = [x, y]; 31 } 32 33 forall(| zero_assign( T )) 34 void ?{}( vec2( T )& vec, zero_t ) with ( vec ) { 35 x = y = 0; 36 } 37 38 void ?{}( vec2( T )& vec, T val ) with ( vec ) { 39 x = y = val; 40 } 41 42 void ?{}( vec2( T )& vec, vec2( T ) other ) with ( vec ) { 43 [x,y] = other.[x,y]; 44 } 45 46 void ?=?( vec2( T )& vec, vec2( T ) other ) with ( vec ) { 47 [x,y] = other.[x,y]; 48 } 49 forall(| zero_assign( T )) 50 void ?=?( vec2( T )& vec, zero_t ) with ( vec ) { 51 x = y = 0; 52 } 53 54 // Primitive mathematical operations 55 56 // - 57 forall(| subtract( T )) { 58 vec2( T ) ?-?( vec2( T ) u, vec2( T ) v ) { 59 return [u.x - v.x, u.y - v.y]; 60 } 61 vec2( T )& ?-=?( vec2( T )& u, vec2( T ) v ) { 62 u = u - v; 63 return u; 64 } 65 } 66 forall(| negate( T )) 67 vec2( T ) -?( vec2( T ) v ) with ( v ) { 68 return [-x, -y]; 69 } 70 71 forall(| { T --?( T&); }) { 72 vec2( T )& --?( vec2( T )& v ) { 73 --v.x; 74 --v.y; 75 return v; 76 } 77 vec2( T ) ?--( vec2( T )& v ) { 78 vec2( T ) copy = v; 79 --v; 80 return copy; 81 } 82 } 83 84 // + 85 forall(| add( T )) { 86 vec2( T ) ?+?( vec2( T ) u, vec2( T ) v ) { 87 return [u.x + v.x, u.y + v.y]; 88 } 89 vec2( T )& ?+=?( vec2( T )& u, vec2( T ) v ) { 90 u = u + v; 91 return u; 92 } 93 } 94 95 forall(| { T ++?( T&); }) { 96 vec2( T )& ++?( vec2( T )& v ) { 97 ++v.x; 98 ++v.y; 99 return v; 100 } 101 vec2( T ) ?++( vec2( T )& v ) { 102 vec2( T ) copy = v; 103 ++v; 104 return copy; 105 } 106 } 107 108 // * 109 forall(| multiply( T )) { 110 vec2( T ) ?*?( vec2( T ) v, T scalar ) with ( v ) { 111 return [x * scalar, y * scalar]; 112 } 113 vec2( T ) ?*?( T scalar, vec2( T ) v ) { 114 return v * scalar; 115 } 116 vec2( T ) ?*?( vec2( T ) u, vec2( T ) v ) { 117 return [u.x * v.x, u.y * v.y]; 118 } 119 vec2( T )& ?*=?( vec2( T )& v, T scalar ) { 120 v = v * scalar; 121 return v; 122 } 123 vec2( T ) ?*=?( vec2( T )& u, vec2( T ) v ) { 124 u = u * v; 125 return u; 126 } 127 } 128 129 // / 130 forall(| divide( T )) { 131 vec2( T ) ?/?( vec2( T ) v, T scalar ) with ( v ) { 132 return [x / scalar, y / scalar]; 133 } 134 vec2( T ) ?/?( vec2( T ) u, vec2( T ) v ) { 135 return [u.x / v.x, u.y / v.y]; 136 } 137 vec2( T )& ?/=?( vec2( T )& v, T scalar ) { 138 v = v / scalar; 139 return v; 140 } 141 vec2( T ) ?/=?( vec2( T )& u, vec2( T ) v ) { 142 u = u / v; 143 return u; 144 } 145 } 146 147 // % 148 forall(| { T ?%?( T,T ); }) { 149 vec2( T ) ?%?( vec2( T ) v, T scalar ) with ( v ) { 150 return [x % scalar, y % scalar]; 151 } 152 vec2( T )& ?%=?( vec2( T )& u, T scalar ) { 153 u = u % scalar; 154 return u; 155 } 156 vec2( T ) ?%?( vec2( T ) u, vec2( T ) v ) { 157 return [u.x % v.x, u.y % v.y]; 158 } 159 vec2( T )& ?%=?( vec2( T )& u, vec2( T ) v ) { 160 u = u % v; 161 return u; 162 } 163 } 164 165 // & 166 forall(| { T ?&?( T,T ); }) { 167 vec2( T ) ?&?( vec2( T ) v, T scalar ) with ( v ) { 168 return [x & scalar, y & scalar]; 169 } 170 vec2( T )& ?&=?( vec2( T )& u, T scalar ) { 171 u = u & scalar; 172 return u; 173 } 174 vec2( T ) ?&?( vec2( T ) u, vec2( T ) v ) { 175 return [u.x & v.x, u.y & v.y]; 176 } 177 vec2( T )& ?&=?( vec2( T )& u, vec2( T ) v ) { 178 u = u & v; 179 return u; 180 } 181 } 182 183 // | 184 forall(| { T ?|?( T,T ); }) { 185 vec2( T ) ?|?( vec2( T ) v, T scalar ) with ( v ) { 186 return [x | scalar, y | scalar]; 187 } 188 vec2( T )& ?|=?( vec2( T )& u, T scalar ) { 189 u = u | scalar; 190 return u; 191 } 192 vec2( T ) ?|?( vec2( T ) u, vec2( T ) v ) { 193 return [u.x | v.x, u.y | v.y]; 194 } 195 vec2( T )& ?|=?( vec2( T )& u, vec2( T ) v ) { 196 u = u | v; 197 return u; 198 } 199 } 200 201 // ^ 202 forall(| { T ?^?( T,T ); }) { 203 vec2( T ) ?^?( vec2( T ) v, T scalar ) with ( v ) { 204 return [x ^ scalar, y ^ scalar]; 205 } 206 vec2( T )& ?^=?( vec2( T )& u, T scalar ) { 207 u = u ^ scalar; 208 return u; 209 } 210 vec2( T ) ?^?( vec2( T ) u, vec2( T ) v ) { 211 return [u.x ^ v.x, u.y ^ v.y]; 212 } 213 vec2( T )& ?^=?( vec2( T )& u, vec2( T ) v ) { 214 u = u ^ v; 215 return u; 216 } 217 } 218 219 // << 220 forall(| { T ?<<?( T,T ); }) { 221 vec2( T ) ?<<?( vec2( T ) v, T scalar ) with ( v ) { 222 return [x << scalar, y << scalar]; 223 } 224 vec2( T )& ?<<=?( vec2( T )& u, T scalar ) { 225 u = u << scalar; 226 return u; 227 } 228 vec2( T ) ?<<?( vec2( T ) u, vec2( T ) v ) { 229 return [u.x << v.x, u.y << v.y]; 230 } 231 vec2( T )& ?<<=?( vec2( T )& u, vec2( T ) v ) { 232 u = u << v; 233 return u; 234 } 235 } 236 237 // >> 238 forall(| { T ?>>?( T,T ); }) { 239 vec2( T ) ?>>?( vec2( T ) v, T scalar ) with ( v ) { 240 return [x >> scalar, y >> scalar]; 241 } 242 vec2( T )& ?>>=?( vec2( T )& u, T scalar ) { 243 u = u >> scalar; 244 return u; 245 } 246 vec2( T ) ?>>?( vec2( T ) u, vec2( T ) v ) { 247 return [u.x >> v.x, u.y >> v.y]; 248 } 249 vec2( T )& ?>>=?( vec2( T )& u, vec2( T ) v ) { 250 u = u >> v; 251 return u; 252 } 253 } 254 255 // ~ 256 forall(| { T ~?( T ); }) 257 vec2( T ) ~?( vec2( T ) v ) with ( v ) { 258 return [~v.x, ~v.y]; 259 } 260 261 // relational 262 forall(| equality( T )) { 263 bool ?==?( vec2( T ) u, vec2( T ) v ) with ( u ) { 264 return x == v.x && y == v.y; 265 } 266 bool ?!=?( vec2( T ) u, vec2( T ) v ) { 267 return !( u == v ); 268 } 269 } 270 271 // Geometric functions 272 forall(| add( T ) | multiply( T )) 273 T dot( vec2( T ) u, vec2( T ) v ) { 274 return u.x * v.x + u.y * v.y; 275 } 276 } // static inline 277 278 279 forall( ostype &, T | writeable( T, ostype )) { 280 ostype & ?|?( ostype & os, vec2( T ) v ) with ( v ) { 283 281 return os | '<' | x | ',' | y | '>'; 284 282 } 285 OSTYPE_VOID_IMPL( os, vec2( T) )283 OSTYPE_VOID_IMPL( os, vec2( T ) ) 286 284 } -
libcfa/src/vec/vec3.hfa
rf41b161 rc62013e 19 19 #include "vec.hfa" 20 20 21 forall (T) {21 forall( T ) { 22 22 struct vec3 { 23 23 T x, y, z; … … 25 25 } 26 26 27 forall (T) { 28 static inline { 29 30 void ?{}(vec3(T)& v, T x, T y, T z) { 27 static inline forall( T ) { 28 void ?{}( vec3( T )& v, T x, T y, T z ) { 31 29 v.[x, y, z] = [x, y, z]; 32 30 } 33 31 34 forall( | zero_assign(T))35 void ?{}( vec3(T)& vec, zero_t) with (vec) {32 forall( | zero_assign( T ) ) 33 void ?{}( vec3( T )& vec, zero_t ) with ( vec ) { 36 34 x = y = z = 0; 37 35 } 38 36 39 void ?{}( vec3(T)& vec, T val) with (vec) {37 void ?{}( vec3( T )& vec, T val ) with ( vec ) { 40 38 x = y = z = val; 41 39 } 42 40 43 void ?{}( vec3(T)& vec, vec3(T) other) with (vec) {41 void ?{}( vec3( T )& vec, vec3( T ) other ) with ( vec ) { 44 42 [x,y,z] = other.[x,y,z]; 45 43 } 46 44 47 void ?=?( vec3(T)& vec, vec3(T) other) with (vec) {45 void ?=?( vec3( T )& vec, vec3( T ) other ) with ( vec ) { 48 46 [x,y,z] = other.[x,y,z]; 49 47 } 50 forall(| zero_assign(T)) 51 void ?=?(vec3(T)& vec, zero_t) with (vec) { 48 49 forall( | zero_assign( T ) ) 50 void ?=?( vec3( T )& vec, zero_t ) with ( vec ) { 52 51 x = y = z = 0; 53 52 } … … 56 55 57 56 // - 58 forall(| subtract(T)) { 59 vec3(T) ?-?(vec3(T) u, vec3(T) v) { 60 return [u.x - v.x, u.y - v.y, u.z - v.z]; 61 } 62 vec3(T)& ?-=?(vec3(T)& u, vec3(T) v) { 63 u = u - v; 64 return u; 65 } 66 } 67 forall(| negate(T)) { 68 vec3(T) -?(vec3(T) v) with (v) { 69 return [-x, -y, -z]; 70 } 71 } 72 forall(| { T --?(T&); }) { 73 vec3(T)& --?(vec3(T)& v) { 74 --v.x; 75 --v.y; 76 --v.z; 77 return v; 78 } 79 vec3(T) ?--(vec3(T)& v) { 80 vec3(T) copy = v; 81 --v; 82 return copy; 83 } 57 forall( | subtract( T ) ) { 58 vec3( T ) ?-?( vec3( T ) u, vec3( T ) v ) { 59 return [u.x - v.x, u.y - v.y, u.z - v.z]; 60 } 61 vec3( T )& ?-=?( vec3( T )& u, vec3( T ) v ) { 62 u = u - v; 63 return u; 64 } 65 } 66 67 forall( | negate( T ) ) { 68 vec3( T ) -?( vec3( T ) v ) with ( v ) { 69 return [-x, -y, -z]; 70 } 71 } 72 73 forall( | { T --?( T&); }) { 74 vec3( T )& --?( vec3( T )& v ) { 75 --v.x; 76 --v.y; 77 --v.z; 78 return v; 79 } 80 vec3( T ) ?--( vec3( T )& v ) { 81 vec3( T ) copy = v; 82 --v; 83 return copy; 84 } 84 85 } 85 86 86 87 // + 87 forall( | add(T)) {88 vec3(T) ?+?(vec3(T) u, vec3(T) v) {89 return [u.x + v.x, u.y + v.y, u.z + v.z];90 }91 vec3(T)& ?+=?(vec3(T)& u, vec3(T) v) {92 u = u + v;93 return u;94 }95 } 96 97 forall( | { T ++?(T&); }) {98 vec3(T)& ++?(vec3(T)& v) {99 ++v.x;100 ++v.y;101 ++v.z;102 return v;103 }104 vec3(T) ?++(vec3(T)& v) {105 vec3(T) copy = v;106 ++v;107 return copy;108 }88 forall( | add( T ) ) { 89 vec3( T ) ?+?( vec3( T ) u, vec3( T ) v ) { 90 return [u.x + v.x, u.y + v.y, u.z + v.z]; 91 } 92 vec3( T )& ?+=?( vec3( T )& u, vec3( T ) v ) { 93 u = u + v; 94 return u; 95 } 96 } 97 98 forall( | { T ++?( T&); }) { 99 vec3( T )& ++?( vec3( T )& v ) { 100 ++v.x; 101 ++v.y; 102 ++v.z; 103 return v; 104 } 105 vec3( T ) ?++( vec3( T )& v ) { 106 vec3( T ) copy = v; 107 ++v; 108 return copy; 109 } 109 110 } 110 111 111 112 // * 112 forall( | multiply(T)) {113 vec3(T) ?*?(vec3(T) v, T scalar) with (v) {114 return [x * scalar, y * scalar, z * scalar];115 }116 vec3(T) ?*?(T scalar, vec3(T) v) {117 return v * scalar;118 }119 vec3(T) ?*?(vec3(T) u, vec3(T) v) {120 return [u.x * v.x, u.y * v.y, u.z * v.z];121 }122 vec3(T)& ?*=?(vec3(T)& v, T scalar) {123 v = v * scalar;124 return v;125 }126 vec3(T)& ?*=?(vec3(T)& u, vec3(T) v) {127 u = u * v;128 return u;129 }113 forall( | multiply( T ) ) { 114 vec3( T ) ?*?( vec3( T ) v, T scalar ) with ( v ) { 115 return [x * scalar, y * scalar, z * scalar]; 116 } 117 vec3( T ) ?*?( T scalar, vec3( T ) v ) { 118 return v * scalar; 119 } 120 vec3( T ) ?*?( vec3( T ) u, vec3( T ) v ) { 121 return [u.x * v.x, u.y * v.y, u.z * v.z]; 122 } 123 vec3( T )& ?*=?( vec3( T )& v, T scalar ) { 124 v = v * scalar; 125 return v; 126 } 127 vec3( T )& ?*=?( vec3( T )& u, vec3( T ) v ) { 128 u = u * v; 129 return u; 130 } 130 131 } 131 132 132 133 // / 133 forall( | divide(T)) {134 vec3(T) ?/?(vec3(T) v, T scalar) with (v) {135 return [x / scalar, y / scalar, z / scalar];136 }137 vec3(T) ?/?(vec3(T) u, vec3(T) v) {138 return [u.x / v.x, u.y / v.y, u.z / v.z];139 }140 vec3(T)& ?/=?(vec3(T)& v, T scalar) {141 v = v / scalar;142 return v;143 }144 vec3(T)& ?/=?(vec3(T)& u, vec3(T) v) {145 u = u / v;146 return u;147 }148 } 149 134 forall( | divide( T ) ) { 135 vec3( T ) ?/?( vec3( T ) v, T scalar ) with ( v ) { 136 return [x / scalar, y / scalar, z / scalar]; 137 } 138 vec3( T ) ?/?( vec3( T ) u, vec3( T ) v ) { 139 return [u.x / v.x, u.y / v.y, u.z / v.z]; 140 } 141 vec3( T )& ?/=?( vec3( T )& v, T scalar ) { 142 v = v / scalar; 143 return v; 144 } 145 vec3( T )& ?/=?( vec3( T )& u, vec3( T ) v ) { 146 u = u / v; 147 return u; 148 } 149 } 150 150 151 // % 151 forall( | { T ?%?(T,T); }) {152 vec3(T) ?%?(vec3(T) v, T scalar) with (v) {153 return [x % scalar, y % scalar, z % scalar];154 }155 vec3(T)& ?%=?(vec3(T)& u, T scalar) {156 u = u % scalar;157 return u;158 }159 vec3(T) ?%?(vec3(T) u, vec3(T) v) {160 return [u.x % v.x, u.y % v.y, u.z % v.z];161 }162 vec3(T)& ?%=?(vec3(T)& u, vec3(T) v) {163 u = u % v;164 return u;165 }152 forall( | { T ?%?( T,T ); }) { 153 vec3( T ) ?%?( vec3( T ) v, T scalar ) with ( v ) { 154 return [x % scalar, y % scalar, z % scalar]; 155 } 156 vec3( T )& ?%=?( vec3( T )& u, T scalar ) { 157 u = u % scalar; 158 return u; 159 } 160 vec3( T ) ?%?( vec3( T ) u, vec3( T ) v ) { 161 return [u.x % v.x, u.y % v.y, u.z % v.z]; 162 } 163 vec3( T )& ?%=?( vec3( T )& u, vec3( T ) v ) { 164 u = u % v; 165 return u; 166 } 166 167 } 167 168 168 169 // & 169 forall( | { T ?&?(T,T); }) {170 vec3(T) ?&?(vec3(T) v, T scalar) with (v) {171 return [x & scalar, y & scalar, z & scalar];172 }173 vec3(T)& ?&=?(vec3(T)& u, T scalar) {174 u = u & scalar;175 return u;176 }177 vec3(T) ?&?(vec3(T) u, vec3(T) v) {178 return [u.x & v.x, u.y & v.y, u.z & v.z];179 }180 vec3(T)& ?&=?(vec3(T)& u, vec3(T) v) {181 u = u & v;182 return u;183 }170 forall( | { T ?&?( T,T ); }) { 171 vec3( T ) ?&?( vec3( T ) v, T scalar ) with ( v ) { 172 return [x & scalar, y & scalar, z & scalar]; 173 } 174 vec3( T )& ?&=?( vec3( T )& u, T scalar ) { 175 u = u & scalar; 176 return u; 177 } 178 vec3( T ) ?&?( vec3( T ) u, vec3( T ) v ) { 179 return [u.x & v.x, u.y & v.y, u.z & v.z]; 180 } 181 vec3( T )& ?&=?( vec3( T )& u, vec3( T ) v ) { 182 u = u & v; 183 return u; 184 } 184 185 } 185 186 186 187 // | 187 forall( | { T ?|?(T,T); }) {188 vec3(T) ?|?(vec3(T) v, T scalar) with (v) {189 return [x | scalar, y | scalar, z | scalar];190 }191 vec3(T)& ?|=?(vec3(T)& u, T scalar) {192 u = u | scalar;193 return u;194 }195 vec3(T) ?|?(vec3(T) u, vec3(T) v) {196 return [u.x | v.x, u.y | v.y, u.z | v.z];197 }198 vec3(T)& ?|=?(vec3(T)& u, vec3(T) v) {199 u = u | v;200 return u;201 }188 forall( | { T ?|?( T,T ); }) { 189 vec3( T ) ?|?( vec3( T ) v, T scalar ) with ( v ) { 190 return [x | scalar, y | scalar, z | scalar]; 191 } 192 vec3( T )& ?|=?( vec3( T )& u, T scalar ) { 193 u = u | scalar; 194 return u; 195 } 196 vec3( T ) ?|?( vec3( T ) u, vec3( T ) v ) { 197 return [u.x | v.x, u.y | v.y, u.z | v.z]; 198 } 199 vec3( T )& ?|=?( vec3( T )& u, vec3( T ) v ) { 200 u = u | v; 201 return u; 202 } 202 203 } 203 204 204 205 // ^ 205 forall( | { T ?^?(T,T); }) {206 vec3(T) ?^?(vec3(T) v, T scalar) with (v) {207 return [x ^ scalar, y ^ scalar, z ^ scalar];208 }209 vec3(T)& ?^=?(vec3(T)& u, T scalar) {210 u = u ^ scalar;211 return u;212 }213 vec3(T) ?^?(vec3(T) u, vec3(T) v) {214 return [u.x ^ v.x, u.y ^ v.y, u.z ^ v.z];215 }216 vec3(T)& ?^=?(vec3(T)& u, vec3(T) v) {217 u = u ^ v;218 return u;219 }206 forall( | { T ?^?( T,T ); }) { 207 vec3( T ) ?^?( vec3( T ) v, T scalar ) with ( v ) { 208 return [x ^ scalar, y ^ scalar, z ^ scalar]; 209 } 210 vec3( T )& ?^=?( vec3( T )& u, T scalar ) { 211 u = u ^ scalar; 212 return u; 213 } 214 vec3( T ) ?^?( vec3( T ) u, vec3( T ) v ) { 215 return [u.x ^ v.x, u.y ^ v.y, u.z ^ v.z]; 216 } 217 vec3( T )& ?^=?( vec3( T )& u, vec3( T ) v ) { 218 u = u ^ v; 219 return u; 220 } 220 221 } 221 222 222 223 // << 223 forall( | { T ?<<?(T,T); }) {224 vec3(T) ?<<?(vec3(T) v, T scalar) with (v) {225 return [x << scalar, y << scalar, z << scalar];226 }227 vec3(T)& ?<<=?(vec3(T)& u, T scalar) {228 u = u << scalar;229 return u;230 }231 vec3(T) ?<<?(vec3(T) u, vec3(T) v) {232 return [u.x << v.x, u.y << v.y, u.z << v.z];233 }234 vec3(T)& ?<<=?(vec3(T)& u, vec3(T) v) {235 u = u << v;236 return u;237 }224 forall( | { T ?<<?( T,T ); }) { 225 vec3( T ) ?<<?( vec3( T ) v, T scalar ) with ( v ) { 226 return [x << scalar, y << scalar, z << scalar]; 227 } 228 vec3( T )& ?<<=?( vec3( T )& u, T scalar ) { 229 u = u << scalar; 230 return u; 231 } 232 vec3( T ) ?<<?( vec3( T ) u, vec3( T ) v ) { 233 return [u.x << v.x, u.y << v.y, u.z << v.z]; 234 } 235 vec3( T )& ?<<=?( vec3( T )& u, vec3( T ) v ) { 236 u = u << v; 237 return u; 238 } 238 239 } 239 240 240 241 // >> 241 forall( | { T ?>>?(T,T); }) {242 vec3(T) ?>>?(vec3(T) v, T scalar) with (v) {243 return [x >> scalar, y >> scalar, z >> scalar];244 }245 vec3(T)& ?>>=?(vec3(T)& u, T scalar) {246 u = u >> scalar;247 return u;248 }249 vec3(T) ?>>?(vec3(T) u, vec3(T) v) {250 return [u.x >> v.x, u.y >> v.y, u.z >> v.z];251 }252 vec3(T)& ?>>=?(vec3(T)& u, vec3(T) v) {253 u = u >> v;254 return u;255 }242 forall( | { T ?>>?( T,T ); }) { 243 vec3( T ) ?>>?( vec3( T ) v, T scalar ) with ( v ) { 244 return [x >> scalar, y >> scalar, z >> scalar]; 245 } 246 vec3( T )& ?>>=?( vec3( T )& u, T scalar ) { 247 u = u >> scalar; 248 return u; 249 } 250 vec3( T ) ?>>?( vec3( T ) u, vec3( T ) v ) { 251 return [u.x >> v.x, u.y >> v.y, u.z >> v.z]; 252 } 253 vec3( T )& ?>>=?( vec3( T )& u, vec3( T ) v ) { 254 u = u >> v; 255 return u; 256 } 256 257 } 257 258 258 259 // ~ 259 forall( | { T ~?(T); })260 vec3(T) ~?(vec3(T) v) with (v) {260 forall( | { T ~?( T ); }) 261 vec3( T ) ~?( vec3( T ) v ) with ( v ) { 261 262 return [~v.x, ~v.y, ~v.z]; 262 263 } 263 264 264 265 // relational 265 forall( | equality(T)) {266 bool ?==?(vec3(T) u, vec3(T) v) with (u) {267 return x == v.x && y == v.y && z == v.z;268 }269 bool ?!=?(vec3(T) u, vec3(T) v) {270 return !(u == v);271 }266 forall( | equality( T ) ) { 267 bool ?==?( vec3( T ) u, vec3( T ) v ) with ( u ) { 268 return x == v.x && y == v.y && z == v.z; 269 } 270 bool ?!=?( vec3( T ) u, vec3( T ) v ) { 271 return !( u == v ); 272 } 272 273 } 273 274 274 275 // Geometric functions 275 forall( | add(T) | multiply(T))276 T dot(vec3(T) u, vec3(T) v) {276 forall( | add( T ) | multiply( T ) ) 277 T dot( vec3( T ) u, vec3( T ) v ) { 277 278 return u.x * v.x + u.y * v.y + u.z * v.z; 278 279 } 279 280 280 forall(| subtract(T) | multiply(T)) 281 vec3(T) cross(vec3(T) u, vec3(T) v) { 282 return (vec3(T)){ u.y * v.z - v.y * u.z, 283 u.z * v.x - v.z * u.x, 284 u.x * v.y - v.x * u.y }; 285 } 286 287 } // static inline 281 forall( | subtract( T ) | multiply( T ) ) 282 vec3( T ) cross( vec3( T ) u, vec3( T ) v ) { 283 return ( vec3( T ) ){ u.y * v.z - v.y * u.z, 284 u.z * v.x - v.z * u.x, 285 u.x * v.y - v.x * u.y }; 286 } 288 287 } 289 288 290 forall( ostype &, T | writeable(T, ostype)) {291 ostype & ?|?( ostype & os, vec3(T) v) with (v) {289 forall( ostype &, T | writeable( T, ostype ) ) { 290 ostype & ?|?( ostype & os, vec3( T ) v ) with ( v ) { 292 291 return os | '<' | x | ',' | y | ',' | z | '>'; 293 292 } 294 OSTYPE_VOID_IMPL( os, vec3( T) )293 OSTYPE_VOID_IMPL( os, vec3( T ) ) 295 294 } -
libcfa/src/vec/vec4.hfa
rf41b161 rc62013e 19 19 #include "vec.hfa" 20 20 21 forall (T) {21 forall( T ) { 22 22 struct vec4 { 23 23 T x, y, z, w; … … 25 25 } 26 26 27 forall (T) { 28 static inline { 29 30 void ?{}(vec4(T)& v, T x, T y, T z, T w) { 27 static inline forall( T ) { 28 void ?{}( vec4( T )& v, T x, T y, T z, T w ) { 31 29 v.[x, y, z, w] = [x, y, z, w]; 32 30 } 33 31 34 forall( | zero_assign(T))35 void ?{}( vec4(T)& vec, zero_t) with (vec) {32 forall( | zero_assign( T ) ) 33 void ?{}( vec4( T )& vec, zero_t ) with ( vec ) { 36 34 x = y = z = w = 0; 37 35 } 38 36 39 void ?{}( vec4(T)& vec, T val) with (vec) {37 void ?{}( vec4( T )& vec, T val ) with ( vec ) { 40 38 x = y = z = w = val; 41 39 } 42 40 43 void ?{}( vec4(T)& vec, vec4(T) other) with (vec) {41 void ?{}( vec4( T )& vec, vec4( T ) other ) with ( vec ) { 44 42 [x,y,z,w] = other.[x,y,z,w]; 45 43 } 46 44 47 void ?=?( vec4(T)& vec, vec4(T) other) with (vec) {45 void ?=?( vec4( T )& vec, vec4( T ) other ) with ( vec ) { 48 46 [x,y,z,w] = other.[x,y,z,w]; 49 47 } 50 forall(| zero_assign(T)) 51 void ?=?(vec4(T)& vec, zero_t) with (vec) { 48 49 forall( | zero_assign( T ) ) 50 void ?=?( vec4( T )& vec, zero_t ) with ( vec ) { 52 51 x = y = z = w = 0; 53 52 } … … 56 55 57 56 // - 58 forall(| subtract(T)) { 59 vec4(T) ?-?(vec4(T) u, vec4(T) v) { 60 return [u.x - v.x, u.y - v.y, u.z - v.z, u.w - v.w]; 61 } 62 vec4(T)& ?-=?(vec4(T)& u, vec4(T) v) { 63 u = u - v; 64 return u; 65 } 66 } 67 forall(| negate(T)) { 68 vec4(T) -?(vec4(T) v) with (v) { 69 return [-x, -y, -z, -w]; 70 } 71 } 72 forall(| { T --?(T&); }) { 73 vec4(T)& --?(vec4(T)& v) { 74 --v.x; 75 --v.y; 76 --v.z; 77 --v.w; 78 return v; 79 } 80 vec4(T) ?--(vec4(T)& v) { 81 vec4(T) copy = v; 82 --v; 83 return copy; 84 } 57 forall( | subtract( T ) ) { 58 vec4( T ) ?-?( vec4( T ) u, vec4( T ) v ) { 59 return [u.x - v.x, u.y - v.y, u.z - v.z, u.w - v.w]; 60 } 61 vec4( T )& ?-=?( vec4( T )& u, vec4( T ) v ) { 62 u = u - v; 63 return u; 64 } 65 } 66 67 forall( | negate( T ) ) { 68 vec4( T ) -?( vec4( T ) v ) with ( v ) { 69 return [-x, -y, -z, -w]; 70 } 71 } 72 forall( | { T --?( T&); }) { 73 vec4( T )& --?( vec4( T )& v ) { 74 --v.x; 75 --v.y; 76 --v.z; 77 --v.w; 78 return v; 79 } 80 vec4( T ) ?--( vec4( T )& v ) { 81 vec4( T ) copy = v; 82 --v; 83 return copy; 84 } 85 85 } 86 86 87 87 // + 88 forall( | add(T)) {89 vec4(T) ?+?(vec4(T) u, vec4(T) v) {90 return [u.x + v.x, u.y + v.y, u.z + v.z, u.w + v.w];91 }92 vec4(T)& ?+=?(vec4(T)& u, vec4(T) v) {93 u = u + v;94 return u;95 }96 } 97 98 forall( | { T ++?(T&); }) {99 vec4(T)& ++?(vec4(T)& v) {100 ++v.x;101 ++v.y;102 ++v.z;103 ++v.w;104 return v;105 }106 vec4(T) ?++(vec4(T)& v) {107 vec4(T) copy = v;108 ++v;109 return copy;110 }88 forall( | add( T ) ) { 89 vec4( T ) ?+?( vec4( T ) u, vec4( T ) v ) { 90 return [u.x + v.x, u.y + v.y, u.z + v.z, u.w + v.w]; 91 } 92 vec4( T )& ?+=?( vec4( T )& u, vec4( T ) v ) { 93 u = u + v; 94 return u; 95 } 96 } 97 98 forall( | { T ++?( T&); }) { 99 vec4( T )& ++?( vec4( T )& v ) { 100 ++v.x; 101 ++v.y; 102 ++v.z; 103 ++v.w; 104 return v; 105 } 106 vec4( T ) ?++( vec4( T )& v ) { 107 vec4( T ) copy = v; 108 ++v; 109 return copy; 110 } 111 111 } 112 112 113 113 // * 114 forall( | multiply(T)) {115 vec4(T) ?*?(vec4(T) v, T scalar) with (v) {116 return [x * scalar, y * scalar, z * scalar, w * scalar];117 }118 vec4(T) ?*?(T scalar, vec4(T) v) {119 return v * scalar;120 }121 vec4(T) ?*?(vec4(T) u, vec4(T) v) {122 return [u.x * v.x, u.y * v.y, u.z * v.z, u.w * v.w];123 }124 vec4(T)& ?*=?(vec4(T)& v, T scalar) {125 v = v * scalar;126 return v;127 }128 vec4(T)& ?*=?(vec4(T)& u, vec4(T) v) {129 u = u * v;130 return u;131 }114 forall( | multiply( T ) ) { 115 vec4( T ) ?*?( vec4( T ) v, T scalar ) with ( v ) { 116 return [x * scalar, y * scalar, z * scalar, w * scalar]; 117 } 118 vec4( T ) ?*?( T scalar, vec4( T ) v ) { 119 return v * scalar; 120 } 121 vec4( T ) ?*?( vec4( T ) u, vec4( T ) v ) { 122 return [u.x * v.x, u.y * v.y, u.z * v.z, u.w * v.w]; 123 } 124 vec4( T )& ?*=?( vec4( T )& v, T scalar ) { 125 v = v * scalar; 126 return v; 127 } 128 vec4( T )& ?*=?( vec4( T )& u, vec4( T ) v ) { 129 u = u * v; 130 return u; 131 } 132 132 } 133 133 134 134 // / 135 forall( | divide(T)) {136 vec4( T) ?/?(vec4(T) v, T scalar) with (v) {135 forall( | divide( T ) ) { 136 vec4( T ) ?/?( vec4( T ) v, T scalar ) with ( v ) { 137 137 return [x / scalar, y / scalar, z / scalar, w / scalar]; 138 138 } 139 vec4( T) ?/?(vec4(T) u, vec4(T) v) {139 vec4( T ) ?/?( vec4( T ) u, vec4( T ) v ) { 140 140 return [u.x / v.x, u.y / v.y, u.z / v.z, u.w / v.w]; 141 141 } 142 vec4( T)& ?/=?(vec4(T)& v, T scalar) {142 vec4( T )& ?/=?( vec4( T )& v, T scalar ) { 143 143 v = v / scalar; 144 144 return v; 145 145 } 146 vec4( T)& ?/=?(vec4(T)& u, vec4(T) v) {146 vec4( T )& ?/=?( vec4( T )& u, vec4( T ) v ) { 147 147 u = u / v; 148 148 return u; … … 151 151 152 152 // % 153 forall( | { T ?%?(T,T); }) {154 vec4(T) ?%?(vec4(T) v, T scalar) with (v) {155 return [x % scalar, y % scalar, z % scalar, w % scalar];156 }157 vec4(T)& ?%=?(vec4(T)& u, T scalar) {158 u = u % scalar;159 return u;160 }161 vec4(T) ?%?(vec4(T) u, vec4(T) v) {162 return [u.x % v.x, u.y % v.y, u.z % v.z, u.w % v.w];163 }164 vec4(T)& ?%=?(vec4(T)& u, vec4(T) v) {165 u = u % v;166 return u;167 }153 forall( | { T ?%?( T,T ); }) { 154 vec4( T ) ?%?( vec4( T ) v, T scalar ) with ( v ) { 155 return [x % scalar, y % scalar, z % scalar, w % scalar]; 156 } 157 vec4( T )& ?%=?( vec4( T )& u, T scalar ) { 158 u = u % scalar; 159 return u; 160 } 161 vec4( T ) ?%?( vec4( T ) u, vec4( T ) v ) { 162 return [u.x % v.x, u.y % v.y, u.z % v.z, u.w % v.w]; 163 } 164 vec4( T )& ?%=?( vec4( T )& u, vec4( T ) v ) { 165 u = u % v; 166 return u; 167 } 168 168 } 169 169 170 170 // & 171 forall( | { T ?&?(T,T); }) {172 vec4(T) ?&?(vec4(T) v, T scalar) with (v) {173 return [x & scalar, y & scalar, z & scalar, w & scalar];174 }175 vec4(T)& ?&=?(vec4(T)& u, T scalar) {176 u = u & scalar;177 return u;178 }179 vec4(T) ?&?(vec4(T) u, vec4(T) v) {180 return [u.x & v.x, u.y & v.y, u.z & v.z, u.w & v.w];181 }182 vec4(T)& ?&=?(vec4(T)& u, vec4(T) v) {183 u = u & v;184 return u;185 }171 forall( | { T ?&?( T,T ); }) { 172 vec4( T ) ?&?( vec4( T ) v, T scalar ) with ( v ) { 173 return [x & scalar, y & scalar, z & scalar, w & scalar]; 174 } 175 vec4( T )& ?&=?( vec4( T )& u, T scalar ) { 176 u = u & scalar; 177 return u; 178 } 179 vec4( T ) ?&?( vec4( T ) u, vec4( T ) v ) { 180 return [u.x & v.x, u.y & v.y, u.z & v.z, u.w & v.w]; 181 } 182 vec4( T )& ?&=?( vec4( T )& u, vec4( T ) v ) { 183 u = u & v; 184 return u; 185 } 186 186 } 187 187 188 188 // | 189 forall( | { T ?|?(T,T); }) {190 vec4(T) ?|?(vec4(T) v, T scalar) with (v) {191 return [x | scalar, y | scalar, z | scalar, w | scalar];192 }193 vec4(T)& ?|=?(vec4(T)& u, T scalar) {194 u = u | scalar;195 return u;196 }197 vec4(T) ?|?(vec4(T) u, vec4(T) v) {198 return [u.x | v.x, u.y | v.y, u.z | v.z, u.w | v.w];199 }200 vec4(T)& ?|=?(vec4(T)& u, vec4(T) v) {201 u = u | v;202 return u;203 }189 forall( | { T ?|?( T,T ); }) { 190 vec4( T ) ?|?( vec4( T ) v, T scalar ) with ( v ) { 191 return [x | scalar, y | scalar, z | scalar, w | scalar]; 192 } 193 vec4( T )& ?|=?( vec4( T )& u, T scalar ) { 194 u = u | scalar; 195 return u; 196 } 197 vec4( T ) ?|?( vec4( T ) u, vec4( T ) v ) { 198 return [u.x | v.x, u.y | v.y, u.z | v.z, u.w | v.w]; 199 } 200 vec4( T )& ?|=?( vec4( T )& u, vec4( T ) v ) { 201 u = u | v; 202 return u; 203 } 204 204 } 205 205 206 206 // ^ 207 forall( | { T ?^?(T,T); }) {208 vec4(T) ?^?(vec4(T) v, T scalar) with (v) {209 return [x ^ scalar, y ^ scalar, z ^ scalar, w ^ scalar];210 }211 vec4(T)& ?^=?(vec4(T)& u, T scalar) {212 u = u ^ scalar;213 return u;214 }215 vec4(T) ?^?(vec4(T) u, vec4(T) v) {216 return [u.x ^ v.x, u.y ^ v.y, u.z ^ v.z, u.w ^ v.w];217 }218 vec4(T)& ?^=?(vec4(T)& u, vec4(T) v) {219 u = u ^ v;220 return u;221 }207 forall( | { T ?^?( T,T ); }) { 208 vec4( T ) ?^?( vec4( T ) v, T scalar ) with ( v ) { 209 return [x ^ scalar, y ^ scalar, z ^ scalar, w ^ scalar]; 210 } 211 vec4( T )& ?^=?( vec4( T )& u, T scalar ) { 212 u = u ^ scalar; 213 return u; 214 } 215 vec4( T ) ?^?( vec4( T ) u, vec4( T ) v ) { 216 return [u.x ^ v.x, u.y ^ v.y, u.z ^ v.z, u.w ^ v.w]; 217 } 218 vec4( T )& ?^=?( vec4( T )& u, vec4( T ) v ) { 219 u = u ^ v; 220 return u; 221 } 222 222 } 223 223 224 224 // << 225 forall( | { T ?<<?(T,T); }) {226 vec4(T) ?<<?(vec4(T) v, T scalar) with (v) {227 return [x << scalar, y << scalar, z << scalar, w << scalar];228 }229 vec4(T)& ?<<=?(vec4(T)& u, T scalar) {230 u = u << scalar;231 return u;232 }233 vec4(T) ?<<?(vec4(T) u, vec4(T) v) {234 return [u.x << v.x, u.y << v.y, u.z << v.z, u.w << v.w];235 }236 vec4(T)& ?<<=?(vec4(T)& u, vec4(T) v) {237 u = u << v;238 return u;239 }225 forall( | { T ?<<?( T,T ); }) { 226 vec4( T ) ?<<?( vec4( T ) v, T scalar ) with ( v ) { 227 return [x << scalar, y << scalar, z << scalar, w << scalar]; 228 } 229 vec4( T )& ?<<=?( vec4( T )& u, T scalar ) { 230 u = u << scalar; 231 return u; 232 } 233 vec4( T ) ?<<?( vec4( T ) u, vec4( T ) v ) { 234 return [u.x << v.x, u.y << v.y, u.z << v.z, u.w << v.w]; 235 } 236 vec4( T )& ?<<=?( vec4( T )& u, vec4( T ) v ) { 237 u = u << v; 238 return u; 239 } 240 240 } 241 241 242 242 // >> 243 forall( | { T ?>>?(T,T); }) {244 vec4(T) ?>>?(vec4(T) v, T scalar) with (v) {245 return [x >> scalar, y >> scalar, z >> scalar, w >> scalar];246 }247 vec4(T)& ?>>=?(vec4(T)& u, T scalar) {248 u = u >> scalar;249 return u;250 }251 vec4(T) ?>>?(vec4(T) u, vec4(T) v) {252 return [u.x >> v.x, u.y >> v.y, u.z >> v.z, u.w >> v.w];253 }254 vec4(T)& ?>>=?(vec4(T)& u, vec4(T) v) {255 u = u >> v;256 return u;257 }243 forall( | { T ?>>?( T,T ); }) { 244 vec4( T ) ?>>?( vec4( T ) v, T scalar ) with ( v ) { 245 return [x >> scalar, y >> scalar, z >> scalar, w >> scalar]; 246 } 247 vec4( T )& ?>>=?( vec4( T )& u, T scalar ) { 248 u = u >> scalar; 249 return u; 250 } 251 vec4( T ) ?>>?( vec4( T ) u, vec4( T ) v ) { 252 return [u.x >> v.x, u.y >> v.y, u.z >> v.z, u.w >> v.w]; 253 } 254 vec4( T )& ?>>=?( vec4( T )& u, vec4( T ) v ) { 255 u = u >> v; 256 return u; 257 } 258 258 } 259 259 260 260 // ~ 261 forall( | { T ~?(T); })262 vec4( T) ~?(vec4(T) v) with (v) {261 forall( | { T ~?( T ); }) 262 vec4( T ) ~?( vec4( T ) v ) with ( v ) { 263 263 return [~x, ~y, ~z, ~w]; 264 264 } 265 265 266 266 // relational 267 forall( | equality(T)) {268 bool ?==?(vec4(T) u, vec4(T) v) with (u) {269 return x == v.x && y == v.y && z == v.z && w == v.w;270 }271 bool ?!=?(vec4(T) u, vec4(T) v) {272 return !(u == v);273 }267 forall( | equality( T ) ) { 268 bool ?==?( vec4( T ) u, vec4( T ) v ) with ( u ) { 269 return x == v.x && y == v.y && z == v.z && w == v.w; 270 } 271 bool ?!=?( vec4( T ) u, vec4( T ) v ) { 272 return !( u == v ); 273 } 274 274 } 275 275 276 276 // Geometric functions 277 forall( | add(T) | multiply(T))278 T dot( vec4(T) u, vec4(T) v) {277 forall( | add( T ) | multiply( T ) ) 278 T dot( vec4( T ) u, vec4( T ) v ) { 279 279 return u.x * v.x + u.y * v.y + u.z * v.z + u.w * v.w; 280 280 } 281 282 } // static inline283 281 } 284 282 285 forall( ostype &, T | writeable(T, ostype)) {286 ostype & ?|?( ostype & os, vec4(T) v) with (v) {283 forall( ostype &, T | writeable( T, ostype ) ) { 284 ostype & ?|?( ostype & os, vec4( T ) v ) with ( v ) { 287 285 return os | '<' | x | ',' | y | ',' | z | ',' | w | '>'; 288 286 } 289 OSTYPE_VOID_IMPL( os, vec4( T) )287 OSTYPE_VOID_IMPL( os, vec4( T ) ) 290 288 } 291 -
tests/enum_tests/planet.cfa
rf41b161 rc62013e 36 36 37 37 // Planet rp = fromInt( prng( countof( Planet ) ) ); // select random orbiting body 38 39 #pragma GCC diagnostic push 40 // FIX ME: false positive with gcc > 11, so disable. 41 #pragma GCC diagnostic ignored "-Wdangling-pointer" 38 42 Planet rp = fromInt( countof( Planet ) - 1 ); // non-random for test suite 43 #pragma GCC diagnostic pop 44 39 45 choose( rp ) { // implicit breaks 40 46 case MERCURY, VENUS, EARTH, MARS:
Note:
See TracChangeset
for help on using the changeset viewer.