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:
authorGermano <germano.costa@ig.com.br>2018-05-17 03:36:41 +0300
committerGermano <germano.costa@ig.com.br>2018-05-17 03:36:41 +0300
commit4b18858660f4e7068e8345315fa04b3215c85548 (patch)
tree7d2e830f761795820b6aa8b2ea2074be91aa1541 /source/blender/blenlib
parentd038f4651e962edddaef057dc5356ac55f87c213 (diff)
BLI_math_geom: Separate the `isect_ray_seg_v3` from `dist_squared_ray_to_seg_v3`.
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r--source/blender/blenlib/BLI_math_geom.h5
-rw-r--r--source/blender/blenlib/intern/math_geom.c82
2 files changed, 57 insertions, 30 deletions
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index 111450b6402..f12ee2b3c69 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -315,6 +315,11 @@ bool isect_ray_seg_v2(
const float v0[2], const float v1[2],
float *r_lambda, float *r_u);
+bool isect_ray_seg_v3(
+ const float ray_origin[3], const float ray_direction[3],
+ const float v0[3], const float v1[3],
+ float *r_lambda);
+
/* 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);
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index 0e7358aa426..a72cbb67883 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -570,6 +570,8 @@ float dist_squared_to_ray_v3(
*r_depth = dot_v3v3(dvec, ray_direction);
return len_squared_v3(dvec) - SQUARE(*r_depth);
}
+
+
/**
* Find the closest point in a seg to a ray and return the distance squared.
* \param r_point: Is the point on segment closest to ray (or to ray_origin if the ray and the segment are parallel).
@@ -580,45 +582,38 @@ float dist_squared_ray_to_seg_v3(
const float v0[3], const float v1[3],
float r_point[3], float *r_depth)
{
- float a[3], t[3], n[3], lambda;
- sub_v3_v3v3(a, v1, v0);
- sub_v3_v3v3(t, v0, ray_origin);
- cross_v3_v3v3(n, a, ray_direction);
- const float nlen = len_squared_v3(n);
-
- /* if (nlen == 0.0f) the lines are parallel,
- * has no nearest point, only distance squared.*/
- if (nlen == 0.0f) {
- /* Calculate the distance to the point v0 then */
- copy_v3_v3(r_point, v0);
- *r_depth = dot_v3v3(t, ray_direction);
- }
- else {
- float c[3], cray[3];
- sub_v3_v3v3(c, n, t);
- cross_v3_v3v3(cray, c, ray_direction);
- lambda = dot_v3v3(cray, n) / nlen;
- if (lambda <= 0) {
+ float lambda, depth;
+ if (isect_ray_seg_v3(
+ ray_origin, ray_direction, v0, v1, &lambda))
+ {
+ if (lambda <= 0.0f) {
copy_v3_v3(r_point, v0);
-
- *r_depth = dot_v3v3(t, ray_direction);
}
- else if (lambda >= 1) {
+ else if (lambda >= 1.0f) {
copy_v3_v3(r_point, v1);
-
- sub_v3_v3v3(t, v1, ray_origin);
- *r_depth = dot_v3v3(t, ray_direction);
}
else {
- madd_v3_v3v3fl(r_point, v0, a, lambda);
-
- sub_v3_v3v3(t, r_point, ray_origin);
- *r_depth = dot_v3v3(t, ray_direction);
+ interp_v3_v3v3(r_point, v0, v1, lambda);
}
}
- return len_squared_v3(t) - SQUARE(*r_depth);
+ else {
+ /* has no nearest point, only distance squared. */
+ /* Calculate the distance to the point v0 then */
+ copy_v3_v3(r_point, v0);
+ }
+
+ float dvec[3];
+ sub_v3_v3v3(dvec, r_point, ray_origin);
+ depth = dot_v3v3(dvec, ray_direction);
+
+ if (r_depth) {
+ *r_depth = depth;
+ }
+
+ return len_squared_v3(dvec) - SQUARE(depth);
}
+
/* Returns the coordinates of the nearest vertex and
* the farthest vertex from a plane (or normal). */
void aabb_get_near_far_from_plane(
@@ -1986,6 +1981,33 @@ bool isect_ray_seg_v2(
return false;
}
+
+bool isect_ray_seg_v3(
+ const float ray_origin[3], const float ray_direction[3],
+ const float v0[3], const float v1[3],
+ float *r_lambda)
+{
+ float a[3], t[3], n[3];
+ sub_v3_v3v3(a, v1, v0);
+ sub_v3_v3v3(t, v0, ray_origin);
+ cross_v3_v3v3(n, a, ray_direction);
+ const float nlen = len_squared_v3(n);
+
+ if (nlen == 0.0f) {
+ /* the lines are parallel.*/
+ return false;
+ }
+
+ float c[3], cray[3];
+ sub_v3_v3v3(c, n, t);
+ cross_v3_v3v3(cray, c, ray_direction);
+
+ *r_lambda = dot_v3v3(cray, n) / nlen;
+
+ return true;
+}
+
+
/**
* Check if a point is behind all planes.
*/