| [eef8dfb] | 1 | //
 | 
|---|
 | 2 | // Cforall Version 1.0.0 Copyright (C) 2021 University of Waterloo
 | 
|---|
 | 3 | //
 | 
|---|
 | 4 | // The contents of this file are covered under the licence agreement in the
 | 
|---|
 | 5 | // file "LICENCE" distributed with Cforall.
 | 
|---|
 | 6 | //
 | 
|---|
 | 7 | // io/types.hfa --
 | 
|---|
 | 8 | //
 | 
|---|
 | 9 | // Author           : Dimitry Kobets
 | 
|---|
 | 10 | // Created On       :
 | 
|---|
 | 11 | // Last Modified By :
 | 
|---|
 | 12 | // Last Modified On :
 | 
|---|
 | 13 | // Update Count     :
 | 
|---|
 | 14 | //
 | 
|---|
 | 15 | 
 | 
|---|
| [746157e] | 16 | #pragma once
 | 
|---|
 | 17 | 
 | 
|---|
 | 18 | #include <iostream.hfa>
 | 
|---|
 | 19 | #include "vec.hfa"
 | 
|---|
 | 20 | 
 | 
|---|
| [fd54fef] | 21 | forall (T) {
 | 
|---|
| [746157e] | 22 |     struct vec4 {
 | 
|---|
 | 23 |         T x, y, z, w;
 | 
|---|
 | 24 |     };
 | 
|---|
 | 25 | }
 | 
|---|
 | 26 | 
 | 
|---|
| [fd54fef] | 27 | forall (T) {
 | 
|---|
| [746157e] | 28 |     static inline {
 | 
|---|
 | 29 | 
 | 
|---|
 | 30 |     void ?{}(vec4(T)& v, T x, T y, T z, T w) {
 | 
|---|
 | 31 |         v.[x, y, z, w] = [x, y, z, w];
 | 
|---|
 | 32 |     }
 | 
|---|
 | 33 | 
 | 
|---|
 | 34 |     forall(| zero_assign(T))
 | 
|---|
 | 35 |     void ?{}(vec4(T)& vec, zero_t) with (vec) {
 | 
|---|
 | 36 |         x = y = z = w = 0;
 | 
|---|
 | 37 |     }
 | 
|---|
 | 38 | 
 | 
|---|
 | 39 |     void ?{}(vec4(T)& vec, T val) with (vec) {
 | 
|---|
 | 40 |         x = y = z = w = val;
 | 
|---|
 | 41 |     }
 | 
|---|
 | 42 | 
 | 
|---|
 | 43 |     void ?{}(vec4(T)& vec, vec4(T) other) with (vec) {
 | 
|---|
 | 44 |         [x,y,z,w] = other.[x,y,z,w];
 | 
|---|
 | 45 |     }
 | 
|---|
 | 46 | 
 | 
|---|
 | 47 |     void ?=?(vec4(T)& vec, vec4(T) other) with (vec) {
 | 
|---|
 | 48 |         [x,y,z,w] = other.[x,y,z,w];
 | 
|---|
 | 49 |     }
 | 
|---|
 | 50 |     forall(| zero_assign(T))
 | 
|---|
 | 51 |     void ?=?(vec4(T)& vec, zero_t) with (vec) {
 | 
|---|
 | 52 |         x = y = z = w = 0;
 | 
|---|
 | 53 |     }
 | 
|---|
 | 54 | 
 | 
|---|
 | 55 |     // Primitive mathematical operations
 | 
|---|
 | 56 | 
 | 
|---|
| [94df8de] | 57 |     // -
 | 
|---|
| [746157e] | 58 |     forall(| subtract(T)) {
 | 
|---|
| [250dbae] | 59 |     vec4(T) ?-?(vec4(T) u, vec4(T) v) {
 | 
|---|
| [746157e] | 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 |     }
 | 
|---|
| [94df8de] | 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 |     }
 | 
|---|
 | 86 | 
 | 
|---|
 | 87 |     // +
 | 
|---|
| [746157e] | 88 |     forall(| add(T)) {
 | 
|---|
| [94df8de] | 89 |     vec4(T) ?+?(vec4(T) u, vec4(T) v) {
 | 
|---|
| [746157e] | 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 | 
 | 
|---|
| [94df8de] | 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 |     }
 | 
|---|
 | 112 | 
 | 
|---|
 | 113 |     // *
 | 
|---|
| [746157e] | 114 |     forall(| multiply(T)) {
 | 
|---|
| [250dbae] | 115 |     vec4(T) ?*?(vec4(T) v, T scalar) with (v) {
 | 
|---|
| [746157e] | 116 |         return [x * scalar, y * scalar, z * scalar, w * scalar];
 | 
|---|
 | 117 |     }
 | 
|---|
| [250dbae] | 118 |     vec4(T) ?*?(T scalar, vec4(T) v) {
 | 
|---|
| [746157e] | 119 |         return v * scalar;
 | 
|---|
 | 120 |     }
 | 
|---|
| [94df8de] | 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 |     }
 | 
|---|
| [746157e] | 124 |     vec4(T)& ?*=?(vec4(T)& v, T scalar) {
 | 
|---|
 | 125 |         v = v * scalar;
 | 
|---|
 | 126 |         return v;
 | 
|---|
 | 127 |     }
 | 
|---|
| [94df8de] | 128 |     vec4(T)& ?*=?(vec4(T)& u, vec4(T) v) {
 | 
|---|
 | 129 |         u = u * v;
 | 
|---|
 | 130 |         return u;
 | 
|---|
 | 131 |     }
 | 
|---|
| [746157e] | 132 |     }
 | 
|---|
 | 133 | 
 | 
|---|
| [250dbae] | 134 |     // /
 | 
|---|
| [746157e] | 135 |     forall(| divide(T)) {
 | 
|---|
 | 136 |     vec4(T) ?/?(vec4(T) v, T scalar) with (v) {
 | 
|---|
 | 137 |         return [x / scalar, y / scalar, z / scalar, w / scalar];
 | 
|---|
 | 138 |     }
 | 
|---|
| [94df8de] | 139 |     vec4(T) ?/?(vec4(T) u, vec4(T) v) {
 | 
|---|
 | 140 |         return [u.x / v.x, u.y / v.y, u.z / v.z, u.w / v.w];
 | 
|---|
 | 141 |     }
 | 
|---|
| [250dbae] | 142 |     vec4(T)& ?/=?(vec4(T)& v, T scalar) {
 | 
|---|
| [746157e] | 143 |         v = v / scalar;
 | 
|---|
 | 144 |         return v;
 | 
|---|
 | 145 |     }
 | 
|---|
| [94df8de] | 146 |     vec4(T)& ?/=?(vec4(T)& u, vec4(T) v) {
 | 
|---|
 | 147 |         u = u / v;
 | 
|---|
 | 148 |         return u;
 | 
|---|
 | 149 |     }
 | 
|---|
 | 150 |     }
 | 
|---|
 | 151 | 
 | 
|---|
 | 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 |     }
 | 
|---|
 | 168 |     }
 | 
