diff options
author | Pablo Dobarro <pablodp606@gmail.com> | 2020-05-13 03:47:46 +0300 |
---|---|---|
committer | Pablo Dobarro <pablodp606@gmail.com> | 2020-05-13 03:49:38 +0300 |
commit | bf0a55411491329aa2ee893c111e66feeab8793b (patch) | |
tree | 347d4fb92527290fa4df222de34518a7a80ca701 /source/blender | |
parent | 50ef801a79b5c280ecd02f89e9a9b4533e4102c4 (diff) |
Fix T75968: PBVH raycast returns wrong active vertex
nearest_vertex_co was not reset when a new triangle was intersected by
the ray, so it was always returning the closest vertex to the real
cursor position in any triangle, which was not always the triangle under
the cursor.
Reviewed By: sergey
Maniphest Tasks: T75968
Differential Revision: https://developer.blender.org/D7485
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/pbvh.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c index e6d672ad9d9..5756cb8c706 100644 --- a/source/blender/blenkernel/intern/pbvh.c +++ b/source/blender/blenkernel/intern/pbvh.c @@ -2155,7 +2155,11 @@ static bool pbvh_faces_node_raycast(PBVH *bvh, float location[3] = {0.0f}; madd_v3_v3v3fl(location, ray_start, ray_normal, *depth); for (int j = 0; j < 3; j++) { - if (len_squared_v3v3(location, co[j]) < len_squared_v3v3(location, nearest_vertex_co)) { + /* Always assign nearest_vertex_co in the first iteration to avoid comparison against + * uninitialized values. This stores the closest vertex in the current intersecting + * triangle. */ + if (j == 0 || + len_squared_v3v3(location, co[j]) < len_squared_v3v3(location, nearest_vertex_co)) { copy_v3_v3(nearest_vertex_co, co[j]); *r_active_vertex_index = mloop[lt->tri[j]].v; *r_active_face_index = lt->poly; @@ -2235,8 +2239,11 @@ static bool pbvh_grids_node_raycast(PBVH *bvh, const int y_it[4] = {0, 0, 1, 1}; for (int j = 0; j < 4; j++) { - if (len_squared_v3v3(location, co[j]) < - len_squared_v3v3(location, nearest_vertex_co)) { + /* Always assign nearest_vertex_co in the first iteration to avoid comparison against + * uninitialized values. This stores the closest vertex in the current intersecting + * quad. */ + if (j == 0 || len_squared_v3v3(location, co[j]) < + len_squared_v3v3(location, nearest_vertex_co)) { copy_v3_v3(nearest_vertex_co, co[j]); *r_active_vertex_index = gridkey->grid_area * grid_index + |