Cleanup: Move mesh looptri real edges function
This commit is contained in:
parent
aca27e5462
commit
19b9b8d431
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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])) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue