diff --git a/source/blender/blenkernel/BKE_pbvh_api.hh b/source/blender/blenkernel/BKE_pbvh_api.hh index c63f8b6f06d..331f1e02899 100644 --- a/source/blender/blenkernel/BKE_pbvh_api.hh +++ b/source/blender/blenkernel/BKE_pbvh_api.hh @@ -324,10 +324,10 @@ bool raycast_node(Tree &pbvh, const float3 &ray_start, const float3 &ray_normal, IsectRayPrecalc *isect_precalc, - float *depth, - PBVHVertRef *active_vertex, - int *active_face_grid_index, - float *face_normal); + float *r_depth, + PBVHVertRef *r_active_vertex, + int &r_active_face_grid_index, + float3 &r_face_normal); bool bmesh_node_raycast_detail(BMeshNode &node, const float3 &ray_start, diff --git a/source/blender/blenkernel/intern/pbvh.cc b/source/blender/blenkernel/intern/pbvh.cc index 322bf6cee88..468bb07eb4b 100644 --- a/source/blender/blenkernel/intern/pbvh.cc +++ b/source/blender/blenkernel/intern/pbvh.cc @@ -1649,21 +1649,21 @@ void raycast(Tree &pbvh, } bool ray_face_intersection_quad(const float3 &ray_start, - IsectRayPrecalc *isect_precalc, + const IsectRayPrecalc *isect_precalc, const float3 &t0, const float3 &t1, const float3 &t2, const float3 &t3, - float *depth) + float *r_depth) { float depth_test; if ((isect_ray_tri_watertight_v3(ray_start, isect_precalc, t0, t1, t2, &depth_test, nullptr) && - (depth_test < *depth)) || + (depth_test < *r_depth)) || (isect_ray_tri_watertight_v3(ray_start, isect_precalc, t0, t2, t3, &depth_test, nullptr) && - (depth_test < *depth))) + (depth_test < *r_depth))) { - *depth = depth_test; + *r_depth = depth_test; return true; } @@ -1671,17 +1671,17 @@ bool ray_face_intersection_quad(const float3 &ray_start, } bool ray_face_intersection_tri(const float3 &ray_start, - IsectRayPrecalc *isect_precalc, + const IsectRayPrecalc *isect_precalc, const float3 &t0, const float3 &t1, const float3 &t2, - float *depth) + float *r_depth) { float depth_test; if (isect_ray_tri_watertight_v3(ray_start, isect_precalc, t0, t1, t2, &depth_test, nullptr) && - (depth_test < *depth)) + (depth_test < *r_depth)) { - *depth = depth_test; + *r_depth = depth_test; return true; } @@ -1774,30 +1774,27 @@ static void calc_mesh_intersect_data(const Span corner_verts, const int face_index, const int tri_index, const std::array co, - float *depth, + const float *depth, PBVHVertRef *r_active_vertex, - int *r_active_face_index, - float *r_face_normal) + int &r_active_face_index, + float3 &r_face_normal) { - float nearest_vertex_co[3] = {0.0f}; - - if (r_face_normal) { - normal_tri_v3(r_face_normal, co[0], co[1], co[2]); - } + float3 nearest_vertex_co(0.0f); + normal_tri_v3(r_face_normal, co[0], co[1], co[2]); if (r_active_vertex) { const float3 location = ray_start + ray_normal * *depth; - for (int j = 0; j < 3; j++) { + for (int i = 0; i < co.size(); i++) { /* 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)) + if (i == 0 || + len_squared_v3v3(location, co[i]) < len_squared_v3v3(location, nearest_vertex_co)) { - copy_v3_v3(nearest_vertex_co, co[j]); - r_active_vertex->i = corner_verts[corner_tris[tri_index][j]]; - *r_active_face_index = face_index; + nearest_vertex_co = co[i]; + r_active_vertex->i = corner_verts[corner_tris[tri_index][i]]; + r_active_face_index = face_index; } } } @@ -1813,10 +1810,10 @@ static bool pbvh_faces_node_raycast(const MeshNode &node, const float3 &ray_start, const float3 &ray_normal, IsectRayPrecalc *isect_precalc, - float *depth, + float *r_depth, PBVHVertRef *r_active_vertex, - int *r_active_face_index, - float *r_face_normal) + int &r_active_face_index, + float3 &r_face_normal) { const Span face_indices = node.faces(); @@ -1833,7 +1830,7 @@ static bool pbvh_faces_node_raycast(const MeshNode &node, const std::array co{{vert_positions[corner_verts[tri[0]]], vert_positions[corner_verts[tri[1]]], vert_positions[corner_verts[tri[2]]]}}; - if (ray_face_intersection_tri(ray_start, isect_precalc, co[0], co[1], co[2], depth)) { + if (ray_face_intersection_tri(ray_start, isect_precalc, co[0], co[1], co[2], r_depth)) { hit = true; calc_mesh_intersect_data(corner_verts, corner_tris, @@ -1842,7 +1839,7 @@ static bool pbvh_faces_node_raycast(const MeshNode &node, face_i, tri_i, co, - depth, + r_depth, r_active_vertex, r_active_face_index, r_face_normal); @@ -1864,7 +1861,7 @@ static bool pbvh_faces_node_raycast(const MeshNode &node, {node_positions[vert_map.index_of(corner_verts[tri[0]])], node_positions[vert_map.index_of(corner_verts[tri[1]])], node_positions[vert_map.index_of(corner_verts[tri[2]])]}}; - if (ray_face_intersection_tri(ray_start, isect_precalc, co[0], co[1], co[2], depth)) { + if (ray_face_intersection_tri(ray_start, isect_precalc, co[0], co[1], co[2], r_depth)) { hit = true; calc_mesh_intersect_data(corner_verts, corner_tris, @@ -1873,7 +1870,7 @@ static bool pbvh_faces_node_raycast(const MeshNode &node, face_i, tri_i, co, - depth, + r_depth, r_active_vertex, r_active_face_index, r_face_normal); @@ -1892,38 +1889,36 @@ static void calc_grids_intersect_data(const CCGKey &key, const short x, const short y, const std::array co, - float *depth, + float *r_depth, PBVHVertRef *r_active_vertex, - int *r_active_grid_index, - float *r_face_normal) + int &r_active_grid_index, + float3 &r_face_normal) { float3 nearest_vertex_co; - if (r_face_normal) { - normal_quad_v3(r_face_normal, co[0], co[1], co[2], co[3]); - } + normal_quad_v3(r_face_normal, co[0], co[1], co[2], co[3]); if (r_active_vertex) { - const float3 location = ray_start + ray_normal * *depth; + const float3 location = ray_start + ray_normal * *r_depth; const int x_it[4] = {0, 1, 1, 0}; const int y_it[4] = {1, 1, 0, 0}; - for (int j = 0; j < 4; j++) { + for (int i = 0; i < co.size(); i++) { /* 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)) + if (i == 0 || + len_squared_v3v3(location, co[i]) < len_squared_v3v3(location, nearest_vertex_co)) { - copy_v3_v3(nearest_vertex_co, co[j]); + copy_v3_v3(nearest_vertex_co, co[i]); - r_active_vertex->i = key.grid_area * grid + (y + y_it[j]) * key.grid_size + (x + x_it[j]); + r_active_vertex->i = key.grid_area * grid + (y + y_it[i]) * key.grid_size + (x + x_it[i]); } } } if (r_active_grid_index) { - *r_active_grid_index = grid; + r_active_grid_index = grid; } } @@ -1932,11 +1927,11 @@ static bool pbvh_grids_node_raycast(const SubdivCCG &subdiv_ccg, const Span node_positions, const float3 &ray_start, const float3 &ray_normal, - IsectRayPrecalc *isect_precalc, - float *depth, + const IsectRayPrecalc *isect_precalc, + float *r_depth, PBVHVertRef *r_active_vertex, - int *r_active_grid_index, - float *r_face_normal) + int &r_active_grid_index, + float3 &r_face_normal) { const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg); const Span grids = node.grids(); @@ -1961,7 +1956,7 @@ static bool pbvh_grids_node_raycast(const SubdivCCG &subdiv_ccg, grid_positions[CCG_grid_xy_to_index(grid_size, x + 1, y)], grid_positions[CCG_grid_xy_to_index(grid_size, x, y)]}}; if (ray_face_intersection_quad( - ray_start, isect_precalc, co[0], co[1], co[2], co[3], depth)) + ray_start, isect_precalc, co[0], co[1], co[2], co[3], r_depth)) { hit = true; calc_grids_intersect_data(key, @@ -1971,7 +1966,7 @@ static bool pbvh_grids_node_raycast(const SubdivCCG &subdiv_ccg, x, y, co, - depth, + r_depth, r_active_vertex, r_active_grid_index, r_face_normal); @@ -1996,7 +1991,7 @@ static bool pbvh_grids_node_raycast(const SubdivCCG &subdiv_ccg, grid_positions[y * grid_size + x + 1], grid_positions[y * grid_size + x]}; if (ray_face_intersection_quad( - ray_start, isect_precalc, co[0], co[1], co[2], co[3], depth)) + ray_start, isect_precalc, co[0], co[1], co[2], co[3], r_depth)) { hit = true; calc_grids_intersect_data(key, @@ -2006,7 +2001,7 @@ static bool pbvh_grids_node_raycast(const SubdivCCG &subdiv_ccg, x, y, co, - depth, + r_depth, r_active_vertex, r_active_grid_index, r_face_normal); @@ -2032,10 +2027,10 @@ bool raycast_node(Tree &pbvh, const float3 &ray_start, const float3 &ray_normal, IsectRayPrecalc *isect_precalc, - float *depth, - PBVHVertRef *active_vertex, - int *active_face_grid_index, - float *face_normal) + float *r_depth, + PBVHVertRef *r_active_vertex, + int &r_active_face_grid_index, + float3 &r_face_normal) { if (node.flag_ & PBVH_FullyHidden) { return false; @@ -2052,10 +2047,10 @@ bool raycast_node(Tree &pbvh, ray_start, ray_normal, isect_precalc, - depth, - active_vertex, - active_face_grid_index, - face_normal); + r_depth, + r_active_vertex, + r_active_face_grid_index, + r_face_normal); case Type::Grids: return pbvh_grids_node_raycast(*subdiv_ccg, static_cast(node), @@ -2063,19 +2058,19 @@ bool raycast_node(Tree &pbvh, ray_start, ray_normal, isect_precalc, - depth, - active_vertex, - active_face_grid_index, - face_normal); + r_depth, + r_active_vertex, + r_active_face_grid_index, + r_face_normal); case Type::BMesh: return bmesh_node_raycast(static_cast(node), ray_start, ray_normal, isect_precalc, - depth, + r_depth, use_origco, - active_vertex, - face_normal); + r_active_vertex, + r_face_normal); } BLI_assert_unreachable(); return false; diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.cc b/source/blender/blenkernel/intern/pbvh_bmesh.cc index 32f146545e5..eeb2bcb89ab 100644 --- a/source/blender/blenkernel/intern/pbvh_bmesh.cc +++ b/source/blender/blenkernel/intern/pbvh_bmesh.cc @@ -1856,25 +1856,25 @@ bool bmesh_node_raycast(BMeshNode &node, const float3 &ray_start, const float3 &ray_normal, IsectRayPrecalc *isect_precalc, - float *depth, + float *r_depth, bool use_original, PBVHVertRef *r_active_vertex, float *r_face_normal) { bool hit = false; - float nearest_vertex_co[3] = {0.0f}; + float3 nearest_vertex_co(0.0f); use_original = use_original && !node.orig_tris_.is_empty(); if (use_original) { - for (const int i : node.orig_tris_.index_range()) { + for (const int tri_idx : node.orig_tris_.index_range()) { float *cos[3]; - cos[0] = node.orig_positions_[node.orig_tris_[i][0]]; - cos[1] = node.orig_positions_[node.orig_tris_[i][1]]; - cos[2] = node.orig_positions_[node.orig_tris_[i][2]]; + cos[0] = node.orig_positions_[node.orig_tris_[tri_idx][0]]; + cos[1] = node.orig_positions_[node.orig_tris_[tri_idx][1]]; + cos[2] = node.orig_positions_[node.orig_tris_[tri_idx][2]]; - if (ray_face_intersection_tri(ray_start, isect_precalc, cos[0], cos[1], cos[2], depth)) { + if (ray_face_intersection_tri(ray_start, isect_precalc, cos[0], cos[1], cos[2], r_depth)) { hit = true; if (r_face_normal) { @@ -1882,14 +1882,14 @@ bool bmesh_node_raycast(BMeshNode &node, } if (r_active_vertex) { - float location[3] = {0.0f}; - madd_v3_v3v3fl(location, ray_start, ray_normal, *depth); - for (const int j : IndexRange(3)) { - if (j == 0 || - len_squared_v3v3(location, cos[j]) < len_squared_v3v3(location, nearest_vertex_co)) + float3 location(0.0f); + madd_v3_v3v3fl(location, ray_start, ray_normal, *r_depth); + for (const int i : IndexRange(3)) { + if (i == 0 || + len_squared_v3v3(location, cos[i]) < len_squared_v3v3(location, nearest_vertex_co)) { - copy_v3_v3(nearest_vertex_co, cos[j]); - r_active_vertex->i = intptr_t(node.orig_verts_[node.orig_tris_[i][j]]); + copy_v3_v3(nearest_vertex_co, cos[i]); + r_active_vertex->i = intptr_t(node.orig_verts_[node.orig_tris_[tri_idx][i]]); } } } @@ -1905,7 +1905,7 @@ bool bmesh_node_raycast(BMeshNode &node, BM_face_as_array_vert_tri(f, v_tri); if (ray_face_intersection_tri( - ray_start, isect_precalc, v_tri[0]->co, v_tri[1]->co, v_tri[2]->co, depth)) + ray_start, isect_precalc, v_tri[0]->co, v_tri[1]->co, v_tri[2]->co, r_depth)) { hit = true; @@ -1914,14 +1914,14 @@ bool bmesh_node_raycast(BMeshNode &node, } if (r_active_vertex) { - float location[3] = {0.0f}; - madd_v3_v3v3fl(location, ray_start, ray_normal, *depth); - for (const int j : IndexRange(3)) { - if (j == 0 || len_squared_v3v3(location, v_tri[j]->co) < + float3 location(0.0f); + madd_v3_v3v3fl(location, ray_start, ray_normal, *r_depth); + for (const int i : IndexRange(3)) { + if (i == 0 || len_squared_v3v3(location, v_tri[i]->co) < len_squared_v3v3(location, nearest_vertex_co)) { - copy_v3_v3(nearest_vertex_co, v_tri[j]->co); - r_active_vertex->i = intptr_t(v_tri[j]); + copy_v3_v3(nearest_vertex_co, v_tri[i]->co); + r_active_vertex->i = intptr_t(v_tri[i]); } } } diff --git a/source/blender/blenkernel/intern/pbvh_intern.hh b/source/blender/blenkernel/intern/pbvh_intern.hh index 5ea844d1d91..eead9dd3c90 100644 --- a/source/blender/blenkernel/intern/pbvh_intern.hh +++ b/source/blender/blenkernel/intern/pbvh_intern.hh @@ -15,18 +15,18 @@ namespace blender::bke::pbvh { bool ray_face_intersection_quad(const float3 &ray_start, - IsectRayPrecalc *isect_precalc, + const IsectRayPrecalc *isect_precalc, const float3 &t0, const float3 &t1, const float3 &t2, const float3 &t3, - float *depth); + float *r_depth); bool ray_face_intersection_tri(const float3 &ray_start, - IsectRayPrecalc *isect_precalc, + const IsectRayPrecalc *isect_precalc, const float3 &t0, const float3 &t1, const float3 &t2, - float *depth); + float *r_depth); bool ray_face_nearest_quad(const float3 &ray_start, const float3 &ray_normal, @@ -50,7 +50,7 @@ bool bmesh_node_raycast(blender::bke::pbvh::BMeshNode &node, const float3 &ray_start, const float3 &ray_normal, IsectRayPrecalc *isect_precalc, - float *dist, + float *r_depth, bool use_original, PBVHVertRef *r_active_vertex, float *r_face_normal); diff --git a/source/blender/editors/sculpt_paint/sculpt.cc b/source/blender/editors/sculpt_paint/sculpt.cc index 6bdf5dcfd80..c9cfeac4912 100644 --- a/source/blender/editors/sculpt_paint/sculpt.cc +++ b/source/blender/editors/sculpt_paint/sculpt.cc @@ -2634,7 +2634,7 @@ struct SculptRaycastData { const SubdivCCG *subdiv_ccg; PBVHVertRef active_vertex; - float *face_normal; + float3 face_normal; int active_face_grid_index; @@ -4447,7 +4447,7 @@ static void sculpt_raycast_cb(blender::bke::pbvh::Node &node, SculptRaycastData &srd.isect_precalc, &srd.depth, &srd.active_vertex, - &srd.active_face_grid_index, + srd.active_face_grid_index, srd.face_normal)) { srd.hit = true;