=bmesh= merge from trunk at r36529
[blender.git] / source / blender / blenlib / BLI_math_geom.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: some of this file.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  * */
27
28 #ifndef BLI_MATH_GEOM_H
29 #define BLI_MATH_GEOM_H
30
31 /** \file BLI_math_geom.h
32  *  \ingroup bli
33  */
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 #include "BLI_math_inline.h"
40
41 #ifdef BLI_MATH_INLINE_H
42 #include "intern/math_geom_inline.c"
43 #endif
44
45 /********************************** Polygons *********************************/
46
47 void cent_tri_v3(float r[3], const float a[3], const float b[3], const float c[3]);
48 void cent_quad_v3(float r[3], const float a[3], const float b[3], const float c[3], const float d[3]);
49
50 float normal_tri_v3(float r[3], const float a[3], const float b[3], const float c[3]);
51 float normal_quad_v3(float r[3], const float a[3], const float b[3], const float c[3], const float d[3]);
52
53 float area_tri_v2(const float a[2], const float b[2], const float c[2]);
54 float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2]);
55 float area_tri_v3(const float a[3], const float b[3], const float c[3]);
56 float area_quad_v3(const float a[3], const float b[3], const float c[3], const float d[3]);
57 float area_poly_v3(int nr, float verts[][3], const float normal[3]);
58
59 int is_quad_convex_v3(const float *v1, const float *v2, const float *v3, const float *v4);
60
61 /********************************* Distance **********************************/
62
63 float dist_to_line_v2(const float p[2], const float l1[2], const float l2[2]);
64 float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]);
65
66 float dist_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3]);
67 float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
68 float closest_to_line_v2(float r[2], const float p[2], const float l1[2], const float l2[2]);
69 void closest_to_line_segment_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
70
71 /******************************* Intersection ********************************/
72
73 /* TODO int return value consistency */
74
75 /* line-line */
76 #define ISECT_LINE_LINE_COLINEAR        -1
77 #define ISECT_LINE_LINE_NONE             0
78 #define ISECT_LINE_LINE_EXACT            1
79 #define ISECT_LINE_LINE_CROSS            2
80
81 int isect_line_line_v2(const float a1[2], const float a2[2], const float b1[2], const float b2[2]);
82 int isect_line_line_v2_short(const short a1[2], const short a2[2], const short b1[2], const short b2[2]);
83 int isect_seg_seg_v2_point(const float v1[2], const float v2[2], const float v3[2], const float v4[2], float vi[2]);
84
85 /* Returns the number of point of interests
86  * 0 - lines are colinear
87  * 1 - lines are coplanar, i1 is set to intersection
88  * 2 - i1 and i2 are the nearest points on line 1 (v1, v2) and line 2 (v3, v4) respectively 
89  * */
90
91 int isect_line_line_v3(const float v1[3], const float v2[3],
92         const float v3[3], const float v4[3], float i1[3], float i2[3]);
93 int isect_line_line_strict_v3(const float v1[3], const float v2[3],
94         const float v3[3], const float v4[3], float vi[3], float *lambda);
95
96 /*if clip is nonzero, will only return true if lambda is >= 0.0
97   (i.e. intersection point is along positive d)*/
98 int isect_ray_plane_v3(float p1[3], float d[3], float v0[3], 
99                                            float v1[3], float v2[3], float *lambda, int clip);
100
101 /* line/ray triangle */
102 int isect_line_tri_v3(const float p1[3], const float p2[3],
103         const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2]);
104 int isect_ray_tri_v3(const float p1[3], const float d[3],
105         const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2]);
106 int isect_ray_tri_threshold_v3(const float p1[3], const float d[3],
107         const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2], const float threshold);
108 int isect_ray_tri_epsilon_v3(const float p1[3], const float d[3],
109         const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2], const float epsilon);
110
111 /* point in polygon */
112 int isect_point_quad_v2(const float p[2], const float a[2], const float b[2], const float c[2], const float d[2]);
113
114 int isect_point_tri_v2(const float v1[2], const float v2[2], const float v3[2], const float pt[2]);
115 int isect_point_tri_v2_int(const int x1, const int y1, const int x2, const int y2, const int a, const int b);
116 int isect_point_tri_prism_v3(const float p[3], const float v1[3], const float v2[3], const float v3[3]);
117
118 void isect_point_quad_uv_v2(const float v0[2], const float v1[2], const float v2[2], const float v3[2],
119         const float pt[2], float *uv);
120 void isect_point_face_uv_v2(const int isquad, const float v0[2], const float v1[2], const float v2[2],
121         const float v3[2], const float pt[2], float *uv);
122
123 /* other */
124 int isect_sweeping_sphere_tri_v3(const float p1[3], const float p2[3], const float radius,
125         const float v0[3], const float v1[3], const float v2[3], float *lambda, float ipoint[3]);
126
127 int isect_axial_line_tri_v3(const int axis, const float co1[3], const float co2[3],
128         const float v0[3], const float v1[3], const float v2[3], float *lambda);
129
130 int isect_aabb_aabb_v3(const float min1[3], const float max1[3], const float min2[3], const float max2[3]);
131
132 int clip_line_plane(float p1[3], float p2[3], const float plane[4]);
133
134 void plot_line_v2v2i(const int p1[2], const int p2[2], int (*callback)(int, int, void *), void *userData);
135
136 /****************************** Interpolation ********************************/
137
138 /* tri or quad, d can be NULL */
139 void interp_weights_face_v3(float w[4],
140         const float a[3], const float b[3], const float c[3], const float d[3], const float p[3]);
141 void interp_weights_poly_v3(float w[], float v[][3], const int n, const float p[3]);
142
143 void interp_cubic_v3(float x[3], float v[3],
144         const float x1[3], const float v1[3], const float x2[3], const float v2[3], const float t);
145
146 int interp_sparse_array(float *array, const int list_size, const float invalid);
147
148 void barycentric_transform(float pt_tar[3], float const pt_src[3],
149         const float tri_tar_p1[3], const float tri_tar_p2[3], const float tri_tar_p3[3],
150         const float tri_src_p1[3], const float tri_src_p2[3], const float tri_src_p3[3]);
151
152 void barycentric_weights_v2(const float v1[2], const float v2[2], const float v3[2],
153         const float co[2], float w[3]);
154
155 /***************************** View & Projection *****************************/
156
157 void lookat_m4(float mat[4][4], float vx, float vy, 
158         float vz, float px, float py, float pz, float twist);
159 void polarview_m4(float mat[4][4], float dist, float azimuth,
160         float incidence, float twist);
161
162 void perspective_m4(float mat[4][4], const float left, const float right,
163         const float bottom, const float top, const float nearClip, const float farClip);
164 void orthographic_m4(float mat[4][4], const float left, const float right,
165         const float bottom, const float top, const float nearClip, const float farClip);
166 void window_translate_m4(float winmat[][4], float perspmat[][4],
167         const float x, const float y);
168
169 int box_clip_bounds_m4(float boundbox[2][3],
170         const float bounds[4], float winmat[4][4]);
171 void box_minmax_bounds_m4(float min[3], float max[3],
172         float boundbox[2][3], float mat[4][4]);
173
174 /********************************** Mapping **********************************/
175
176 void map_to_tube(float *u, float *v, const float x, const float y, const float z);
177 void map_to_sphere(float *u, float *v, const float x, const float y, const float z);
178
179 /********************************** Normals **********************************/
180
181 void accumulate_vertex_normals(float n1[3], float n2[3], float n3[3],
182         float n4[3], const float f_no[3], const float co1[3], const float co2[3],
183         const float co3[3], const float co4[3]);
184
185 /********************************* Tangents **********************************/
186
187 typedef struct VertexTangent {
188         struct VertexTangent *next;
189         float tang[3], uv[2];
190 } VertexTangent;
191
192 float *find_vertex_tangent(VertexTangent *vtang, const float uv[2]);
193 void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang,
194         const float tang[3], const float uv[2]);
195 void tangent_from_uv(float uv1[2], float uv2[2], float uv3[2],
196         float co1[3], float co2[3], float co3[3], float n[3], float tang[3]);
197
198 /******************************** Vector Clouds ******************************/
199
200 void vcloud_estimate_transform(int list_size, float (*pos)[3], float *weight,
201         float (*rpos)[3], float *rweight,
202         float lloc[3],float rloc[3],float lrot[3][3],float lscale[3][3]);
203
204 /****************************** Spherical Harmonics *************************/
205
206 /* Uses 2nd order SH => 9 coefficients, stored in this order:
207    0 = (0,0),
208    1 = (1,-1), 2 = (1,0), 3 = (1,1),
209    4 = (2,-2), 5 = (2,-1), 6 = (2,0), 7 = (2,1), 8 = (2,2) */
210
211 MINLINE void zero_sh(float r[9]);
212 MINLINE void copy_sh_sh(float r[9], const float a[9]);
213 MINLINE void mul_sh_fl(float r[9], const float f);
214 MINLINE void add_sh_shsh(float r[9], const float a[9], const float b[9]);
215
216 MINLINE float eval_shv3(float r[9], const float v[3]);
217 MINLINE float diffuse_shv3(float r[9], const float v[3]);
218 MINLINE void vec_fac_to_sh(float r[9], const float v[3], const float f);
219 MINLINE void madd_sh_shfl(float r[9], const float sh[3], const float f);
220
221 /********************************* Form Factor *******************************/
222
223 float form_factor_hemi_poly(float p[3], float n[3],
224         float v1[3], float v2[3], float v3[3], float v4[3]);
225
226 #ifdef __cplusplus
227 }
228 #endif
229
230 #endif /* BLI_MATH_GEOM_H */
231