Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenlib/BLI_math_geom.h')
-rw-r--r--source/blender/blenlib/BLI_math_geom.h124
1 files changed, 85 insertions, 39 deletions
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index b3526b6fc60..45edaca544d 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -95,7 +95,6 @@ float dist_squared_to_line_v2(const float p[2], const float l1[2], const float l
float dist_to_line_v2(const float p[2], const float l1[2], const float l2[2]);
float dist_squared_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]);
float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]);
-void closest_to_line_segment_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2]);
float dist_signed_squared_to_plane_v3(const float p[3], const float plane[4]);
float dist_squared_to_plane_v3(const float p[3], const float plane[4]);
@@ -116,8 +115,9 @@ 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]);
-float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
-float closest_to_line_v2(float r[2], const float p[2], const float l1[2], const float l2[2]);
+float closest_to_line_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2]);
+float closest_to_line_v3(float r_close[3], const float p[3], const float l1[3], const float l2[3]);
+void closest_to_line_segment_v2(float r_close[2], const float p[2], const float l1[2], const float l2[2]);
void closest_to_line_segment_v3(float r_close[3], const float p[3], const float l1[3], const float l2[3]);
void closest_to_plane_normalized_v3(float r_close[3], const float plane[4], const float pt[3]);
void closest_to_plane_v3(float r_close[3], const float plane[4], const float pt[3]);
@@ -127,6 +127,12 @@ void closest_to_plane3_v3(float r_close[3], const float plane[3], const float pt
/* Set 'r' to the point in triangle (t1, t2, t3) closest to point 'p' */
void closest_on_tri_to_point_v3(float r[3], const float p[3], const float t1[3], const float t2[3], const float t3[3]);
+float ray_point_factor_v3_ex(
+ const float p[3], const float ray_origin[3], const float ray_direction[3],
+ const float epsilon, const float fallback);
+float ray_point_factor_v3(
+ const float p[3], const float ray_origin[3], const float ray_direction[3]);
+
float line_point_factor_v3_ex(
const float p[3], const float l1[3], const float l2[3],
const float epsilon, const float fallback);
@@ -154,34 +160,41 @@ void limit_dist_v3(float v1[3], float v2[3], const float dist);
#define ISECT_LINE_LINE_EXACT 1
#define ISECT_LINE_LINE_CROSS 2
-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]);
-int isect_line_line_v2(const float a1[2], const float a2[2], const float b1[2], const float b2[2]);
-int isect_line_line_v2_int(const int a1[2], const int a2[2], const int b1[2], const int b2[2]);
+int isect_seg_seg_v2(const float a1[2], const float a2[2], const float b1[2], const float b2[2]);
+int isect_seg_seg_v2_int(const int a1[2], const int a2[2], const int b1[2], const int b2[2]);
+int isect_seg_seg_v2_point(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float vi[2]);
+bool isect_seg_seg_v2_simple(const float v1[2], const float v2[2], const float v3[2], const float v4[2]);
+
int isect_line_sphere_v3(const float l1[3], const float l2[3], const float sp[3], const float r, 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], const float r, float r_p1[2], float r_p2[2]);
-int isect_seg_seg_v2_point(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float vi[2]);
-bool isect_seg_seg_v2(const float v1[2], const float v2[2], const float v3[2], const float v4[2]);
+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]);
int isect_line_line_epsilon_v3(
const float v1[3], const float v2[3],
- const float v3[3], const float v4[3], float i1[3], float i2[3],
+ const float v3[3], const float v4[3],
+ float i1[3], float i2[3],
const float epsilon);
int isect_line_line_v3(
const float v1[3], const float v2[3],
const float v3[3], const float v4[3],
- float i1[3], float i2[3]);
-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 r_i1[3], float r_i2[3]);
+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);
bool isect_ray_plane_v3(
- const float p1[3], const float d[3],
- const float v0[3], const float v1[3], const float v2[3],
+ const float ray_origin[3], const float ray_direction[3],
+ const float plane[4],
float *r_lambda, const bool clip);
bool isect_point_planes_v3(float (*planes)[4], int totplane, const float p[3]);
-bool isect_line_plane_v3(float out[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_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],
@@ -191,24 +204,28 @@ bool isect_plane_plane_v3(
float r_isect_co[3], float r_isect_no[3]) ATTR_WARN_UNUSED_RESULT;
/* line/ray triangle */
-bool isect_line_tri_v3(
+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]);
-bool isect_line_tri_epsilon_v3(
+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], const float epsilon);
+bool isect_axial_line_segment_tri_v3(
+ const 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);
+
bool isect_ray_tri_v3(
- const float p1[3], const float d[3],
+ 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]);
bool isect_ray_tri_threshold_v3(
- const float p1[3], const float d[3],
+ 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], const float threshold);
bool isect_ray_tri_epsilon_v3(
- const float p1[3], const float d[3],
+ 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], const float epsilon);
bool isect_tri_tri_epsilon_v3(
@@ -227,17 +244,22 @@ struct IsectRayPrecalc {
};
void isect_ray_tri_watertight_v3_precalc(
- struct IsectRayPrecalc *isect_precalc, const float dir[3]);
+ struct IsectRayPrecalc *isect_precalc, const float ray_direction[3]);
bool isect_ray_tri_watertight_v3(
- const float P[3], const struct IsectRayPrecalc *isect_precalc,
+ const float ray_origin[3], const struct IsectRayPrecalc *isect_precalc,
const float v0[3], const float v1[3], const float v2[3],
float *r_dist, float r_uv[2]);
/* slower version which calculates IsectRayPrecalc each time */
bool isect_ray_tri_watertight_v3_simple(
- const float P[3], const float dir[3],
+ 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]);
+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);
+
/* point in polygon */
bool isect_point_poly_v2(const float pt[2], const float verts[][2], const unsigned int nr, const bool use_holes);
bool isect_point_poly_v2_int(const int pt[2], const int verts[][2], const unsigned int nr, const bool use_holes);
@@ -248,36 +270,59 @@ int isect_point_tri_v2(const float pt[2], const float v1[2], const float v2[2],
bool isect_point_tri_v2_cw(const float pt[2], const float v1[2], const float v2[2], const float v3[2]);
int isect_point_tri_v2_int(const int x1, const int y1, const int x2, const int y2, const int a, const int b);
bool isect_point_tri_prism_v3(const float p[3], const float v1[3], const float v2[3], const float v3[3]);
-bool isect_point_tri_v3(const float p[3], const float v1[3], const float v2[3], const float v3[3],
- float r_vi[3]);
+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]);
/* axis-aligned bounding box */
bool isect_aabb_aabb_v3(const float min1[3], const float max1[3], const float min2[3], const float max2[3]);
-typedef struct {
- float ray_start[3];
+struct IsectRayAABB_Precalc {
+ float ray_origin[3];
float ray_inv_dir[3];
int sign[3];
-} IsectRayAABBData;
+};
+
+void isect_ray_aabb_v3_precalc(
+ struct IsectRayAABB_Precalc *data,
+ const float ray_origin[3], const float ray_direction[3]);
+bool isect_ray_aabb_v3(
+ const struct IsectRayAABB_Precalc *data,
+ const float bb_min[3], const float bb_max[3], float *tmin);
-void isect_ray_aabb_initialize(IsectRayAABBData *data, const float ray_start[3], const float ray_direction[3]);
-bool isect_ray_aabb(const IsectRayAABBData *data, const float bb_min[3], const float bb_max[3], float *tmin);
+struct NearestRayToAABB_Precalc {
+ float ray_origin[3];
+ float ray_direction[3];
+ float ray_inv_dir[3];
+ float cdot_axis[3];
+ float idiag_sq[3];
+ bool sign[3];
+};
+
+void dist_squared_ray_to_aabb_v3_precalc(
+ struct NearestRayToAABB_Precalc *data,
+ const float ray_origin[3], const float ray_direction[3]);
+float dist_squared_ray_to_aabb_v3(
+ const struct NearestRayToAABB_Precalc *data,
+ const float bb_min[3], const float bb_max[3],
+ bool r_axis_closest[3]);
/* other */
bool isect_sweeping_sphere_tri_v3(const float p1[3], const float p2[3], const float radius,
const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float ipoint[3]);
-bool isect_axial_line_tri_v3(const int axis, const float co1[3], const float co2[3],
- const float v0[3], const float v1[3], const float v2[3], float *r_lambda);
-
-bool clip_segment_v3_plane(float p1[3], float p2[3], const float plane[4]);
-bool clip_segment_v3_plane_n(float p1[3], float p2[3], float plane_array[][4], const int plane_tot);
+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]);
+bool clip_segment_v3_plane_n(
+ const float p1[3], const float p2[3], const float plane_array[][4], const int plane_tot,
+ float r_p1[3], float r_p2[3]);
void plot_line_v2v2i(const int p1[2], const int p2[2], bool (*callback)(int, int, void *), void *userData);
void fill_poly_v2i_n(
const int xmin, const int ymin, const int xmax, const int ymax,
const int polyXY[][2], const int polyCorners,
- void (*callback)(int, int, void *), void *userData);
+ void (*callback)(int x, int x_end, int y, void *), void *userData);
/****************************** Interpolation ********************************/
/* tri or quad, d can be NULL */
@@ -411,7 +456,8 @@ void axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3]);
MINLINE void axis_dominant_v3(int *r_axis_a, int *r_axis_b, const float axis[3]);
MINLINE float axis_dominant_v3_max(int *r_axis_a, int *r_axis_b, const float axis[3]) ATTR_WARN_UNUSED_RESULT;
-MINLINE int axis_dominant_v3_single(const float vec[3]);
+MINLINE int axis_dominant_v3_single(const float vec[3]);
+MINLINE int axis_dominant_v3_ortho_single(const float vec[3]);
MINLINE int max_axis_v3(const float vec[3]);
MINLINE int min_axis_v3(const float vec[3]);