Cleanup: Move mesh looptri real edges function

This commit is contained in:
Hans Goudey 2023-11-28 16:49:55 -05:00
parent aca27e5462
commit 19b9b8d431
8 changed files with 46 additions and 62 deletions

View File

@ -115,19 +115,6 @@ void BKE_mesh_ensure_default_orig_index_customdata(struct Mesh *mesh);
*/
void BKE_mesh_ensure_default_orig_index_customdata_no_check(struct Mesh *mesh);
#ifdef __cplusplus
/**
* Sets each output array element to the edge index if it is a real edge, or -1.
*/
void BKE_mesh_looptri_get_real_edges(const blender::int2 *edges,
const int *corner_verts,
const int *corner_edges,
const struct MLoopTri *tri,
int r_edges[3]);
#endif
/**
* Free (or release) any data used by this mesh (does not free the mesh itself).
* Only use for undo, in most cases `BKE_id_free(nullptr, me)` should be used.

View File

@ -44,6 +44,12 @@ void looptris_calc_with_normals(Span<float3> vert_positions,
void looptris_calc_face_indices(OffsetIndices<int> faces, MutableSpan<int> looptri_faces);
/** Return the triangle's three edge indices they are real edges, otherwise -1. */
int3 looptri_get_real_edges(Span<int2> edges,
Span<int> corner_verts,
Span<int> corner_edges,
const MLoopTri &tri);
/** Calculate the average position of the vertices in the face. */
float3 face_center_calc(Span<float3> vert_positions, Span<int> face_verts);

View File

