Max 5 API Reference
00001 #include "jit.vecmath.h" 00002 #include <math.h> // for finite() 00003 /* 00004 * jit.vecmath.c 00005 * 00006 * Copyright 2001-2005 - Cycling '74 00007 * Derek Gerstmann - derek@cycling74.com 00008 * 00009 * Basic vector math operations for floating point datatypes. 00010 * 00011 * All functions were designed to use the first function parameter 00012 * as the assigned/return value (eg): 00013 * 00014 * // C = A + B 00015 * jit_vec3_add(c, a, b); 00016 * 00017 * With the notable exception of all "_to_array" & "_to_coord" methods: 00018 * 00019 * // matrix -> array 00020 * jit_mat4_to_array(m, a); 00021 * 00022 * 00023 */ 00024 00025 // ---------------------------------------------------------------------------- 00026 00027 void jit_vec2_fill(t_jit_vec2 *u, float x) 00028 { 00029 u->x = x; 00030 u->y = x; 00031 } 00032 00033 void jit_vec2_assign(t_jit_vec2 *u, t_jit_vec2 *v) 00034 { 00035 if(u == v) 00036 return; 00037 00038 u->x = v->x; 00039 u->y = v->y; 00040 } 00041 00042 void jit_vec2_from_array(t_jit_vec2 *u, float *xy) 00043 { 00044 u->x = xy[0]; 00045 u->y = xy[1]; 00046 } 00047 00048 void jit_vec2_from_coords(t_jit_vec2 *u, float x, float y) 00049 { 00050 u->x = x; 00051 u->y = y; 00052 } 00053 00054 void jit_vec2_to_array(t_jit_vec2 *u, float *xy) 00055 { 00056 xy[0] = u->x; 00057 xy[1] = u->y; 00058 } 00059 00060 void jit_vec2_to_coords(t_jit_vec2 *u, float *x, float *y) 00061 { 00062 *x = u->x; 00063 *y = u->y; 00064 } 00065 00066 long jit_vec2_equal(t_jit_vec2 *u, t_jit_vec2 *v) 00067 { 00068 return (u->x == v->x && u->y == v->y) ? TRUE : FALSE; 00069 } 00070 00071 long jit_vec2_not_equal(t_jit_vec2 *u, t_jit_vec2 *v) 00072 { 00073 return (u->x != v->x || u->y != v->y) ? TRUE : FALSE; 00074 } 00075 00076 void jit_vec2_mult( t_jit_vec2 *u, t_jit_vec2 *a, t_jit_vec2 *b) 00077 { 00078 u->x = a->x * b->x; 00079 u->y = a->y * b->y; 00080 } 00081 00082 void jit_vec2_scale( t_jit_vec2 *u, t_jit_vec2 *a, float s) 00083 { 00084 u->x = a->x * s; 00085 u->y = a->y * s; 00086 } 00087 00088 void jit_vec2_accum_scale( t_jit_vec2 *u, float s) 00089 { 00090 u->x *= s; 00091 u->y *= s; 00092 } 00093 00094 void jit_vec2_div( t_jit_vec2 *u, t_jit_vec2 *a, float s) 00095 { 00096 float inv = 0.0f; 00097 00098 if(s != 0.0f) 00099 inv = 1.0f / s; 00100 00101 u->x = a->x * inv; 00102 u->y = a->y * inv; 00103 } 00104 00105 void jit_vec2_sub( t_jit_vec2 *u, t_jit_vec2 *a, t_jit_vec2 *b) 00106 { 00107 u->x = a->x - b->x; 00108 u->y = a->y - b->y; 00109 } 00110 00111 void jit_vec2_accum_sub(t_jit_vec2 *u, t_jit_vec2 *v) 00112 { 00113 u->x -= v->x; 00114 u->y -= v->y; 00115 } 00116 00117 void jit_vec2_add( t_jit_vec2 *u, t_jit_vec2 *a, t_jit_vec2 *b) 00118 { 00119 u->x = a->x + b->x; 00120 u->y = a->y + b->y; 00121 } 00122 00123 void jit_vec2_accum_add(t_jit_vec2 *u, t_jit_vec2 *v) 00124 { 00125 u->x += v->x; 00126 u->y += v->y; 00127 } 00128 00129 float jit_vec2_get_coord(t_jit_vec2 *u, long i) 00130 { 00131 if(i >=0 && i < 2) 00132 return u->vals[i]; 00133 else 00134 return 0.0f; 00135 } 00136 00137 float jit_vec2_mag_sqr(t_jit_vec2 *u) 00138 { 00139 return u->x * u->x + u->y * u->y; 00140 } 00141 00142 float jit_vec2_mag(t_jit_vec2 *u) 00143 { 00144 float v = u->x * u->x + u->y * u->y; 00145 if(v != 0.0f) 00146 return jit_math_sqrt(v); 00147 else 00148 return v; 00149 } 00150 00151 void jit_vec2_negate(t_jit_vec2 *u) 00152 { 00153 u->x = -u->x; 00154 u->y = -u->y; 00155 } 00156 00157 void jit_vec2_max(t_jit_vec2 *r, t_jit_vec2 *a, t_jit_vec2 *b) 00158 { 00159 r->x = JIT_MATH_MAX(a->x, b->x); 00160 r->y = JIT_MATH_MAX(a->y, b->y); 00161 } 00162 00163 void jit_vec2_min(t_jit_vec2 *r, t_jit_vec2 *a, t_jit_vec2 *b) 00164 { 00165 r->x = JIT_MATH_MIN(a->x, b->x); 00166 r->y = JIT_MATH_MIN(a->y, b->y); 00167 } 00168 00169 void jit_vec2_lerp(t_jit_vec2 *w, float t, t_jit_vec2 *u, t_jit_vec2 *v) 00170 { 00171 w->x = JIT_MATH_LERP(t, u->x, v->x); 00172 w->y = JIT_MATH_LERP(t, u->y, v->y); 00173 } 00174 00175 long jit_vec2_is_valid( t_jit_vec2 *v) 00176 { 00177 return (!jit_math_is_nan(v->x) && !jit_math_is_nan(v->y) && 00178 jit_math_is_finite(v->x) && jit_math_is_finite(v->y) ); 00179 } 00180 00181 // ---------------------------------------------------------------------------- 00182 00183 void jit_vec3_fill(t_jit_vec3 *u, float x) 00184 { 00185 u->x = x; 00186 u->y = x; 00187 u->z = x; 00188 } 00189 00190 void jit_vec3_assign(t_jit_vec3 *u, t_jit_vec3 *v) 00191 { 00192 if(u == v) 00193 return; 00194 00195 u->x = v->x; 00196 u->y = v->y; 00197 u->z = v->z; 00198 } 00199 00200 void jit_vec3_from_array(t_jit_vec3 *u, float *xyz) 00201 { 00202 u->x = xyz[0]; 00203 u->y = xyz[1]; 00204 u->z = xyz[2]; 00205 } 00206 00207 void jit_vec3_from_coords(t_jit_vec3 *u, float x, float y, float z) 00208 { 00209 u->x = x; 00210 u->y = y; 00211 u->z = z; 00212 } 00213 00214 void jit_vec3_to_array(t_jit_vec3 *u, float *xyz) 00215 { 00216 xyz[0] = u->x; 00217 xyz[1] = u->y; 00218 xyz[2] = u->z; 00219 } 00220 00221 void jit_vec3_to_coords(t_jit_vec3 *u, float *x, float *y, float *z) 00222 { 00223 *x = u->x; 00224 *y = u->y; 00225 *z = u->z; 00226 } 00227 00228 long jit_vec3_equal(t_jit_vec3 *u, t_jit_vec3 *v) 00229 { 00230 return (u->x == v->x && u->y == v->y && u->z == v->z) ? TRUE : FALSE; 00231 } 00232 00233 long jit_vec3_not_equal(t_jit_vec3 *u, t_jit_vec3 *v) 00234 { 00235 return (u->x != v->x || u->y != v->y || u->z != v->z) ? TRUE : FALSE; 00236 } 00237 00238 void jit_vec3_mult( t_jit_vec3 *u, t_jit_vec3 *a, t_jit_vec3 *b) 00239 { 00240 u->x = a->x * b->x; 00241 u->y = a->y * b->y; 00242 u->z = a->z * b->z; 00243 } 00244 00245 void jit_vec3_scale( t_jit_vec3 *u, t_jit_vec3 *a, float s) 00246 { 00247 u->x = a->x * s; 00248 u->y = a->y * s; 00249 u->z = a->z * s; 00250 } 00251 00252 void jit_vec3_accum_scale( t_jit_vec3 *u, float s) 00253 { 00254 u->x *= s; 00255 u->y *= s; 00256 u->z *= s; 00257 } 00258 00259 void jit_vec3_div( t_jit_vec3 *u, t_jit_vec3 *a, float s) 00260 { 00261 float inv = 0.0f; 00262 00263 if(s != 0.0f) 00264 inv = 1.0f / s; 00265 00266 u->x = a->x * inv; 00267 u->y = a->y * inv; 00268 u->z = a->z * inv; 00269 } 00270 00271 void jit_vec3_sub( t_jit_vec3 *u, t_jit_vec3 *a, t_jit_vec3 *b) 00272 { 00273 u->x = a->x - b->x; 00274 u->y = a->y - b->y; 00275 u->z = a->z - b->z; 00276 } 00277 00278 void jit_vec3_accum_sub(t_jit_vec3 *u, t_jit_vec3 *v) 00279 { 00280 u->x -= v->x; 00281 u->y -= v->y; 00282 u->z -= v->z; 00283 } 00284 00285 void jit_vec3_add( t_jit_vec3 *u, t_jit_vec3 *a, t_jit_vec3 *b) 00286 { 00287 u->x = a->x + b->x; 00288 u->y = a->y + b->y; 00289 u->z = a->z + b->z; 00290 } 00291 00292 void jit_vec3_accum_add(t_jit_vec3 *u, t_jit_vec3 *v) 00293 { 00294 u->x += v->x; 00295 u->y += v->y; 00296 u->z += v->z; 00297 } 00298 00299 void jit_vec3_madd(t_jit_vec3 *u, t_jit_vec3 *v, float s) 00300 { 00301 u->x += v->x*s; 00302 u->y += v->y*s; 00303 u->z += v->z*s; 00304 } 00305 00306 float jit_vec3_get_coord(t_jit_vec3 *u, long i) 00307 { 00308 if(i <= 0 && i < 3) 00309 return u->vals[i]; 00310 else 00311 return 0.0f; 00312 } 00313 00314 float jit_vec3_mag_sqr(t_jit_vec3 *u) 00315 { 00316 return u->x * u->x + u->y * u->y + u->z * u->z; 00317 } 00318 00319 float jit_vec3_mag(t_jit_vec3 *u) 00320 { 00321 float v = u->x * u->x + u->y * u->y + u->z * u->z; 00322 if(v != 0) 00323 return jit_math_sqrt(v); 00324 else 00325 return v; 00326 } 00327 00328 void jit_vec3_negate(t_jit_vec3 *u) 00329 { 00330 u->x = -u->x; 00331 u->y = -u->y; 00332 u->z = -u->z; 00333 } 00334 00335 void jit_vec3_cross(t_jit_vec3 *u, t_jit_vec3 *a, t_jit_vec3 *b) 00336 { 00337 u->x = a->y*b->z - a->z*b->y; 00338 u->y = a->z*b->x - a->x*b->z; 00339 u->z = a->x*b->y - a->y*b->x; 00340 } 00341 00342 float jit_vec3_dot(t_jit_vec3 *u, t_jit_vec3 *v) 00343 { 00344 return u->x*v->x + u->y*v->y + u->z*v->z; 00345 } 00346 00347 void jit_vec3_reflect(t_jit_vec3 *r, t_jit_vec3 *n, t_jit_vec3 *l) 00348 { 00349 float ndotl = 2.0f * jit_vec3_dot(n, l); 00350 jit_vec3_scale(r, l, -1.0f); 00351 jit_vec3_madd(r, n, ndotl); 00352 } 00353 00354 float jit_vec3_normalize( t_jit_vec3 *u ) 00355 { 00356 float s = JIT_MATH_F32_EPS; 00357 float m = u->x * u->x + u->y * u->y + u->z * u->z; 00358 00359 if (m > JIT_MATH_F32_EPS) 00360 { 00361 s = jit_math_sqrt(m); 00362 s = 1.0f / s; 00363 u->x *= s; 00364 u->y *= s; 00365 u->z *= s; 00366 } 00367 else 00368 { 00369 u->x = s; 00370 u->y = s; 00371 u->z = s; 00372 } 00373 00374 return s; 00375 00376 } 00377 00378 void jit_vec3_orthogonalize( t_jit_vec3 *u, t_jit_vec3 *v ) 00379 { 00380 float d; 00381 t_jit_vec3 p; 00382 00383 jit_vec3_scale(&p, v, jit_vec3_dot( v, u )); 00384 00385 u->x -= p.x; 00386 u->y -= p.y; 00387 u->z -= p.y; 00388 } 00389 00390 void jit_vec3_orthonormalize( t_jit_vec3 *u, t_jit_vec3 *v ) 00391 { 00392 jit_vec3_orthogonalize( u, v ); 00393 jit_vec3_normalize( u ); 00394 } 00395 00396 void jit_vec3_max(t_jit_vec3 *r, t_jit_vec3 *a, t_jit_vec3 *b) 00397 { 00398 r->x = JIT_MATH_MAX(a->x, b->x); 00399 r->y = JIT_MATH_MAX(a->y, b->y); 00400 r->z = JIT_MATH_MAX(a->z, b->z); 00401 } 00402 00403 void jit_vec3_min(t_jit_vec3 *r, t_jit_vec3 *a, t_jit_vec3 *b) 00404 { 00405 r->x = JIT_MATH_MIN(a->x, b->x); 00406 r->y = JIT_MATH_MIN(a->y, b->y); 00407 r->z = JIT_MATH_MIN(a->z, b->z); 00408 } 00409 00410 void jit_vec3_lerp(t_jit_vec3 *w, float t, t_jit_vec3 *u, t_jit_vec3 *v) 00411 { 00412 w->x = JIT_MATH_LERP(t, u->x, v->x); 00413 w->y = JIT_MATH_LERP(t, u->y, v->y); 00414 w->z = JIT_MATH_LERP(t, u->z, v->z); 00415 } 00416 00417 void jit_vec3_cubemap_normal(t_jit_vec3 *v, int i, int x, int y, int cubesize) 00418 { 00419 float s, t, sc, tc; 00420 s = ((float)x + 0.5f) / (float)cubesize; 00421 t = ((float)y + 0.5f) / (float)cubesize; 00422 sc = s * 2.0f - 1.0f; 00423 tc = t * 2.0f - 1.0f; 00424 00425 switch (i) 00426 { 00427 case 0: 00428 v->x = 1.0f; 00429 v->y = -tc; 00430 v->z = -sc; 00431 break; 00432 case 1: 00433 v->x = -1.0f; 00434 v->y = -tc; 00435 v->z = sc; 00436 break; 00437 case 2: 00438 v->x = sc; 00439 v->y = 1.0f; 00440 v->z = tc; 00441 break; 00442 case 3: 00443 v->x = sc; 00444 v->y = -1.0f; 00445 v->z = -tc; 00446 break; 00447 case 4: 00448 v->x = sc; 00449 v->y = -tc; 00450 v->z = 1.0f; 00451 break; 00452 case 5: 00453 v->x = -sc; 00454 v->y = -tc; 00455 v->z = -1.0f; 00456 break; 00457 } 00458 jit_vec3_normalize(v); 00459 } 00460 00461 long jit_vec3_is_valid( t_jit_vec3 *v) 00462 { 00463 return (!jit_math_is_nan(v->x) && !jit_math_is_nan(v->y) && !jit_math_is_nan(v->z) && 00464 jit_math_is_finite(v->x) && jit_math_is_finite(v->y) && jit_math_is_finite(v->z)); 00465 } 00466 00467 // ---------------------------------------------------------------------------- 00468 00469 void jit_vec4_fill(t_jit_vec4 *u, float x) 00470 { 00471 u->x = x; 00472 u->y = x; 00473 u->z = x; 00474 u->w = x; 00475 } 00476 00477 void jit_vec4_assign(t_jit_vec4 *u, t_jit_vec4 *v) 00478 { 00479 if(u == v) 00480 return; 00481 00482 u->x = v->x; 00483 u->y = v->y; 00484 u->z = v->z; 00485 u->w = v->w; 00486 } 00487 00488 void jit_vec4_from_array(t_jit_vec4 *u, float *xyzw) 00489 { 00490 u->x = xyzw[0]; 00491 u->y = xyzw[1]; 00492 u->z = xyzw[2]; 00493 u->w = xyzw[3]; 00494 } 00495 00496 void jit_vec4_from_coords(t_jit_vec4 *u, float x, float y, float z, float w) 00497 { 00498 u->x = x; 00499 u->y = y; 00500 u->z = z; 00501 u->w = w; 00502 } 00503 00504 void jit_vec4_to_array(t_jit_vec4 *u, float *xyzw) 00505 { 00506 xyzw[0] = u->x; 00507 xyzw[1] = u->y; 00508 xyzw[2] = u->z; 00509 xyzw[3] = u->w; 00510 } 00511 00512 void jit_vec4_to_coords(t_jit_vec4 *u, float *x, float *y, float *z, float *w) 00513 { 00514 *x = u->x; 00515 *y = u->y; 00516 *z = u->z; 00517 *w = u->w; 00518 } 00519 00520 long jit_vec4_equal(t_jit_vec4 *u, t_jit_vec4 *v) 00521 { 00522 return (u->x == v->x && u->y == v->y && u->z == v->z && u->w == v->w) ? TRUE : FALSE; 00523 } 00524 00525 long jit_vec4_not_equal(t_jit_vec4 *u, t_jit_vec4 *v) 00526 { 00527 return (u->x != v->x || u->y != v->y || u->z != v->z || u->w != v->w) ? TRUE : FALSE; 00528 } 00529 00530 void jit_vec4_mult( t_jit_vec4 *u, t_jit_vec4 *a, t_jit_vec4 *b) 00531 { 00532 u->x = a->x * b->x; 00533 u->y = a->y * b->y; 00534 u->z = a->z * b->z; 00535 u->w = a->w * b->w; 00536 } 00537 00538 void jit_vec4_scale( t_jit_vec4 *u, t_jit_vec4 *a, float s) 00539 { 00540 u->x = a->x * s; 00541 u->y = a->y * s; 00542 u->z = a->z * s; 00543 u->w = a->w * s; 00544 } 00545 00546 void jit_vec4_accum_scale( t_jit_vec4 *u, float s) 00547 { 00548 u->x *= s; 00549 u->y *= s; 00550 u->z *= s; 00551 u->w *= s; 00552 } 00553 00554 void jit_vec4_div( t_jit_vec4 *u, t_jit_vec4 *a, float s) 00555 { 00556 float inv = 0.0f; 00557 00558 if(s != 0.0f) 00559 inv = 1.0f / s; 00560 00561 u->x = a->x * inv; 00562 u->y = a->y * inv; 00563 u->z = a->z * inv; 00564 u->w = a->z * inv; 00565 } 00566 00567 void jit_vec4_sub( t_jit_vec4 *u, t_jit_vec4 *a, t_jit_vec4 *b) 00568 { 00569 u->x = a->x - b->x; 00570 u->y = a->y - b->y; 00571 u->z = a->z - b->z; 00572 u->w = a->w - b->w; 00573 } 00574 00575 void jit_vec4_accum_sub(t_jit_vec4 *u, t_jit_vec4 *v) 00576 { 00577 u->x -= v->x; 00578 u->y -= v->y; 00579 u->z -= v->z; 00580 u->w -= v->w; 00581 } 00582 00583 void jit_vec4_add( t_jit_vec4 *u, t_jit_vec4 *a, t_jit_vec4 *b) 00584 { 00585 u->x = a->x + b->x; 00586 u->y = a->y + b->y; 00587 u->z = a->z + b->z; 00588 u->w = a->w + b->w; 00589 } 00590 00591 void jit_vec4_accum_add(t_jit_vec4 *u, t_jit_vec4 *v) 00592 { 00593 u->x += v->x; 00594 u->y += v->y; 00595 u->z += v->z; 00596 u->w += v->w; 00597 } 00598 00599 float jit_vec4_get_coord(t_jit_vec4 *u, long i) 00600 { 00601 if(i >= 0 && i < 4) 00602 return u->vals[i]; 00603 else 00604 return 0.0f; 00605 } 00606 00607 float jit_vec4_mag_sqr(t_jit_vec4 *u) 00608 { 00609 return u->x * u->x + u->y * u->y + u->z * u->z + u->w * u->w; 00610 } 00611 00612 float jit_vec4_mag(t_jit_vec4 *u) 00613 { 00614 float v = u->x * u->x + u->y * u->y + u->z * u->z + u->w * u->w; 00615 if(v != 0.0f) 00616 return jit_math_sqrt(v); 00617 else 00618 return v; 00619 } 00620 00621 void jit_vec4_negate(t_jit_vec4 *u) 00622 { 00623 u->x = -u->x; 00624 u->y = -u->y; 00625 u->z = -u->z; 00626 u->w = -u->w; 00627 } 00628 00629 float jit_vec4_dot( t_jit_vec4 *u, t_jit_vec4 *v) 00630 { 00631 return u->x*v->x + u->y*v->y + u->z*v->z + u->w*v->w; 00632 } 00633 00634 float jit_vec4_normalize( t_jit_vec4 *u ) 00635 { 00636 float s = JIT_MATH_F32_EPS; 00637 float m = u->x * u->x + u->y * u->y + u->z * u->z + u->w * u->w; 00638 00639 if (m > JIT_MATH_F32_EPS) 00640 { 00641 s = jit_math_sqrt(m); 00642 s = 1.0f / s; 00643 u->x *= s; 00644 u->y *= s; 00645 u->z *= s; 00646 u->w *= s; 00647 } 00648 else 00649 { 00650 u->x = s; 00651 u->y = s; 00652 u->z = s; 00653 u->w = s; 00654 } 00655 00656 return s; 00657 } 00658 00659 void jit_vec4_max(t_jit_vec4 *r, t_jit_vec4 *a, t_jit_vec4 *b) 00660 { 00661 r->x = JIT_MATH_MAX(a->x, b->x); 00662 r->y = JIT_MATH_MAX(a->y, b->y); 00663 r->z = JIT_MATH_MAX(a->z, b->z); 00664 r->w = JIT_MATH_MAX(a->w, b->w); 00665 } 00666 00667 void jit_vec4_min(t_jit_vec4 *r, t_jit_vec4 *a, t_jit_vec4 *b) 00668 { 00669 r->x = JIT_MATH_MIN(a->x, b->x); 00670 r->y = JIT_MATH_MIN(a->y, b->y); 00671 r->z = JIT_MATH_MIN(a->z, b->z); 00672 r->w = JIT_MATH_MIN(a->w, b->w); 00673 } 00674 00675 void jit_vec4_lerp(t_jit_vec4 *w, float t, t_jit_vec4 *u, t_jit_vec4 *v) 00676 { 00677 w->x = JIT_MATH_LERP(t, u->x, v->x); 00678 w->y = JIT_MATH_LERP(t, u->y, v->y); 00679 w->z = JIT_MATH_LERP(t, u->z, v->z); 00680 w->w = JIT_MATH_LERP(t, u->w, v->w); 00681 } 00682 00683 long jit_vec4_is_valid( t_jit_vec4 *v) 00684 { 00685 return (!jit_math_is_nan(v->x) && !jit_math_is_nan(v->y) && !jit_math_is_nan(v->z) && !jit_math_is_nan(v->w) && 00686 jit_math_is_finite(v->x) && jit_math_is_finite(v->y) && jit_math_is_finite(v->z) && jit_math_is_finite(v->w)); 00687 } 00688 00689 // ---------------------------------------------------------------------------- 00690 00691 void jit_quat_fill(t_jit_quat *u, float x) 00692 { 00693 u->x = x; 00694 u->y = x; 00695 u->z = x; 00696 u->w = x; 00697 } 00698 00699 void jit_quat_assign(t_jit_quat *u, t_jit_quat *v) 00700 { 00701 if(u == v) 00702 return; 00703 00704 u->x = v->x; 00705 u->y = v->y; 00706 u->z = v->z; 00707 u->w = v->w; 00708 } 00709 00710 void jit_quat_from_array(t_jit_quat *u, float *xyzw) 00711 { 00712 u->x = xyzw[0]; 00713 u->y = xyzw[1]; 00714 u->z = xyzw[2]; 00715 u->w = xyzw[3]; 00716 } 00717 00718 void jit_quat_from_coords(t_jit_quat *u, float x, float y, float z, float w) 00719 { 00720 u->x = x; 00721 u->y = y; 00722 u->z = z; 00723 u->w = w; 00724 } 00725 00726 void jit_quat_to_array(t_jit_quat *u, float *xyzw) 00727 { 00728 xyzw[0] = u->x; 00729 xyzw[1] = u->y; 00730 xyzw[2] = u->z; 00731 xyzw[3] = u->w; 00732 } 00733 00734 void jit_quat_to_coords(t_jit_quat *u, float *x, float *y, float *z, float *w) 00735 { 00736 *x = u->x; 00737 *y = u->y; 00738 *z = u->z; 00739 *w = u->w; 00740 } 00741 00742 long jit_quat_equal(t_jit_quat *u, t_jit_quat *v) 00743 { 00744 return (u->x == v->x && u->y == v->y && u->z == v->z && u->w == v->w) ? TRUE : FALSE; 00745 } 00746 00747 long jit_quat_not_equal(t_jit_quat *u, t_jit_quat *v) 00748 { 00749 return (u->x != v->x || u->y != v->y || u->z != v->z || u->w != v->w) ? TRUE : FALSE; 00750 } 00751 00752 void jit_quat_scale( t_jit_quat *u, t_jit_quat *a, float s) 00753 { 00754 u->x = a->x * s; 00755 u->y = a->y * s; 00756 u->z = a->z * s; 00757 u->w = a->w * s; 00758 } 00759 00760 void jit_quat_accum_scale( t_jit_quat *u, float s) 00761 { 00762 u->x *= s; 00763 u->y *= s; 00764 u->z *= s; 00765 u->w *= s; 00766 } 00767 00768 void jit_quat_div( t_jit_quat *u, t_jit_quat *a, float s) 00769 { 00770 float inv = 0.0f; 00771 00772 if(s != 0.0f) 00773 inv = 1.0f / s; 00774 00775 u->x = a->x * inv; 00776 u->y = a->y * inv; 00777 u->z = a->z * inv; 00778 u->w = a->z * inv; 00779 } 00780 00781 void jit_quat_add(t_jit_quat * r, t_jit_quat * q1, t_jit_quat * q2) 00782 { 00783 t_jit_quat t1, t2; 00784 00785 t1.x = q1->x * q2->w; 00786 t1.y = q1->y * q2->w; 00787 t1.z = q1->z * q2->w; 00788 t1.w = q1->w; 00789 00790 t2.x = q2->x * q1->w; 00791 t2.y = q2->y * q1->w; 00792 t2.z = q2->z * q1->w; 00793 t2.w = q2->w; 00794 00795 r->x = (q2->y * q1->z) - (q2->z * q1->y) + t1.x + t2.x; 00796 r->y = (q2->z * q1->x) - (q2->x * q1->z) + t1.y + t2.y; 00797 r->z = (q2->x * q1->y) - (q2->y * q1->x) + t1.z + t2.z; 00798 r->w = q1->w * q2->w - (q1->x * q2->x + q1->y * q2->y + q1->z * q2->z); 00799 } 00800 00801 void jit_quat_mult( t_jit_quat *r, t_jit_quat * p, t_jit_quat * q) 00802 { 00803 r->x = p->w * q->x + p->x * q->w + p->y * q->z - p->z * q->y; 00804 r->y = p->w * q->y + p->y * q->w + p->z * q->x - p->x * q->z; 00805 r->z = p->w * q->z + p->z * q->w + p->x * q->y - p->y * q->x; 00806 r->w = p->w * q->w - p->x * q->x - p->y * q->y - p->z * q->z; 00807 } 00808 00809 float jit_quat_dot( t_jit_quat * q1, t_jit_quat * q2) 00810 { 00811 return q1->x*q2->x + q1->y*q2->y + q1->z*q2->z + q1->w*q2->w; 00812 } 00813 00814 float jit_quat_get_coord( t_jit_quat *u, long i) 00815 { 00816 if(i >= 0 && i < 4) 00817 return u->vals[i]; 00818 else 00819 return 0.0f; 00820 } 00821 00822 float jit_quat_mag_sqr(t_jit_quat *u) 00823 { 00824 return u->x * u->x + u->y * u->y + u->z * u->z + u->w * u->w; 00825 } 00826 00827 float jit_quat_mag(t_jit_quat *u) 00828 { 00829 float v = u->x * u->x + u->y * u->y + u->z * u->z + u->w * u->w; 00830 if(v != 0.0f) 00831 return jit_math_sqrt(v); 00832 else 00833 return v; 00834 } 00835 00836 void jit_quat_negate(t_jit_quat *u) 00837 { 00838 u->x = -u->x; 00839 u->y = -u->y; 00840 u->z = -u->z; 00841 u->w = -u->w; 00842 } 00843 00844 float jit_quat_normalize( t_jit_quat *u ) 00845 { 00846 float s = JIT_MATH_F32_EPS; 00847 float m = u->x * u->x + u->y * u->y + u->z * u->z + u->w * u->w; 00848 00849 if (m > JIT_MATH_F32_EPS) 00850 { 00851 s = jit_math_sqrt(m); 00852 s = 1.0f / s; 00853 u->x *= s; 00854 u->y *= s; 00855 u->z *= s; 00856 u->w *= s; 00857 } 00858 else 00859 { 00860 u->x = s; 00861 u->y = s; 00862 u->z = s; 00863 u->w = s; 00864 } 00865 00866 return s; 00867 } 00868 00869 void jit_quat_max(t_jit_quat *r, t_jit_quat *a, t_jit_quat *b) 00870 { 00871 r->x = JIT_MATH_MAX(a->x, b->x); 00872 r->y = JIT_MATH_MAX(a->y, b->y); 00873 r->z = JIT_MATH_MAX(a->z, b->z); 00874 r->w = JIT_MATH_MAX(a->w, b->w); 00875 } 00876 00877 void jit_quat_min(t_jit_quat *r, t_jit_quat *a, t_jit_quat *b) 00878 { 00879 r->x = JIT_MATH_MIN(a->x, b->x); 00880 r->y = JIT_MATH_MIN(a->y, b->y); 00881 r->z = JIT_MATH_MIN(a->z, b->z); 00882 r->w = JIT_MATH_MIN(a->w, b->w); 00883 } 00884 00885 void jit_quat_from_mat3( t_jit_quat *q, t_jit_mat3 *m) 00886 { 00887 static long next[] = { 1, 2, 0 }; 00888 00889 long i, j, k; 00890 float vi, vj, vk; 00891 float scale; 00892 00893 float trace = m->v00 + m->v11 + m->v22; 00894 00895 if (trace > 0.0f) 00896 { 00897 scale = jit_math_sqrt(trace + 1.0f); 00898 q->w = 0.5f * scale; 00899 scale = 0.5f / scale; 00900 q->x = scale * (m->v21 - m->v12); 00901 q->y = scale * (m->v02 - m->v20); 00902 q->z = scale * (m->v10 - m->v01); 00903 } 00904 else 00905 { 00906 i = 0; 00907 if (m->v11 > m->v00) 00908 i = 1; 00909 00910 vi = jit_mat3_get_coord(m, i, i); 00911 if (m->v22 > vi) 00912 i = 2; 00913 00914 j = next[i]; 00915 k = next[j]; 00916 00917 vi = jit_mat3_get_coord(m, i, i); 00918 vj = jit_mat3_get_coord(m, j, j); 00919 vk = jit_mat3_get_coord(m, k, k); 00920 00921 scale = jit_math_sqrt(vi - vj - vk + 1); 00922 00923 q->vals[i] = 0.5f * scale; 00924 scale = 0.5f / scale; 00925 00926 vi = jit_mat3_get_coord(m, k, j); 00927 vj = jit_mat3_get_coord(m, j, k); 00928 q->w = scale * (vi - vj); 00929 00930 vi = jit_mat3_get_coord(m, j, i); 00931 vj = jit_mat3_get_coord(m, i, j); 00932 q->vals[j] = scale * (vi + vj); 00933 00934 vi = jit_mat3_get_coord(m, k, i); 00935 vj = jit_mat3_get_coord(m, i, k); 00936 q->vals[k] = scale * (vi + vj); 00937 } 00938 } 00939 00940 void jit_mat3_from_quat(t_jit_mat3 *m, t_jit_quat *q ) 00941 { 00942 float x2 = q->x * 2; 00943 float y2 = q->y * 2; 00944 float z2 = q->z * 2; 00945 00946 float wx = x2 * q->w; 00947 float wy = y2 * q->w; 00948 float wz = z2 * q->w; 00949 float xx = x2 * q->x; 00950 float xy = y2 * q->x; 00951 float xz = z2 * q->x; 00952 float yy = y2 * q->y; 00953 float yz = z2 * q->y; 00954 float zz = z2 * q->z; 00955 00956 m->v00 = 1 - (yy + zz); 00957 m->v01 = xy - wz; 00958 m->v02 = xz + wy; 00959 m->v10 = xy + wz; 00960 m->v11 = 1 - (xx + zz); 00961 m->v12 = yz - wx; 00962 m->v20 = xz - wy; 00963 m->v21 = yz + wx; 00964 m->v22 = 1 - (xx + yy); 00965 } 00966 00967 void jit_quat_from_mat4(t_jit_quat * q, t_jit_mat4 *m) 00968 { 00969 t_jit_mat3 r; 00970 jit_mat3_from_mat4(&r, m); 00971 jit_quat_from_mat3(q, &r); 00972 } 00973 00974 void jit_quat_from_axisangle(t_jit_quat * q, t_jit_vec3 *a, float angle) 00975 { 00976 t_jit_vec3 t; 00977 float scale; 00978 float halfangle; 00979 00980 t.x = a->x; 00981 t.y = a->y; 00982 t.z = a->z; 00983 00984 jit_vec3_normalize(&t); 00985 00986 halfangle = angle * 0.5f; 00987 scale = jit_math_sin(halfangle); 00988 00989 q->x = scale * t.x; 00990 q->y = scale * t.y; 00991 q->z = scale * t.z; 00992 q->w = jit_math_cos(halfangle); 00993 } 00994 00995 void jit_quat_conj(t_jit_quat * p) 00996 { 00997 p->x = -p->x; 00998 p->y = -p->y; 00999 p->z = -p->z; 01000 } 01001 01002 void jit_quat_get_conj(t_jit_quat * p, t_jit_quat * q) 01003 { 01004 p->x = -q->x; 01005 p->y = -q->y; 01006 p->z = -q->z; 01007 p->w = q->w; 01008 } 01009 01010 void jit_quat_slerp(t_jit_quat *r, float s, t_jit_quat * q1, t_jit_quat * q2) 01011 { 01012 float cosine; 01013 float angle; 01014 float sine; 01015 float invsine; 01016 float c1, c2; 01017 01018 cosine = jit_quat_dot(q1, q2); 01019 if (cosine < -1) 01020 cosine = -1; 01021 else if (cosine > 1) 01022 cosine = 1; 01023 01024 angle = (float)jit_math_acos(cosine); 01025 if (JIT_MATH_F32_ABS(angle) < JIT_MATH_F32_EPS) 01026 { 01027 r->x = q1->x; 01028 r->y = q1->y; 01029 r->z = q1->z; 01030 r->w = q1->w; 01031 return; 01032 } 01033 01034 sine = jit_math_sin(angle); 01035 invsine = 1.0f / sine; 01036 01037 c1 = jit_math_sin((1.0f - s) * angle) * invsine; 01038 c2 = jit_math_sin(s * angle) * invsine; 01039 01040 r->x = c1 * q1->x + c2 * q2->x; 01041 r->y = c1 * q1->y + c2 * q2->y; 01042 r->z = c1 * q1->z + c2 * q2->z; 01043 r->w = c1 * q1->w + c2 * q2->w; 01044 } 01045 01046 void jit_quat_trackball(t_jit_quat * q, t_jit_vec2 *p1, t_jit_vec2 *p2, float radius) 01047 { 01048 t_jit_vec3 d; 01049 t_jit_vec3 axis; 01050 t_jit_vec3 v1, v2; 01051 01052 float t; 01053 float phi; 01054 01055 if (p1->x == p2->x && p1->y == p2->y) 01056 { 01057 // zero rotation 01058 q->x = 0.0f; 01059 q->y = 0.0f; 01060 q->z = 0.0f; 01061 q->w = 1.0f; 01062 return; 01063 } 01064 01065 // get z-coordinates for projection of P1 and P2 to deformed sphere 01066 jit_vec3_from_coords(&v1, p1->x, p1->y, jit_math_project_to_sphere(radius, p1->x, p1->y)); 01067 jit_vec3_from_coords(&v2, p2->x, p2->y, jit_math_project_to_sphere(radius, p2->x, p2->y)); 01068 01069 // cross product of P1 and P2 01070 jit_vec3_cross(&axis, &v1, &v2); 01071 01072 // figure out how much to rotate around that axis. 01073 d.x = v1.x - v2.x; 01074 d.y = v1.y - v2.y; 01075 d.z = v1.z - v2.z; 01076 t = jit_math_sqrt(d.x * d.x + d.y * d.y + d.z * d.z) / (radius); 01077 01078 // avoid problems with out-of-control values... 01079 if (t > 1.0f) 01080 t = 1.0f; 01081 if (t < -1.0f) 01082 t = -1.0f; 01083 01084 phi = 2.0f * (float)jit_math_asin(t); 01085 jit_quat_from_axisangle(q, &axis, phi); 01086 } 01087 01088 long jit_quat_is_valid( t_jit_quat *v) 01089 { 01090 return (!jit_math_is_nan(v->x) && !jit_math_is_nan(v->y) && !jit_math_is_nan(v->z) && !jit_math_is_nan(v->w) && 01091 jit_math_is_finite(v->x) && jit_math_is_finite(v->y) && jit_math_is_finite(v->z) && jit_math_is_finite(v->w)); 01092 } 01093 01094 // ---------------------------------------------------------------------------- 01095 01096 void jit_mat3_assign( t_jit_mat3 *m, t_jit_mat3 *a ) 01097 { 01098 // avoid self assignment 01099 if(m == a) 01100 return; 01101 01102 m->v00 = a->v00; m->v10 = a->v10; m->v20 = a->v20; 01103 m->v01 = a->v01; m->v11 = a->v11; m->v21 = a->v21; 01104 m->v02 = a->v02; m->v12 = a->v12; m->v22 = a->v22; 01105 } 01106 01107 void jit_mat3_from_array( t_jit_mat3 *m, float *v ) 01108 { 01109 m->v00 = v[0]; m->v10 = v[1]; m->v20 = v[2]; 01110 m->v01 = v[3]; m->v11 = v[4]; m->v21 = v[5]; 01111 m->v02 = v[6]; m->v12 = v[7]; m->v22 = v[8]; 01112 } 01113 01114 void jit_mat3_from_array3x3( t_jit_mat3 *m, float **v ) 01115 { 01116 m->v00 = v[0][0]; m->v10 = v[1][0]; m->v20 = v[2][0]; 01117 m->v01 = v[0][1]; m->v11 = v[1][1]; m->v21 = v[2][1]; 01118 m->v02 = v[0][2]; m->v12 = v[1][2]; m->v22 = v[2][2]; 01119 } 01120 01121 void jit_mat3_from_coords( t_jit_mat3 *m, 01122 float f0, float f1, float f2, 01123 float f3, float f4, float f5, 01124 float f6, float f7, float f8 ) 01125 { 01126 m->v00 = f0; m->v10 = f1; m->v20 = f2; 01127 m->v01 = f3; m->v11 = f4; m->v21 = f5; 01128 m->v02 = f6; m->v12 = f7; m->v22 = f8; 01129 } 01130 01131 void jit_mat3_to_array( t_jit_mat3 *m, float *v ) 01132 { 01133 m->v00 = v[0]; m->v10 = v[1]; m->v20 = v[2]; 01134 m->v01 = v[3]; m->v11 = v[4]; m->v21 = v[5]; 01135 m->v02 = v[6]; m->v12 = v[7]; m->v22 = v[8]; 01136 } 01137 01138 void jit_mat3_to_array3x3( t_jit_mat3 *m, float **v ) 01139 { 01140 v[0][0] = m->v00; v[1][0] = m->v10; v[2][0] = m->v20; 01141 v[0][1] = m->v01; v[1][1] = m->v11; v[2][1] = m->v21; 01142 v[0][2] = m->v02; v[1][2] = m->v12; v[2][2] = m->v22; 01143 } 01144 01145 void jit_mat3_to_coords( t_jit_mat3 *m, 01146 float *f0, float *f1, float *f2, 01147 float *f3, float *f4, float *f5, 01148 float *f6, float *f7, float *f8 ) 01149 { 01150 *f0 = m->v00; *f1 = m->v10; *f2 = m->v20; 01151 *f3 = m->v01; *f4 = m->v11; *f5 = m->v21; 01152 *f6 = m->v02; *f7 = m->v12; *f8 = m->v22; 01153 } 01154 01155 void jit_mat3_get_row( t_jit_vec3 *v, long i, t_jit_mat3 *m ) 01156 { 01157 if( i >= 0 && i < 3 ) 01158 { 01159 v->x = m->vals[i + 0]; 01160 v->y = m->vals[i + 3]; 01161 v->z = m->vals[i + 6]; 01162 } 01163 } 01164 01165 void jit_mat3_set_row( t_jit_mat3 *m, long i, t_jit_vec3 *v ) 01166 { 01167 if( i >= 0 && i < 3 ) 01168 { 01169 m->vals[i + 0] = v->x; 01170 m->vals[i + 3] = v->y; 01171 m->vals[i + 6] = v->z; 01172 } 01173 } 01174 01175 void jit_mat3_get_col( t_jit_vec3 *v, long i, t_jit_mat3 *m ) 01176 { 01177 if( i >= 0 && i < 3 ) 01178 { 01179 v->x = m->vals[i * 3 + 0]; 01180 v->y = m->vals[i * 3 + 1]; 01181 v->z = m->vals[i * 3 + 2]; 01182 } 01183 } 01184 01185 void jit_mat3_set_col( t_jit_mat3 *m, long i, t_jit_vec3 *v) 01186 { 01187 if( i >= 0 && i < 3 ) 01188 { 01189 m->vals[i * 3 + 0] = v->x; 01190 m->vals[i * 3 + 1] = v->y; 01191 m->vals[i * 3 + 2] = v->z; 01192 } 01193 } 01194 01195 float jit_mat3_get_coord( t_jit_mat3 *m, long r, long c ) 01196 { 01197 if(r >= 0 && r < 3 && c >= 0 && c < 3 ) 01198 return m->vals[ c * 3 + r ]; 01199 else 01200 return 0.0f; 01201 } 01202 01203 void jit_mat3_add(t_jit_mat3 *c, t_jit_mat3 *a, t_jit_mat3 *b) 01204 { 01205 // avoid self assignment 01206 if (c == a || c == b) 01207 { 01208 t_jit_mat3 m; 01209 01210 m.v00 = a->v00 + b->v00; 01211 m.v01 = a->v01 + b->v01; 01212 m.v02 = a->v02 + b->v02; 01213 m.v10 = a->v10 + b->v10; 01214 m.v11 = a->v11 + b->v11; 01215 m.v12 = a->v12 + b->v12; 01216 m.v20 = a->v20 + b->v20; 01217 m.v21 = a->v21 + b->v21; 01218 m.v22 = a->v22 + b->v22; 01219 01220 jit_mat3_assign(c, &m); 01221 } 01222 else 01223 { 01224 c->v00 = a->v00 + b->v00; 01225 c->v01 = a->v01 + b->v01; 01226 c->v02 = a->v02 + b->v02; 01227 c->v10 = a->v10 + b->v10; 01228 c->v11 = a->v11 + b->v11; 01229 c->v12 = a->v12 + b->v12; 01230 c->v20 = a->v20 + b->v20; 01231 c->v21 = a->v21 + b->v21; 01232 c->v22 = a->v22 + b->v22; 01233 } 01234 } 01235 01236 void jit_mat3_accum_add(t_jit_mat3 *a, t_jit_mat3 *b) 01237 { 01238 a->v00 += b->v00; 01239 a->v10 += b->v10; 01240 a->v20 += b->v20; 01241 a->v01 += b->v01; 01242 a->v11 += b->v11; 01243 a->v21 += b->v21; 01244 a->v02 += b->v02; 01245 a->v12 += b->v12; 01246 a->v22 += b->v22; 01247 } 01248 01249 void jit_mat3_accum_scale( t_jit_mat3 *m, float s) 01250 { 01251 m->v00 *= s; m->v10 *= s; m->v20 *= s; 01252 m->v01 *= s; m->v11 *= s; m->v21 *= s; 01253 m->v02 *= s; m->v12 *= s; m->v22 *= s; 01254 } 01255 01256 void jit_mat3_accum_sub( t_jit_mat3 *m, t_jit_mat3 *a ) 01257 { 01258 m->v00 -= a->v00; m->v10 -= a->v10; m->v20 -= a->v20; 01259 m->v01 -= a->v01; m->v11 -= a->v11; m->v21 -= a->v21; 01260 m->v02 -= a->v02; m->v12 -= a->v12; m->v22 -= a->v22; 01261 } 01262 01263 void jit_mat3_mult(t_jit_mat3 *c, t_jit_mat3 *a, t_jit_mat3 *b) 01264 { 01265 if (c == a || c == b) 01266 { 01267 t_jit_mat3 m; 01268 01269 m.v00 = a->v00 * b->v00 + a->v01 * b->v10 + a->v02 * b->v20; 01270 m.v10 = a->v10 * b->v00 + a->v11 * b->v10 + a->v12 * b->v20; 01271 m.v20 = a->v20 * b->v00 + a->v21 * b->v10 + a->v22 * b->v20; 01272 m.v01 = a->v00 * b->v01 + a->v01 * b->v11 + a->v02 * b->v21; 01273 m.v11 = a->v10 * b->v01 + a->v11 * b->v11 + a->v12 * b->v21; 01274 m.v21 = a->v20 * b->v01 + a->v21 * b->v11 + a->v22 * b->v21; 01275 m.v02 = a->v00 * b->v02 + a->v01 * b->v12 + a->v02 * b->v22; 01276 m.v12 = a->v10 * b->v02 + a->v11 * b->v12 + a->v12 * b->v22; 01277 m.v22 = a->v20 * b->v02 + a->v21 * b->v12 + a->v22 * b->v22; 01278 01279 jit_mat3_assign(c, &m); 01280 } 01281 else 01282 { 01283 c->v00 = a->v00 * b->v00 + a->v01 * b->v10 + a->v02 * b->v20; 01284 c->v10 = a->v10 * b->v00 + a->v11 * b->v10 + a->v12 * b->v20; 01285 c->v20 = a->v20 * b->v00 + a->v21 * b->v10 + a->v22 * b->v20; 01286 c->v01 = a->v00 * b->v01 + a->v01 * b->v11 + a->v02 * b->v21; 01287 c->v11 = a->v10 * b->v01 + a->v11 * b->v11 + a->v12 * b->v21; 01288 c->v21 = a->v20 * b->v01 + a->v21 * b->v11 + a->v22 * b->v21; 01289 c->v02 = a->v00 * b->v02 + a->v01 * b->v12 + a->v02 * b->v22; 01290 c->v12 = a->v10 * b->v02 + a->v11 * b->v12 + a->v12 * b->v22; 01291 c->v22 = a->v20 * b->v02 + a->v21 * b->v12 + a->v22 * b->v22; 01292 } 01293 } 01294 01295 void jit_mat3_get_transpose(t_jit_mat3 *b, t_jit_mat3 *a) 01296 { 01297 b->v00 = a->v00; 01298 b->v01 = a->v10; 01299 b->v02 = a->v20; 01300 b->v10 = a->v01; 01301 b->v11 = a->v11; 01302 b->v12 = a->v21; 01303 b->v20 = a->v02; 01304 b->v21 = a->v12; 01305 b->v22 = a->v22; 01306 } 01307 01308 void jit_mat3_transpose(t_jit_mat3 *a) 01309 { 01310 float t; 01311 t = a->v01; 01312 a->v01 = a->v10; 01313 a->v10 = t; 01314 01315 t = a->v02; 01316 a->v02 = a->v20; 01317 a->v20 = t; 01318 01319 t = a->v12; 01320 a->v12 = a->v21; 01321 a->v21 = t; 01322 } 01323 01324 void jit_mat3_mult_vec3( t_jit_vec3 *r, t_jit_mat3 *m, t_jit_vec3 *v ) 01325 { 01326 r->x = m->v00 * v->x + m->v01 * v->y + m->v02 * v->z; 01327 r->y = m->v10 * v->x + m->v11 * v->y + m->v12 * v->z; 01328 r->z = m->v20 * v->x + m->v21 * v->y + m->v22 * v->z; 01329 } 01330 01331 void jit_vec3_mult_mat3( t_jit_vec3 *r, t_jit_vec3 *v, t_jit_mat3 *m ) 01332 { 01333 r->x = m->v00 * v->x + m->v10 * v->y + m->v20 * v->z; 01334 r->y = m->v01 * v->x + m->v11 * v->y + m->v21 * v->z; 01335 r->z = m->v02 * v->x + m->v12 * v->y + m->v22 * v->z; 01336 } 01337 01338 void jit_mat3_from_axisangle( t_jit_mat3 *m, t_jit_vec3 *v, float theta ) 01339 { 01340 float ct = (float)(jit_math_cos(theta)); 01341 float st = (float)(jit_math_sin(theta)); 01342 01343 float xx = v->x * v->x; 01344 float yy = v->y * v->y; 01345 float zz = v->z * v->z; 01346 float xy = v->x * v->y; 01347 float xz = v->x * v->z; 01348 float yz = v->y * v->z; 01349 01350 m->v00 = xx + ct*(1-xx); 01351 m->v01 = xy + ct*(-xy) + st*-v->z; 01352 m->v02 = xz + ct*(-xz) + st*v->y; 01353 01354 m->v10 = xy + ct*(-xy) + st*v->z; 01355 m->v11 = yy + ct*(1-yy); 01356 m->v12 = yz + ct*(-yz) + st*-v->x; 01357 01358 m->v20 = xz + ct*(-xz) + st*-v->y; 01359 m->v21 = yz + ct*(-yz) + st*v->x; 01360 m->v22 = zz + ct*(1-zz); 01361 } 01362 01363 void jit_mat3_from_uv( t_jit_mat3 *m, t_jit_vec3 *u, t_jit_vec3 *v ) 01364 { 01365 float phi; 01366 float h, hxy, hxz, hyz; 01367 float lambda; 01368 t_jit_vec3 w; 01369 01370 jit_vec3_cross(&w, u, v); 01371 phi = jit_vec3_dot(u, v); 01372 lambda = jit_vec3_dot(&w, &w); 01373 01374 if (lambda > JIT_MATH_F32_EPS) 01375 h = (1.0f - phi) / lambda; 01376 else 01377 h = lambda; 01378 01379 hxy = w.x * w.y * h; 01380 hxz = w.x * w.z * h; 01381 hyz = w.y * w.z * h; 01382 01383 m->v00 = phi + w.x * w.x * h; 01384 m->v01 = hxy - w.z; 01385 m->v02 = hxz + w.y; 01386 01387 m->v10 = hxy + w.z; 01388 m->v11 = phi + w.y * w.y * h; 01389 m->v12 = hyz - w.x; 01390 01391 m->v20 = hxz - w.y; 01392 m->v21 = hyz + w.x; 01393 m->v22 = phi + w.z * w.z * h; 01394 } 01395 01396 float jit_mat3_determinant( t_jit_mat3 *m ) 01397 { 01398 return JIT_MATH_DET3x3( 01399 m->v00, m->v01, m->v02, 01400 m->v10, m->v11, m->v12, 01401 m->v20, m->v21, m->v22); 01402 } 01403 01404 void jit_mat3_get_inverse(t_jit_mat3 *b, t_jit_mat3 *a) 01405 { 01406 float det,oodet; 01407 01408 b->v00 = (a->v11 * a->v22 - a->v21 * a->v12); 01409 b->v10 = -(a->v10 * a->v22 - a->v20 * a->v12); 01410 b->v20 = (a->v10 * a->v21 - a->v20 * a->v11); 01411 b->v01 = -(a->v01 * a->v22 - a->v21 * a->v02); 01412 b->v11 = (a->v00 * a->v22 - a->v20 * a->v02); 01413 b->v21 = -(a->v00 * a->v21 - a->v20 * a->v01); 01414 b->v02 = (a->v01 * a->v12 - a->v11 * a->v02); 01415 b->v12 = -(a->v00 * a->v12 - a->v10 * a->v02); 01416 b->v22 = (a->v00 * a->v11 - a->v10 * a->v01); 01417 01418 det = (a->v00 * b->v00) + (a->v01 * b->v10) + (a->v02 * b->v20); 01419 01420 oodet = 1.0f / det; 01421 01422 b->v00 *= oodet; b->v01 *= oodet; b->v02 *= oodet; 01423 b->v10 *= oodet; b->v11 *= oodet; b->v12 *= oodet; 01424 b->v20 *= oodet; b->v21 *= oodet; b->v22 *= oodet; 01425 } 01426 01427 01428 void jit_mat3_negate( t_jit_mat3 *m ) 01429 { 01430 m->v00 = -m->v00; m->v10 = -m->v10; m->v20 = -m->v20; 01431 m->v01 = -m->v01; m->v11 = -m->v11; m->v21 = -m->v21; 01432 m->v02 = -m->v02; m->v12 = -m->v12; m->v22 = -m->v22; 01433 } 01434 01435 void jit_mat3_tangent_basis(t_jit_mat3 *basis, 01436 t_jit_vec3 *v0, t_jit_vec3 *v1, t_jit_vec3 *v2, 01437 t_jit_vec2 *t0, t_jit_vec2 *t1, t_jit_vec2 *t2, 01438 t_jit_vec3 *n) 01439 { 01440 float oonorm; 01441 t_jit_vec3 cp; 01442 t_jit_vec3 e0; 01443 t_jit_vec3 e1; 01444 01445 jit_vec3_from_coords(&e0, v1->x - v0->x, t1->s - t0->s, t1->t - t0->t); 01446 jit_vec3_from_coords(&e1, v2->x - v0->x, t2->s - t0->s, t2->t - t0->t); 01447 01448 jit_vec3_cross(&cp, &e0, &e1); 01449 if ( JIT_MATH_F32_ABS(cp.x) > JIT_MATH_F32_EPS) 01450 { 01451 basis->v00 = -cp.y / cp.x; 01452 basis->v10 = -cp.z / cp.x; 01453 } 01454 01455 e0.x = v1->y - v0->y; 01456 e1.x = v2->y - v0->y; 01457 01458 jit_vec3_cross(&cp, &e0, &e1); 01459 if ( JIT_MATH_F32_ABS(cp.x) > JIT_MATH_F32_EPS) 01460 { 01461 basis->v01 = -cp.y / cp.x; 01462 basis->v11 = -cp.z / cp.x; 01463 } 01464 01465 e0.x = v1->z - v0->z; 01466 e1.x = v2->z - v0->z; 01467 01468 jit_vec3_cross(&cp, &e0, &e1); 01469 if ( JIT_MATH_F32_ABS(cp.x) > JIT_MATH_F32_EPS) 01470 { 01471 basis->v02 = -cp.y / cp.x; 01472 basis->v12 = -cp.z / cp.x; 01473 } 01474 01475 // tangent 01476 oonorm = 1.0f / jit_math_sqrt(basis->v00 * basis->v00 + basis->v01 * basis->v01 + basis->v02 * basis->v02); 01477 basis->v00 *= oonorm; 01478 basis->v01 *= oonorm; 01479 basis->v02 *= oonorm; 01480 01481 // binormal 01482 oonorm = 1.0f / jit_math_sqrt(basis->v10 * basis->v10 + basis->v11 * basis->v11 + basis->v12 * basis->v12); 01483 basis->v10 *= oonorm; 01484 basis->v11 *= oonorm; 01485 basis->v12 *= oonorm; 01486 01487 // normal via cross product 01488 basis->v20 = basis->v01*basis->v12 - basis->v02*basis->v11; 01489 basis->v21 = basis->v02*basis->v10 - basis->v00*basis->v12; 01490 basis->v22 = basis->v00*basis->v11 - basis->v01*basis->v10; 01491 01492 oonorm = 1.0f / jit_math_sqrt(basis->v20 * basis->v20 + basis->v21 * basis->v21 + basis->v22 * basis->v22); 01493 basis->v20 *= oonorm; 01494 basis->v21 *= oonorm; 01495 basis->v22 *= oonorm; 01496 01497 // Gram-Schmidt orthogonalization process 01498 basis->v10 = basis->v21*basis->v02 - basis->v22*basis->v01; 01499 basis->v11 = basis->v22*basis->v00 - basis->v20*basis->v02; 01500 basis->v12 = basis->v20*basis->v01 - basis->v21*basis->v00; 01501 01502 if (n && (basis->v20 * n->x + basis->v21 * n->y + basis->v22 * n->z < 0.0f)) 01503 { 01504 basis->v20 = -basis->v20; 01505 basis->v21 = -basis->v21; 01506 basis->v22 = -basis->v22; 01507 } 01508 } 01509 01510 void jit_vec3_mult_mat4_pos(t_jit_vec3 *u, t_jit_vec3 *v, t_jit_mat4 *m) 01511 { 01512 float oow; 01513 float div = v->x * m->v03 + v->y * m->v13 + v->z * m->v23 + m->v33; 01514 if (div < JIT_MATH_F32_EPS && div > -JIT_MATH_F32_EPS) 01515 oow = 1.0f ; 01516 else 01517 oow = 1.0f / div; 01518 01519 u->x = (m->v00 * v->x + m->v10 * v->y + m->v20 * v->z + m->v30) * oow; 01520 u->y = (m->v01 * v->x + m->v11 * v->y + m->v21 * v->z + m->v31) * oow; 01521 u->z = (m->v02 * v->x + m->v12 * v->y + m->v22 * v->z + m->v32) * oow; 01522 } 01523 01524 void jit_mat4_mult_vec3_pos(t_jit_vec3 *u, t_jit_mat4 *m, t_jit_vec3 *v) 01525 { 01526 float w; 01527 float div = v->x * m->v30 + v->y * m->v31 + v->z * m->v32 + m->v33; 01528 01529 if (div < JIT_MATH_F32_EPS && div > -JIT_MATH_F32_EPS) 01530 w = 1.0f ; 01531 else 01532 w = 1.0f / div; 01533 01534 u->x = (m->v00 * v->x + m->v01 * v->y + m->v02 * v->z + m->v03) * w; 01535 u->y = (m->v10 * v->x + m->v11 * v->y + m->v12 * v->z + m->v13) * w; 01536 u->z = (m->v20 * v->x + m->v21 * v->y + m->v22 * v->z + m->v23) * w; 01537 } 01538 01539 void jit_vec3_mult_mat4_dir(t_jit_vec3 *u, t_jit_vec3 *v, t_jit_mat4 *m) 01540 { 01541 u->x = m->v00 * v->x + m->v10 * v->y + m->v20 * v->z; 01542 u->y = m->v01 * v->x + m->v11 * v->y + m->v21 * v->z; 01543 u->z = m->v02 * v->x + m->v12 * v->y + m->v22 * v->z; 01544 } 01545 01546 void jit_mat4_mult_vec3_dir(t_jit_vec3 *u, t_jit_mat4 *m, t_jit_vec3 *v) 01547 { 01548 u->x = m->v00 * v->x + m->v01 * v->y + m->v02 * v->z; 01549 u->y = m->v10 * v->x + m->v11 * v->y + m->v12 * v->z; 01550 u->z = m->v20 * v->x + m->v21 * v->y + m->v22 * v->z; 01551 } 01552 01553 void jit_vec3_mult_mat4(t_jit_vec3 *u, t_jit_vec3 *v, t_jit_mat4 *m) 01554 { 01555 u->x = m->v00 * v->x + m->v10 * v->y + m->v20 * v->z + m->v30; 01556 u->y = m->v01 * v->x + m->v11 * v->y + m->v21 * v->z + m->v31; 01557 u->z = m->v02 * v->x + m->v12 * v->y + m->v22 * v->z + m->v32; 01558 } 01559 01560 void jit_mat4_mult_vec3(t_jit_vec3 *u, t_jit_mat4 *m, t_jit_vec3 *v) 01561 { 01562 u->x = m->v00 * v->x + m->v01 * v->y + m->v02 * v->z + m->v03; 01563 u->y = m->v10 * v->x + m->v11 * v->y + m->v12 * v->z + m->v13; 01564 u->z = m->v20 * v->x + m->v21 * v->y + m->v22 * v->z + m->v23; 01565 } 01566 01567 // ---------------------------------------------------------------------------- 01568 01569 void jit_mat4_assign( t_jit_mat4 *m, t_jit_mat4 *a ) 01570 { 01571 // avoid self assignment 01572 if(m == a) 01573 return; 01574 01575 m->v00 = a->v00; m->v10 = a->v10; m->v20 = a->v20; m->v30 = a->v30; 01576 m->v01 = a->v01; m->v11 = a->v11; m->v21 = a->v21; m->v31 = a->v31; 01577 m->v02 = a->v02; m->v12 = a->v12; m->v22 = a->v22; m->v32 = a->v32; 01578 m->v03 = a->v03; m->v13 = a->v13; m->v23 = a->v23; m->v33 = a->v33; 01579 } 01580 01581 void jit_mat4_from_array( t_jit_mat4 *m, float *v ) 01582 { 01583 m->v00 = v[0]; m->v10 = v[1]; m->v20 = v[2]; m->v30 = v[3]; 01584 m->v01 = v[4]; m->v11 = v[5]; m->v21 = v[6]; m->v31 = v[7]; 01585 m->v02 = v[8]; m->v12 = v[9]; m->v22 = v[10]; m->v32 = v[11]; 01586 m->v03 = v[12]; m->v13 = v[13]; m->v23 = v[14]; m->v33 = v[15]; 01587 } 01588 01589 void jit_mat4_from_array4x4( t_jit_mat4 *m, float **v ) 01590 { 01591 m->v00 = v[0][0]; m->v10 = v[1][0]; m->v20 = v[2][0]; m->v30 = v[3][0]; 01592 m->v01 = v[0][1]; m->v11 = v[1][1]; m->v21 = v[2][1]; m->v31 = v[3][1]; 01593 m->v02 = v[0][2]; m->v12 = v[1][2]; m->v22 = v[2][2]; m->v32 = v[3][2]; 01594 m->v03 = v[0][3]; m->v13 = v[1][3]; m->v23 = v[2][3]; m->v33 = v[3][3]; 01595 } 01596 01597 void jit_mat4_from_coords( t_jit_mat4 *m, 01598 float f0, float f1, float f2, float f3, 01599 float f4, float f5, float f6, float f7, 01600 float f8, float f9, float f10, float f11, 01601 float f12, float f13, float f14, float f15 ) 01602 { 01603 m->v00 = f0; m->v10 = f1; m->v20 = f2; m->v30 = f3; 01604 m->v01 = f4; m->v11 = f5; m->v21 = f6; m->v31 = f7; 01605 m->v02 = f8; m->v12 = f9; m->v22 = f10; m->v32 = f11; 01606 m->v03 = f12; m->v13 = f13; m->v23 = f14; m->v33 = f15; 01607 } 01608 01609 void jit_mat4_to_array( t_jit_mat4 *m, float *v ) 01610 { 01611 v[0] = m->v00; v[1] = m->v10; v[2] = m->v20; v[3] = m->v30; 01612 v[4] = m->v01; v[5] = m->v11; v[6] = m->v21; v[7] = m->v31; 01613 v[8] = m->v02; v[9] = m->v12; v[10] = m->v22; v[11] = m->v32; 01614 v[12] = m->v03; v[13] = m->v13; v[14] = m->v23; v[15] = m->v33; 01615 } 01616 01617 void jit_mat4_to_array4x4( t_jit_mat4 *m, float **v ) 01618 { 01619 v[0][0] = m->v00; v[1][0] = m->v10; v[2][0] = m->v20; v[3][0] = m->v30; 01620 v[0][1] = m->v01; v[1][1] = m->v11; v[2][1] = m->v21; v[3][1] = m->v31; 01621 v[0][2] = m->v02; v[1][2] = m->v12; v[2][2] = m->v22; v[3][2] = m->v32; 01622 v[0][3] = m->v03; v[1][3] = m->v13; v[2][3] = m->v23; v[3][3] = m->v33; 01623 } 01624 01625 void jit_mat4_to_coords( t_jit_mat4 *m, 01626 float *f0, float *f1, float *f2, float *f3, 01627 float *f4, float *f5, float *f6, float *f7, 01628 float *f8, float *f9, float *f10, float *f11, 01629 float *f12, float *f13, float *f14, float *f15 ) 01630 { 01631 *f0 = m->v00; *f1 = m->v10; *f2 = m->v20; *f3 = m->v30; 01632 *f4 = m->v01; *f5 = m->v11; *f6 = m->v21; *f7 = m->v31; 01633 *f8 = m->v02; *f9 = m->v12; *f10 = m->v22; *f11 = m->v32; 01634 *f12 = m->v03; *f13 = m->v13; *f14 = m->v23; *f15 = m->v33; 01635 } 01636 01637 void jit_mat4_get_row( t_jit_vec4 *v, long i, t_jit_mat4 *m ) 01638 { 01639 if( i >= 0 && i < 4 ) 01640 { 01641 v->x = m->vals[i + 0]; 01642 v->y = m->vals[i + 4]; 01643 v->z = m->vals[i + 8]; 01644 v->w = m->vals[i + 12]; 01645 } 01646 } 01647 01648 void jit_mat4_set_row( t_jit_mat4 *m, long i, t_jit_vec4 *v ) 01649 { 01650 if( i >= 0 && i < 4 ) 01651 { 01652 m->vals[i + 0] = v->x; 01653 m->vals[i + 4] = v->y; 01654 m->vals[i + 8] = v->z; 01655 m->vals[i + 12] = v->w; 01656 } 01657 } 01658 01659 void jit_mat4_get_col( t_jit_vec4 *v, long i, t_jit_mat4 *m ) 01660 { 01661 if( i >= 0 && i < 4 ) 01662 { 01663 v->x = m->vals[i * 4 + 0]; 01664 v->y = m->vals[i * 4 + 1]; 01665 v->z = m->vals[i * 4 + 2]; 01666 v->w = m->vals[i * 4 + 3]; 01667 } 01668 } 01669 01670 void jit_mat4_set_col( t_jit_mat4 *m, long i, t_jit_vec4 *v) 01671 { 01672 if( i >= 0 && i < 4 ) 01673 { 01674 m->vals[i * 4 + 0] = v->x; 01675 m->vals[i * 4 + 1] = v->y; 01676 m->vals[i * 4 + 2] = v->z; 01677 m->vals[i * 4 + 3] = v->w; 01678 } 01679 } 01680 01681 float jit_mat4_get_coord( t_jit_mat4 *m, long r, long c ) 01682 { 01683 if(c >= 0 && c < 4 && r >= 0 && r < 4) 01684 return m->vals[ c * 4 + r ]; 01685 else 01686 return 0.0f; 01687 } 01688 01689 void jit_mat4_mult_vec4(t_jit_vec4 *u, t_jit_mat4 *m, t_jit_vec4 *v) 01690 { 01691 u->x = m->v00 * v->x + m->v01 * v->y + m->v02 * v->z + m->v03 * v->w; 01692 u->y = m->v10 * v->x + m->v11 * v->y + m->v12 * v->z + m->v13 * v->w; 01693 u->z = m->v20 * v->x + m->v21 * v->y + m->v22 * v->z + m->v23 * v->w; 01694 u->w = m->v30 * v->x + m->v31 * v->y + m->v32 * v->z + m->v33 * v->w; 01695 } 01696 01697 void jit_vec4_mult_mat4(t_jit_vec4 *u, t_jit_vec4 *v, t_jit_mat4 *m) 01698 { 01699 u->x = m->v00 * v->x + m->v10 * v->y + m->v20 * v->z + m->v30 * v->w; 01700 u->y = m->v01 * v->x + m->v11 * v->y + m->v21 * v->z + m->v31 * v->w; 01701 u->z = m->v02 * v->x + m->v12 * v->y + m->v22 * v->z + m->v32 * v->w; 01702 u->w = m->v03 * v->x + m->v13 * v->y + m->v23 * v->z + m->v33 * v->w; 01703 } 01704 01705 void jit_mat4_accum_add(t_jit_mat4 *a, t_jit_mat4 *b) 01706 { 01707 a->v00 += b->v00; 01708 a->v10 += b->v10; 01709 a->v20 += b->v20; 01710 a->v30 += b->v30; 01711 a->v01 += b->v01; 01712 a->v11 += b->v11; 01713 a->v21 += b->v21; 01714 a->v31 += b->v31; 01715 a->v02 += b->v02; 01716 a->v12 += b->v12; 01717 a->v22 += b->v22; 01718 a->v32 += b->v32; 01719 a->v03 += b->v03; 01720 a->v13 += b->v13; 01721 a->v23 += b->v23; 01722 a->v33 += b->v33; 01723 } 01724 01725 void jit_mat4_add(t_jit_mat4 *c, t_jit_mat4 *a, t_jit_mat4 *b) 01726 { 01727 if (c == a || c == b) 01728 { 01729 t_jit_mat4 m; 01730 01731 m.v00 = a->v00 + b->v00; 01732 m.v01 = a->v01 + b->v01; 01733 m.v02 = a->v02 + b->v02; 01734 m.v03 = a->v03 + b->v03; 01735 m.v10 = a->v10 + b->v10; 01736 m.v11 = a->v11 + b->v11; 01737 m.v12 = a->v12 + b->v12; 01738 m.v13 = a->v13 + b->v13; 01739 m.v20 = a->v20 + b->v20; 01740 m.v21 = a->v21 + b->v21; 01741 m.v22 = a->v22 + b->v22; 01742 m.v23 = a->v23 + b->v23; 01743 m.v30 = a->v30 + b->v30; 01744 m.v31 = a->v31 + b->v31; 01745 m.v32 = a->v32 + b->v32; 01746 m.v33 = a->v33 + b->v33; 01747 01748 jit_mat4_assign(c, &m); 01749 } 01750 else 01751 { 01752 c->v00 = a->v00 + b->v00; 01753 c->v01 = a->v01 + b->v01; 01754 c->v02 = a->v02 + b->v02; 01755 c->v03 = a->v03 + b->v03; 01756 c->v10 = a->v10 + b->v10; 01757 c->v11 = a->v11 + b->v11; 01758 c->v12 = a->v12 + b->v12; 01759 c->v13 = a->v13 + b->v13; 01760 c->v20 = a->v20 + b->v20; 01761 c->v21 = a->v21 + b->v21; 01762 c->v22 = a->v22 + b->v22; 01763 c->v23 = a->v23 + b->v23; 01764 c->v30 = a->v30 + b->v30; 01765 c->v31 = a->v31 + b->v31; 01766 c->v32 = a->v32 + b->v32; 01767 c->v33 = a->v33 + b->v33; 01768 } 01769 } 01770 01771 void jit_mat4_mult(t_jit_mat4 *c, t_jit_mat4 *a, t_jit_mat4 *b) 01772 { 01773 if (c == a || c == b) 01774 { 01775 t_jit_mat4 m; 01776 01777 m.v00 = a->v00 * b->v00 + a->v01 * b->v10 + a->v02 * b->v20 + a->v03 * b->v30; 01778 m.v10 = a->v10 * b->v00 + a->v11 * b->v10 + a->v12 * b->v20 + a->v13 * b->v30; 01779 m.v20 = a->v20 * b->v00 + a->v21 * b->v10 + a->v22 * b->v20 + a->v23 * b->v30; 01780 m.v30 = a->v30 * b->v00 + a->v31 * b->v10 + a->v32 * b->v20 + a->v33 * b->v30; 01781 m.v01 = a->v00 * b->v01 + a->v01 * b->v11 + a->v02 * b->v21 + a->v03 * b->v31; 01782 m.v11 = a->v10 * b->v01 + a->v11 * b->v11 + a->v12 * b->v21 + a->v13 * b->v31; 01783 m.v21 = a->v20 * b->v01 + a->v21 * b->v11 + a->v22 * b->v21 + a->v23 * b->v31; 01784 m.v31 = a->v30 * b->v01 + a->v31 * b->v11 + a->v32 * b->v21 + a->v33 * b->v31; 01785 m.v02 = a->v00 * b->v02 + a->v01 * b->v12 + a->v02 * b->v22 + a->v03 * b->v32; 01786 m.v12 = a->v10 * b->v02 + a->v11 * b->v12 + a->v12 * b->v22 + a->v13 * b->v32; 01787 m.v22 = a->v20 * b->v02 + a->v21 * b->v12 + a->v22 * b->v22 + a->v23 * b->v32; 01788 m.v32 = a->v30 * b->v02 + a->v31 * b->v12 + a->v32 * b->v22 + a->v33 * b->v32; 01789 m.v03 = a->v00 * b->v03 + a->v01 * b->v13 + a->v02 * b->v23 + a->v03 * b->v33; 01790 m.v13 = a->v10 * b->v03 + a->v11 * b->v13 + a->v12 * b->v23 + a->v13 * b->v33; 01791 m.v23 = a->v20 * b->v03 + a->v21 * b->v13 + a->v22 * b->v23 + a->v23 * b->v33; 01792 m.v33 = a->v30 * b->v03 + a->v31 * b->v13 + a->v32 * b->v23 + a->v33 * b->v33; 01793 01794 jit_mat4_assign(c, &m); 01795 } 01796 else 01797 { 01798 c->v00 = a->v00 * b->v00 + a->v01 * b->v10 + a->v02 * b->v20 + a->v03 * b->v30; 01799 c->v10 = a->v10 * b->v00 + a->v11 * b->v10 + a->v12 * b->v20 + a->v13 * b->v30; 01800 c->v20 = a->v20 * b->v00 + a->v21 * b->v10 + a->v22 * b->v20 + a->v23 * b->v30; 01801 c->v30 = a->v30 * b->v00 + a->v31 * b->v10 + a->v32 * b->v20 + a->v33 * b->v30; 01802 c->v01 = a->v00 * b->v01 + a->v01 * b->v11 + a->v02 * b->v21 + a->v03 * b->v31; 01803 c->v11 = a->v10 * b->v01 + a->v11 * b->v11 + a->v12 * b->v21 + a->v13 * b->v31; 01804 c->v21 = a->v20 * b->v01 + a->v21 * b->v11 + a->v22 * b->v21 + a->v23 * b->v31; 01805 c->v31 = a->v30 * b->v01 + a->v31 * b->v11 + a->v32 * b->v21 + a->v33 * b->v31; 01806 c->v02 = a->v00 * b->v02 + a->v01 * b->v12 + a->v02 * b->v22 + a->v03 * b->v32; 01807 c->v12 = a->v10 * b->v02 + a->v11 * b->v12 + a->v12 * b->v22 + a->v13 * b->v32; 01808 c->v22 = a->v20 * b->v02 + a->v21 * b->v12 + a->v22 * b->v22 + a->v23 * b->v32; 01809 c->v32 = a->v30 * b->v02 + a->v31 * b->v12 + a->v32 * b->v22 + a->v33 * b->v32; 01810 c->v03 = a->v00 * b->v03 + a->v01 * b->v13 + a->v02 * b->v23 + a->v03 * b->v33; 01811 c->v13 = a->v10 * b->v03 + a->v11 * b->v13 + a->v12 * b->v23 + a->v13 * b->v33; 01812 c->v23 = a->v20 * b->v03 + a->v21 * b->v13 + a->v22 * b->v23 + a->v23 * b->v33; 01813 c->v33 = a->v30 * b->v03 + a->v31 * b->v13 + a->v32 * b->v23 + a->v33 * b->v33; 01814 } 01815 } 01816 01817 void jit_mat4_transpose(t_jit_mat4 *m) 01818 { 01819 float t; 01820 t = m->v01; 01821 m->v01 = m->v10; 01822 m->v10 = t; 01823 01824 t = m->v02; 01825 m->v02 = m->v20; 01826 m->v20 = t; 01827 01828 t = m->v03; 01829 m->v03 = m->v30; 01830 m->v30 = t; 01831 01832 t = m->v12; 01833 m->v12 = m->v21; 01834 m->v21 = t; 01835 01836 t = m->v13; 01837 m->v13 = m->v31; 01838 m->v31 = t; 01839 01840 t = m->v23; 01841 m->v23 = m->v32; 01842 m->v32 = t; 01843 } 01844 01845 void jit_mat4_get_transpose(t_jit_mat4 *b, t_jit_mat4 *a) 01846 { 01847 b->v00 = a->v00; 01848 b->v01 = a->v10; 01849 b->v02 = a->v20; 01850 b->v03 = a->v30; 01851 b->v10 = a->v01; 01852 b->v11 = a->v11; 01853 b->v12 = a->v21; 01854 b->v13 = a->v31; 01855 b->v20 = a->v02; 01856 b->v21 = a->v12; 01857 b->v22 = a->v22; 01858 b->v23 = a->v32; 01859 b->v30 = a->v03; 01860 b->v31 = a->v13; 01861 b->v32 = a->v23; 01862 b->v33 = a->v33; 01863 } 01864 01865 void jit_mat4_get_inverse(t_jit_mat4 *b, t_jit_mat4 *a) 01866 { 01867 float det,oodet; 01868 01869 b->v00 = JIT_MATH_DET3x3(a->v11, a->v21, a->v31, a->v12, a->v22, a->v32, a->v13, a->v23, a->v33); 01870 b->v10 = -JIT_MATH_DET3x3(a->v10, a->v20, a->v30, a->v12, a->v22, a->v32, a->v13, a->v23, a->v33); 01871 b->v20 = JIT_MATH_DET3x3(a->v10, a->v20, a->v30, a->v11, a->v21, a->v31, a->v13, a->v23, a->v33); 01872 b->v30 = -JIT_MATH_DET3x3(a->v10, a->v20, a->v30, a->v11, a->v21, a->v31, a->v12, a->v22, a->v32); 01873 01874 b->v01 = -JIT_MATH_DET3x3(a->v01, a->v21, a->v31, a->v02, a->v22, a->v32, a->v03, a->v23, a->v33); 01875 b->v11 = JIT_MATH_DET3x3(a->v00, a->v20, a->v30, a->v02, a->v22, a->v32, a->v03, a->v23, a->v33); 01876 b->v21 = -JIT_MATH_DET3x3(a->v00, a->v20, a->v30, a->v01, a->v21, a->v31, a->v03, a->v23, a->v33); 01877 b->v31 = JIT_MATH_DET3x3(a->v00, a->v20, a->v30, a->v01, a->v21, a->v31, a->v02, a->v22, a->v32); 01878 01879 b->v02 = JIT_MATH_DET3x3(a->v01, a->v11, a->v31, a->v02, a->v12, a->v32, a->v03, a->v13, a->v33); 01880 b->v12 = -JIT_MATH_DET3x3(a->v00, a->v10, a->v30, a->v02, a->v12, a->v32, a->v03, a->v13, a->v33); 01881 b->v22 = JIT_MATH_DET3x3(a->v00, a->v10, a->v30, a->v01, a->v11, a->v31, a->v03, a->v13, a->v33); 01882 b->v32 = -JIT_MATH_DET3x3(a->v00, a->v10, a->v30, a->v01, a->v11, a->v31, a->v02, a->v12, a->v32); 01883 01884 b->v03 = -JIT_MATH_DET3x3(a->v01, a->v11, a->v21, a->v02, a->v12, a->v22, a->v03, a->v13, a->v23); 01885 b->v13 = JIT_MATH_DET3x3(a->v00, a->v10, a->v20, a->v02, a->v12, a->v22, a->v03, a->v13, a->v23); 01886 b->v23 = -JIT_MATH_DET3x3(a->v00, a->v10, a->v20, a->v01, a->v11, a->v21, a->v03, a->v13, a->v23); 01887 b->v33 = JIT_MATH_DET3x3(a->v00, a->v10, a->v20, a->v01, a->v11, a->v21, a->v02, a->v12, a->v22); 01888 01889 det = (a->v00 * b->v00) + (a->v01 * b->v10) + (a->v02 * b->v20) + (a->v03 * b->v30); 01890 01891 // avoid divide by zero 01892 if(det < JIT_MATH_F32_EPS) 01893 det = JIT_MATH_F32_EPS; 01894 01895 oodet = 1.0f / det; 01896 01897 b->v00 *= oodet; 01898 b->v10 *= oodet; 01899 b->v20 *= oodet; 01900 b->v30 *= oodet; 01901 01902 b->v01 *= oodet; 01903 b->v11 *= oodet; 01904 b->v21 *= oodet; 01905 b->v31 *= oodet; 01906 01907 b->v02 *= oodet; 01908 b->v12 *= oodet; 01909 b->v22 *= oodet; 01910 b->v32 *= oodet; 01911 01912 b->v03 *= oodet; 01913 b->v13 *= oodet; 01914 b->v23 *= oodet; 01915 b->v33 *= oodet; 01916 } 01917 01918 void jit_mat4_get_inverse_rot_trans(t_jit_mat4 *b, t_jit_mat4 *a) 01919 { 01920 b->v00 = a->v00; 01921 b->v10 = a->v01; 01922 b->v20 = a->v02; 01923 b->v30 = a->v30; 01924 b->v01 = a->v10; 01925 b->v11 = a->v11; 01926 b->v21 = a->v12; 01927 b->v31 = a->v31; 01928 b->v02 = a->v20; 01929 b->v12 = a->v21; 01930 b->v22 = a->v22; 01931 b->v32 = a->v32; 01932 b->v03 = - (a->v00 * a->v03 + a->v10 * a->v13 + a->v20 * a->v23); 01933 b->v13 = - (a->v01 * a->v03 + a->v11 * a->v13 + a->v21 * a->v23); 01934 b->v23 = - (a->v02 * a->v03 + a->v12 * a->v13 + a->v22 * a->v23); 01935 b->v33 = a->v33; 01936 } 01937 01938 void jit_mat4_look_at(t_jit_mat4 *m, t_jit_vec3 *eye, t_jit_vec3 *center, t_jit_vec3 *up) 01939 { 01940 t_jit_vec3 x, y, z; 01941 01942 // z vector 01943 z.x = eye->x - center->x; 01944 z.y = eye->y - center->y; 01945 z.z = eye->z - center->z; 01946 jit_vec3_normalize(&z); 01947 01948 // y vector 01949 y.x = up->x; 01950 y.y = up->y; 01951 y.z = up->z; 01952 01953 // x vector = u cross z 01954 jit_vec3_cross(&x, &y, &z); 01955 01956 // recompute u = z cross x 01957 jit_vec3_cross(&y, &z, &x); 01958 01959 // renormalize x + y 01960 jit_vec3_normalize(&x); 01961 jit_vec3_normalize(&y); 01962 01963 m->v00 = x.x; m->v01 = x.y; m->v02 = x.z; m->v03 = -x.x * eye->x - x.y * eye->y - x.z*eye->z; 01964 m->v10 = y.x; m->v11 = y.y; m->v12 = y.z; m->v13 = -y.x * eye->x - y.y * eye->y - y.z*eye->z; 01965 m->v20 = z.x; m->v21 = z.y; m->v22 = z.z; m->v23 = -z.x * eye->x - z.y * eye->y - z.z*eye->z; 01966 m->v30 = 0.0f; m->v31 = 0.0f; m->v32 = 0.0f; m->v33 = 1.0f; 01967 } 01968 01969 void jit_mat4_frustum(t_jit_mat4 *m, 01970 float left, float right, 01971 float bottom, float top, 01972 float n, float f) 01973 { 01974 m->v00 = (2.0f*n) / (right-left); 01975 m->v10 = 0.0; 01976 m->v20 = 0.0; 01977 m->v30 = 0.0; 01978 01979 m->v01 = 0.0; 01980 m->v11 = (2.0f*n) / (top-bottom); 01981 m->v21 = 0.0; 01982 m->v31 = 0.0; 01983 01984 m->v02 = (right+left) / (right-left); 01985 m->v12 = (top+bottom) / (top-bottom); 01986 m->v22 = -(f+n) / (f-n); 01987 m->v32 = -1.0f; 01988 01989 m->v03 = 0.0; 01990 m->v13 = 0.0; 01991 m->v23 = -(2.0f*f*n) / (f-n); 01992 m->v33 = 0.0; 01993 } 01994 01995 void jit_mat4_perspective(t_jit_mat4 *m, float fovy, float aspect, float n, float f) 01996 { 01997 float xmin, xmax, ymin, ymax; 01998 01999 ymax = n * jit_math_tan(fovy * JIT_MATH_F32_DEGTORAD * 0.5f); 02000 ymin = -ymax; 02001 02002 xmin = ymin * aspect; 02003 xmax = ymax * aspect; 02004 02005 jit_mat4_frustum(m, xmin, xmax, ymin, ymax, n, f); 02006 } 02007 02008 void jit_mat4_ortho(t_jit_mat4 *m, 02009 float left, float right, 02010 float bottom, float top, 02011 float n, float f) 02012 { 02013 m->v00 = 2.0f / (right - left); 02014 m->v01 = 0.0f; 02015 m->v02 = 0.0f; 02016 m->v03 = - (right + left) / (right - left); 02017 m->v10 = 0.0f; 02018 m->v11 = 2.0f / (top - bottom); 02019 m->v12 = 0.0f; 02020 m->v13 = - (top + bottom) / (top - bottom); 02021 m->v20 = 0.0f; 02022 m->v21 = 0.0f; 02023 m->v22 = - 2.0f / (f - n); 02024 m->v23 = - (f + n) / (f - n); 02025 m->v30 = 0.0f; 02026 m->v31 = 0.0f; 02027 m->v32 = 0.0f; 02028 m->v33 = 1.0f; 02029 } 02030 02031 void jit_mat4_from_quat( t_jit_mat4 *m, t_jit_quat * q) 02032 { 02033 t_jit_mat3 r; 02034 jit_mat3_from_quat(&r, q); 02035 jit_mat4_from_mat3(m, &r); 02036 } 02037 02038 void jit_mat4_from_axisangle( t_jit_mat4 *m, t_jit_vec3 *v, float theta) 02039 { 02040 float ct = (float)jit_math_cos(theta); 02041 float st = (float)jit_math_sin(theta); 02042 02043 float xx = v->x * v->x; 02044 float yy = v->y * v->y; 02045 float zz = v->z * v->z; 02046 float xy = v->x * v->y; 02047 float xz = v->x * v->z; 02048 float yz = v->y * v->z; 02049 02050 m->v00 = xx + ct*(1-xx); 02051 m->v01 = xy + ct*(-xy) + st*-v->z; 02052 m->v02 = xz + ct*(-xz) + st*v->y; 02053 02054 m->v10 = xy + ct*(-xy) + st*v->z; 02055 m->v11 = yy + ct*(1-yy); 02056 m->v12 = yz + ct*(-yz) + st*-v->x; 02057 02058 m->v20 = xz + ct*(-xz) + st*-v->y; 02059 m->v21 = yz + ct*(-yz) + st*v->x; 02060 m->v22 = zz + ct*(1-zz); 02061 } 02062 02063 void jit_mat4_from_uv( t_jit_mat4 *m, t_jit_vec3 *u, t_jit_vec3 *v) 02064 { 02065 float phi; 02066 float h, hxy, hxz, hyz; 02067 float lambda; 02068 t_jit_vec3 w; 02069 02070 jit_vec3_cross(&w, u, v); 02071 phi = jit_vec3_dot(u, v); 02072 lambda = jit_vec3_dot(&w, &w); 02073 02074 if (lambda > JIT_MATH_F32_EPS) 02075 h = (1.0f - phi) / lambda; 02076 else 02077 h = lambda; 02078 02079 hxy = w.x * w.y * h; 02080 hxz = w.x * w.z * h; 02081 hyz = w.y * w.z * h; 02082 02083 m->v00 = phi + w.x * w.x * h; 02084 m->v01 = hxy - w.z; 02085 m->v02 = hxz + w.y; 02086 02087 m->v10 = hxy + w.z; 02088 m->v11 = phi + w.y * w.y * h; 02089 m->v12 = hyz - w.x; 02090 02091 m->v20 = hxz - w.y; 02092 m->v21 = hyz + w.x; 02093 m->v22 = phi + w.z * w.z * h; 02094 } 02095 02096 void jit_mat4_from_mat3( t_jit_mat4 *m, t_jit_mat3 *r) 02097 { 02098 // copy the 3x3 rotation block 02099 m->v00 = r->v00; m->v10 = r->v10; m->v20 = r->v20; 02100 m->v01 = r->v01; m->v11 = r->v11; m->v21 = r->v21; 02101 m->v02 = r->v02; m->v12 = r->v12; m->v22 = r->v22; 02102 } 02103 02104 void jit_mat3_from_mat4(t_jit_mat3 *r, t_jit_mat4 *m) 02105 { 02106 // assign the 3x3 rotation block 02107 r->v00 = m->v00; r->v10 = m->v10; r->v20 = m->v20; 02108 r->v01 = m->v01; r->v11 = m->v11; r->v21 = m->v21; 02109 r->v02 = m->v02; r->v12 = m->v12; r->v22 = m->v22; 02110 } 02111 02112 void jit_mat4_set_scale( t_jit_mat4 *m, t_jit_vec3 *s) 02113 { 02114 m->v00 = s->x; 02115 m->v11 = s->y; 02116 m->v22 = s->z; 02117 } 02118 02119 void jit_mat4_get_scale(t_jit_vec3 *s, t_jit_mat4 *m) 02120 { 02121 s->x = m->v00; 02122 s->y = m->v11; 02123 s->z = m->v22; 02124 } 02125 02126 void jit_mat4_set_translation(t_jit_mat4 *m, t_jit_vec3 *t) 02127 { 02128 m->v03 = t->x; 02129 m->v13 = t->y; 02130 m->v23 = t->z; 02131 } 02132 02133 void jit_mat4_get_translation(t_jit_vec3 *t, t_jit_mat4 *m) 02134 { 02135 t->x = m->v03; 02136 t->y = m->v13; 02137 t->z = m->v23; 02138 } 02139 02140 void jit_mat4_negate(t_jit_mat4 *m) 02141 { 02142 m->v00 = -m->v00; 02143 m->v10 = -m->v10; 02144 m->v20 = -m->v20; 02145 m->v30 = -m->v30; 02146 m->v01 = -m->v01; 02147 m->v11 = -m->v11; 02148 m->v21 = -m->v21; 02149 m->v31 = -m->v31; 02150 m->v02 = -m->v02; 02151 m->v12 = -m->v12; 02152 m->v22 = -m->v22; 02153 m->v32 = -m->v32; 02154 m->v03 = -m->v03; 02155 m->v13 = -m->v13; 02156 m->v23 = -m->v23; 02157 m->v33 = -m->v33; 02158 } 02159 02160 float jit_tri_area( t_jit_vec3 *v1, t_jit_vec3 *v2, t_jit_vec3 *v3) 02161 { 02162 t_jit_vec3 sum; 02163 t_jit_vec3 cp; 02164 jit_vec3_cross(&sum, v1, v2); 02165 jit_vec3_cross(&cp, v2, v3); 02166 jit_vec3_accum_add(&sum, &cp); 02167 jit_vec3_cross(&cp, v3, v1); 02168 jit_vec3_accum_add(&sum, &cp); 02169 return 0.5f * jit_vec3_mag(&sum); 02170 } 02171 02172 float jit_tri_perimeter( t_jit_vec3 *v1, t_jit_vec3 *v2, t_jit_vec3 *v3) 02173 { 02174 float p; 02175 t_jit_vec3 d; 02176 jit_vec3_sub(&d, v1, v2); 02177 p = jit_vec3_mag(&d); 02178 jit_vec3_sub(&d, v2, v3); 02179 p += jit_vec3_mag(&d); 02180 jit_vec3_sub(&d, v3, v1); 02181 p += jit_vec3_mag(&d); 02182 return p; 02183 } 02184 02185 float jit_tri_find_in_circle(t_jit_vec3 *center, t_jit_vec3 *v1, t_jit_vec3 *v2, t_jit_vec3 *v3) 02186 { 02187 t_jit_vec3 d; 02188 float s; 02189 float perim; 02190 float area = jit_tri_area(v1, v2, v3); 02191 02192 // if the area is null 02193 if (area < JIT_MATH_F32_EPS) 02194 { 02195 center = v1; 02196 return 0.0f; 02197 } 02198 02199 perim = 1.0f / jit_tri_perimeter(v1, v2, v3); 02200 02201 jit_vec3_sub(&d, v2, v3); 02202 s = jit_vec3_mag(&d); 02203 jit_vec3_scale(center, v1, s); 02204 02205 jit_vec3_sub(&d, v3, v1); 02206 s = jit_vec3_mag(&d); 02207 jit_vec3_madd(center, v2, s); 02208 02209 jit_vec3_sub(&d, v1, v2); 02210 s = jit_vec3_mag(&d); 02211 jit_vec3_madd(center, v3, s); 02212 02213 jit_vec3_accum_scale(center, perim); 02214 return 2.0f * area * perim; 02215 } 02216 02217 float jit_tri_find_circ_circle( t_jit_vec3 *center, t_jit_vec3 *v1, t_jit_vec3 *v2, t_jit_vec3 *v3) 02218 { 02219 t_jit_vec3 e0; 02220 t_jit_vec3 e1; 02221 float d1, d2, d3; 02222 float c1, c2, c3, c; 02223 02224 jit_vec3_sub(&e0, v3, v1); 02225 jit_vec3_sub(&e1, v2, v1); 02226 d1 = jit_vec3_dot(&e0, &e1); 02227 02228 jit_vec3_sub(&e0, v3, v2); 02229 jit_vec3_sub(&e1, v1, v2); 02230 d2 = jit_vec3_dot(&e0, &e1); 02231 02232 jit_vec3_sub(&e0, v1, v3); 02233 jit_vec3_sub(&e1, v2, v3); 02234 d3 = jit_vec3_dot(&e0, &e1); 02235 02236 c1 = d2 * d3; 02237 c2 = d3 * d1; 02238 c3 = d1 * d2; 02239 c = 1.0f / (c1 + c2 + c3); 02240 02241 jit_vec3_scale(center, v1, c2 + c3); 02242 jit_vec3_madd(center, v2, c3 + c1); 02243 jit_vec3_madd(center, v3, c1 + c2); 02244 02245 c *= 0.5f; 02246 center->x *= c; 02247 center->y *= c; 02248 center->z *= c; 02249 02250 return 0.5f * jit_math_sqrt((d1 + d2) * (d2 + d3) * (d3 + d1) * 2 * c); 02251 } 02252 02253 // ---------------------------------------------------------------------------- 02254 02255
Copyright © 2008, Cycling '74