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:
authorAlexander Gavrilov <angavrilov@gmail.com>2018-12-01 13:44:29 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2018-12-01 13:44:29 +0300
commitb0ec08cfa1cbdc1a5f4dc083f31873e222e84391 (patch)
tree9185bc84953b5c7bf4708126b52046cdf1077fe8 /source/blender/draw
parent3bd057d47284d727dadb6fd826bf55143a00ad97 (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.
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c45
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);
+ }
}
}