[Bf-blender-cvs] [a04dd15193e] master: Edit Mesh: Only draw vertices once

Clément Foucault noreply at git.blender.org
Thu Feb 7 20:41:16 CET 2019


Commit: a04dd15193e6cef261d604b2fb05746e71c6a7e3
Author: Clément Foucault
Date:   Thu Feb 7 20:36:29 2019 +0100
Branches: master
https://developer.blender.org/rBa04dd15193e6cef261d604b2fb05746e71c6a7e3

Edit Mesh: Only draw vertices once

Only add each vertices to point ibo once. That requires tagging each mvert
in the case of modifier preview.

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

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 80d753a58d7..89829cc4c5b 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -3801,11 +3801,10 @@ static void mesh_create_loops_tris(
  * It writes to MEdge->flag with ME_EDGE_TMP_TAG. */
 static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexBuf *ibo_verts, GPUIndexBuf *ibo_edges)
 {
-	BMIter iter_efa, iter_loop;
-	BMFace *efa;
-	BMLoop *loop;
+	BMIter iter;
 	int i;
 
+	const int vert_len = mesh_render_data_verts_len_get_maybe_mapped(rdata);
 	const int edge_len = mesh_render_data_edges_len_get_maybe_mapped(rdata);
 	const int loop_len = mesh_render_data_loops_len_get_maybe_mapped(rdata);
 	const int poly_len = mesh_render_data_polys_len_get_maybe_mapped(rdata);
@@ -3824,28 +3823,31 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
 	int loop_idx = 0;
 	if (rdata->edit_bmesh && (rdata->mapped.use == false)) {
 		BMesh *bm = rdata->edit_bmesh->bm;
-		BMEdge *eed;
 		/* Edges not loose. */
-		BM_ITER_MESH (eed, &iter_efa, bm, BM_EDGES_OF_MESH) {
-			if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
-				if (ibo_edges && eed->l != NULL) {
-					int v1 = BM_elem_index_get(eed->l);
-					int v2 = BM_elem_index_get(eed->l->next);
-					GPU_indexbuf_add_line_verts(&elb_edge, v1, v2);
+		if (ibo_edges) {
+			BMEdge *eed;
+			BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
+				if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+					if (eed->l != NULL) {
+						int v1 = BM_elem_index_get(eed->l);
+						int v2 = BM_elem_index_get(eed->l->next);
+						GPU_indexbuf_add_line_verts(&elb_edge, v1, v2);
+					}
 				}
 			}
 		}
 		/* Face Loops */
-		BM_ITER_MESH (efa, &iter_efa, bm, BM_FACES_OF_MESH) {
-			if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
-				BM_ITER_ELEM_INDEX (loop, &iter_loop, efa, BM_LOOPS_OF_FACE, i) {
-					if (ibo_verts) {
-						GPU_indexbuf_add_generic_vert(&elb_vert, loop_idx + i);
-					}
+		if (ibo_verts) {
+			BMVert *eve;
+			BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+				if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+					BMLoop *l = BM_vert_find_first_loop(eve);
+					int v = BM_elem_index_get(l);
+					GPU_indexbuf_add_generic_vert(&elb_vert, v);
 				}
 			}
-			loop_idx += efa->len;
 		}
+		loop_idx = loop_len;
 		/* Loose edges */
 		for (i = 0; i < ledge_len; ++i) {
 			if (ibo_verts) {
@@ -3867,6 +3869,7 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
 	}
 	else if (rdata->mapped.use) {
 		const MPoly *mpoly = rdata->mapped.me_cage->mpoly;
+		MVert *mvert = rdata->mapped.me_cage->mvert;
 		MEdge *medge = rdata->mapped.me_cage->medge;
 		BMesh *bm = rdata->edit_bmesh->bm;
 
@@ -3879,16 +3882,23 @@ static void mesh_create_edit_loops_points_lines(MeshRenderData *rdata, GPUIndexB
 			/* NOTE: not thread safe. */
 			medge[edge].flag &= ~ME_EDGE_TMP_TAG;
 		}
+		for (int vert = 0; vert < vert_len; ++vert) {
+			/* NOTE: not thread safe. */
+			mvert[vert].flag &= ~ME_VERT_TMP_TAG;
+		}
 
 		/* Face Loops */
 		for (int poly = 0; poly < poly_len; poly++, mpoly++) {
 			int fidx = p_origindex[poly];
 			if (fidx != ORIGINDEX_NONE) {
-				efa = BM_face_at_index(bm, fidx);
+				BMFace *efa = BM_face_at_index(bm, fidx);
 				if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
 					const MLoop *mloop = &rdata->mapped.me_cage->mloop[mpoly->loopstart];
 					for (i = 0; i < mpoly->totloop; ++i, ++mloop) {
-						if (ibo_verts && (v_origindex[mloop->v] != ORIGINDEX_NONE)) {
+						if (ibo_verts && (v_origindex[mloop->v] != ORIGINDEX_NONE) &&
+						    (mvert[mloop->v].flag & ME_VERT_TMP_TAG) == 0)
+						{
+							mvert[mloop->v].flag |= ME_VERT_TMP_TAG;
 							GPU_indexbuf_add_generic_vert(&elb_vert, loop_idx + i);
 						}
 						if (ibo_edges && (e_origindex[mloop->e] != ORIGINDEX_NONE) &&



More information about the Bf-blender-cvs mailing list