|---|
 | 169 | 
 | 
|---|
 | 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 |     }
 | 
|---|
 | 186 |     }
 | 
|---|
 | 187 | 
 | 
|---|
 | 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 |     }
 | 
|---|
 | 204 |     }
 | 
|---|
 | 205 | 
 | 
|---|
 | 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 |     }
 | 
|---|
 | 222 |     }
 | 
|---|
 | 223 | 
 | 
|---|
 | 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 |     }
 | 
|---|
 | 240 |     }
 | 
|---|
 | 241 | 
 | 
|---|
 | 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 |     }
 | 
|---|
 | 258 |     }
 | 
|---|
 | 259 | 
 | 
|---|
 | 260 |     // ~
 | 
|---|
 | 261 |     forall(| { T ~?(T); })
 | 
|---|
 | 262 |     vec4(T) ~?(vec4(T) v) with (v) {
 | 
|---|
 | 263 |         return [~x, ~y, ~z, ~w];
 | 
|---|
| [746157e] | 264 |     }
 | 
|---|
 | 265 | 
 | 
|---|
| [250dbae] | 266 |     // relational
 | 
|---|
| [746157e] | 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 |     }
 | 
|---|
 | 275 | 
 | 
|---|
 | 276 |     // Geometric functions
 | 
|---|
 | 277 |     forall(| add(T) | multiply(T))
 | 
|---|
 | 278 |     T dot(vec4(T) u, vec4(T) v) {
 | 
|---|
 | 279 |         return u.x * v.x + u.y * v.y + u.z * v.z + u.w * v.w;
 | 
|---|
 | 280 |     }
 | 
|---|
 | 281 | 
 | 
|---|
 | 282 |     } // static inline
 | 
|---|
 | 283 | }
 | 
|---|
 | 284 | 
 | 
|---|
| [fd54fef] | 285 | forall(ostype &, T | writeable(T, ostype)) {
 | 
|---|
| [746157e] | 286 |     ostype & ?|?(ostype & os, vec4(T) v) with (v) {
 | 
|---|
 | 287 |         return os | '<' | x | ',' | y | ',' | z | ',' | w | '>';
 | 
|---|
 | 288 |     }
 | 
|---|
 | 289 |     void ?|?(ostype & os, vec4(T) v ) with (v) {
 | 
|---|
 | 290 |         (ostype &)(os | v); ends(os);
 | 
|---|
 | 291 |     }
 | 
|---|
 | 292 | }
 | 
|---|
 | 293 | 
 | 
|---|