[Bf-blender-cvs] [b0ec08cfa1c] blender2.8: Texture Paint: emulate subsurf optimal display in paint mode wireframe.

Alexander Gavrilov noreply at git.blender.org
Sat Dec 1 11:47:41 CET 2018


Commit: b0ec08cfa1cbdc1a5f4dc083f31873e222e84391
Author: Alexander Gavrilov
Date:   Sat Dec 1 13:44:29 2018 +0300
Branches: blender2.8
https://developer.blender.org/rBb0ec08cfa1cbdc1a5f4dc083f31873e222e84391

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.

===================================================================

M	source/blender/draw/intern/draw_cache_impl_mesh.c

===================================================================

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);
+		}
 	}
 }



More information about the Bf-blender-cvs mailing list