Blender V4.3
BLI_math_geom.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
11#include "BLI_compiler_attrs.h"
12#include "BLI_math_inline.h"
13
14#ifdef BLI_MATH_GCC_WARN_PRAGMA
15# pragma GCC diagnostic push
16# pragma GCC diagnostic ignored "-Wredundant-decls"
17#endif
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23/* -------------------------------------------------------------------- */
27float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3]);
28float normal_quad_v3(
29 float n[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3]);
33float normal_poly_v3(float n[3], const float verts[][3], unsigned int nr);
34
35MINLINE float area_tri_v2(const float v1[2], const float v2[2], const float v3[2]);
36MINLINE float area_squared_tri_v2(const float v1[2], const float v2[2], const float v3[2]);
37MINLINE float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2]);
38
39/* Triangles */
40
41float area_tri_v3(const float v1[3], const float v2[3], const float v3[3]);
42float area_squared_tri_v3(const float v1[3], const float v2[3], const float v3[3]);
43float area_tri_signed_v3(const float v1[3],
44 const float v2[3],
45 const float v3[3],
46 const float normal[3]);
47float area_quad_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3]);
48float area_squared_quad_v3(const float v1[3],
49 const float v2[3],
50 const float v3[3],
51 const float v4[3]);
52float area_poly_v3(const float verts[][3], unsigned int nr);
53float area_poly_v2(const float verts[][2], unsigned int nr);
54float area_squared_poly_v3(const float verts[][3], unsigned int nr);
55float area_squared_poly_v2(const float verts[][2], unsigned int nr);
56float area_poly_signed_v2(const float verts[][2], unsigned int nr);
57float cotangent_tri_weight_v3(const float v1[3], const float v2[3], const float v3[3]);
58
59void cross_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3]);
66MINLINE float cross_tri_v2(const float v1[2], const float v2[2], const float v3[2]);
67void cross_poly_v3(float n[3], const float verts[][3], unsigned int nr);
74float cross_poly_v2(const float verts[][2], unsigned int nr);
75
78/* -------------------------------------------------------------------- */
86void plane_from_point_normal_v3(float r_plane[4],
87 const float plane_co[3],
88 const float plane_no[3]);
92void plane_to_point_vector_v3(const float plane[4], float r_plane_co[3], float r_plane_no[3]);
96void plane_to_point_vector_v3_normalized(const float plane[4],
97 float r_plane_co[3],
98 float r_plane_no[3]);
99
100MINLINE float plane_point_side_v3(const float plane[4], const float co[3]);
101
104/* -------------------------------------------------------------------- */
111float volume_tetrahedron_v3(const float v1[3],
112 const float v2[3],
113 const float v3[3],
114 const float v4[3]);
118float volume_tetrahedron_signed_v3(const float v1[3],
119 const float v2[3],
120 const float v3[3],
121 const float v4[3]);
122
129float volume_tri_tetrahedron_signed_v3_6x(const float v1[3], const float v2[3], const float v3[3]);
130float volume_tri_tetrahedron_signed_v3(const float v1[3], const float v2[3], const float v3[3]);
131
137bool is_edge_convex_v3(const float v1[3],
138 const float v2[3],
139 const float f1_no[3],
140 const float f2_no[3]);
144bool is_quad_convex_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3]);
145bool is_quad_convex_v2(const float v1[2], const float v2[2], const float v3[2], const float v4[2]);
146bool is_poly_convex_v2(const float verts[][2], unsigned int nr);
153int is_quad_flip_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3]);
154bool is_quad_flip_v3_first_third_fast(const float v1[3],
155 const float v2[3],
156 const float v3[3],
157 const float v4[3]);
158
161/* -------------------------------------------------------------------- */
168float dist_squared_to_line_v2(const float p[2], const float l1[2], const float l2[2]);
169float dist_to_line_v2(const float p[2], const float l1[2], const float l2[2]);
173float dist_squared_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]);
174float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]);
175
176float dist_signed_squared_to_plane_v3(const float p[3], const float plane[4]);
177float dist_squared_to_plane_v3(const float p[3], const float plane[4]);
181float dist_signed_to_plane_v3(const float p[3], const float plane[4]);
182float dist_to_plane_v3(const float p[3], const float plane[4]);
183
184/* Plane3 versions. */
185
186float dist_signed_squared_to_plane3_v3(const float p[3], const float plane[3]);
187float dist_squared_to_plane3_v3(const float p[3], const float plane[3]);
188float dist_signed_to_plane3_v3(const float p[3], const float plane[3]);
189float dist_to_plane3_v3(const float p[3], const float plane[3]);
190
194float dist_squared_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3]);
195float dist_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3]);
196float dist_squared_to_line_v3(const float p[3], const float l1[3], const float l2[3]);
197float dist_to_line_v3(const float p[3], const float l1[3], const float l2[3]);
221float dist_signed_squared_to_corner_v3v3v3(const float p[3],
222 const float v1[3],
223 const float v2[3],
224 const float v3[3],
225 const float axis_ref[3]);
232float dist_squared_to_ray_v3_normalized(const float ray_origin[3],
233 const float ray_direction[3],
234 const float co[3]);
241float dist_squared_ray_to_seg_v3(const float ray_origin[3],
242 const float ray_direction[3],
243 const float v0[3],
244 const float v1[3],
245 float r_point[3],
246 float *r_depth);
247
251void aabb_get_near_far_from_plane(const float plane_no[3],
252 const float bbmin[3],
253 const float bbmax[3],
254 float bb_near[3],
255 float bb_afar[3]);
256
258 float ray_origin[3];
260 float ray_inv_dir[3];
261};
263 const float ray_direction[3]);
268 const float bb_min[3],
269 const float bb_max[3],
270 float r_point[3],
271 float *r_depth);
276 const float ray_direction[3],
277 const float bb_min[3],
278 const float bb_max[3],
279 float r_point[3],
280 float *r_depth);
281
283 float ray_origin[3];
285 float ray_inv_dir[3];
286 float pmat[4][4];
287 float mval[2];
288};
294 const float projmat[4][4],
295 const float winsize[2],
296 const float mval[2]);
301 const float bbmin[3],
302 const float bbmax[3],
303 bool r_axis_closest[3]);
304float dist_squared_to_projected_aabb_simple(const float projmat[4][4],
305 const float winsize[2],
306 const float mval[2],
307 const float bbmin[3],
308 const float bbmax[3]);
309
311float dist_seg_seg_v2(const float a1[3], const float a2[3], const float b1[3], const float b2[3]);
312
313float closest_to_ray_v3(float r_close[3],
314 const float p[3],
315 const float ray_orig[3],
316 const float ray_dir[3]);
317float closest_to_line_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2]);
318double closest_to_line_v2_db(double r_close[2],
319 const double p[2],
320 const double l1[2],
321 const double l2[2]);
326float closest_to_line_v3(float r_close[3], const float p[3], const float l1[3], const float l2[3]);
332float closest_to_line_segment_v2(float r_close[2],
333 const float p[2],
334 const float l1[2],
335 const float l2[2]);
336
345float closest_seg_seg_v2(float r_closest_a[2],
346 float r_closest_b[2],
347 float *r_lambda_a,
348 float *r_lambda_b,
349 const float a1[2],
350 const float a2[2],
351 const float b1[2],
352 const float b2[2]);
353
359float closest_to_line_segment_v3(float r_close[3],
360 const float p[3],
361 const float l1[3],
362 const float l2[3]);
363
369float closest_ray_to_segment_v3(const float ray_origin[3],
370 const float ray_direction[3],
371 const float v0[3],
372 const float v1[3],
373 float r_close[3]);
374
375void closest_to_plane_normalized_v3(float r_close[3], const float plane[4], const float pt[3]);
385void closest_to_plane_v3(float r_close[3], const float plane[4], const float pt[3]);
386void closest_to_plane3_normalized_v3(float r_close[3], const float plane[3], const float pt[3]);
387void closest_to_plane3_v3(float r_close[3], const float plane[3], const float pt[3]);
388
393 float r[3], const float p[3], const float v1[3], const float v2[3], const float v3[3]);
394
395float ray_point_factor_v3_ex(const float p[3],
396 const float ray_origin[3],
397 const float ray_direction[3],
398 float epsilon,
399 float fallback);
400float ray_point_factor_v3(const float p[3],
401 const float ray_origin[3],
402 const float ray_direction[3]);
403
412 const float p[3], const float l1[3], const float l2[3], float epsilon, float fallback);
413float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3]);
414
416 const float p[2], const float l1[2], const float l2[2], float epsilon, float fallback);
417float line_point_factor_v2(const float p[2], const float l1[2], const float l2[2]);
418
422float line_plane_factor_v3(const float plane_co[3],
423 const float plane_no[3],
424 const float l1[3],
425 const float l2[3]);
426
431void limit_dist_v3(float v1[3], float v2[3], float dist);
432
435/* -------------------------------------------------------------------- */
439/* TODO: int return value consistency. */
440
441/* line-line */
442#define ISECT_LINE_LINE_COLINEAR -1
443#define ISECT_LINE_LINE_NONE 0
444#define ISECT_LINE_LINE_EXACT 1
445#define ISECT_LINE_LINE_CROSS 2
446
450int isect_seg_seg_v2(const float v1[2], const float v2[2], const float v3[2], const float v4[2]);
454void isect_seg_seg_v3(const float a0[3],
455 const float a1[3],
456 const float b0[3],
457 const float b1[3],
458 float r_a[3],
459 float r_b[3]);
460
464int isect_seg_seg_v2_int(const int v1[2], const int v2[2], const int v3[2], const int v4[2]);
478int isect_seg_seg_v2_point_ex(const float v0[2],
479 const float v1[2],
480 const float v2[2],
481 const float v3[2],
482 float endpoint_bias,
483 float r_vi[2]);
485 const float v0[2], const float v1[2], const float v2[2], const float v3[2], float r_vi[2]);
486bool isect_seg_seg_v2_simple(const float v1[2],
487 const float v2[2],
488 const float v3[2],
489 const float v4[2]);
502int isect_seg_seg_v2_lambda_mu_db(const double v1[2],
503 const double v2[2],
504 const double v3[2],
505 const double v4[2],
506 double *r_lambda,
507 double *r_mu);
521int isect_line_sphere_v3(const float l1[3],
522 const float l2[3],
523 const float sp[3],
524 float r,
525 float r_p1[3],
526 float r_p2[3]);
527int isect_line_sphere_v2(const float l1[2],
528 const float l2[2],
529 const float sp[2],
530 float r,
531 float r_p1[2],
532 float r_p2[2]);
533
538 const float v0[2], const float v1[2], const float v2[2], const float v3[2], float r_vi[2]);
545int isect_line_line_epsilon_v3(const float v1[3],
546 const float v2[3],
547 const float v3[3],
548 const float v4[3],
549 float r_i1[3],
550 float r_i2[3],
551 float epsilon);
552int isect_line_line_v3(const float v1[3],
553 const float v2[3],
554 const float v3[3],
555 const float v4[3],
556 float r_i1[3],
557 float r_i2[3]);
562bool isect_line_line_strict_v3(const float v1[3],
563 const float v2[3],
564 const float v3[3],
565 const float v4[3],
566 float vi[3],
567 float *r_lambda);
574bool isect_ray_ray_epsilon_v3(const float ray_origin_a[3],
575 const float ray_direction_a[3],
576 const float ray_origin_b[3],
577 const float ray_direction_b[3],
578 float epsilon,
579 float *r_lambda_a,
580 float *r_lambda_b);
581bool isect_ray_ray_v3(const float ray_origin_a[3],
582 const float ray_direction_a[3],
583 const float ray_origin_b[3],
584 const float ray_direction_b[3],
585 float *r_lambda_a,
586 float *r_lambda_b);
587
594bool isect_ray_plane_v3_factor(const float ray_origin[3],
595 const float ray_direction[3],
596 const float plane_co[3],
597 const float plane_no[3],
598 float *r_lambda);
599
600bool isect_ray_plane_v3(const float ray_origin[3],
601 const float ray_direction[3],
602 const float plane[4],
603 float *r_lambda,
604 bool clip);
605
609bool isect_point_planes_v3(const float (*planes)[4], int totplane, const float p[3]);
614bool isect_point_planes_v3_negated(const float (*planes)[4], int totplane, const float p[3]);
615
627bool isect_line_plane_v3(float r_isect_co[3],
628 const float l1[3],
629 const float l2[3],
630 const float plane_co[3],
631 const float plane_no[3]) ATTR_WARN_UNUSED_RESULT;
632
640bool isect_plane_plane_plane_v3(const float plane_a[4],
641 const float plane_b[4],
642 const float plane_c[4],
643 float r_isect_co[3]) ATTR_WARN_UNUSED_RESULT;
655bool isect_plane_plane_v3(const float plane_a[4],
656 const float plane_b[4],
657 float r_isect_co[3],
658 float r_isect_no[3]) ATTR_WARN_UNUSED_RESULT;
659
674 const float planes[][4],
675 int planes_len,
676 float eps_coplanar,
677 float eps_isect,
678 void (*callback_fn)(const float co[3], int i, int j, int k, void *user_data),
679 void *user_data);
680
681/* line/ray triangle */
682
687bool isect_line_segment_tri_v3(const float p1[3],
688 const float p2[3],
689 const float v0[3],
690 const float v1[3],
691 const float v2[3],
692 float *r_lambda,
693 float r_uv[2]);
697bool isect_line_segment_tri_epsilon_v3(const float p1[3],
698 const float p2[3],
699 const float v0[3],
700 const float v1[3],
701 const float v2[3],
702 float *r_lambda,
703 float r_uv[2],
704 float epsilon);
706 const float p1[3],
707 const float p2[3],
708 const float v0[3],
709 const float v1[3],
710 const float v2[3],
711 float *r_lambda);
712
717bool isect_ray_tri_v3(const float ray_origin[3],
718 const float ray_direction[3],
719 const float v0[3],
720 const float v1[3],
721 const float v2[3],
722 float *r_lambda,
723 float r_uv[2]);
724bool isect_ray_tri_threshold_v3(const float ray_origin[3],
725 const float ray_direction[3],
726 const float v0[3],
727 const float v1[3],
728 const float v2[3],
729 float *r_lambda,
730 float r_uv[2],
731 float threshold);
732bool isect_ray_tri_epsilon_v3(const float ray_origin[3],
733 const float ray_direction[3],
734 const float v0[3],
735 const float v1[3],
736 const float v2[3],
737 float *r_lambda,
738 float r_uv[2],
739 float epsilon);
750bool isect_tri_tri_v3_ex(const float tri_a[3][3],
751 const float tri_b[3][3],
752 float r_i1[3],
753 float r_i2[3],
754 int *r_tri_a_edge_isect_count);
755bool isect_tri_tri_v3(const float t_a0[3],
756 const float t_a1[3],
757 const float t_a2[3],
758 const float t_b0[3],
759 const float t_b1[3],
760 const float t_b2[3],
761 float r_i1[3],
762 float r_i2[3]);
763
764bool isect_tri_tri_v2(const float t_a0[2],
765 const float t_a1[2],
766 const float t_a2[2],
767 const float t_b0[2],
768 const float t_b1[2],
769 const float t_b2[2]);
770
775 /* Maximal dimension `kz`, and orthogonal dimensions. */
776 int kx, ky, kz;
777
778 /* Shear constants. */
779 float sx, sy, sz;
780};
781
783 const float ray_direction[3]);
784bool isect_ray_tri_watertight_v3(const float ray_origin[3],
785 const struct IsectRayPrecalc *isect_precalc,
786 const float v0[3],
787 const float v1[3],
788 const float v2[3],
789 float *r_lambda,
790 float r_uv[2]);
794bool isect_ray_tri_watertight_v3_simple(const float ray_origin[3],
795 const float ray_direction[3],
796 const float v0[3],
797 const float v1[3],
798 const float v2[3],
799 float *r_lambda,
800 float r_uv[2]);
801
802bool isect_ray_seg_v2(const float ray_origin[2],
803 const float ray_direction[2],
804 const float v0[2],
805 const float v1[2],
806 float *r_lambda,
807 float *r_u);
808
809bool isect_ray_line_v3(const float ray_origin[3],
810 const float ray_direction[3],
811 const float v0[3],
812 const float v1[3],
813 float *r_lambda);
814
815/* Point in polygon. */
816
817bool isect_point_poly_v2(const float pt[2], const float verts[][2], unsigned int nr);
818bool isect_point_poly_v2_int(const int pt[2], const int verts[][2], unsigned int nr);
819
824 const float p[2], const float v1[2], const float v2[2], const float v3[2], const float v4[2]);
825
826int isect_point_tri_v2(const float pt[2], const float v1[2], const float v2[2], const float v3[2]);
830bool isect_point_tri_v2_cw(const float pt[2],
831 const float v1[2],
832 const float v2[2],
833 const float v3[2]);
843int isect_point_tri_v2_int(int x1, int y1, int x2, int y2, int a, int b);
844bool isect_point_tri_prism_v3(const float p[3],
845 const float v1[3],
846 const float v2[3],
847 const float v3[3]);
854bool isect_point_tri_v3(const float p[3],
855 const float v1[3],
856 const float v2[3],
857 const float v3[3],
858 float r_isect_co[3]);
859
863bool isect_aabb_aabb_v3(const float min1[3],
864 const float max1[3],
865 const float min2[3],
866 const float max2[3]);
867
869 float ray_origin[3];
870 float ray_inv_dir[3];
871 int sign[3];
872};
873
875 const float ray_origin[3],
876 const float ray_direction[3]);
878 const float bb_min[3],
879 const float bb_max[3],
880 float *r_tmin);
888bool isect_ray_aabb_v3_simple(const float orig[3],
889 const float dir[3],
890 const float bb_min[3],
891 const float bb_max[3],
892 float *tmin,
893 float *tmax);
894
895/* other */
896#define ISECT_AABB_PLANE_BEHIND_ANY 0
897#define ISECT_AABB_PLANE_CROSS_ANY 1
898#define ISECT_AABB_PLANE_IN_FRONT_ALL 2
899
908int isect_aabb_planes_v3(const float (*planes)[4],
909 int totplane,
910 const float bbmin[3],
911 const float bbmax[3]);
912
913bool isect_sweeping_sphere_tri_v3(const float p1[3],
914 const float p2[3],
915 float radius,
916 const float v0[3],
917 const float v1[3],
918 const float v2[3],
919 float *r_lambda,
920 float ipoint[3]);
921
923 const float p1[3], const float p2[3], const float plane[4], float r_p1[3], float r_p2[3]);
924bool clip_segment_v3_plane_n(const float p1[3],
925 const float p2[3],
926 const float plane_array[][4],
927 int plane_num,
928 float r_p1[3],
929 float r_p2[3]);
930
931bool point_in_slice_seg(float p[3], float l1[3], float l2[3]);
932
935/* -------------------------------------------------------------------- */
940 float w[3], const float v1[3], const float v2[3], const float v3[3], const float co[3]);
941void interp_weights_quad_v3(float w[4],
942 const float v1[3],
943 const float v2[3],
944 const float v3[3],
945 const float v4[3],
946 const float co[3]);
947void interp_weights_poly_v3(float w[], float v[][3], int n, const float co[3]);
948void interp_weights_poly_v2(float w[], float v[][2], int n, const float co[2]);
949
951void interp_cubic_v3(float x[3],
952 float v[3],
953 const float x1[3],
954 const float v1[3],
955 const float x2[3],
956 const float v2[3],
957 float t);
958
963int interp_sparse_array(float *array, int list_size, float skipval);
964
970void transform_point_by_tri_v3(float pt_tar[3],
971 float const pt_src[3],
972 const float tri_tar_p1[3],
973 const float tri_tar_p2[3],
974 const float tri_tar_p3[3],
975 const float tri_src_p1[3],
976 const float tri_src_p2[3],
977 const float tri_src_p3[3]);
982void transform_point_by_seg_v3(float p_dst[3],
983 const float p_src[3],
984 const float l_dst_p1[3],
985 const float l_dst_p2[3],
986 const float l_src_p1[3],
987 const float l_src_p2[3]);
988
996 const float v1[2], const float v2[2], const float v3[2], const float co[2], float w[3]);
1003 const float v1[2], const float v2[2], const float v3[2], const float co[2], float w[3]);
1009 const float v1[4], const float v2[4], const float v3[4], const float co[2], float w[3]);
1015void barycentric_weights_v2_quad(const float v1[2],
1016 const float v2[2],
1017 const float v3[2],
1018 const float v4[2],
1019 const float co[2],
1020 float w[4]);
1021
1026 const float v1[2], const float v2[2], const float v3[2], const float co[2], float w[3]);
1033int barycentric_inside_triangle_v2(const float w[3]);
1034
1043 float r_uv[2], const float st[2], const float st0[2], const float st1[2], const float st2[2]);
1050 float r_uv[2], const float st[3], const float st0[3], const float st1[3], const float st2[3]);
1054void resolve_quad_uv_v2(float r_uv[2],
1055 const float st[2],
1056 const float st0[2],
1057 const float st1[2],
1058 const float st2[2],
1059 const float st3[2]);
1063void resolve_quad_uv_v2_deriv(float r_uv[2],
1064 float r_deriv[2][2],
1065 const float st[2],
1066 const float st0[2],
1067 const float st1[2],
1068 const float st2[2],
1069 const float st3[2]);
1073float resolve_quad_u_v2(const float st[2],
1074 const float st0[2],
1075 const float st1[2],
1076 const float st2[2],
1077 const float st3[2]);
1078
1083void interp_bilinear_quad_v3(float data[4][3], float u, float v, float res[3]);
1084void interp_barycentric_tri_v3(float data[3][3], float u, float v, float res[3]);
1085
1088/* -------------------------------------------------------------------- */
1092void lookat_m4(
1093 float mat[4][4], float vx, float vy, float vz, float px, float py, float pz, float twist);
1094void polarview_m4(float mat[4][4], float dist, float azimuth, float incidence, float twist);
1095
1099void perspective_m4(float mat[4][4],
1100 float left,
1101 float right,
1102 float bottom,
1103 float top,
1104 float nearClip,
1105 float farClip);
1106void perspective_m4_fov(float mat[4][4],
1107 float angle_left,
1108 float angle_right,
1109 float angle_up,
1110 float angle_down,
1111 float nearClip,
1112 float farClip);
1116void orthographic_m4(float mat[4][4],
1117 float left,
1118 float right,
1119 float bottom,
1120 float top,
1121 float nearClip,
1122 float farClip);
1127void window_translate_m4(float winmat[4][4], float perspmat[4][4], float x, float y);
1128
1135void planes_from_projmat(const float mat[4][4],
1136 float left[4],
1137 float right[4],
1138 float bottom[4],
1139 float top[4],
1140 float near[4],
1141 float far[4]);
1142
1143void projmat_dimensions(const float winmat[4][4],
1144 float *r_left,
1145 float *r_right,
1146 float *r_bottom,
1147 float *r_top,
1148 float *r_near,
1149 float *r_far);
1150void projmat_dimensions_db(const float winmat_fl[4][4],
1151 double *r_left,
1152 double *r_right,
1153 double *r_bottom,
1154 double *r_top,
1155 double *r_near,
1156 double *r_far);
1157
1166void projmat_from_subregion(const float projmat[4][4],
1167 const int win_size[2],
1168 int x_min,
1169 int x_max,
1170 int y_min,
1171 int y_max,
1172 float r_projmat[4][4]);
1173
1174int box_clip_bounds_m4(float boundbox[2][3], const float bounds[4], float winmat[4][4]);
1175void box_minmax_bounds_m4(float min[3], float max[3], float boundbox[2][3], float mat[4][4]);
1176
1179/* -------------------------------------------------------------------- */
1183bool map_to_tube(float *r_u, float *r_v, float x, float y, float z);
1184bool map_to_sphere(float *r_u, float *r_v, float x, float y, float z);
1185void map_to_plane_v2_v3v3(float r_co[2], const float co[3], const float no[3]);
1186void map_to_plane_axis_angle_v2_v3v3fl(float r_co[2],
1187 const float co[3],
1188 const float axis[3],
1189 float angle);
1190
1193/* -------------------------------------------------------------------- */
1197void accumulate_vertex_normals_tri_v3(float n1[3],
1198 float n2[3],
1199 float n3[3],
1200 const float f_no[3],
1201 const float co1[3],
1202 const float co2[3],
1203 const float co3[3]);
1204
1205void accumulate_vertex_normals_v3(float n1[3],
1206 float n2[3],
1207 float n3[3],
1208 float n4[3],
1209 const float f_no[3],
1210 const float co1[3],
1211 const float co2[3],
1212 const float co3[3],
1213 const float co4[3]);
1214
1220 float **vertnos, const float polyno[3], const float **vertcos, float vdiffs[][3], int nverts);
1221
1224/* -------------------------------------------------------------------- */
1228void tangent_from_uv_v3(const float uv1[2],
1229 const float uv2[2],
1230 const float uv3[2],
1231 const float co1[3],
1232 const float co2[3],
1233 const float co3[3],
1234 const float n[3],
1235 float r_tang[3]);
1236
1239/* -------------------------------------------------------------------- */
1262void vcloud_estimate_transform_v3(int list_size,
1263 const float (*pos)[3],
1264 const float *weight,
1265 const float (*rpos)[3],
1266 const float *rweight,
1267 float lloc[3],
1268 float rloc[3],
1269 float lrot[3][3],
1270 float lscale[3][3]);
1271
1274/* -------------------------------------------------------------------- */
1281void axis_dominant_v3_to_m3_negate(float r_mat[3][3], const float normal[3]);
1292void axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3]);
1293
1297MINLINE void axis_dominant_v3(int *r_axis_a, int *r_axis_b, const float axis[3]);
1301MINLINE float axis_dominant_v3_max(int *r_axis_a,
1302 int *r_axis_b,
1303 const float axis[3]) ATTR_WARN_UNUSED_RESULT;
1307MINLINE int axis_dominant_v3_single(const float vec[3]);
1311MINLINE int axis_dominant_v3_ortho_single(const float vec[3]);
1312
1313MINLINE int max_axis_v3(const float vec[3]);
1314MINLINE int min_axis_v3(const float vec[3]);
1315
1325MINLINE int poly_to_tri_count(int poly_count, int corner_count);
1326
1333MINLINE float shell_angle_to_dist(float angle);
1337MINLINE float shell_v3v3_normalized_to_dist(const float a[3], const float b[3]);
1341MINLINE float shell_v2v2_normalized_to_dist(const float a[2], const float b[2]);
1345MINLINE float shell_v3v3_mid_normalized_to_dist(const float a[3], const float b[3]);
1349MINLINE float shell_v2v2_mid_normalized_to_dist(const float a[2], const float b[2]);
1350
1353/* -------------------------------------------------------------------- */
1365float cubic_tangent_factor_circle_v3(const float tan_l[3], const float tan_r[3]);
1366
1369/* -------------------------------------------------------------------- */
1382 const float v0[3], const float v1[3], const float v2[3], float dist1, float dist2);
1383
1386#ifdef __cplusplus
1387}
1388#endif
1389
1390/* -------------------------------------------------------------------- */
1394#if BLI_MATH_DO_INLINE
1395# include "intern/math_geom_inline.c"
1396#endif
1397
1398#ifdef BLI_MATH_GCC_WARN_PRAGMA
1399# pragma GCC diagnostic pop
1400#endif
1401
#define ATTR_WARN_UNUSED_RESULT
int isect_seg_seg_v2(const float v1[2], const float v2[2], const float v3[2], const float v4[2])
bool isect_point_planes_v3(const float(*planes)[4], int totplane, const float p[3])
bool isect_ray_aabb_v3(const struct IsectRayAABB_Precalc *data, const float bb_min[3], const float bb_max[3], float *r_tmin)
void orthographic_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
int isect_seg_seg_v2_point_ex(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float endpoint_bias, float r_vi[2])
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
Definition math_geom.cc:215
bool clip_segment_v3_plane_n(const float p1[3], const float p2[3], const float plane_array[][4], int plane_num, float r_p1[3], float r_p2[3])
bool isect_ray_ray_v3(const float ray_origin_a[3], const float ray_direction_a[3], const float ray_origin_b[3], const float ray_direction_b[3], float *r_lambda_a, float *r_lambda_b)
float dist_signed_to_plane3_v3(const float p[3], const float plane[3])
Definition math_geom.cc:505
int isect_point_quad_v2(const float p[2], const float v1[2], const float v2[2], const float v3[2], const float v4[2])
float closest_to_ray_v3(float r_close[3], const float p[3], const float ray_orig[3], const float ray_dir[3])
void window_translate_m4(float winmat[4][4], float perspmat[4][4], float x, float y)
float ray_point_factor_v3_ex(const float p[3], const float ray_origin[3], const float ray_direction[3], float epsilon, float fallback)
void isect_ray_tri_watertight_v3_precalc(struct IsectRayPrecalc *isect_precalc, const float ray_direction[3])
float closest_seg_seg_v2(float r_closest_a[2], float r_closest_b[2], float *r_lambda_a, float *r_lambda_b, const float a1[2], const float a2[2], const float b1[2], const float b2[2])
Definition math_geom.cc:303
struct DistRayAABB_Precalc dist_squared_ray_to_aabb_v3_precalc(const float ray_origin[3], const float ray_direction[3])
Definition math_geom.cc:683
float dist_squared_to_line_v3(const float p[3], const float l1[3], const float l2[3])
Definition math_geom.cc:531
bool isect_ray_tri_threshold_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2], float threshold)
bool isect_ray_plane_v3(const float ray_origin[3], const float ray_direction[3], const float plane[4], float *r_lambda, bool clip)
float dist_squared_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3])
Definition math_geom.cc:517
float area_squared_poly_v2(const float verts[][2], unsigned int nr)
Definition math_geom.cc:190
bool isect_line_segment_tri_epsilon_v3(const float p1[3], const float p2[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2], float epsilon)
float dist_squared_to_projected_aabb(struct DistProjectedAABBPrecalc *data, const float bbmin[3], const float bbmax[3], bool r_axis_closest[3])
Definition math_geom.cc:856
void projmat_from_subregion(const float projmat[4][4], const int win_size[2], int x_min, int x_max, int y_min, int y_max, float r_projmat[4][4])
float normal_quad_v3(float n[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
Definition math_geom.cc:56
bool isect_point_poly_v2_int(const int pt[2], const int verts[][2], unsigned int nr)
int isect_line_line_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3], float r_i1[3], float r_i2[3])
void interp_cubic_v3(float x[3], float v[3], const float x1[3], const float v1[3], const float x2[3], const float v2[3], float t)
void perspective_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
float geodesic_distance_propagate_across_triangle(const float v0[3], const float v1[3], const float v2[3], float dist1, float dist2)
MINLINE float shell_v2v2_normalized_to_dist(const float a[2], const float b[2])
float dist_squared_to_plane_v3(const float p[3], const float plane[4])
Definition math_geom.cc:468
bool isect_ray_line_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], float *r_lambda)
int barycentric_inside_triangle_v2(const float w[3])
MINLINE float area_tri_v2(const float v1[2], const float v2[2], const float v3[2])
int is_quad_flip_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
float dist_squared_to_plane3_v3(const float p[3], const float plane[3])
Definition math_geom.cc:484
void transform_point_by_seg_v3(float p_dst[3], const float p_src[3], const float l_dst_p1[3], const float l_dst_p2[3], const float l_src_p1[3], const float l_src_p2[3])
int interp_sparse_array(float *array, int list_size, float skipval)
bool isect_ray_tri_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2])
void perspective_m4_fov(float mat[4][4], float angle_left, float angle_right, float angle_up, float angle_down, float nearClip, float farClip)
bool isect_plane_plane_v3(const float plane_a[4], const float plane_b[4], float r_isect_co[3], float r_isect_no[3]) ATTR_WARN_UNUSED_RESULT
float dist_to_plane3_v3(const float p[3], const float plane[3])
Definition math_geom.cc:512
bool isect_point_poly_v2(const float pt[2], const float verts[][2], unsigned int nr)
float area_poly_v3(const float verts[][3], unsigned int nr)
Definition math_geom.cc:131
void barycentric_weights_v2(const float v1[2], const float v2[2], const float v3[2], const float co[2], float w[3])
MINLINE float area_squared_tri_v2(const float v1[2], const float v2[2], const float v3[2])
void accumulate_vertex_normals_tri_v3(float n1[3], float n2[3], float n3[3], const float f_no[3], const float co1[3], const float co2[3], const float co3[3])
float closest_to_line_segment_v3(float r_close[3], const float p[3], const float l1[3], const float l2[3])
Definition math_geom.cc:385
float ray_point_factor_v3(const float p[3], const float ray_origin[3], const float ray_direction[3])
void barycentric_weights_v2_clamped(const float v1[2], const float v2[2], const float v3[2], const float co[2], float w[3])
void isect_seg_seg_v3(const float a0[3], const float a1[3], const float b0[3], const float b1[3], float r_a[3], float r_b[3])
MINLINE int axis_dominant_v3_single(const float vec[3])
bool isect_point_planes_v3_negated(const float(*planes)[4], int totplane, const float p[3])
double closest_to_line_v2_db(double r_close[2], const double p[2], const double l1[2], const double l2[2])
MINLINE float cross_tri_v2(const float v1[2], const float v2[2], const float v3[2])
MINLINE int axis_dominant_v3_ortho_single(const float vec[3])
int isect_line_line_epsilon_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3], float r_i1[3], float r_i2[3], float epsilon)
MINLINE float plane_point_side_v3(const float plane[4], const float co[3])
float line_point_factor_v2_ex(const float p[2], const float l1[2], const float l2[2], float epsilon, float fallback)
void cross_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
Definition math_geom.cc:24
bool point_in_slice_seg(float p[3], float l1[3], float l2[3])
bool isect_ray_ray_epsilon_v3(const float ray_origin_a[3], const float ray_direction_a[3], const float ray_origin_b[3], const float ray_direction_b[3], float epsilon, float *r_lambda_a, float *r_lambda_b)
float dist_to_plane_v3(const float p[3], const float plane[4])
Definition math_geom.cc:500
bool isect_tri_tri_v2(const float t_a0[2], const float t_a1[2], const float t_a2[2], const float t_b0[2], const float t_b1[2], const float t_b2[2])
void transform_point_by_tri_v3(float pt_tar[3], float const pt_src[3], const float tri_tar_p1[3], const float tri_tar_p2[3], const float tri_tar_p3[3], const float tri_src_p1[3], const float tri_src_p2[3], const float tri_src_p3[3])
void polarview_m4(float mat[4][4], float dist, float azimuth, float incidence, float twist)
int isect_seg_seg_v2_lambda_mu_db(const double v1[2], const double v2[2], const double v3[2], const double v4[2], double *r_lambda, double *r_mu)
void interp_weights_quad_v3(float w[4], const float v1[3], const float v2[3], const float v3[3], const float v4[3], const float co[3])
float area_tri_signed_v3(const float v1[3], const float v2[3], const float v3[3], const float normal[3])
Definition math_geom.cc:113
float volume_tri_tetrahedron_signed_v3_6x(const float v1[3], const float v2[3], const float v3[3])
Definition math_geom.cc:261
void closest_to_plane3_normalized_v3(float r_close[3], const float plane[3], const float pt[3])
Definition math_geom.cc:454
int isect_line_sphere_v3(const float l1[3], const float l2[3], const float sp[3], float r, float r_p1[3], float r_p2[3])
bool isect_seg_seg_v2_simple(const float v1[2], const float v2[2], const float v3[2], const float v4[2])
void closest_to_plane_normalized_v3(float r_close[3], const float plane[4], const float pt[3])
Definition math_geom.cc:440
bool isect_ray_plane_v3_factor(const float ray_origin[3], const float ray_direction[3], const float plane_co[3], const float plane_no[3], float *r_lambda)
MINLINE float axis_dominant_v3_max(int *r_axis_a, int *r_axis_b, const float axis[3]) ATTR_WARN_UNUSED_RESULT
bool isect_point_tri_v3(const float p[3], const float v1[3], const float v2[3], const float v3[3], float r_isect_co[3])
void interp_weights_tri_v3(float w[3], const float v1[3], const float v2[3], const float v3[3], const float co[3])
void resolve_tri_uv_v2(float r_uv[2], const float st[2], const float st0[2], const float st1[2], const float st2[2])
float closest_ray_to_segment_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], float r_close[3])
Definition math_geom.cc:407
float line_point_factor_v3_ex(const float p[3], const float l1[3], const float l2[3], float epsilon, float fallback)
bool isect_ray_aabb_v3_simple(const float orig[3], const float dir[3], const float bb_min[3], const float bb_max[3], float *tmin, float *tmax)
float dist_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3])
Definition math_geom.cc:526
void limit_dist_v3(float v1[3], float v2[3], float dist)
bool isect_aabb_aabb_v3(const float min1[3], const float max1[3], const float min2[3], const float max2[3])
float area_squared_poly_v3(const float verts[][3], unsigned int nr)
Definition math_geom.cc:138
float volume_tri_tetrahedron_signed_v3(const float v1[3], const float v2[3], const float v3[3])
Definition math_geom.cc:269
void cross_poly_v3(float n[3], const float verts[][3], unsigned int nr)
Definition math_geom.cc:166
bool isect_ray_seg_v2(const float ray_origin[2], const float ray_direction[2], const float v0[2], const float v1[2], float *r_lambda, float *r_u)
float dist_squared_to_projected_aabb_simple(const float projmat[4][4], const float winsize[2], const float mval[2], const float bbmin[3], const float bbmax[3])
Definition math_geom.cc:986
bool isect_axial_line_segment_tri_v3(int axis, const float p1[3], const float p2[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda)
void accumulate_vertex_normals_poly_v3(float **vertnos, const float polyno[3], const float **vertcos, float vdiffs[][3], int nverts)
void map_to_plane_axis_angle_v2_v3v3fl(float r_co[2], const float co[3], const float axis[3], float angle)
float dist_squared_ray_to_aabb_v3_simple(const float ray_origin[3], const float ray_direction[3], const float bb_min[3], const float bb_max[3], float r_point[3], float *r_depth)
Definition math_geom.cc:787
bool is_quad_flip_v3_first_third_fast(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
bool clip_segment_v3_plane(const float p1[3], const float p2[3], const float plane[4], float r_p1[3], float r_p2[3])
int isect_line_sphere_v2(const float l1[2], const float l2[2], const float sp[2], float r, float r_p1[2], float r_p2[2])
void closest_to_plane3_v3(float r_close[3], const float plane[3], const float pt[3])
Definition math_geom.cc:447
void resolve_quad_uv_v2(float r_uv[2], const float st[2], const float st0[2], const float st1[2], const float st2[2], const float st3[2])
float line_point_factor_v2(const float p[2], const float l1[2], const float l2[2])
void projmat_dimensions_db(const float winmat_fl[4][4], double *r_left, double *r_right, double *r_bottom, double *r_top, double *r_near, double *r_far)
bool isect_ray_tri_watertight_v3_simple(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2])
void closest_on_tri_to_point_v3(float r[3], const float p[3], const float v1[3], const float v2[3], const float v3[3])
void tangent_from_uv_v3(const float uv1[2], const float uv2[2], const float uv3[2], const float co1[3], const float co2[3], const float co3[3], const float n[3], float r_tang[3])
MINLINE float shell_v3v3_normalized_to_dist(const float a[3], const float b[3])
MINLINE float shell_v3v3_mid_normalized_to_dist(const float a[3], const float b[3])
void lookat_m4(float mat[4][4], float vx, float vy, float vz, float px, float py, float pz, float twist)
void axis_dominant_v3_to_m3_negate(float r_mat[3][3], const float normal[3])
void accumulate_vertex_normals_v3(float n1[3], float n2[3], float n3[3], float n4[3], const float f_no[3], const float co1[3], const float co2[3], const float co3[3], const float co4[3])
bool isect_tri_tri_v3(const float t_a0[3], const float t_a1[3], const float t_a2[3], const float t_b0[3], const float t_b1[3], const float t_b2[3], float r_i1[3], float r_i2[3])
float line_plane_factor_v3(const float plane_co[3], const float plane_no[3], const float l1[3], const float l2[3])
void dist_squared_to_projected_aabb_precalc(struct DistProjectedAABBPrecalc *precalc, const float projmat[4][4], const float winsize[2], const float mval[2])
Definition math_geom.cc:804
float dist_signed_to_plane_v3(const float p[3], const float plane[4])
Definition math_geom.cc:493
void aabb_get_near_far_from_plane(const float plane_no[3], const float bbmin[3], const float bbmax[3], float bb_near[3], float bb_afar[3])
Definition math_geom.cc:647
float dist_seg_seg_v2(const float a1[3], const float a2[3], const float b1[3], const float b2[3])
void resolve_tri_uv_v3(float r_uv[2], const float st[3], const float st0[3], const float st1[3], const float st2[3])
int isect_point_tri_v2_int(int x1, int y1, int x2, int y2, int a, int b)
void isect_ray_aabb_v3_precalc(struct IsectRayAABB_Precalc *data, const float ray_origin[3], const float ray_direction[3])
bool isect_sweeping_sphere_tri_v3(const float p1[3], const float p2[3], float radius, const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float ipoint[3])
float area_tri_v3(const float v1[3], const float v2[3], const float v3[3])
Definition math_geom.cc:98
int isect_aabb_planes_v3(const float(*planes)[4], int totplane, const float bbmin[3], const float bbmax[3])
bool isect_point_tri_v2_cw(const float pt[2], const float v1[2], const float v2[2], const float v3[2])
float area_poly_signed_v2(const float verts[][2], unsigned int nr)
Definition math_geom.cc:185
bool isect_ray_tri_watertight_v3(const float ray_origin[3], const struct IsectRayPrecalc *isect_precalc, const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2])
bool is_quad_convex_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
bool is_edge_convex_v3(const float v1[3], const float v2[3], const float f1_no[3], const float f2_no[3])
float resolve_quad_u_v2(const float st[2], const float st0[2], const float st1[2], const float st2[2], const float st3[2])
void axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3])
Normal to x,y matrix.
void interp_barycentric_tri_v3(float data[3][3], float u, float v, float res[3])
float volume_tetrahedron_signed_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
Definition math_geom.cc:249
float closest_to_line_segment_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2])
Definition math_geom.cc:363
bool isect_line_line_strict_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3], float vi[3], float *r_lambda)
float area_squared_tri_v3(const float v1[3], const float v2[3], const float v3[3])
Definition math_geom.cc:105
bool isect_tri_tri_v3_ex(const float tri_a[3][3], const float tri_b[3][3], float r_i1[3], float r_i2[3], int *r_tri_a_edge_isect_count)
float dist_squared_ray_to_seg_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], float r_point[3], float *r_depth)
Definition math_geom.cc:611
float dist_squared_ray_to_aabb_v3(const struct DistRayAABB_Precalc *data, const float bb_min[3], const float bb_max[3], float r_point[3], float *r_depth)
void barycentric_weights_v2_quad(const float v1[2], const float v2[2], const float v3[2], const float v4[2], const float co[2], float w[4])
int box_clip_bounds_m4(float boundbox[2][3], const float bounds[4], float winmat[4][4])
MINLINE float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2])
float cubic_tangent_factor_circle_v3(const float tan_l[3], const float tan_r[3])
MINLINE int poly_to_tri_count(int poly_count, int corner_count)
float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3])
float dist_squared_to_ray_v3_normalized(const float ray_origin[3], const float ray_direction[3], const float co[3])
Definition math_geom.cc:595
float area_squared_quad_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
Definition math_geom.cc:89
MINLINE float shell_v2v2_mid_normalized_to_dist(const float a[2], const float b[2])
bool barycentric_coords_v2(const float v1[2], const float v2[2], const float v3[2], const float co[2], float w[3])
int isect_line_line_v2_point(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float r_vi[2])
MINLINE int min_axis_v3(const float vec[3])
void closest_to_plane_v3(float r_close[3], const float plane[4], const float pt[3])
Definition math_geom.cc:433
void plane_to_point_vector_v3(const float plane[4], float r_plane_co[3], float r_plane_no[3])
Definition math_geom.cc:221
float cross_poly_v2(const float verts[][2], unsigned int nr)
Definition math_geom.cc:147
float closest_to_line_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2])
MINLINE float shell_angle_to_dist(float angle)
float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2])
Definition math_geom.cc:298
float closest_to_line_v3(float r_close[3], const float p[3], const float l1[3], const float l2[3])
void projmat_dimensions(const float winmat[4][4], float *r_left, float *r_right, float *r_bottom, float *r_top, float *r_near, float *r_far)
void map_to_plane_v2_v3v3(float r_co[2], const float co[3], const float no[3])
bool is_quad_convex_v2(const float v1[2], const float v2[2], const float v3[2], const float v4[2])
float cotangent_tri_weight_v3(const float v1[3], const float v2[3], const float v3[3])
Definition math_geom.cc:196
void vcloud_estimate_transform_v3(int list_size, const float(*pos)[3], const float *weight, const float(*rpos)[3], const float *rweight, float lloc[3], float rloc[3], float lrot[3][3], float lscale[3][3])
void resolve_quad_uv_v2_deriv(float r_uv[2], float r_deriv[2][2], const float st[2], const float st0[2], const float st1[2], const float st2[2], const float st3[2])
void barycentric_weights_v2_persp(const float v1[4], const float v2[4], const float v3[4], const float co[2], float w[3])
float dist_to_line_v3(const float p[3], const float l1[3], const float l2[3])
Definition math_geom.cc:539
void interp_weights_poly_v2(float w[], float v[][2], int n, const float co[2])
float dist_signed_squared_to_plane_v3(const float p[3], const float plane[4])
Definition math_geom.cc:461
bool isect_line_plane_v3(float r_isect_co[3], const float l1[3], const float l2[3], const float plane_co[3], const float plane_no[3]) ATTR_WARN_UNUSED_RESULT
bool isect_plane_plane_plane_v3(const float plane_a[4], const float plane_b[4], const float plane_c[4], float r_isect_co[3]) ATTR_WARN_UNUSED_RESULT
float dist_squared_to_line_v2(const float p[2], const float l1[2], const float l2[2])
Definition math_geom.cc:276
int isect_seg_seg_v2_int(const int v1[2], const int v2[2], const int v3[2], const int v4[2])
float normal_poly_v3(float n[3], const float verts[][3], unsigned int nr)
Definition math_geom.cc:77
int isect_point_tri_v2(const float pt[2], const float v1[2], const float v2[2], const float v3[2])
bool is_poly_convex_v2(const float verts[][2], unsigned int nr)
int isect_seg_seg_v2_point(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float r_vi[2])
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
Definition math_geom.cc:39
bool isect_ray_tri_epsilon_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2], float epsilon)
bool isect_line_segment_tri_v3(const float p1[3], const float p2[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2])
float area_quad_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
Definition math_geom.cc:83
float area_poly_v2(const float verts[][2], unsigned int nr)
Definition math_geom.cc:180
float dist_signed_squared_to_plane3_v3(const float p[3], const float plane[3])
Definition math_geom.cc:477
float dist_to_line_v2(const float p[2], const float l1[2], const float l2[2])
Definition math_geom.cc:284
void plane_to_point_vector_v3_normalized(const float plane[4], float r_plane_co[3], float r_plane_no[3])
Definition math_geom.cc:227
bool isect_planes_v3_fn(const float planes[][4], int planes_len, float eps_coplanar, float eps_isect, void(*callback_fn)(const float co[3], int i, int j, int k, void *user_data), void *user_data)
void interp_weights_poly_v3(float w[], float v[][3], int n, const float co[3])
MINLINE int max_axis_v3(const float vec[3])
void interp_bilinear_quad_v3(float data[4][3], float u, float v, float res[3])
bool map_to_sphere(float *r_u, float *r_v, float x, float y, float z)
bool map_to_tube(float *r_u, float *r_v, float x, float y, float z)
void planes_from_projmat(const float mat[4][4], float left[4], float right[4], float bottom[4], float top[4], float near[4], float far[4])
bool isect_point_tri_prism_v3(const float p[3], const float v1[3], const float v2[3], const float v3[3])
float volume_tetrahedron_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
Definition math_geom.cc:237
float dist_squared_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2])
Definition math_geom.cc:289
void box_minmax_bounds_m4(float min[3], float max[3], float boundbox[2][3], float mat[4][4])
MINLINE void axis_dominant_v3(int *r_axis_a, int *r_axis_b, const float axis[3])
float dist_signed_squared_to_corner_v3v3v3(const float p[3], const float v1[3], const float v2[3], const float v3[3], const float axis_ref[3])
Definition math_geom.cc:544
#define MINLINE
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
Definition btDbvt.cpp:299
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition btQuadWord.h:117
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
static float verts[][3]
#define min(a, b)
Definition sort.c:32