Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2015-08-20 12:09:20 +0300
committerCampbell Barton <ideasman42@gmail.com>2015-08-20 12:13:14 +0300
commit179a2e1b98b048e5b9f607eee23f94f22d8234aa (patch)
treeda0eb4600bbcb20e1961a96e6469e495bb998477 /source/blender/blenkernel/intern/editderivedmesh.c
parent66365589ff4c18ad06f6ff268351773833f02bea (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.c60
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);