diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-08-20 12:09:20 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-08-20 12:13:14 +0300 |
commit | 179a2e1b98b048e5b9f607eee23f94f22d8234aa (patch) | |
tree | da0eb4600bbcb20e1961a96e6469e495bb998477 /source/blender/blenkernel/intern/editderivedmesh.c | |
parent | 66365589ff4c18ad06f6ff268351773833f02bea (diff) |
Use BVH-overlap for mesh self-intersection display
Add BKE_bmbvh_overlap, remove BKE_bmbvh_find_face_segment
Diffstat (limited to 'source/blender/blenkernel/intern/editderivedmesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/editderivedmesh.c | 60 |
1 files changed, 23 insertions, 37 deletions
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index 8f251b774cf..8158411c2e4 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -2125,15 +2125,17 @@ static void statvis_calc_intersect( /* result */ unsigned char (*r_face_colors)[4]) { - BMIter iter; BMesh *bm = em->bm; - BMEdge *e; - int index; + int i; /* fallback */ // const char col_fallback[4] = {64, 64, 64, 255}; + float fcol[3]; + unsigned char col[3]; struct BMBVHTree *bmtree; + BVHTreeOverlap *overlap; + unsigned int overlap_len; memset(r_face_colors, 64, sizeof(int) * em->bm->totface); @@ -2144,46 +2146,30 @@ static void statvis_calc_intersect( bmtree = BKE_bmbvh_new_from_editmesh(em, 0, vertexCos, false); - BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { - BMFace *f_hit; - float cos[2][3]; - float cos_mid[3]; - float ray_no[3]; + overlap = BKE_bmbvh_overlap(bmtree, bmtree, &overlap_len); - if (e->l == NULL) - continue; + /* same for all faces */ + weight_to_rgb(fcol, 1.0f); + rgb_float_to_uchar(col, fcol); - if (vertexCos) { - copy_v3_v3(cos[0], vertexCos[BM_elem_index_get(e->v1)]); - copy_v3_v3(cos[1], vertexCos[BM_elem_index_get(e->v2)]); - } - else { - copy_v3_v3(cos[0], e->v1->co); - copy_v3_v3(cos[1], e->v2->co); - } - - mid_v3_v3v3(cos_mid, cos[0], cos[1]); - sub_v3_v3v3(ray_no, cos[1], cos[0]); - - f_hit = BKE_bmbvh_find_face_segment(bmtree, cos[0], cos[1], - NULL, NULL, NULL); + if (overlap) { + for (i = 0; i < overlap_len; i++) { + BMFace *f_hit_pair[2] = { + em->looptris[overlap[i].indexA][0]->f, + em->looptris[overlap[i].indexB][0]->f, + }; + int j; - if (f_hit) { - BMLoop *l_iter, *l_first; - float fcol[3]; + for (j = 0; j < 2; j++) { + BMFace *f_hit = f_hit_pair[j]; + int index; - index = BM_elem_index_get(f_hit); - weight_to_rgb(fcol, 1.0f); - rgb_float_to_uchar(r_face_colors[index], fcol); + index = BM_elem_index_get(f_hit); - l_iter = l_first = e->l; - do { - index = BM_elem_index_get(l_iter->f); - weight_to_rgb(fcol, 1.0f); - rgb_float_to_uchar(r_face_colors[index], fcol); - } while ((l_iter = l_iter->radial_next) != l_first); + copy_v3_v3_char((char *)r_face_colors[index], (const char *)col); + } } - + MEM_freeN(overlap); } BKE_bmbvh_free(bmtree); |