diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2018-12-01 13:44:29 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2018-12-01 13:44:29 +0300 |
commit | b0ec08cfa1cbdc1a5f4dc083f31873e222e84391 (patch) | |
tree | 9185bc84953b5c7bf4708126b52046cdf1077fe8 | |
parent | 3bd057d47284d727dadb6fd826bf55143a00ad97 (diff) |
Texture Paint: emulate subsurf optimal display in paint mode wireframe.
The wireframe is intended for showing selected faces, and selection is
based on original faces, so the extra wireframe lines are pure noise.
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_mesh.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index fbd2420b7a4..5ee91f52342 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -175,6 +175,8 @@ typedef struct MeshRenderData { BMEditMesh *edit_bmesh; struct EditMeshData *edit_data; + Mesh *me; + MVert *mvert; const MEdge *medge; const MLoop *mloop; @@ -616,6 +618,8 @@ static MeshRenderData *mesh_render_data_create_ex( } } else { + rdata->me = me; + if (types & (MR_DATATYPE_VERT)) { rdata->vert_len = me->totvert; rdata->mvert = CustomData_get_layer(&me->vdata, CD_MVERT); @@ -1360,16 +1364,55 @@ static void mesh_render_data_ensure_edge_visible_bool(MeshRenderData *rdata) edge_visible_bool = rdata->edge_visible_bool = MEM_callocN(sizeof(*edge_visible_bool) * rdata->edge_len, __func__); + /* If original index is available, hide edges within the same original poly. */ + const int *p_origindex = NULL; + int *index_table = NULL; + + if (rdata->me != NULL) { + p_origindex = CustomData_get_layer(&rdata->me->pdata, CD_ORIGINDEX); + if (p_origindex != NULL) { + index_table = MEM_malloc_arrayN(sizeof(int), rdata->edge_len, __func__); + memset(index_table, -1, sizeof(int) * rdata->edge_len); + } + } + for (int i = 0; i < rdata->poly_len; i++) { const MPoly *poly = &rdata->mpoly[i]; + int p_orig = p_origindex ? p_origindex[i] : ORIGINDEX_NONE; if (!(poly->flag & ME_HIDE)) { for (int j = 0; j < poly->totloop; j++) { const MLoop *loop = &rdata->mloop[poly->loopstart + j]; - edge_visible_bool[loop->e] = true; + + if (p_orig != ORIGINDEX_NONE) { + /* Boundary edge is visible. */ + if (index_table[loop->e] == -1) { + index_table[loop->e] = p_orig; + edge_visible_bool[loop->e] = true; + } + /* Edge between two faces with the same original is hidden. */ + else if (index_table[loop->e] == p_orig) { + edge_visible_bool[loop->e] = false; + } + /* Edge between two different original faces is visible. */ + else { + index_table[loop->e] = -2; + edge_visible_bool[loop->e] = true; + } + } + else { + if (index_table != NULL) { + index_table[loop->e] = -2; + } + edge_visible_bool[loop->e] = true; + } } } } + + if (index_table != NULL) { + MEM_freeN(index_table); + } } } |