Blender V2.61 - r43446

math_vector_inline.c

Go to the documentation of this file.
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