Cleanup: replace the struct 'Ref' from knife code with 'LinkData'

This commit is contained in:
Germano Cavalcante
2024-02-19 20:39:32 -03:00
parent 27e01c10dd
commit 714683b83e

View File

@@ -120,11 +120,6 @@ struct KnifeVert {
bool is_splitting; /* Created when an edge was split. */
};
struct Ref {
Ref *next, *prev;
void *ref;
};
struct KnifeEdge {
KnifeVert *v1, *v2;
BMFace *basef; /* Face to restrict face fill to. */
@@ -703,9 +698,9 @@ static void knifetool_draw_visible_angles(const KnifeTool_OpData *kcd)
float angle = 0.0f;
float *end;
kfe = static_cast<KnifeEdge *>(((Ref *)kfv->edges.first)->ref);
LISTBASE_FOREACH (Ref *, ref, &kfv->edges) {
tempkfe = static_cast<KnifeEdge *>(ref->ref);
kfe = static_cast<KnifeEdge *>(((LinkData *)kfv->edges.first)->data);
LISTBASE_FOREACH (LinkData *, ref, &kfv->edges) {
tempkfe = static_cast<KnifeEdge *>(ref->data);
if (tempkfe->v1 != kfv) {
tempkfv = tempkfe->v1;
}
@@ -786,9 +781,9 @@ static void knifetool_draw_visible_angles(const KnifeTool_OpData *kcd)
}
else {
/* Choose minimum angle edge. */
kfe = static_cast<KnifeEdge *>(((Ref *)kfv->edges.first)->ref);
LISTBASE_FOREACH (Ref *, ref, &kfv->edges) {
tempkfe = static_cast<KnifeEdge *>(ref->ref);
kfe = static_cast<KnifeEdge *>(((LinkData *)kfv->edges.first)->data);
LISTBASE_FOREACH (LinkData *, ref, &kfv->edges) {
tempkfe = static_cast<KnifeEdge *>(ref->data);
if (tempkfe->v1 != kfv) {
tempkfv = tempkfe->v1;
}
@@ -1546,8 +1541,8 @@ static BMElem *bm_elem_from_knife_vert(KnifeVert *kfv, KnifeEdge **r_kfe)
if (r_kfe || ele_test == nullptr) {
if (kfv->v == nullptr) {
LISTBASE_FOREACH (Ref *, ref, &kfv->edges) {
kfe = static_cast<KnifeEdge *>(ref->ref);
LISTBASE_FOREACH (LinkData *, ref, &kfv->edges) {
kfe = static_cast<KnifeEdge *>(ref->data);
if (kfe->e) {
if (r_kfe) {
*r_kfe = kfe;
@@ -1568,7 +1563,7 @@ static BMElem *bm_elem_from_knife_vert(KnifeVert *kfv, KnifeEdge **r_kfe)
/* face? */
if (ele_test == nullptr) {
if (BLI_listbase_is_single(&kfe->faces)) {
ele_test = static_cast<BMElem *>(((Ref *)kfe->faces.first)->ref);
ele_test = static_cast<BMElem *>(((LinkData *)kfe->faces.first)->data);
}
}
@@ -1605,17 +1600,17 @@ static ListBase *knife_empty_list(KnifeTool_OpData *kcd)
static void knife_append_list(KnifeTool_OpData *kcd, ListBase *lst, void *elem)
{
Ref *ref;
LinkData *ref;
ref = static_cast<Ref *>(BLI_mempool_calloc(kcd->refs));
ref->ref = elem;
ref = static_cast<LinkData *>(BLI_mempool_calloc(kcd->refs));
ref->data = elem;
BLI_addtail(lst, ref);
}
static Ref *find_ref(ListBase *lb, void *ref)
static LinkData *find_ref(ListBase *lb, void *ref)
{
LISTBASE_FOREACH (Ref *, ref1, lb) {
if (ref1->ref == ref) {
LISTBASE_FOREACH (LinkData *, ref1, lb) {
if (ref1->data == ref) {
return ref1;
}
}
@@ -1651,10 +1646,10 @@ static void knife_add_edge_faces_to_vert(KnifeTool_OpData *kcd, KnifeVert *kfv,
* If more than one, return the first; if none, return nullptr. */
static BMFace *knife_find_common_face(ListBase *faces1, ListBase *faces2)
{
LISTBASE_FOREACH (Ref *, ref1, faces1) {
LISTBASE_FOREACH (Ref *, ref2, faces2) {
if (ref1->ref == ref2->ref) {
return (BMFace *)(ref1->ref);
LISTBASE_FOREACH (LinkData *, ref1, faces1) {
LISTBASE_FOREACH (LinkData *, ref2, faces2) {
if (ref1->data == ref2->data) {
return (BMFace *)(ref1->data);
}
}
}
@@ -1778,7 +1773,7 @@ static KnifeVert *knife_split_edge(KnifeTool_OpData *kcd,
KnifeEdge **r_kfe)
{
KnifeEdge *newkfe = new_knife_edge(kcd);
Ref *ref;
LinkData *ref;
BMFace *f;
newkfe->v1 = kfe->v1;
@@ -1807,8 +1802,8 @@ static KnifeVert *knife_split_edge(KnifeTool_OpData *kcd,
kfe->v1->is_splitting = true;
BLI_addtail(&kfe->v1->edges, ref);
LISTBASE_FOREACH (Ref *, ref, &kfe->faces) {
knife_edge_append_face(kcd, newkfe, static_cast<BMFace *>(ref->ref));
LISTBASE_FOREACH (LinkData *, ref, &kfe->faces) {
knife_edge_append_face(kcd, newkfe, static_cast<BMFace *>(ref->data));
}
knife_add_to_vert_edges(kcd, newkfe);
@@ -2119,15 +2114,15 @@ static void knife_add_single_cut(KnifeTool_OpData *kcd,
*/
static void knife_cut_face(KnifeTool_OpData *kcd, BMFace *f, ListBase *hits)
{
Ref *r;
LinkData *r;
if (BLI_listbase_count_at_most(hits, 2) != 2) {
return;
}
for (r = static_cast<Ref *>(hits->first); r->next; r = r->next) {
for (r = static_cast<LinkData *>(hits->first); r->next; r = r->next) {
knife_add_single_cut(
kcd, static_cast<KnifeLineHit *>(r->ref), static_cast<KnifeLineHit *>(r->next->ref), f);
kcd, static_cast<KnifeLineHit *>(r->data), static_cast<KnifeLineHit *>(r->next->data), f);
}
}
@@ -2145,9 +2140,9 @@ static void knife_make_face_cuts(KnifeTool_OpData *kcd, BMesh *bm, BMFace *f, Li
BLI_assert(BLI_gset_len(kcd->edgenet.edge_visit) == 0);
i = 0;
LISTBASE_FOREACH (Ref *, ref, kfedges) {
LISTBASE_FOREACH (LinkData *, ref, kfedges) {
bool is_new_edge = false;
kfe = static_cast<KnifeEdge *>(ref->ref);
kfe = static_cast<KnifeEdge *>(ref->data);
if (kfe->is_invalid) {
continue;
@@ -2250,8 +2245,8 @@ static void knife_make_face_cuts(KnifeTool_OpData *kcd, BMesh *bm, BMFace *f, Li
static int sort_verts_by_dist_cb(void *co_p, const void *cur_a_p, const void *cur_b_p)
{
const KnifeVert *cur_a = static_cast<const KnifeVert *>(((const Ref *)cur_a_p)->ref);
const KnifeVert *cur_b = static_cast<const KnifeVert *>(((const Ref *)cur_b_p)->ref);
const KnifeVert *cur_a = static_cast<const KnifeVert *>(((const LinkData *)cur_a_p)->data);
const KnifeVert *cur_b = static_cast<const KnifeVert *>(((const LinkData *)cur_b_p)->data);
const float *co = static_cast<const float *>(co_p);
const float a_sq = len_squared_v3v3(co, cur_a->co);
const float b_sq = len_squared_v3v3(co, cur_b->co);
@@ -2315,8 +2310,8 @@ static void knife_make_cuts(KnifeTool_OpData *kcd, Object *ob)
if (kfv->v || kfv->is_invalid || kfv->ob != ob) {
continue; /* Already have a BMVert. */
}
LISTBASE_FOREACH (Ref *, ref, &kfv->edges) {
kfe = static_cast<KnifeEdge *>(ref->ref);
LISTBASE_FOREACH (LinkData *, ref, &kfv->edges) {
kfe = static_cast<KnifeEdge *>(ref->data);
BMEdge *e = kfe->e;
if (!e) {
continue;
@@ -2337,8 +2332,8 @@ static void knife_make_cuts(KnifeTool_OpData *kcd, Object *ob)
for (auto [e, list] : ehash.items()) {
BLI_listbase_sort_r(list, sort_verts_by_dist_cb, e->v1->co);
LISTBASE_FOREACH (Ref *, ref, list) {
kfv = static_cast<KnifeVert *>(ref->ref);
LISTBASE_FOREACH (LinkData *, ref, list) {
kfv = static_cast<KnifeVert *>(ref->data);
pct = line_point_factor_v3(kfv->co, e->v1->co, e->v2->co);
kfv->v = BM_edge_split(bm, e, e->v1, &enew, pct);
}
@@ -2403,13 +2398,13 @@ static void knife_add_cut(KnifeTool_OpData *kcd)
add_hit_to_facehits(kcd, facehits, lh->f, lh);
}
if (lh->v) {
LISTBASE_FOREACH (Ref *, r, &lh->v->faces) {
add_hit_to_facehits(kcd, facehits, static_cast<BMFace *>(r->ref), lh);
LISTBASE_FOREACH (LinkData *, r, &lh->v->faces) {
add_hit_to_facehits(kcd, facehits, static_cast<BMFace *>(r->data), lh);
}
}
if (lh->kfe) {
LISTBASE_FOREACH (Ref *, r, &lh->kfe->faces) {
add_hit_to_facehits(kcd, facehits, static_cast<BMFace *>(r->ref), lh);
LISTBASE_FOREACH (LinkData *, r, &lh->kfe->faces) {
add_hit_to_facehits(kcd, facehits, static_cast<BMFace *>(r->data), lh);
}
}
}
@@ -2566,8 +2561,8 @@ static bool knife_ray_intersect_face(KnifeTool_OpData *kcd,
interp_v3_v3v3v3_uv(hit_cageco, UNPACK3(tri_cos), ray_tri_uv);
/* Now check that far enough away from verts and edges. */
list = knife_get_face_kedges(kcd, ob, ob_index, f);
LISTBASE_FOREACH (Ref *, ref, list) {
kfe = static_cast<KnifeEdge *>(ref->ref);
LISTBASE_FOREACH (LinkData *, ref, list) {
kfe = static_cast<KnifeEdge *>(ref->data);
if (kfe->is_invalid) {
continue;
}
@@ -2897,8 +2892,8 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd)
fobs.add(f, ob_index);
list = knife_get_face_kedges(kcd, ob, ob_index, f);
LISTBASE_FOREACH (Ref *, ref, list) {
KnifeEdge *kfe = static_cast<KnifeEdge *>(ref->ref);
LISTBASE_FOREACH (LinkData *, ref, list) {
KnifeEdge *kfe = static_cast<KnifeEdge *>(ref->data);
if (kfe->is_invalid) {
continue;
}
@@ -3209,8 +3204,8 @@ static int knife_sample_screen_density_from_closest_face(KnifeTool_OpData *kcd,
knife_project_v2(kcd, cageco, sco);
list = knife_get_face_kedges(kcd, ob, ob_index, f);
LISTBASE_FOREACH (Ref *, ref, list) {
KnifeEdge *kfe = static_cast<KnifeEdge *>(ref->ref);
LISTBASE_FOREACH (LinkData *, ref, list) {
KnifeEdge *kfe = static_cast<KnifeEdge *>(ref->data);
int i;
if (kfe->is_invalid) {
@@ -3342,8 +3337,8 @@ static KnifeEdge *knife_find_closest_edge_of_face(
/* Look through all edges associated with this face. */
list = knife_get_face_kedges(kcd, ob, ob_index, f);
LISTBASE_FOREACH (Ref *, ref, list) {
KnifeEdge *kfe = static_cast<KnifeEdge *>(ref->ref);
LISTBASE_FOREACH (LinkData *, ref, list) {
KnifeEdge *kfe = static_cast<KnifeEdge *>(ref->data);
float kfv1_sco[2], kfv2_sco[2], test_cagep[3];
float lambda;
@@ -3580,8 +3575,8 @@ static bool knife_snap_angle_relative(KnifeTool_OpData *kcd)
* If none exists then exit. */
if (kcd->prev.vert) {
int count = 0;
LISTBASE_FOREACH (Ref *, ref, &kcd->prev.vert->edges) {
kfe = ((KnifeEdge *)(ref->ref));
LISTBASE_FOREACH (LinkData *, ref, &kcd->prev.vert->edges) {
kfe = ((KnifeEdge *)(ref->data));
if (kfe->is_invalid) {
continue;
}
@@ -3613,16 +3608,16 @@ static bool knife_snap_angle_relative(KnifeTool_OpData *kcd)
/* Choose best face for plane. */
BMFace *fprev = nullptr;
if (kcd->prev.vert && kcd->prev.vert->v) {
LISTBASE_FOREACH (Ref *, ref, &kcd->prev.vert->faces) {
f = ((BMFace *)(ref->ref));
LISTBASE_FOREACH (LinkData *, ref, &kcd->prev.vert->faces) {
f = ((BMFace *)(ref->data));
if (f == fcurr) {
fprev = f;
}
}
}
else if (kcd->prev.edge) {
LISTBASE_FOREACH (Ref *, ref, &kcd->prev.edge->faces) {
f = ((BMFace *)(ref->ref));
LISTBASE_FOREACH (LinkData *, ref, &kcd->prev.edge->faces) {
f = ((BMFace *)(ref->data));
if (f == fcurr) {
fprev = f;
}
@@ -3710,8 +3705,8 @@ static int knife_calculate_snap_ref_edges(KnifeTool_OpData *kcd)
}
if (kcd->prev.vert) {
LISTBASE_FOREACH (Ref *, ref, &kcd->prev.vert->edges) {
kfe = ((KnifeEdge *)(ref->ref));
LISTBASE_FOREACH (LinkData *, ref, &kcd->prev.vert->edges) {
kfe = ((KnifeEdge *)(ref->data));
if (kfe->is_invalid) {
continue;
}
@@ -3904,8 +3899,8 @@ static void knifetool_undo(KnifeTool_OpData *kcd)
if (!v1->is_invalid && !v1->is_splitting) {
v1->is_invalid = true;
/* If the first vertex is touching any other cut edges don't remove it. */
LISTBASE_FOREACH (Ref *, ref, &v1->edges) {
kfe = static_cast<KnifeEdge *>(ref->ref);
LISTBASE_FOREACH (LinkData *, ref, &v1->edges) {
kfe = static_cast<KnifeEdge *>(ref->data);
if (kfe->is_cut && !kfe->is_invalid) {
v1->is_invalid = false;
break;
@@ -3917,8 +3912,8 @@ static void knifetool_undo(KnifeTool_OpData *kcd)
if (!v2->is_invalid && !v2->is_splitting) {
v2->is_invalid = true;
/* If the second vertex is touching any other cut edges don't remove it. */
LISTBASE_FOREACH (Ref *, ref, &v2->edges) {
kfe = static_cast<KnifeEdge *>(ref->ref);
LISTBASE_FOREACH (LinkData *, ref, &v2->edges) {
kfe = static_cast<KnifeEdge *>(ref->data);
if (kfe->is_cut && !kfe->is_invalid) {
v2->is_invalid = false;
break;
@@ -4073,7 +4068,7 @@ static void knifetool_init(ViewContext *vc,
ED_region_tag_redraw(kcd->region);
kcd->refs = BLI_mempool_create(sizeof(Ref), 0, 2048, 0);
kcd->refs = BLI_mempool_create(sizeof(LinkData), 0, 2048, 0);
kcd->kverts = BLI_mempool_create(sizeof(KnifeVert), 0, 512, BLI_MEMPOOL_ALLOW_ITER);
kcd->kedges = BLI_mempool_create(sizeof(KnifeEdge), 0, 512, BLI_MEMPOOL_ALLOW_ITER);