diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-07-26 19:35:16 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-07-26 19:35:16 +0400 |
commit | b7dad0b5c613c50d6fab359f0e9145cbad19c2b0 (patch) | |
tree | fd01aa15aae72da346d88a3622812a5f4783c2c9 /source/blender/editors/uvedit | |
parent | e3f6875df07ad415b85249dc8014d0cc650957d9 (diff) |
fix [#36286] UV face display not working for concave ngons
Diffstat (limited to 'source/blender/editors/uvedit')
-rw-r--r-- | source/blender/editors/uvedit/uvedit_draw.c | 69 |
1 files changed, 66 insertions, 3 deletions
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index 438f6bbdb9c..ef22f4a484c 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -66,6 +66,10 @@ #include "uvedit_intern.h" +/* use editmesh tessface */ +#define USE_EDBM_LOOPTRIS + + void draw_image_cursor(SpaceImage *sima, ARegion *ar) { float zoom[2], x_fac, y_fac; @@ -257,6 +261,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe weight_to_rgb(col, areadiff); glColor3fv(col); + /* TODO: USE_EDBM_LOOPTRIS */ glBegin(GL_POLYGON); BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); @@ -321,6 +326,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe ang[i] = angle_normalized_v3v3(av[i], av[(i + 1) % efa_len]); } + /* TODO: USE_EDBM_LOOPTRIS */ glBegin(GL_POLYGON); BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) { luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); @@ -421,6 +427,23 @@ static void draw_uvs_texpaint(SpaceImage *sima, Scene *scene, Object *ob) } } +#ifdef USE_EDBM_LOOPTRIS +static void draw_uvs_looptri(BMEditMesh *em, unsigned int *r_loop_index, const int cd_loop_uv_offset) +{ + unsigned int i = *r_loop_index; + BMFace *f = em->looptris[i][0]->f; + do { + unsigned int j; + for (j = 0; j < 3; j++) { + MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(em->looptris[i][j], cd_loop_uv_offset); + glVertex2fv(luv->uv); + } + i++; + } while (i != em->tottri && (f == em->looptris[i][0]->f)); + *r_loop_index = i - 1; +} +#endif + /* draws uv's in the image space */ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) { @@ -428,7 +451,10 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) Mesh *me = obedit->data; BMEditMesh *em = me->edit_btmesh; BMesh *bm = em->bm; - BMFace *efa, *efa_act, *activef; + BMFace *efa, *efa_act; +#ifndef USE_EDBM_LOOPTRIS + BMFace *activef; +#endif BMLoop *l; BMIter iter, liter; MTexPoly *tf, *activetf = NULL; @@ -443,7 +469,9 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) const int cd_poly_tex_offset = CustomData_get_offset(&bm->pdata, CD_MTEXPOLY); activetf = EDBM_mtexpoly_active_get(em, &efa_act, FALSE, FALSE); /* will be set to NULL if hidden */ +#ifndef USE_EDBM_LOOPTRIS activef = BM_mesh_active_face_get(bm, FALSE, FALSE); +#endif ts = scene->toolsettings; drawfaces = draw_uvs_face_check(scene); @@ -490,9 +518,42 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); +#ifdef USE_EDBM_LOOPTRIS + { + unsigned int i; + for (i = 0; i < em->tottri; i++) { + efa = em->looptris[i][0]->f; + tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset); + if (uvedit_face_visible_test(scene, ima, efa, tf)) { + const bool is_select = uvedit_face_select_test(scene, efa, cd_loop_uv_offset); + BM_elem_flag_enable(efa, BM_ELEM_TAG); + + if (tf == activetf) { + /* only once */ + glEnable(GL_POLYGON_STIPPLE); + glPolygonStipple(stipple_quarttone); + UI_ThemeColor4(TH_EDITMESH_ACTIVE); + } + else { + glColor4ubv((GLubyte *)(is_select ? col2 : col1)); + } + + glBegin(GL_TRIANGLES); + draw_uvs_looptri(em, &i, cd_loop_uv_offset); + glEnd(); + + if (tf == activetf) { + glDisable(GL_POLYGON_STIPPLE); + } + } + else { + BM_elem_flag_disable(efa, BM_ELEM_TAG); + } + } + } +#else BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset); - if (uvedit_face_visible_test(scene, ima, efa, tf)) { BM_elem_flag_enable(efa, BM_ELEM_TAG); if (tf == activetf) continue; /* important the temp boolean is set above */ @@ -515,6 +576,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) BM_elem_flag_disable(efa, BM_ELEM_TAG); } } +#endif glDisable(GL_BLEND); } else { @@ -536,7 +598,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) } /* 3. draw active face stippled */ - +#ifndef USE_EDBM_LOOPTRIS if (activef) { tf = BM_ELEM_CD_GET_VOID_P(activef, cd_poly_tex_offset); if (uvedit_face_visible_test(scene, ima, activef, tf)) { @@ -558,6 +620,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) glDisable(GL_BLEND); } } +#endif /* 4. draw edges */ |