istereo2

annotate libs/vmath/vector.inl @ 13:ea928c313344

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 28 Sep 2015 19:04:50 +0300
parents
children
rev   line source
nuclear@2 1 /*
nuclear@2 2 libvmath - a vector math library
nuclear@2 3 Copyright (C) 2004-2011 John Tsiombikas <nuclear@member.fsf.org>
nuclear@2 4
nuclear@2 5 This program is free software: you can redistribute it and/or modify
nuclear@2 6 it under the terms of the GNU Lesser General Public License as published
nuclear@2 7 by the Free Software Foundation, either version 3 of the License, or
nuclear@2 8 (at your option) any later version.
nuclear@2 9
nuclear@2 10 This program is distributed in the hope that it will be useful,
nuclear@2 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
nuclear@2 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nuclear@2 13 GNU Lesser General Public License for more details.
nuclear@2 14
nuclear@2 15 You should have received a copy of the GNU Lesser General Public License
nuclear@2 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
nuclear@2 17 */
nuclear@2 18
nuclear@2 19 #include <math.h>
nuclear@2 20
nuclear@2 21 #ifdef __cplusplus
nuclear@2 22 extern "C" {
nuclear@2 23 #endif /* __cplusplus */
nuclear@2 24
nuclear@2 25 /* C 2D vector functions */
nuclear@2 26 static inline vec2_t v2_cons(scalar_t x, scalar_t y)
nuclear@2 27 {
nuclear@2 28 vec2_t v;
nuclear@2 29 v.x = x;
nuclear@2 30 v.y = y;
nuclear@2 31 return v;
nuclear@2 32 }
nuclear@2 33
nuclear@2 34 static inline void v2_print(FILE *fp, vec2_t v)
nuclear@2 35 {
nuclear@2 36 fprintf(fp, "[ %.4f %.4f ]", v.x, v.y);
nuclear@2 37 }
nuclear@2 38
nuclear@2 39 static inline vec2_t v2_add(vec2_t v1, vec2_t v2)
nuclear@2 40 {
nuclear@2 41 vec2_t res;
nuclear@2 42 res.x = v1.x + v2.x;
nuclear@2 43 res.y = v1.y + v2.y;
nuclear@2 44 return res;
nuclear@2 45 }
nuclear@2 46
nuclear@2 47 static inline vec2_t v2_sub(vec2_t v1, vec2_t v2)
nuclear@2 48 {
nuclear@2 49 vec2_t res;
nuclear@2 50 res.x = v1.x - v2.x;
nuclear@2 51 res.y = v1.y - v2.y;
nuclear@2 52 return res;
nuclear@2 53 }
nuclear@2 54
nuclear@2 55 static inline vec2_t v2_scale(vec2_t v, scalar_t s)
nuclear@2 56 {
nuclear@2 57 vec2_t res;
nuclear@2 58 res.x = v.x * s;
nuclear@2 59 res.y = v.y * s;
nuclear@2 60 return res;
nuclear@2 61 }
nuclear@2 62
nuclear@2 63 static inline scalar_t v2_dot(vec2_t v1, vec2_t v2)
nuclear@2 64 {
nuclear@2 65 return v1.x * v2.x + v1.y * v2.y;
nuclear@2 66 }
nuclear@2 67
nuclear@2 68 static inline scalar_t v2_length(vec2_t v)
nuclear@2 69 {
nuclear@2 70 return sqrt(v.x * v.x + v.y * v.y);
nuclear@2 71 }
nuclear@2 72
nuclear@2 73 static inline scalar_t v2_length_sq(vec2_t v)
nuclear@2 74 {
nuclear@2 75 return v.x * v.x + v.y * v.y;
nuclear@2 76 }
nuclear@2 77
nuclear@2 78 static inline vec2_t v2_normalize(vec2_t v)
nuclear@2 79 {
nuclear@2 80 scalar_t len = (scalar_t)sqrt(v.x * v.x + v.y * v.y);
nuclear@2 81 v.x /= len;
nuclear@2 82 v.y /= len;
nuclear@2 83 return v;
nuclear@2 84 }
nuclear@2 85
nuclear@2 86 static inline vec2_t v2_lerp(vec2_t v1, vec2_t v2, scalar_t t)
nuclear@2 87 {
nuclear@2 88 vec2_t res;
nuclear@2 89 res.x = v1.x + (v2.x - v1.x) * t;
nuclear@2 90 res.y = v1.y + (v2.y - v1.y) * t;
nuclear@2 91 return res;
nuclear@2 92 }
nuclear@2 93
nuclear@2 94
nuclear@2 95 /* C 3D vector functions */
nuclear@2 96 static inline vec3_t v3_cons(scalar_t x, scalar_t y, scalar_t z)
nuclear@2 97 {
nuclear@2 98 vec3_t v;
nuclear@2 99 v.x = x;
nuclear@2 100 v.y = y;
nuclear@2 101 v.z = z;
nuclear@2 102 return v;
nuclear@2 103 }
nuclear@2 104
nuclear@2 105 static inline void v3_print(FILE *fp, vec3_t v)
nuclear@2 106 {
nuclear@2 107 fprintf(fp, "[ %.4f %.4f %.4f ]", v.x, v.y, v.z);
nuclear@2 108 }
nuclear@2 109
nuclear@2 110 static inline vec3_t v3_add(vec3_t v1, vec3_t v2)
nuclear@2 111 {
nuclear@2 112 v1.x += v2.x;
nuclear@2 113 v1.y += v2.y;
nuclear@2 114 v1.z += v2.z;
nuclear@2 115 return v1;
nuclear@2 116 }
nuclear@2 117
nuclear@2 118 static inline vec3_t v3_sub(vec3_t v1, vec3_t v2)
nuclear@2 119 {
nuclear@2 120 v1.x -= v2.x;
nuclear@2 121 v1.y -= v2.y;
nuclear@2 122 v1.z -= v2.z;
nuclear@2 123 return v1;
nuclear@2 124 }
nuclear@2 125
nuclear@2 126 static inline vec3_t v3_neg(vec3_t v)
nuclear@2 127 {
nuclear@2 128 v.x = -v.x;
nuclear@2 129 v.y = -v.y;
nuclear@2 130 v.z = -v.z;
nuclear@2 131 return v;
nuclear@2 132 }
nuclear@2 133
nuclear@2 134 static inline vec3_t v3_mul(vec3_t v1, vec3_t v2)
nuclear@2 135 {
nuclear@2 136 v1.x *= v2.x;
nuclear@2 137 v1.y *= v2.y;
nuclear@2 138 v1.z *= v2.z;
nuclear@2 139 return v1;
nuclear@2 140 }
nuclear@2 141
nuclear@2 142 static inline vec3_t v3_scale(vec3_t v1, scalar_t s)
nuclear@2 143 {
nuclear@2 144 v1.x *= s;
nuclear@2 145 v1.y *= s;
nuclear@2 146 v1.z *= s;
nuclear@2 147 return v1;
nuclear@2 148 }
nuclear@2 149
nuclear@2 150 static inline scalar_t v3_dot(vec3_t v1, vec3_t v2)
nuclear@2 151 {
nuclear@2 152 return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
nuclear@2 153 }
nuclear@2 154
nuclear@2 155 static inline vec3_t v3_cross(vec3_t v1, vec3_t v2)
nuclear@2 156 {
nuclear@2 157 vec3_t v;
nuclear@2 158 v.x = v1.y * v2.z - v1.z * v2.y;
nuclear@2 159 v.y = v1.z * v2.x - v1.x * v2.z;
nuclear@2 160 v.z = v1.x * v2.y - v1.y * v2.x;
nuclear@2 161 return v;
nuclear@2 162 }
nuclear@2 163
nuclear@2 164 static inline scalar_t v3_length(vec3_t v)
nuclear@2 165 {
nuclear@2 166 return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
nuclear@2 167 }
nuclear@2 168
nuclear@2 169 static inline scalar_t v3_length_sq(vec3_t v)
nuclear@2 170 {
nuclear@2 171 return v.x * v.x + v.y * v.y + v.z * v.z;
nuclear@2 172 }
nuclear@2 173
nuclear@2 174 static inline vec3_t v3_normalize(vec3_t v)
nuclear@2 175 {
nuclear@2 176 scalar_t len = sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
nuclear@2 177 v.x /= len;
nuclear@2 178 v.y /= len;
nuclear@2 179 v.z /= len;
nuclear@2 180 return v;
nuclear@2 181 }
nuclear@2 182
nuclear@2 183 static inline vec3_t v3_transform(vec3_t v, mat4_t m)
nuclear@2 184 {
nuclear@2 185 vec3_t res;
nuclear@2 186 res.x = m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3];
nuclear@2 187 res.y = m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3];
nuclear@2 188 res.z = m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3];
nuclear@2 189 return res;
nuclear@2 190 }
nuclear@2 191
nuclear@2 192 static inline vec3_t v3_rotate(vec3_t v, scalar_t x, scalar_t y, scalar_t z)
nuclear@2 193 {
nuclear@2 194 void m4_rotate(mat4_t, scalar_t, scalar_t, scalar_t);
nuclear@2 195
nuclear@2 196 mat4_t m = {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}};
nuclear@2 197 m4_rotate(m, x, y, z);
nuclear@2 198 return v3_transform(v, m);
nuclear@2 199 }
nuclear@2 200
nuclear@2 201 static inline vec3_t v3_rotate_axis(vec3_t v, scalar_t angle, scalar_t x, scalar_t y, scalar_t z)
nuclear@2 202 {
nuclear@2 203 void m4_rotate_axis(mat4_t, scalar_t, scalar_t, scalar_t, scalar_t);
nuclear@2 204
nuclear@2 205 mat4_t m = {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}};
nuclear@2 206 m4_rotate_axis(m, angle, x, y, z);
nuclear@2 207 return v3_transform(v, m);
nuclear@2 208 }
nuclear@2 209
nuclear@2 210 static inline vec3_t v3_rotate_quat(vec3_t v, quat_t q)
nuclear@2 211 {
nuclear@2 212 quat_t quat_rotate_quat(quat_t, quat_t);
nuclear@2 213
nuclear@2 214 quat_t vq = v4_cons(v.x, v.y, v.z, 0.0);
nuclear@2 215 quat_t res = quat_rotate_quat(vq, q);
nuclear@2 216 return v3_cons(res.x, res.y, res.z);
nuclear@2 217 }
nuclear@2 218
nuclear@2 219 static inline vec3_t v3_reflect(vec3_t v, vec3_t n)
nuclear@2 220 {
nuclear@2 221 scalar_t dot = v3_dot(v, n);
nuclear@2 222 return v3_sub(v3_scale(n, dot * 2.0), v);
nuclear@2 223 }
nuclear@2 224
nuclear@2 225 static inline vec3_t v3_lerp(vec3_t v1, vec3_t v2, scalar_t t)
nuclear@2 226 {
nuclear@2 227 v1.x += (v2.x - v1.x) * t;
nuclear@2 228 v1.y += (v2.y - v1.y) * t;
nuclear@2 229 v1.z += (v2.z - v1.z) * t;
nuclear@2 230 return v1;
nuclear@2 231 }
nuclear@2 232
nuclear@2 233 /* C 4D vector functions */
nuclear@2 234 static inline vec4_t v4_cons(scalar_t x, scalar_t y, scalar_t z, scalar_t w)
nuclear@2 235 {
nuclear@2 236 vec4_t v;
nuclear@2 237 v.x = x;
nuclear@2 238 v.y = y;
nuclear@2 239 v.z = z;
nuclear@2 240 v.w = w;
nuclear@2 241 return v;
nuclear@2 242 }
nuclear@2 243
nuclear@2 244 static inline void v4_print(FILE *fp, vec4_t v)
nuclear@2 245 {
nuclear@2 246 fprintf(fp, "[ %.4f %.4f %.4f %.4f ]", v.x, v.y, v.z, v.w);
nuclear@2 247 }
nuclear@2 248
nuclear@2 249 static inline vec4_t v4_add(vec4_t v1, vec4_t v2)
nuclear@2 250 {
nuclear@2 251 v1.x += v2.x;
nuclear@2 252 v1.y += v2.y;
nuclear@2 253 v1.z += v2.z;
nuclear@2 254 v1.w += v2.w;
nuclear@2 255 return v1;
nuclear@2 256 }
nuclear@2 257
nuclear@2 258 static inline vec4_t v4_sub(vec4_t v1, vec4_t v2)
nuclear@2 259 {
nuclear@2 260 v1.x -= v2.x;
nuclear@2 261 v1.y -= v2.y;
nuclear@2 262 v1.z -= v2.z;
nuclear@2 263 v1.w -= v2.w;
nuclear@2 264 return v1;
nuclear@2 265 }
nuclear@2 266
nuclear@2 267 static inline vec4_t v4_neg(vec4_t v)
nuclear@2 268 {
nuclear@2 269 v.x = -v.x;
nuclear@2 270 v.y = -v.y;
nuclear@2 271 v.z = -v.z;
nuclear@2 272 v.w = -v.w;
nuclear@2 273 return v;
nuclear@2 274 }
nuclear@2 275
nuclear@2 276 static inline vec4_t v4_mul(vec4_t v1, vec4_t v2)
nuclear@2 277 {
nuclear@2 278 v1.x *= v2.x;
nuclear@2 279 v1.y *= v2.y;
nuclear@2 280 v1.z *= v2.z;
nuclear@2 281 v1.w *= v2.w;
nuclear@2 282 return v1;
nuclear@2 283 }
nuclear@2 284
nuclear@2 285 static inline vec4_t v4_scale(vec4_t v, scalar_t s)
nuclear@2 286 {
nuclear@2 287 v.x *= s;
nuclear@2 288 v.y *= s;
nuclear@2 289 v.z *= s;
nuclear@2 290 v.w *= s;
nuclear@2 291 return v;
nuclear@2 292 }
nuclear@2 293
nuclear@2 294 static inline scalar_t v4_dot(vec4_t v1, vec4_t v2)
nuclear@2 295 {
nuclear@2 296 return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w;
nuclear@2 297 }
nuclear@2 298
nuclear@2 299 static inline scalar_t v4_length(vec4_t v)
nuclear@2 300 {
nuclear@2 301 return sqrt(v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w);
nuclear@2 302 }
nuclear@2 303
nuclear@2 304 static inline scalar_t v4_length_sq(vec4_t v)
nuclear@2 305 {
nuclear@2 306 return v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w;
nuclear@2 307 }
nuclear@2 308
nuclear@2 309 static inline vec4_t v4_normalize(vec4_t v)
nuclear@2 310 {
nuclear@2 311 scalar_t len = sqrt(v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w);
nuclear@2 312 v.x /= len;
nuclear@2 313 v.y /= len;
nuclear@2 314 v.z /= len;
nuclear@2 315 v.w /= len;
nuclear@2 316 return v;
nuclear@2 317 }
nuclear@2 318
nuclear@2 319 static inline vec4_t v4_transform(vec4_t v, mat4_t m)
nuclear@2 320 {
nuclear@2 321 vec4_t res;
nuclear@2 322 res.x = m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w;
nuclear@2 323 res.y = m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w;
nuclear@2 324 res.z = m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w;
nuclear@2 325 res.w = m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w;
nuclear@2 326 return res;
nuclear@2 327 }
nuclear@2 328
nuclear@2 329 #ifdef __cplusplus
nuclear@2 330 } /* extern "C" */
nuclear@2 331
nuclear@2 332
nuclear@2 333 /* --------------- C++ part -------------- */
nuclear@2 334
nuclear@2 335 inline scalar_t &Vector2::operator [](int elem) {
nuclear@2 336 return elem ? y : x;
nuclear@2 337 }
nuclear@2 338
nuclear@2 339 inline const scalar_t &Vector2::operator [](int elem) const {
nuclear@2 340 return elem ? y : x;
nuclear@2 341 }
nuclear@2 342
nuclear@2 343 inline Vector2 operator -(const Vector2 &vec) {
nuclear@2 344 return Vector2(-vec.x, -vec.y);
nuclear@2 345 }
nuclear@2 346
nuclear@2 347 inline scalar_t dot_product(const Vector2 &v1, const Vector2 &v2) {
nuclear@2 348 return v1.x * v2.x + v1.y * v2.y;
nuclear@2 349 }
nuclear@2 350
nuclear@2 351 inline Vector2 operator +(const Vector2 &v1, const Vector2 &v2) {
nuclear@2 352 return Vector2(v1.x + v2.x, v1.y + v2.y);
nuclear@2 353 }
nuclear@2 354
nuclear@2 355 inline Vector2 operator -(const Vector2 &v1, const Vector2 &v2) {
nuclear@2 356 return Vector2(v1.x - v2.x, v1.y - v2.y);
nuclear@2 357 }
nuclear@2 358
nuclear@2 359 inline Vector2 operator *(const Vector2 &v1, const Vector2 &v2) {
nuclear@2 360 return Vector2(v1.x * v2.x, v1.y * v2.y);
nuclear@2 361 }
nuclear@2 362
nuclear@2 363 inline Vector2 operator /(const Vector2 &v1, const Vector2 &v2) {
nuclear@2 364 return Vector2(v1.x / v2.x, v1.y / v2.y);
nuclear@2 365 }
nuclear@2 366
nuclear@2 367 inline bool operator ==(const Vector2 &v1, const Vector2 &v2) {
nuclear@2 368 return (fabs(v1.x - v2.x) < XSMALL_NUMBER) && (fabs(v1.y - v2.x) < XSMALL_NUMBER);
nuclear@2 369 }
nuclear@2 370
nuclear@2 371 inline void operator +=(Vector2 &v1, const Vector2 &v2) {
nuclear@2 372 v1.x += v2.x;
nuclear@2 373 v1.y += v2.y;
nuclear@2 374 }
nuclear@2 375
nuclear@2 376 inline void operator -=(Vector2 &v1, const Vector2 &v2) {
nuclear@2 377 v1.x -= v2.x;
nuclear@2 378 v1.y -= v2.y;
nuclear@2 379 }
nuclear@2 380
nuclear@2 381 inline void operator *=(Vector2 &v1, const Vector2 &v2) {
nuclear@2 382 v1.x *= v2.x;
nuclear@2 383 v1.y *= v2.y;
nuclear@2 384 }
nuclear@2 385
nuclear@2 386 inline void operator /=(Vector2 &v1, const Vector2 &v2) {
nuclear@2 387 v1.x /= v2.x;
nuclear@2 388 v1.y /= v2.y;
nuclear@2 389 }
nuclear@2 390
nuclear@2 391 inline Vector2 operator +(const Vector2 &vec, scalar_t scalar) {
nuclear@2 392 return Vector2(vec.x + scalar, vec.y + scalar);
nuclear@2 393 }
nuclear@2 394
nuclear@2 395 inline Vector2 operator +(scalar_t scalar, const Vector2 &vec) {
nuclear@2 396 return Vector2(vec.x + scalar, vec.y + scalar);
nuclear@2 397 }
nuclear@2 398
nuclear@2 399 inline Vector2 operator -(scalar_t scalar, const Vector2 &vec) {
nuclear@2 400 return Vector2(vec.x - scalar, vec.y - scalar);
nuclear@2 401 }
nuclear@2 402
nuclear@2 403 inline Vector2 operator *(const Vector2 &vec, scalar_t scalar) {
nuclear@2 404 return Vector2(vec.x * scalar, vec.y * scalar);
nuclear@2 405 }
nuclear@2 406
nuclear@2 407 inline Vector2 operator *(scalar_t scalar, const Vector2 &vec) {
nuclear@2 408 return Vector2(vec.x * scalar, vec.y * scalar);
nuclear@2 409 }
nuclear@2 410
nuclear@2 411 inline Vector2 operator /(const Vector2 &vec, scalar_t scalar) {
nuclear@2 412 return Vector2(vec.x / scalar, vec.y / scalar);
nuclear@2 413 }
nuclear@2 414
nuclear@2 415 inline void operator +=(Vector2 &vec, scalar_t scalar) {
nuclear@2 416 vec.x += scalar;
nuclear@2 417 vec.y += scalar;
nuclear@2 418 }
nuclear@2 419
nuclear@2 420 inline void operator -=(Vector2 &vec, scalar_t scalar) {
nuclear@2 421 vec.x -= scalar;
nuclear@2 422 vec.y -= scalar;
nuclear@2 423 }
nuclear@2 424
nuclear@2 425 inline void operator *=(Vector2 &vec, scalar_t scalar) {
nuclear@2 426 vec.x *= scalar;
nuclear@2 427 vec.y *= scalar;
nuclear@2 428 }
nuclear@2 429
nuclear@2 430 inline void operator /=(Vector2 &vec, scalar_t scalar) {
nuclear@2 431 vec.x /= scalar;
nuclear@2 432 vec.y /= scalar;
nuclear@2 433 }
nuclear@2 434
nuclear@2 435 inline scalar_t Vector2::length() const {
nuclear@2 436 return sqrt(x*x + y*y);
nuclear@2 437 }
nuclear@2 438
nuclear@2 439 inline scalar_t Vector2::length_sq() const {
nuclear@2 440 return x*x + y*y;
nuclear@2 441 }
nuclear@2 442
nuclear@2 443 inline Vector2 lerp(const Vector2 &a, const Vector2 &b, scalar_t t)
nuclear@2 444 {
nuclear@2 445 return a + (b - a) * t;
nuclear@2 446 }
nuclear@2 447
nuclear@2 448 inline Vector2 catmull_rom_spline(const Vector2 &v0, const Vector2 &v1,
nuclear@2 449 const Vector2 &v2, const Vector2 &v3, scalar_t t)
nuclear@2 450 {
nuclear@2 451 scalar_t spline(scalar_t, scalar_t, scalar_t, scalar_t, scalar_t);
nuclear@2 452 scalar_t x = spline(v0.x, v1.x, v2.x, v3.x, t);
nuclear@2 453 scalar_t y = spline(v0.y, v1.y, v2.y, v3.y, t);
nuclear@2 454 return Vector2(x, y);
nuclear@2 455 }
nuclear@2 456
nuclear@2 457
nuclear@2 458 /* ------------- Vector3 -------------- */
nuclear@2 459
nuclear@2 460 inline scalar_t &Vector3::operator [](int elem) {
nuclear@2 461 return elem ? (elem == 1 ? y : z) : x;
nuclear@2 462 }
nuclear@2 463
nuclear@2 464 inline const scalar_t &Vector3::operator [](int elem) const {
nuclear@2 465 return elem ? (elem == 1 ? y : z) : x;
nuclear@2 466 }
nuclear@2 467
nuclear@2 468 /* unary operations */
nuclear@2 469 inline Vector3 operator -(const Vector3 &vec) {
nuclear@2 470 return Vector3(-vec.x, -vec.y, -vec.z);
nuclear@2 471 }
nuclear@2 472
nuclear@2 473 /* binary vector (op) vector operations */
nuclear@2 474 inline scalar_t dot_product(const Vector3 &v1, const Vector3 &v2) {
nuclear@2 475 return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
nuclear@2 476 }
nuclear@2 477
nuclear@2 478 inline Vector3 cross_product(const Vector3 &v1, const Vector3 &v2) {
nuclear@2 479 return Vector3(v1.y * v2.z - v1.z * v2.y, v1.z * v2.x - v1.x * v2.z, v1.x * v2.y - v1.y * v2.x);
nuclear@2 480 }
nuclear@2 481
nuclear@2 482
nuclear@2 483 inline Vector3 operator +(const Vector3 &v1, const Vector3 &v2) {
nuclear@2 484 return Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
nuclear@2 485 }
nuclear@2 486
nuclear@2 487 inline Vector3 operator -(const Vector3 &v1, const Vector3 &v2) {
nuclear@2 488 return Vector3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
nuclear@2 489 }
nuclear@2 490
nuclear@2 491 inline Vector3 operator *(const Vector3 &v1, const Vector3 &v2) {
nuclear@2 492 return Vector3(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z);
nuclear@2 493 }
nuclear@2 494
nuclear@2 495 inline Vector3 operator /(const Vector3 &v1, const Vector3 &v2) {
nuclear@2 496 return Vector3(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z);
nuclear@2 497 }
nuclear@2 498
nuclear@2 499 inline bool operator ==(const Vector3 &v1, const Vector3 &v2) {
nuclear@2 500 return (fabs(v1.x - v2.x) < XSMALL_NUMBER) && (fabs(v1.y - v2.y) < XSMALL_NUMBER) && (fabs(v1.z - v2.z) < XSMALL_NUMBER);
nuclear@2 501 }
nuclear@2 502
nuclear@2 503 inline void operator +=(Vector3 &v1, const Vector3 &v2) {
nuclear@2 504 v1.x += v2.x;
nuclear@2 505 v1.y += v2.y;
nuclear@2 506 v1.z += v2.z;
nuclear@2 507 }
nuclear@2 508
nuclear@2 509 inline void operator -=(Vector3 &v1, const Vector3 &v2) {
nuclear@2 510 v1.x -= v2.x;
nuclear@2 511 v1.y -= v2.y;
nuclear@2 512 v1.z -= v2.z;
nuclear@2 513 }
nuclear@2 514
nuclear@2 515 inline void operator *=(Vector3 &v1, const Vector3 &v2) {
nuclear@2 516 v1.x *= v2.x;
nuclear@2 517 v1.y *= v2.y;
nuclear@2 518 v1.z *= v2.z;
nuclear@2 519 }
nuclear@2 520
nuclear@2 521 inline void operator /=(Vector3 &v1, const Vector3 &v2) {
nuclear@2 522 v1.x /= v2.x;
nuclear@2 523 v1.y /= v2.y;
nuclear@2 524 v1.z /= v2.z;
nuclear@2 525 }
nuclear@2 526 /* binary vector (op) scalar and scalar (op) vector operations */
nuclear@2 527 inline Vector3 operator +(const Vector3 &vec, scalar_t scalar) {
nuclear@2 528 return Vector3(vec.x + scalar, vec.y + scalar, vec.z + scalar);
nuclear@2 529 }
nuclear@2 530
nuclear@2 531 inline Vector3 operator +(scalar_t scalar, const Vector3 &vec) {
nuclear@2 532 return Vector3(vec.x + scalar, vec.y + scalar, vec.z + scalar);
nuclear@2 533 }
nuclear@2 534
nuclear@2 535 inline Vector3 operator -(const Vector3 &vec, scalar_t scalar) {
nuclear@2 536 return Vector3(vec.x - scalar, vec.y - scalar, vec.z - scalar);
nuclear@2 537 }
nuclear@2 538
nuclear@2 539 inline Vector3 operator *(const Vector3 &vec, scalar_t scalar) {
nuclear@2 540 return Vector3(vec.x * scalar, vec.y * scalar, vec.z * scalar);
nuclear@2 541 }
nuclear@2 542
nuclear@2 543 inline Vector3 operator *(scalar_t scalar, const Vector3 &vec) {
nuclear@2 544 return Vector3(vec.x * scalar, vec.y * scalar, vec.z * scalar);
nuclear@2 545 }
nuclear@2 546
nuclear@2 547 inline Vector3 operator /(const Vector3 &vec, scalar_t scalar) {
nuclear@2 548 return Vector3(vec.x / scalar, vec.y / scalar, vec.z / scalar);
nuclear@2 549 }
nuclear@2 550
nuclear@2 551 inline void operator +=(Vector3 &vec, scalar_t scalar) {
nuclear@2 552 vec.x += scalar;
nuclear@2 553 vec.y += scalar;
nuclear@2 554 vec.z += scalar;
nuclear@2 555 }
nuclear@2 556
nuclear@2 557 inline void operator -=(Vector3 &vec, scalar_t scalar) {
nuclear@2 558 vec.x -= scalar;
nuclear@2 559 vec.y -= scalar;
nuclear@2 560 vec.z -= scalar;
nuclear@2 561 }
nuclear@2 562
nuclear@2 563 inline void operator *=(Vector3 &vec, scalar_t scalar) {
nuclear@2 564 vec.x *= scalar;
nuclear@2 565 vec.y *= scalar;
nuclear@2 566 vec.z *= scalar;
nuclear@2 567 }
nuclear@2 568
nuclear@2 569 inline void operator /=(Vector3 &vec, scalar_t scalar) {
nuclear@2 570 vec.x /= scalar;
nuclear@2 571 vec.y /= scalar;
nuclear@2 572 vec.z /= scalar;
nuclear@2 573 }
nuclear@2 574
nuclear@2 575 inline scalar_t Vector3::length() const {
nuclear@2 576 return sqrt(x*x + y*y + z*z);
nuclear@2 577 }
nuclear@2 578 inline scalar_t Vector3::length_sq() const {
nuclear@2 579 return x*x + y*y + z*z;
nuclear@2 580 }
nuclear@2 581
nuclear@2 582 inline Vector3 lerp(const Vector3 &a, const Vector3 &b, scalar_t t) {
nuclear@2 583 return a + (b - a) * t;
nuclear@2 584 }
nuclear@2 585
nuclear@2 586 inline Vector3 catmull_rom_spline(const Vector3 &v0, const Vector3 &v1,
nuclear@2 587 const Vector3 &v2, const Vector3 &v3, scalar_t t)
nuclear@2 588 {
nuclear@2 589 scalar_t spline(scalar_t, scalar_t, scalar_t, scalar_t, scalar_t);
nuclear@2 590 scalar_t x = spline(v0.x, v1.x, v2.x, v3.x, t);
nuclear@2 591 scalar_t y = spline(v0.y, v1.y, v2.y, v3.y, t);
nuclear@2 592 scalar_t z = spline(v0.z, v1.z, v2.z, v3.z, t);
nuclear@2 593 return Vector3(x, y, z);
nuclear@2 594 }
nuclear@2 595
nuclear@2 596 /* ----------- Vector4 ----------------- */
nuclear@2 597
nuclear@2 598 inline scalar_t &Vector4::operator [](int elem) {
nuclear@2 599 return elem ? (elem == 1 ? y : (elem == 2 ? z : w)) : x;
nuclear@2 600 }
nuclear@2 601
nuclear@2 602 inline const scalar_t &Vector4::operator [](int elem) const {
nuclear@2 603 return elem ? (elem == 1 ? y : (elem == 2 ? z : w)) : x;
nuclear@2 604 }
nuclear@2 605
nuclear@2 606 inline Vector4 operator -(const Vector4 &vec) {
nuclear@2 607 return Vector4(-vec.x, -vec.y, -vec.z, -vec.w);
nuclear@2 608 }
nuclear@2 609
nuclear@2 610 inline scalar_t dot_product(const Vector4 &v1, const Vector4 &v2) {
nuclear@2 611 return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w;
nuclear@2 612 }
nuclear@2 613
nuclear@2 614 inline Vector4 cross_product(const Vector4 &v1, const Vector4 &v2, const Vector4 &v3) {
nuclear@2 615 scalar_t a, b, c, d, e, f; /* Intermediate Values */
nuclear@2 616 Vector4 result;
nuclear@2 617
nuclear@2 618 /* Calculate intermediate values. */
nuclear@2 619 a = (v2.x * v3.y) - (v2.y * v3.x);
nuclear@2 620 b = (v2.x * v3.z) - (v2.z * v3.x);
nuclear@2 621 c = (v2.x * v3.w) - (v2.w * v3.x);
nuclear@2 622 d = (v2.y * v3.z) - (v2.z * v3.y);
nuclear@2 623 e = (v2.y * v3.w) - (v2.w * v3.y);
nuclear@2 624 f = (v2.z * v3.w) - (v2.w * v3.z);
nuclear@2 625
nuclear@2 626 /* Calculate the result-vector components. */
nuclear@2 627 result.x = (v1.y * f) - (v1.z * e) + (v1.w * d);
nuclear@2 628 result.y = - (v1.x * f) + (v1.z * c) - (v1.w * b);
nuclear@2 629 result.z = (v1.x * e) - (v1.y * c) + (v1.w * a);
nuclear@2 630 result.w = - (v1.x * d) + (v1.y * b) - (v1.z * a);
nuclear@2 631 return result;
nuclear@2 632 }
nuclear@2 633
nuclear@2 634 inline Vector4 operator +(const Vector4 &v1, const Vector4 &v2) {
nuclear@2 635 return Vector4(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z, v1.w + v2.w);
nuclear@2 636 }
nuclear@2 637
nuclear@2 638 inline Vector4 operator -(const Vector4 &v1, const Vector4 &v2) {
nuclear@2 639 return Vector4(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z, v1.w - v2.w);
nuclear@2 640 }
nuclear@2 641
nuclear@2 642 inline Vector4 operator *(const Vector4 &v1, const Vector4 &v2) {
nuclear@2 643 return Vector4(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z, v1.w * v2.w);
nuclear@2 644 }
nuclear@2 645
nuclear@2 646 inline Vector4 operator /(const Vector4 &v1, const Vector4 &v2) {
nuclear@2 647 return Vector4(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z, v1.w / v2.w);
nuclear@2 648 }
nuclear@2 649
nuclear@2 650 inline bool operator ==(const Vector4 &v1, const Vector4 &v2) {
nuclear@2 651 return (fabs(v1.x - v2.x) < XSMALL_NUMBER) &&
nuclear@2 652 (fabs(v1.y - v2.y) < XSMALL_NUMBER) &&
nuclear@2 653 (fabs(v1.z - v2.z) < XSMALL_NUMBER) &&
nuclear@2 654 (fabs(v1.w - v2.w) < XSMALL_NUMBER);
nuclear@2 655 }
nuclear@2 656
nuclear@2 657 inline void operator +=(Vector4 &v1, const Vector4 &v2) {
nuclear@2 658 v1.x += v2.x;
nuclear@2 659 v1.y += v2.y;
nuclear@2 660 v1.z += v2.z;
nuclear@2 661 v1.w += v2.w;
nuclear@2 662 }
nuclear@2 663
nuclear@2 664 inline void operator -=(Vector4 &v1, const Vector4 &v2) {
nuclear@2 665 v1.x -= v2.x;
nuclear@2 666 v1.y -= v2.y;
nuclear@2 667 v1.z -= v2.z;
nuclear@2 668 v1.w -= v2.w;
nuclear@2 669 }
nuclear@2 670
nuclear@2 671 inline void operator *=(Vector4 &v1, const Vector4 &v2) {
nuclear@2 672 v1.x *= v2.x;
nuclear@2 673 v1.y *= v2.y;
nuclear@2 674 v1.z *= v2.z;
nuclear@2 675 v1.w *= v2.w;
nuclear@2 676 }
nuclear@2 677
nuclear@2 678 inline void operator /=(Vector4 &v1, const Vector4 &v2) {
nuclear@2 679 v1.x /= v2.x;
nuclear@2 680 v1.y /= v2.y;
nuclear@2 681 v1.z /= v2.z;
nuclear@2 682 v1.w /= v2.w;
nuclear@2 683 }
nuclear@2 684
nuclear@2 685 /* binary vector (op) scalar and scalar (op) vector operations */
nuclear@2 686 inline Vector4 operator +(const Vector4 &vec, scalar_t scalar) {
nuclear@2 687 return Vector4(vec.x + scalar, vec.y + scalar, vec.z + scalar, vec.w + scalar);
nuclear@2 688 }
nuclear@2 689
nuclear@2 690 inline Vector4 operator +(scalar_t scalar, const Vector4 &vec) {
nuclear@2 691 return Vector4(vec.x + scalar, vec.y + scalar, vec.z + scalar, vec.w + scalar);
nuclear@2 692 }
nuclear@2 693
nuclear@2 694 inline Vector4 operator -(const Vector4 &vec, scalar_t scalar) {
nuclear@2 695 return Vector4(vec.x - scalar, vec.y - scalar, vec.z - scalar, vec.w - scalar);
nuclear@2 696 }
nuclear@2 697
nuclear@2 698 inline Vector4 operator *(const Vector4 &vec, scalar_t scalar) {
nuclear@2 699 return Vector4(vec.x * scalar, vec.y * scalar, vec.z * scalar, vec.w * scalar);
nuclear@2 700 }
nuclear@2 701
nuclear@2 702 inline Vector4 operator *(scalar_t scalar, const Vector4 &vec) {
nuclear@2 703 return Vector4(vec.x * scalar, vec.y * scalar, vec.z * scalar, vec.w * scalar);
nuclear@2 704 }
nuclear@2 705
nuclear@2 706 inline Vector4 operator /(const Vector4 &vec, scalar_t scalar) {
nuclear@2 707 return Vector4(vec.x / scalar, vec.y / scalar, vec.z / scalar, vec.w / scalar);
nuclear@2 708 }
nuclear@2 709
nuclear@2 710 inline void operator +=(Vector4 &vec, scalar_t scalar) {
nuclear@2 711 vec.x += scalar;
nuclear@2 712 vec.y += scalar;
nuclear@2 713 vec.z += scalar;
nuclear@2 714 vec.w += scalar;
nuclear@2 715 }
nuclear@2 716
nuclear@2 717 inline void operator -=(Vector4 &vec, scalar_t scalar) {
nuclear@2 718 vec.x -= scalar;
nuclear@2 719 vec.y -= scalar;
nuclear@2 720 vec.z -= scalar;
nuclear@2 721 vec.w -= scalar;
nuclear@2 722 }
nuclear@2 723
nuclear@2 724 inline void operator *=(Vector4 &vec, scalar_t scalar) {
nuclear@2 725 vec.x *= scalar;
nuclear@2 726 vec.y *= scalar;
nuclear@2 727 vec.z *= scalar;
nuclear@2 728 vec.w *= scalar;
nuclear@2 729 }
nuclear@2 730
nuclear@2 731 inline void operator /=(Vector4 &vec, scalar_t scalar) {
nuclear@2 732 vec.x /= scalar;
nuclear@2 733 vec.y /= scalar;
nuclear@2 734 vec.z /= scalar;
nuclear@2 735 vec.w /= scalar;
nuclear@2 736 }
nuclear@2 737
nuclear@2 738 inline scalar_t Vector4::length() const {
nuclear@2 739 return sqrt(x*x + y*y + z*z + w*w);
nuclear@2 740 }
nuclear@2 741 inline scalar_t Vector4::length_sq() const {
nuclear@2 742 return x*x + y*y + z*z + w*w;
nuclear@2 743 }
nuclear@2 744
nuclear@2 745 inline Vector4 lerp(const Vector4 &v0, const Vector4 &v1, scalar_t t)
nuclear@2 746 {
nuclear@2 747 return v0 + (v1 - v0) * t;
nuclear@2 748 }
nuclear@2 749
nuclear@2 750 inline Vector4 catmull_rom_spline(const Vector4 &v0, const Vector4 &v1,
nuclear@2 751 const Vector4 &v2, const Vector4 &v3, scalar_t t)
nuclear@2 752 {
nuclear@2 753 scalar_t spline(scalar_t, scalar_t, scalar_t, scalar_t, scalar_t);
nuclear@2 754 scalar_t x = spline(v0.x, v1.x, v2.x, v3.x, t);
nuclear@2 755 scalar_t y = spline(v0.y, v1.y, v2.y, v3.y, t);
nuclear@2 756 scalar_t z = spline(v0.z, v1.z, v2.z, v3.z, t);
nuclear@2 757 scalar_t w = spline(v0.w, v1.w, v2.w, v3.w, t);
nuclear@2 758 return Vector4(x, y, z, w);
nuclear@2 759 }
nuclear@2 760
nuclear@2 761 #endif /* __cplusplus */