diff options
Diffstat (limited to 'source/blender/bmesh/operators/bmo_similar.c')
-rw-r--r-- | source/blender/bmesh/operators/bmo_similar.c | 64 |
1 files changed, 37 insertions, 27 deletions
diff --git a/source/blender/bmesh/operators/bmo_similar.c b/source/blender/bmesh/operators/bmo_similar.c index 454d6d8c6c8..0cd17258834 100644 --- a/source/blender/bmesh/operators/bmo_similar.c +++ b/source/blender/bmesh/operators/bmo_similar.c @@ -106,11 +106,28 @@ void bmo_similar_faces_exec(BMesh *bm, BMOperator *op) const float thresh = BMO_slot_float_get(op->slots_in, "thresh"); const float thresh_radians = thresh * (float)M_PI; const int compare = BMO_slot_int_get(op->slots_in, "compare"); + /* for comparison types that use custom-data */ + int cd_offset = -1; /* initial_elem - other_elem */ float delta_fl; int delta_i; + if (type == SIMFACE_FACEMAP) { + cd_offset = CustomData_get_offset(&bm->pdata, CD_FACEMAP); + if (cd_offset == -1) { + return; + } + } +#ifdef WITH_FREESTYLE + else if (type == SIMFACE_FREESTYLE) { + cd_offset = CustomData_get_offset(&bm->pdata, CD_FREESTYLE_FACE); + if (cd_offset == -1) { + return; + } + } +#endif + num_total = BM_mesh_elem_count(bm, BM_FACE); /* @@ -145,7 +162,7 @@ void bmo_similar_faces_exec(BMesh *bm, BMOperator *op) * Save us some computation burden: In case of perimeter/area/coplanar selection we compute * only once. */ - if (type == SIMFACE_PERIMETER || type == SIMFACE_AREA || type == SIMFACE_COPLANAR || type == SIMFACE_IMAGE) { + if (type == SIMFACE_PERIMETER || type == SIMFACE_AREA || type == SIMFACE_COPLANAR) { for (i = 0; i < num_total; i++) { switch (type) { case SIMFACE_PERIMETER: @@ -164,14 +181,6 @@ void bmo_similar_faces_exec(BMesh *bm, BMOperator *op) case SIMFACE_AREA: f_ext[i].area = BM_face_calc_area(f_ext[i].f); break; - - case SIMFACE_IMAGE: - f_ext[i].t = NULL; - if (CustomData_has_layer(&(bm->pdata), CD_MTEXPOLY)) { - MTexPoly *mtpoly = CustomData_bmesh_get(&bm->pdata, f_ext[i].f->head.data, CD_MTEXPOLY); - f_ext[i].t = mtpoly->tpage; - } - break; } } } @@ -190,14 +199,6 @@ void bmo_similar_faces_exec(BMesh *bm, BMOperator *op) cont = false; } break; - - case SIMFACE_IMAGE: - if (f_ext[i].t == f_ext[indices[idx]].t) { - BMO_face_flag_enable(bm, fm, FACE_MARK); - cont = false; - } - break; - case SIMFACE_NORMAL: angle = angle_normalized_v3v3(fs->no, fm->no); /* if the angle between the normals -> 0 */ if (angle <= thresh_radians) { @@ -254,20 +255,29 @@ void bmo_similar_faces_exec(BMesh *bm, BMOperator *op) cont = false; } break; + case SIMFACE_FACEMAP: + { + BLI_assert(cd_offset != -1); + const int *fmap1 = BM_ELEM_CD_GET_VOID_P(fs, cd_offset); + const int *fmap2 = BM_ELEM_CD_GET_VOID_P(fm, cd_offset); + if (*fmap1 == *fmap2) { + BMO_face_flag_enable(bm, fm, FACE_MARK); + cont = false; + } + break; + } #ifdef WITH_FREESTYLE case SIMFACE_FREESTYLE: - if (CustomData_has_layer(&bm->pdata, CD_FREESTYLE_FACE)) { - FreestyleEdge *ffa1, *ffa2; - - ffa1 = CustomData_bmesh_get(&bm->pdata, fs->head.data, CD_FREESTYLE_FACE); - ffa2 = CustomData_bmesh_get(&bm->pdata, fm->head.data, CD_FREESTYLE_FACE); - - if (ffa1 && ffa2 && (ffa1->flag & FREESTYLE_FACE_MARK) == (ffa2->flag & FREESTYLE_FACE_MARK)) { - BMO_face_flag_enable(bm, fm, FACE_MARK); - cont = false; - } + { + BLI_assert(cd_offset != -1); + const FreestyleEdge *ffa1 = BM_ELEM_CD_GET_VOID_P(fs, cd_offset); + const FreestyleEdge *ffa2 = BM_ELEM_CD_GET_VOID_P(fm, cd_offset); + if ((ffa1->flag & FREESTYLE_FACE_MARK) == (ffa2->flag & FREESTYLE_FACE_MARK)) { + BMO_face_flag_enable(bm, fm, FACE_MARK); + cont = false; } break; + } #endif default: BLI_assert(0); |