diff options
Diffstat (limited to 'source/blender/blenlib/BLI_math_geom.h')
-rw-r--r-- | source/blender/blenlib/BLI_math_geom.h | 124 |
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]); |