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
This commit is contained in:
Pablo Dobarro 2020-05-13 02:47:46 +02:00
parent 50ef801a79
commit bf0a554114
Notes: blender-bot 2023-02-14 06:17:17 +01:00
Referenced by issue #75968, Sculpt Mode active vertex precision issues
1 changed files with 10 additions and 3 deletions

View File

@ -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 +