@ -1078,27 +1078,6 @@ void BKE_mesh_sharp_edges_set_from_angle(Mesh *me, const float angle)
sharp_edges.finish();
}
void BKE_mesh_looptri_get_real_edges(const blender::int2 *edges,
const int *corner_verts,
const int *corner_edges,
const MLoopTri *tri,
int r_edges[3])
{
for (int i = 2, i_next = 0; i_next < 3; i = i_next++) {
const int corner_1 = tri->tri[i];
const int corner_2 = tri->tri[i_next];
const int vert_1 = corner_verts[corner_1];
const int vert_2 = corner_verts[corner_2];
const int edge_i = corner_edges[corner_1];
const blender::int2 &edge = edges[edge_i];
bool is_real = (vert_1 == edge[0] && vert_2 == edge[1]) ||
(vert_1 == edge[1] && vert_2 == edge[0]);
r_edges[i] = is_real ? edge_i : -1;
}
}
std::optional<blender::Bounds<blender::float3>> Mesh::bounds_min_max() const
{
using namespace blender;

View File

@ -324,4 +324,26 @@ void looptris_calc_with_normals(const Span<float3> vert_positions,
/** \} */
int3 looptri_get_real_edges(const Span<int2> edges,
const Span<int> corner_verts,
const Span<int> corner_edges,
const MLoopTri &tri)
{
int3 real_edges;
for (int i = 2, i_next = 0; i_next < 3; i = i_next++) {
const int corner_1 = int(tri.tri[i]);
const int corner_2 = int(tri.tri[i_next]);
const int vert_1 = corner_verts[corner_1];
const int vert_2 = corner_verts[corner_2];
const int edge_i = corner_edges[corner_1];
const int2 edge = edges[edge_i];
const bool is_real = (vert_1 == edge[0] && vert_2 == edge[1]) ||
(vert_1 == edge[1] && vert_2 == edge[0]);
real_edges[i] = is_real ? edge_i : -1;
}
return real_edges;
}
} // namespace blender::bke::mesh

View File

@ -246,9 +246,8 @@ static ShrinkwrapBoundaryData *shrinkwrap_build_boundary_data(Mesh *mesh)
"ShrinkwrapBoundaryData::looptri_is_boundary");
for (const int64_t i : looptris.index_range()) {
int real_edges[3];
BKE_mesh_looptri_get_real_edges(
edges.data(), corner_verts.data(), corner_edges.data(), &looptris[i], real_edges);
const int3 real_edges = bke::mesh::looptri_get_real_edges(
edges, corner_verts, corner_edges, looptris[i]);
for (int j = 0; j < 3; j++) {
if (real_edges[j] >= 0 && edge_mode[real_edges[j]]) {
@ -1063,10 +1062,8 @@ static void mesh_looptri_target_project(void *userdata,
/* Boundary edges */
else if (tree->boundary && BLI_BITMAP_TEST(tree->boundary->looptri_has_boundary, index)) {
const BLI_bitmap *is_boundary = tree->boundary->edge_is_boundary;
int edges[3];
BKE_mesh_looptri_get_real_edges(
data->edges.data(), data->corner_verts.data(), tree->corner_edges.data(), lt, edges);
const int3 edges = bke::mesh::looptri_get_real_edges(
data->edges, data->corner_verts, tree->corner_edges, *lt);
for (int i = 0; i < 3; i++) {
if (edges[i] >= 0 && BLI_BITMAP_TEST(is_boundary, edges[i])) {

View File

@ -1058,6 +1058,7 @@ struct PBVHBatches {
void create_index_faces(const PBVH_GPU_Args &args)
{
using namespace blender;
const int *mat_index = static_cast<const int *>(
CustomData_get_layer_named(args.face_data, CD_PROP_INT32, "material_index"));
@ -1077,18 +1078,16 @@ struct PBVHBatches {
continue;
}
const MLoopTri *lt = &args.mlooptri[looptri_i];
int r_edges[3];
BKE_mesh_looptri_get_real_edges(
edges.data(), args.corner_verts.data(), args.corner_edges.data(), lt, r_edges);
const blender::int3 real_edges = bke::mesh::looptri_get_real_edges(
edges, args.corner_verts, args.corner_edges, args.mlooptri[looptri_i]);
if (r_edges[0] != -1) {
if (real_edges[0] != -1) {
edge_count++;
}
if (r_edges[1] != -1) {
if (real_edges[1] != -1) {
edge_count++;
}
if (r_edges[2] != -1) {
if (real_edges[2] != -1) {
edge_count++;
}
}
@ -1103,18 +1102,16 @@ struct PBVHBatches {
continue;
}
const MLoopTri *lt = &args.mlooptri[looptri_i];
int r_edges[3];
BKE_mesh_looptri_get_real_edges(
edges.data(), args.corner_verts.data(), args.corner_edges.data(), lt, r_edges);
const blender::int3 real_edges = bke::mesh::looptri_get_real_edges(
edges, args.corner_verts, args.corner_edges, args.mlooptri[looptri_i]);
if (r_edges[0] != -1) {
if (real_edges[0] != -1) {
GPU_indexbuf_add_line_verts(&elb_lines, vertex_i, vertex_i + 1);
}
if (r_edges[1] != -1) {
if (real_edges[1] != -1) {
GPU_indexbuf_add_line_verts(&elb_lines, vertex_i + 1, vertex_i + 2);
}
if (r_edges[2] != -1) {
if (real_edges[2] != -1) {
GPU_indexbuf_add_line_verts(&elb_lines, vertex_i + 2, vertex_i);
}

View File

@ -1681,12 +1681,8 @@ static void lineart_identify_mlooptri_feature_edges(void *__restrict userdata,
}
}
int real_edges[3];
BKE_mesh_looptri_get_real_edges(e_feat_data->edges.data(),
e_feat_data->corner_verts.data(),
e_feat_data->corner_edges.data(),
&looptris[i / 3],
real_edges);
const blender::int3 real_edges = blender::bke::mesh::looptri_get_real_edges(
e_feat_data->edges, e_feat_data->corner_verts, e_feat_data->corner_edges, looptris[i / 3]);
if (real_edges[i % 3] >= 0) {
if (ld->conf.use_crease && ld->conf.sharp_as_crease &&

View File

@ -124,7 +124,7 @@ enum {
* }
* \endcode
*
* See #BKE_mesh_looptri_get_real_edges for a utility that does this.
* See #bke::mesh::looptri_get_real_edges for a utility that does this.
*
* \note A #MLoopTri may be in the middle of an ngon and not reference **any** edges.
*/