Blender V2.61 - r43446
|
00001 /* 00002 * ***** BEGIN GPL LICENSE BLOCK ***** 00003 * 00004 * This program is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU General Public License 00006 * as published by the Free Software Foundation; either version 2 00007 * of the License, or (at your option) any later version. 00008 * 00009 * This program is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 * GNU General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU General Public License 00015 * along with this program; if not, write to the Free Software Foundation, 00016 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00017 * 00018 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. 00019 * All rights reserved. 00020 00021 * The Original Code is: some of this file. 00022 * 00023 * ***** END GPL LICENSE BLOCK ***** 00024 * */ 00025 00031 #include "BLI_math.h" 00032 00033 #ifndef BLI_MATH_VECTOR_INLINE_H 00034 #define BLI_MATH_VECTOR_INLINE_H 00035 00036 /********************************** Init *************************************/ 00037 00038 MINLINE void zero_v2(float r[2]) 00039 { 00040 r[0]= 0.0f; 00041 r[1]= 0.0f; 00042 } 00043 00044 MINLINE void zero_v3(float r[3]) 00045 { 00046 r[0]= 0.0f; 00047 r[1]= 0.0f; 00048 r[2]= 0.0f; 00049 } 00050 00051 MINLINE void zero_v4(float r[4]) 00052 { 00053 r[0]= 0.0f; 00054 r[1]= 0.0f; 00055 r[2]= 0.0f; 00056 r[3]= 0.0f; 00057 } 00058 00059 MINLINE void copy_v2_v2(float r[2], const float a[2]) 00060 { 00061 r[0]= a[0]; 00062 r[1]= a[1]; 00063 } 00064 00065 MINLINE void copy_v3_v3(float r[3], const float a[3]) 00066 { 00067 r[0]= a[0]; 00068 r[1]= a[1]; 00069 r[2]= a[2]; 00070 } 00071 00072 MINLINE void copy_v4_v4(float r[4], const float a[4]) 00073 { 00074 r[0]= a[0]; 00075 r[1]= a[1]; 00076 r[2]= a[2]; 00077 r[3]= a[3]; 00078 } 00079 00080 /* short */ 00081 MINLINE void copy_v2_v2_char(char r[2], const char a[2]) 00082 { 00083 r[0]= a[0]; 00084 r[1]= a[1]; 00085 } 00086 00087 MINLINE void copy_v3_v3_char(char r[3], const char a[3]) 00088 { 00089 r[0]= a[0]; 00090 r[1]= a[1]; 00091 r[2]= a[2]; 00092 } 00093 00094 MINLINE void copy_v4_v4_char(char r[4], const char a[4]) 00095 { 00096 r[0]= a[0]; 00097 r[1]= a[1]; 00098 r[2]= a[2]; 00099 r[3]= a[3]; 00100 } 00101 00102 /* short */ 00103 MINLINE void copy_v2_v2_short(short r[2], const short a[2]) 00104 { 00105 r[0]= a[0]; 00106 r[1]= a[1]; 00107 } 00108 00109 MINLINE void copy_v3_v3_short(short r[3], const short a[3]) 00110 { 00111 r[0]= a[0]; 00112 r[1]= a[1]; 00113 r[2]= a[2]; 00114 } 00115 00116 MINLINE void copy_v4_v4_short(short r[4], const short a[4]) 00117 { 00118 r[0]= a[0]; 00119 r[1]= a[1]; 00120 r[2]= a[2]; 00121 r[3]= a[3]; 00122 } 00123 00124 /* int */ 00125 MINLINE void copy_v2_v2_int(int r[2], const int a[2]) 00126 { 00127 r[0]= a[0]; 00128 r[1]= a[1]; 00129 } 00130 00131 MINLINE void copy_v3_v3_int(int r[3], const int a[3]) 00132 { 00133 r[0]= a[0]; 00134 r[1]= a[1]; 00135 r[2]= a[2]; 00136 } 00137 00138 MINLINE void copy_v4_v4_int(int r[4], const int a[4]) 00139 { 00140 r[0]= a[0]; 00141 r[1]= a[1]; 00142 r[2]= a[2]; 00143 r[3]= a[3]; 00144 } 00145 00146 MINLINE void swap_v2_v2(float a[2], float b[2]) 00147 { 00148 SWAP(float, a[0], b[0]); 00149 SWAP(float, a[1], b[1]); 00150 } 00151 00152 MINLINE void swap_v3_v3(float a[3], float b[3]) 00153 { 00154 SWAP(float, a[0], b[0]); 00155 SWAP(float, a[1], b[1]); 00156 SWAP(float, a[2], b[2]); 00157 } 00158 00159 MINLINE void swap_v4_v4(float a[4], float b[4]) 00160 { 00161 SWAP(float, a[0], b[0]); 00162 SWAP(float, a[1], b[1]); 00163 SWAP(float, a[2], b[2]); 00164 SWAP(float, a[3], b[3]); 00165 } 00166 00167 /********************************* Arithmetic ********************************/ 00168 00169 MINLINE void add_v3_fl(float r[3], float f) 00170 { 00171 r[0] += f; 00172 r[1] += f; 00173 r[2] += f; 00174 } 00175 00176 MINLINE void add_v4_fl(float r[4], float f) 00177 { 00178 r[0] += f; 00179 r[1] += f; 00180 r[2] += f; 00181 r[3] += f; 00182 } 00183 00184 MINLINE void add_v2_v2(float r[2], const float a[2]) 00185 { 00186 r[0] += a[0]; 00187 r[1] += a[1]; 00188 } 00189 00190 MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2]) 00191 { 00192 r[0]= a[0] + b[0]; 00193 r[1]= a[1] + b[1]; 00194 } 00195 00196 MINLINE void add_v3_v3(float r[3], const float a[3]) 00197 { 00198 r[0] += a[0]; 00199 r[1] += a[1]; 00200 r[2] += a[2]; 00201 } 00202 00203 MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3]) 00204 { 00205 r[0]= a[0] + b[0]; 00206 r[1]= a[1] + b[1]; 00207 r[2]= a[2] + b[2]; 00208 } 00209 00210 MINLINE void sub_v2_v2(float r[2], const float a[2]) 00211 { 00212 r[0] -= a[0]; 00213 r[1] -= a[1]; 00214 } 00215 00216 MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2]) 00217 { 00218 r[0]= a[0] - b[0]; 00219 r[1]= a[1] - b[1]; 00220 } 00221 00222 MINLINE void sub_v3_v3(float r[3], const float a[3]) 00223 { 00224 r[0] -= a[0]; 00225 r[1] -= a[1]; 00226 r[2] -= a[2]; 00227 } 00228 00229 MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3]) 00230 { 00231 r[0]= a[0] - b[0]; 00232 r[1]= a[1] - b[1]; 00233 r[2]= a[2] - b[2]; 00234 } 00235 00236 MINLINE void sub_v4_v4(float r[4], const float a[4]) 00237 { 00238 r[0] -= a[0]; 00239 r[1] -= a[1]; 00240 r[2] -= a[2]; 00241 r[3] -= a[3]; 00242 } 00243 00244 MINLINE void sub_v4_v4v4(float r[4], const float a[4], const float b[4]) 00245 { 00246 r[0]= a[0] - b[0]; 00247 r[1]= a[1] - b[1]; 00248 r[2]= a[2] - b[2]; 00249 r[3]= a[3] - b[3]; 00250 } 00251 00252 00253 MINLINE void mul_v2_fl(float r[2], float f) 00254 { 00255 r[0]*= f; 00256 r[1]*= f; 00257 } 00258 00259 MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f) 00260 { 00261 r[0]= a[0]*f; 00262 r[1]= a[1]*f; 00263 } 00264 00265 MINLINE void mul_v3_fl(float r[3], float f) 00266 { 00267 r[0] *= f; 00268 r[1] *= f; 00269 r[2] *= f; 00270 } 00271 00272 MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f) 00273 { 00274 r[0]= a[0]*f; 00275 r[1]= a[1]*f; 00276 r[2]= a[2]*f; 00277 } 00278 00279 MINLINE void mul_v2_v2(float r[2], const float a[2]) 00280 { 00281 r[0] *= a[0]; 00282 r[1] *= a[1]; 00283 } 00284 00285 MINLINE void mul_v3_v3(float r[3], const float a[3]) 00286 { 00287 r[0] *= a[0]; 00288 r[1] *= a[1]; 00289 r[2] *= a[2]; 00290 } 00291 00292 MINLINE void mul_v4_fl(float r[4], float f) 00293 { 00294 r[0]*= f; 00295 r[1]*= f; 00296 r[2]*= f; 00297 r[3]*= f; 00298 } 00299 00300 MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f) 00301 { 00302 r[0] += a[0]*f; 00303 r[1] += a[1]*f; 00304 } 00305 00306 MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f) 00307 { 00308 r[0] += a[0]*f; 00309 r[1] += a[1]*f; 00310 r[2] += a[2]*f; 00311 } 00312 00313 MINLINE void madd_v3_v3v3(float r[3], const float a[3], const float b[3]) 00314 { 00315 r[0] += a[0]*b[0]; 00316 r[1] += a[1]*b[1]; 00317 r[2] += a[2]*b[2]; 00318 } 00319 00320 MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f) 00321 { 00322 r[0] = a[0] + b[0]*f; 00323 r[1] = a[1] + b[1]*f; 00324 } 00325 00326 MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f) 00327 { 00328 r[0] = a[0] + b[0]*f; 00329 r[1] = a[1] + b[1]*f; 00330 r[2] = a[2] + b[2]*f; 00331 } 00332 00333 MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3]) 00334 { 00335 r[0] = a[0] + b[0]*c[0]; 00336 r[1] = a[1] + b[1]*c[1]; 00337 r[2] = a[2] + b[2]*c[2]; 00338 } 00339 00340 MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f) 00341 { 00342 r[0] += a[0]*f; 00343 r[1] += a[1]*f; 00344 r[2] += a[2]*f; 00345 r[3] += a[3]*f; 00346 } 00347 00348 MINLINE void mul_v3_v3v3(float r[3], const float v1[3], const float v2[3]) 00349 { 00350 r[0] = v1[0] * v2[0]; 00351 r[1] = v1[1] * v2[1]; 00352 r[2] = v1[2] * v2[2]; 00353 } 00354 00355 MINLINE void negate_v2(float r[3]) 00356 { 00357 r[0]= -r[0]; 00358 r[1]= -r[1]; 00359 } 00360 00361 MINLINE void negate_v2_v2(float r[2], const float a[2]) 00362 { 00363 r[0]= -a[0]; 00364 r[1]= -a[1]; 00365 } 00366 00367 MINLINE void negate_v3(float r[3]) 00368 { 00369 r[0]= -r[0]; 00370 r[1]= -r[1]; 00371 r[2]= -r[2]; 00372 } 00373 00374 MINLINE void negate_v3_v3(float r[3], const float a[3]) 00375 { 00376 r[0]= -a[0]; 00377 r[1]= -a[1]; 00378 r[2]= -a[2]; 00379 } 00380 00381 MINLINE void negate_v4(float r[4]) 00382 { 00383 r[0]= -r[0]; 00384 r[1]= -r[1]; 00385 r[2]= -r[2]; 00386 r[3]= -r[3]; 00387 } 00388 00389 MINLINE void negate_v4_v4(float r[4], const float a[4]) 00390 { 00391 r[0]= -a[0]; 00392 r[1]= -a[1]; 00393 r[2]= -a[2]; 00394 r[3]= -a[3]; 00395 } 00396 00397 MINLINE float dot_v2v2(const float a[2], const float b[2]) 00398 { 00399 return a[0]*b[0] + a[1]*b[1]; 00400 } 00401 00402 MINLINE float dot_v3v3(const float a[3], const float b[3]) 00403 { 00404 return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; 00405 } 00406 00407 MINLINE float cross_v2v2(const float a[2], const float b[2]) 00408 { 00409 return a[0]*b[1] - a[1]*b[0]; 00410 } 00411 00412 MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3]) 00413 { 00414 r[0]= a[1]*b[2] - a[2]*b[1]; 00415 r[1]= a[2]*b[0] - a[0]*b[2]; 00416 r[2]= a[0]*b[1] - a[1]*b[0]; 00417 } 00418 00419 MINLINE void star_m3_v3(float rmat[][3], float a[3]) 00420 { 00421 rmat[0][0]= rmat[1][1]= rmat[2][2]= 0.0; 00422 rmat[0][1]= -a[2]; 00423 rmat[0][2]= a[1]; 00424 rmat[1][0]= a[2]; 00425 rmat[1][2]= -a[0]; 00426 rmat[2][0]= -a[1]; 00427 rmat[2][1]= a[0]; 00428 } 00429 00430 /*********************************** Length **********************************/ 00431 00432 MINLINE float len_v2(const float v[2]) 00433 { 00434 return (float)sqrtf(v[0]*v[0] + v[1]*v[1]); 00435 } 00436 00437 MINLINE float len_v2v2(const float v1[2], const float v2[2]) 00438 { 00439 float x, y; 00440 00441 x = v1[0]-v2[0]; 00442 y = v1[1]-v2[1]; 00443 return (float)sqrtf(x*x+y*y); 00444 } 00445 00446 MINLINE float len_v3(const float a[3]) 00447 { 00448 return sqrtf(dot_v3v3(a, a)); 00449 } 00450 00451 MINLINE float len_squared_v2v2(const float a[3], const float b[3]) 00452 { 00453 float d[2]; 00454 00455 sub_v2_v2v2(d, b, a); 00456 return dot_v2v2(d, d); 00457 } 00458 00459 MINLINE float len_v3v3(const float a[3], const float b[3]) 00460 { 00461 float d[3]; 00462 00463 sub_v3_v3v3(d, b, a); 00464 return len_v3(d); 00465 } 00466 00467 MINLINE float len_squared_v3v3(const float a[3], const float b[3]) 00468 { 00469 float d[3]; 00470 00471 sub_v3_v3v3(d, b, a); 00472 return dot_v3v3(d, d); 00473 } 00474 00475 MINLINE float normalize_v2_v2(float r[2], const float a[2]) 00476 { 00477 float d= dot_v2v2(a, a); 00478 00479 if(d > 1.0e-35f) { 00480 d= sqrtf(d); 00481 mul_v2_v2fl(r, a, 1.0f/d); 00482 } else { 00483 zero_v2(r); 00484 d= 0.0f; 00485 } 00486 00487 return d; 00488 } 00489 00490 MINLINE float normalize_v2(float n[2]) 00491 { 00492 return normalize_v2_v2(n, n); 00493 } 00494 00495 MINLINE float normalize_v3_v3(float r[3], const float a[3]) 00496 { 00497 float d= dot_v3v3(a, a); 00498 00499 /* a larger value causes normalize errors in a 00500 scaled down models with camera xtreme close */ 00501 if(d > 1.0e-35f) { 00502 d= sqrtf(d); 00503 mul_v3_v3fl(r, a, 1.0f/d); 00504 } 00505 else { 00506 zero_v3(r); 00507 d= 0.0f; 00508 } 00509 00510 return d; 00511 } 00512 00513 MINLINE float normalize_v3(float n[3]) 00514 { 00515 return normalize_v3_v3(n, n); 00516 } 00517 00518 MINLINE void normal_short_to_float_v3(float out[3], const short in[3]) 00519 { 00520 out[0] = in[0]*(1.0f/32767.0f); 00521 out[1] = in[1]*(1.0f/32767.0f); 00522 out[2] = in[2]*(1.0f/32767.0f); 00523 } 00524 00525 MINLINE void normal_float_to_short_v3(short out[3], const float in[3]) 00526 { 00527 out[0] = (short)(in[0]*32767.0f); 00528 out[1] = (short)(in[1]*32767.0f); 00529 out[2] = (short)(in[2]*32767.0f); 00530 } 00531 00532 /********************************* Comparison ********************************/ 00533 00534 MINLINE int is_zero_v3(const float v[3]) 00535 { 00536 return (v[0] == 0 && v[1] == 0 && v[2] == 0); 00537 } 00538 00539 MINLINE int is_zero_v4(const float v[4]) 00540 { 00541 return (v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0); 00542 } 00543 00544 MINLINE int is_one_v3(const float v[3]) 00545 { 00546 return (v[0] == 1 && v[1] == 1 && v[2] == 1); 00547 } 00548 00549 MINLINE int equals_v2v2(const float v1[2], const float v2[2]) 00550 { 00551 return ((v1[0]==v2[0]) && (v1[1]==v2[1])); 00552 } 00553 00554 MINLINE int equals_v3v3(const float v1[3], const float v2[3]) 00555 { 00556 return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2])); 00557 } 00558 00559 MINLINE int equals_v4v4(const float v1[4], const float v2[4]) 00560 { 00561 return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]) && (v1[3]==v2[3])); 00562 } 00563 00564 MINLINE int compare_v3v3(const float v1[3], const float v2[3], const float limit) 00565 { 00566 if(fabsf(v1[0]-v2[0])<limit) 00567 if(fabsf(v1[1]-v2[1])<limit) 00568 if(fabsf(v1[2]-v2[2])<limit) 00569 return 1; 00570 00571 return 0; 00572 } 00573 00574 MINLINE int compare_len_v3v3(const float v1[3], const float v2[3], const float limit) 00575 { 00576 float x,y,z; 00577 00578 x=v1[0]-v2[0]; 00579 y=v1[1]-v2[1]; 00580 z=v1[2]-v2[2]; 00581 00582 return ((x*x + y*y + z*z) < (limit*limit)); 00583 } 00584 00585 MINLINE int compare_v4v4(const float v1[4], const float v2[4], const float limit) 00586 { 00587 if(fabsf(v1[0]-v2[0])<limit) 00588 if(fabsf(v1[1]-v2[1])<limit) 00589 if(fabsf(v1[2]-v2[2])<limit) 00590 if(fabsf(v1[3]-v2[3])<limit) 00591 return 1; 00592 00593 return 0; 00594 } 00595 00596 MINLINE float line_point_side_v2(const float l1[2], const float l2[2], const float pt[2]) 00597 { 00598 return ((l1[0]-pt[0]) * (l2[1]-pt[1])) - 00599 ((l2[0]-pt[0]) * (l1[1]-pt[1])); 00600 } 00601 00602 #endif /* BLI_MATH_VECTOR_INLINE_H */ 00603