20
18
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21
19
* All rights reserved.
23
21
* The Original Code is: some of this file.
25
23
* ***** END GPL LICENSE BLOCK *****
26
/** \file blender/blenlib/intern/math_vector_inline.c
28
31
#include "BLI_math.h"
30
#ifndef BLI_MATH_VECTOR_INLINE
31
#define BLI_MATH_VECTOR_INLINE
33
#ifndef __MATH_VECTOR_INLINE_C__
34
#define __MATH_VECTOR_INLINE_C__
33
36
/********************************** Init *************************************/
35
38
MINLINE void zero_v2(float r[2])
41
44
MINLINE void zero_v3(float r[3])
48
51
MINLINE void zero_v4(float r[4])
56
59
MINLINE void copy_v2_v2(float r[2], const float a[2])
62
65
MINLINE void copy_v3_v3(float r[3], const float a[3])
69
72
MINLINE void copy_v4_v4(float r[4], const float a[4])
80
MINLINE void copy_v2_fl(float r[2], float f)
86
MINLINE void copy_v3_fl(float r[3], float f)
93
MINLINE void copy_v4_fl(float r[4], float f)
102
MINLINE void copy_v2_v2_char(char r[2], const char a[2])
108
MINLINE void copy_v3_v3_char(char r[3], const char a[3])
115
MINLINE void copy_v4_v4_char(char r[4], const char a[4])
124
MINLINE void copy_v2_v2_short(short r[2], const short a[2])
130
MINLINE void copy_v3_v3_short(short r[3], const short a[3])
137
MINLINE void copy_v4_v4_short(short r[4], const short a[4])
146
MINLINE void copy_v2_v2_int(int r[2], const int a[2])
152
MINLINE void copy_v3_v3_int(int r[3], const int a[3])
159
MINLINE void copy_v4_v4_int(int r[4], const int a[4])
167
/* double -> float */
168
MINLINE void copy_v2fl_v2db(float r[2], const double a[2])
174
MINLINE void copy_v3fl_v3db(float r[3], const double a[3])
181
MINLINE void copy_v4fl_v4db(float r[4], const double a[4])
189
/* float -> double */
190
MINLINE void copy_v2db_v2fl(double r[2], const float a[2])
196
MINLINE void copy_v3db_v3fl(double r[3], const float a[3])
203
MINLINE void copy_v4db_v4fl(double r[4], const float a[4])
77
211
MINLINE void swap_v2_v2(float a[2], float b[2])
98
232
/********************************* Arithmetic ********************************/
100
MINLINE void add_v2_v2(float *r, const float *a)
234
MINLINE void add_v3_fl(float r[3], float f)
241
MINLINE void add_v4_fl(float r[4], float f)
249
MINLINE void add_v2_v2(float r[2], const float a[2])
106
MINLINE void add_v2_v2v2(float *r, const float *a, const float *b)
255
MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
112
MINLINE void add_v3_v3(float *r, const float *a)
261
MINLINE void add_v3_v3(float r[3], const float a[3])
119
MINLINE void add_v3_v3v3(float *r, const float *a, const float *b)
268
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
126
MINLINE void sub_v2_v2(float *r, const float *a)
275
MINLINE void sub_v2_v2(float r[2], const float a[2])
132
MINLINE void sub_v2_v2v2(float *r, const float *a, const float *b)
281
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
138
MINLINE void sub_v3_v3(float *r, const float *a)
287
MINLINE void sub_v3_v3(float r[3], const float a[3])
191
356
MINLINE void mul_v4_fl(float r[4], float f)
199
364
MINLINE void madd_v2_v2fl(float r[2], const float a[2], float f)
205
370
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
212
377
MINLINE void madd_v3_v3v3(float r[3], const float a[3], const float b[3])
219
384
MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f)
221
r[0] = a[0] + b[0]*f;
222
r[1] = a[1] + b[1]*f;
386
r[0] = a[0] + b[0] * f;
387
r[1] = a[1] + b[1] * f;
225
390
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
227
r[0] = a[0] + b[0]*f;
228
r[1] = a[1] + b[1]*f;
229
r[2] = a[2] + b[2]*f;
392
r[0] = a[0] + b[0] * f;
393
r[1] = a[1] + b[1] * f;
394
r[2] = a[2] + b[2] * f;
232
397
MINLINE void madd_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3])
234
r[0] = a[0] + b[0]*c[0];
235
r[1] = a[1] + b[1]*c[1];
236
r[2] = a[2] + b[2]*c[2];
399
r[0] = a[0] + b[0] * c[0];
400
r[1] = a[1] + b[1] * c[1];
401
r[2] = a[2] + b[2] * c[2];
239
404
MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f)
247
MINLINE void mul_v3_v3v3(float *v, const float *v1, const float *v2)
249
v[0] = v1[0] * v2[0];
250
v[1] = v1[1] * v2[1];
251
v[2] = v1[2] * v2[2];
412
MINLINE void mul_v3_v3v3(float r[3], const float v1[3], const float v2[3])
414
r[0] = v1[0] * v2[0];
415
r[1] = v1[1] * v2[1];
416
r[2] = v1[2] * v2[2];
419
MINLINE void negate_v2(float r[3])
425
MINLINE void negate_v2_v2(float r[2], const float a[2])
254
431
MINLINE void negate_v3(float r[3])
261
438
MINLINE void negate_v3_v3(float r[3], const float a[3])
445
MINLINE void negate_v4(float r[4])
453
MINLINE void negate_v4_v4(float r[4], const float a[4])
268
461
MINLINE float dot_v2v2(const float a[2], const float b[2])
270
return a[0]*b[0] + a[1]*b[1];
463
return a[0] * b[0] + a[1] * b[1];
273
466
MINLINE float dot_v3v3(const float a[3], const float b[3])
275
return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
468
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
278
471
MINLINE float cross_v2v2(const float a[2], const float b[2])
280
return a[0]*b[1] - a[1]*b[0];
473
return a[0] * b[1] - a[1] * b[0];
283
476
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
285
r[0]= a[1]*b[2] - a[2]*b[1];
286
r[1]= a[2]*b[0] - a[0]*b[2];
287
r[2]= a[0]*b[1] - a[1]*b[0];
290
MINLINE void star_m3_v3(float mat[][3], float *vec)
292
mat[0][0]= mat[1][1]= mat[2][2]= 0.0;
478
r[0] = a[1] * b[2] - a[2] * b[1];
479
r[1] = a[2] * b[0] - a[0] * b[2];
480
r[2] = a[0] * b[1] - a[1] * b[0];
483
/* Newell's Method */
484
/* excuse this fairly spesific function,
485
* its used for polygon normals all over the place
486
* could use a better name */
487
MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3])
489
n[0] += (v_prev[1] - v_curr[1]) * (v_prev[2] + v_curr[2]);
490
n[1] += (v_prev[2] - v_curr[2]) * (v_prev[0] + v_curr[0]);
491
n[2] += (v_prev[0] - v_curr[0]) * (v_prev[1] + v_curr[1]);
494
MINLINE void star_m3_v3(float rmat[][3], float a[3])
496
rmat[0][0] = rmat[1][1] = rmat[2][2] = 0.0;
301
505
/*********************************** Length **********************************/
507
MINLINE float len_squared_v2(const float v[2])
509
return v[0] * v[0] + v[1] * v[1];
512
MINLINE float len_squared_v3(const float v[3])
514
return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
303
517
MINLINE float len_v2(const float v[2])
305
return (float)sqrt(v[0]*v[0] + v[1]*v[1]);
519
return sqrtf(v[0] * v[0] + v[1] * v[1]);
308
522
MINLINE float len_v2v2(const float v1[2], const float v2[2])
314
return (float)sqrt(x*x+y*y);
528
return sqrtf(x * x + y * y);
317
531
MINLINE float len_v3(const float a[3])
358
581
MINLINE float normalize_v3_v3(float r[3], const float a[3])
360
float d= dot_v3v3(a, a);
583
float d = dot_v3v3(a, a);
362
585
/* a larger value causes normalize errors in a
363
scaled down models with camera xtreme close */
366
mul_v3_v3fl(r, a, 1.0f/d);
586
* scaled down models with camera xtreme close */
589
mul_v3_v3fl(r, a, 1.0f / d);
599
MINLINE double normalize_v3_d(double n[3])
601
double d = n[0] * n[0] + n[1] * n[1] + n[2] * n[2];
603
/* a larger value causes normalize errors in a
604
* scaled down models with camera xtreme close */
616
n[0] = n[1] = n[2] = 0;
378
625
return normalize_v3_v3(n, n);
381
MINLINE void normal_short_to_float_v3(float *out, const short *in)
628
MINLINE void normal_short_to_float_v3(float out[3], const short in[3])
383
out[0] = in[0]*(1.0f/32767.0f);
384
out[1] = in[1]*(1.0f/32767.0f);
385
out[2] = in[2]*(1.0f/32767.0f);
630
out[0] = in[0] * (1.0f / 32767.0f);
631
out[1] = in[1] * (1.0f / 32767.0f);
632
out[2] = in[2] * (1.0f / 32767.0f);
388
MINLINE void normal_float_to_short_v3(short *out, const float *in)
635
MINLINE void normal_float_to_short_v3(short out[3], const float in[3])
390
out[0] = (short)(in[0]*32767.0f);
391
out[1] = (short)(in[1]*32767.0f);
392
out[2] = (short)(in[2]*32767.0f);
637
out[0] = (short) (in[0] * 32767.0f);
638
out[1] = (short) (in[1] * 32767.0f);
639
out[2] = (short) (in[2] * 32767.0f);
395
642
/********************************* Comparison ********************************/
397
MINLINE int is_zero_v3(float *v)
645
MINLINE int is_zero_v2(const float v[3])
647
return (v[0] == 0 && v[1] == 0);
650
MINLINE int is_zero_v3(const float v[3])
399
652
return (v[0] == 0 && v[1] == 0 && v[2] == 0);
402
MINLINE int is_one_v3(float *v)
655
MINLINE int is_zero_v4(const float v[4])
657
return (v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0);
660
MINLINE int is_one_v3(const float v[3])
404
662
return (v[0] == 1 && v[1] == 1 && v[2] == 1);
407
MINLINE int equals_v3v3(float *v1, float *v2)
409
return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]));
412
MINLINE int compare_v3v3(float *v1, float *v2, float limit)
414
if(fabs(v1[0]-v2[0])<limit)
415
if(fabs(v1[1]-v2[1])<limit)
416
if(fabs(v1[2]-v2[2])<limit)
665
MINLINE int equals_v2v2(const float v1[2], const float v2[2])
667
return ((v1[0] == v2[0]) && (v1[1] == v2[1]));
670
MINLINE int equals_v3v3(const float v1[3], const float v2[3])
672
return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]));
675
MINLINE int equals_v4v4(const float v1[4], const float v2[4])
677
return ((v1[0] == v2[0]) && (v1[1] == v2[1]) && (v1[2] == v2[2]) && (v1[3] == v2[3]));
680
MINLINE int compare_v3v3(const float v1[3], const float v2[3], const float limit)
682
if (fabsf(v1[0] - v2[0]) < limit)
683
if (fabsf(v1[1] - v2[1]) < limit)
684
if (fabsf(v1[2] - v2[2]) < limit)
422
MINLINE int compare_len_v3v3(float *v1, float *v2, float limit)
690
MINLINE int compare_len_v3v3(const float v1[3], const float v2[3], const float limit)
430
return ((x*x + y*y + z*z) < (limit*limit));
698
return ((x * x + y * y + z * z) < (limit * limit));
433
MINLINE int compare_v4v4(float *v1, float *v2, float limit)
701
MINLINE int compare_v4v4(const float v1[4], const float v2[4], const float limit)
435
if(fabs(v1[0]-v2[0])<limit)
436
if(fabs(v1[1]-v2[1])<limit)
437
if(fabs(v1[2]-v2[2])<limit)
438
if(fabs(v1[3]-v2[3])<limit)
703
if (fabsf(v1[0] - v2[0]) < limit)
704
if (fabsf(v1[1] - v2[1]) < limit)
705
if (fabsf(v1[2] - v2[2]) < limit)
706
if (fabsf(v1[3] - v2[3]) < limit)
444
#endif /* BLI_MATH_VECTOR_INLINE */
712
MINLINE float line_point_side_v2(const float l1[2], const float l2[2], const float pt[2])
714
return (((l1[0] - pt[0]) * (l2[1] - pt[1])) -
715
((l2[0] - pt[0]) * (l1[1] - pt[1])));
718
#endif /* __MATH_VECTOR_INLINE_C__ */