[Bf-blender-cvs] [677f066634] blender2.8: Edit Mesh overlays: added looses edges and verts as triangle.

Clément Foucault noreply at git.blender.org
Tue Feb 28 14:25:25 CET 2017


Commit: 677f066634e7434e705c83751dc21a427ed086e1
Author: Clément Foucault
Date:   Tue Feb 28 14:30:34 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB677f066634e7434e705c83751dc21a427ed086e1

Edit Mesh overlays: added looses edges and verts as triangle.

We loose a bit of memory for (more?) performance.

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

M	source/blender/blenkernel/intern/mesh_render.c
M	source/blender/gpu/shaders/gpu_shader_edit_overlay_geom.glsl

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

diff --git a/source/blender/blenkernel/intern/mesh_render.c b/source/blender/blenkernel/intern/mesh_render.c
index 0194491f24..2e9ea90792 100644
--- a/source/blender/blenkernel/intern/mesh_render.c
+++ b/source/blender/blenkernel/intern/mesh_render.c
@@ -93,6 +93,8 @@ typedef struct MeshRenderData {
 	int tottri;
 	int totloop;
 	int totpoly;
+	int totlvert;
+	int totledge;
 
 	BMEditMesh *edit_bmesh;
 	MVert *mvert;
@@ -111,6 +113,8 @@ typedef struct MeshRenderData {
 	EdgeHash *ehash;
 	EdgeAdjacentPolys *edges_adjacent_polys;
 	MLoopTri *mlooptri;
+	int *loose_edges;
+	int *loose_verts;
 
 	float (*poly_normals)[3];
 	short (*poly_normals_short)[3];
@@ -118,14 +122,16 @@ typedef struct MeshRenderData {
 } MeshRenderData;
 
 enum {
-	MR_DATATYPE_VERT    = 1 << 0,
-	MR_DATATYPE_EDGE    = 1 << 1,
-	MR_DATATYPE_LOOPTRI = 1 << 2,
-	MR_DATATYPE_LOOP    = 1 << 3,
-	MR_DATATYPE_POLY    = 1 << 4,
-	MR_DATATYPE_ACTIVE  = 1 << 5,
-	MR_DATATYPE_CREASE  = 1 << 6,
-	MR_DATATYPE_BWEIGHT = 1 << 7,
+	MR_DATATYPE_VERT       = 1 << 0,
+	MR_DATATYPE_LOOSE_VERT = 1 << 1,
+	MR_DATATYPE_EDGE       = 1 << 2,
+	MR_DATATYPE_LOOSE_EDGE = 1 << 3,
+	MR_DATATYPE_LOOPTRI    = 1 << 4,
+	MR_DATATYPE_LOOP       = 1 << 5,
+	MR_DATATYPE_POLY       = 1 << 6,
+	MR_DATATYPE_ACTIVE     = 1 << 7,
+	MR_DATATYPE_CREASE     = 1 << 8,
+	MR_DATATYPE_BWEIGHT    = 1 << 9,
 };
 
 static MeshRenderData *mesh_render_data_create(Mesh *me, const int types)
@@ -140,11 +146,11 @@ static MeshRenderData *mesh_render_data_create(Mesh *me, const int types)
 		mrdata->edit_bmesh = embm;
 
 		int bm_ensure_types = 0;
-		if (types & MR_DATATYPE_VERT) {
+		if (types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOSE_VERT)) {
 			mrdata->totvert = bm->totvert;
 			bm_ensure_types |= BM_VERT;
 		}
-		if (types & MR_DATATYPE_EDGE) {
+		if (types & (MR_DATATYPE_EDGE | MR_DATATYPE_LOOSE_EDGE)) {
 			mrdata->totedge = bm->totedge;
 			bm_ensure_types |= BM_EDGE;
 		}
@@ -173,13 +179,59 @@ static MeshRenderData *mesh_render_data_create(Mesh *me, const int types)
 		}
 		BM_mesh_elem_index_ensure(bm, bm_ensure_types);
 		BM_mesh_elem_table_ensure(bm, bm_ensure_types & ~BM_LOOP);
+		if (types & MR_DATATYPE_LOOSE_VERT) {
+			mrdata->types |= MR_DATATYPE_VERT;
+			mrdata->totlvert = 0;
+			/* XXX slow, looping twice */
+			for (int i = 0; i < mrdata->totvert; ++i) {
+				BMVert *bv = BM_vert_at_index(bm, i);
+				if (BM_vert_edge_count_ex(bv, 1) == 0) {
+					mrdata->totlvert++;
+				}
+			}
+
+			int *lverts = mrdata->loose_verts = MEM_mallocN(mrdata->totlvert * sizeof(int), "Loose Vert");
+
+			int li = 0;
+			if (mrdata->totlvert > 0) {
+				for (int i = 0; i < mrdata->totvert; ++i) {
+					BMVert *bv = BM_vert_at_index(bm, i);
+					if (BM_vert_edge_count_ex(bv, 1) == 0) {
+						lverts[li++] = i;
+					}
+				}
+			}
+		}
+		if (types & MR_DATATYPE_LOOSE_EDGE) {
+			mrdata->types |= MR_DATATYPE_EDGE;
+			mrdata->totledge = 0;
+			/* XXX slow, looping twice */
+			for (int i = 0; i < mrdata->totedge; ++i) {
+				BMEdge *bv = BM_edge_at_index(bm, i);
+				if (BM_edge_is_wire(bv)) {
+					mrdata->totledge++;
+				}
+			}
+
+			int *ledges = mrdata->loose_edges = MEM_mallocN(mrdata->totledge * sizeof(int), "Loose Egde");
+
+			int li = 0;
+			if (mrdata->totledge > 0) {
+				for (int i = 0; i < mrdata->totedge; ++i) {
+					BMEdge *bv = BM_edge_at_index(bm, i);
+					if (BM_edge_is_wire(bv)) {
+						ledges[li++] = i;
+					}
+				}
+			}
+		}
 	}
 	else {
-		if (types & MR_DATATYPE_VERT) {
+		if (types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOSE_VERT)) {
 			mrdata->totvert = me->totvert;
 			mrdata->mvert = CustomData_get_layer(&me->vdata, CD_MVERT);
 		}
-		if (types & MR_DATATYPE_EDGE) {
+		if (types & (MR_DATATYPE_EDGE | MR_DATATYPE_LOOSE_EDGE)) {
 			mrdata->totedge = me->totedge;
 			mrdata->medge = CustomData_get_layer(&me->edata, CD_MEDGE);
 		}
@@ -196,6 +248,16 @@ static MeshRenderData *mesh_render_data_create(Mesh *me, const int types)
 			mrdata->totpoly = me->totpoly;
 			mrdata->mpoly = CustomData_get_layer(&me->pdata, CD_MPOLY);
 		}
+		if (types & MR_DATATYPE_LOOSE_VERT) {
+			mrdata->types |= MR_DATATYPE_VERT;
+			mrdata->totlvert = 0;
+			/* TODO */
+		}
+		if (types & MR_DATATYPE_LOOSE_EDGE) {
+			mrdata->types |= MR_DATATYPE_EDGE;
+			mrdata->totledge = 0;
+			/* TODO */
+		}
 	}
 
 	return mrdata;
@@ -206,6 +268,12 @@ static void mesh_render_data_free(MeshRenderData *mrdata)
 	if (mrdata->ehash) {
 		BLI_edgehash_free(mrdata->ehash, NULL);
 	}
+	if (mrdata->loose_verts) {
+		MEM_freeN(mrdata->loose_verts);
+	}
+	if (mrdata->loose_edges) {
+		MEM_freeN(mrdata->loose_edges);
+	}
 	if (mrdata->edges_adjacent_polys) {
 		MEM_freeN(mrdata->edges_adjacent_polys);
 	}
@@ -230,12 +298,24 @@ static int mesh_render_data_verts_num_get(const MeshRenderData *mrdata)
 	return mrdata->totvert;
 }
 
+static int mesh_render_data_loose_verts_num_get(const MeshRenderData *mrdata)
+{
+	BLI_assert(mrdata->types & MR_DATATYPE_LOOSE_VERT);
+	return mrdata->totlvert;
+}
+
 static int mesh_render_data_edges_num_get(const MeshRenderData *mrdata)
 {
 	BLI_assert(mrdata->types & MR_DATATYPE_EDGE);
 	return mrdata->totedge;
 }
 
+static int mesh_render_data_loose_edges_num_get(const MeshRenderData *mrdata)
+{
+	BLI_assert(mrdata->types & MR_DATATYPE_LOOSE_EDGE);
+	return mrdata->totledge;
+}
+
 static int mesh_render_data_looptri_num_get(const MeshRenderData *mrdata)
 {
 	BLI_assert(mrdata->types & MR_DATATYPE_LOOPTRI);
@@ -844,8 +924,9 @@ Batch *BKE_mesh_batch_cache_get_fancy_edges(Mesh *me)
 enum {
 	VFLAG_VERTEX_ACTIVE   = 1 << 0,
 	VFLAG_VERTEX_SELECTED = 1 << 1,
-	VFLAG_FACE_ACTIVE     = 1 << 2,
-	VFLAG_FACE_SELECTED   = 1 << 3,
+	VFLAG_VERTEX_LOOSE    = 1 << 2,
+	VFLAG_FACE_ACTIVE     = 1 << 3,
+	VFLAG_FACE_SELECTED   = 1 << 4,
 };
 
 enum {
@@ -856,7 +937,8 @@ enum {
 	VFLAG_EDGE_SHARP    = 1 << 4,
 };
 
-static unsigned char *get_vertex_flag(MeshRenderData *mrdata, const int v1, const int v2, const int v3, const int tri_idx)
+static unsigned char *get_vertex_flag(
+        MeshRenderData *mrdata, const int v1, const int v2, const int v3, const int tri_idx, const int edge_idx)
 {
 	/* This is really not efficient
 	 * some operation are repeated accross all vertices
@@ -872,8 +954,7 @@ static unsigned char *get_vertex_flag(MeshRenderData *mrdata, const int v1, cons
 	if (mrdata->edit_bmesh) {
 		BMesh *bm = mrdata->edit_bmesh->bm;
 		BMVert *bv1 = BM_vert_at_index(bm, v1);
-		BMVert *bv2 = BM_vert_at_index(bm, v2);
-		BMVert *bv3 = BM_vert_at_index(bm, v3);
+		BMEdge *edge = NULL;
 
 		/* Current vertex */
 		if (bv1 == mrdata->eve_act)
@@ -883,15 +964,27 @@ static unsigned char *get_vertex_flag(MeshRenderData *mrdata, const int v1, cons
 			vflag[0] |= VFLAG_VERTEX_SELECTED;
 
 		/* Current face */
-		BMFace *face = mrdata->edit_bmesh->looptris[tri_idx][0]->f;
-		if (face == mrdata->efa_act)
-			vflag[0] |= VFLAG_FACE_ACTIVE;
-
-		if (BM_elem_flag_test(face, BM_ELEM_SELECT))
-			vflag[0] |= VFLAG_FACE_SELECTED;
-
-		/* Oposite edge */
-		BMEdge *edge = BM_edge_exists(bv2, bv3);
+		if (tri_idx > -1) {
+			BMFace *face = mrdata->edit_bmesh->looptris[tri_idx][0]->f;
+			if (face == mrdata->efa_act)
+				vflag[0] |= VFLAG_FACE_ACTIVE;
+
+			if (BM_elem_flag_test(face, BM_ELEM_SELECT))
+				vflag[0] |= VFLAG_FACE_SELECTED;
+
+			/* Oposite edge */
+			BMVert *bv2 = BM_vert_at_index(bm, v2);
+			BMVert *bv3 = BM_vert_at_index(bm, v3);
+			edge = BM_edge_exists(bv2, bv3);
+		}
+		else if (edge_idx > -1) {
+			/* Loose edge */
+			edge = BM_edge_at_index(bm, edge_idx);
+		}
+		else {
+			/* Loose Vertex */
+			vflag[0] |= VFLAG_VERTEX_LOOSE;
+		}
 
 		/* if edge exists */
 		if (edge != NULL) {
@@ -945,17 +1038,35 @@ static void add_overlay_tri(
         const int v1, const int v2, const int v3, const int tri_idx, const int base_vert_idx)
 {
 	const float *pos = mesh_render_data_vert_co(mrdata, v1);
-	unsigned char *vflag = get_vertex_flag(mrdata, v1, v2, v3, tri_idx);
+	unsigned char *vflag = get_vertex_flag(mrdata, v1, v2, v3, tri_idx, -1);
 	setAttrib(vbo, pos_id, base_vert_idx + 0, pos);
 	setAttrib(vbo, edgeMod_id, base_vert_idx + 0, vflag);
 
 	pos = mesh_render_data_vert_co(mrdata, v2);
-	vflag = get_vertex_flag(mrdata, v2, v1, v3, tri_idx);
+	vflag = get_vertex_flag(mrdata, v2, v1, v3, tri_idx, -1);
 	setAttrib(vbo, pos_id, base_vert_idx + 1, pos);
 	setAttrib(vbo, edgeMod_id, base_vert_idx + 1, vflag);
 
 	pos = mesh_render_data_vert_co(mrdata, v3);
-	vflag = get_vertex_flag(mrdata, v3, v2, v1, tri_idx);
+	vflag = get_vertex_flag(mrdata, v3, v2, v1, tri_idx, -1);
+	setAttrib(vbo, pos_id, base_vert_idx + 2, pos);
+	setAttrib(vbo, edgeMod_id, base_vert_idx + 2, vflag);
+}
+
+static void add_overlay_loose_edge(
+        MeshRenderData *mrdata, VertexBuffer *vbo, const unsigned int pos_id, const unsigned int edgeMod_id,
+        const int v1, const int v2, const int edge_idx, const int base_vert_idx)
+{
+	const float *pos = mesh_render_data_vert_co(mrdata, v1);
+	unsigned char *vflag = get_vertex_flag(mrdata, v1, v2, v2, -1, edge_idx);
+	setAttrib(vbo, pos_id, base_vert_idx + 0, pos);
+	setAttrib(vbo, edgeMod_id, base_vert_idx + 0, vflag);
+
+	pos = mesh_render_data_vert_co(mrdata, v2);
+	vflag = get_vertex_flag(mrdata, v2, v1, v1, -1, edge_idx);
+	setAttrib(vbo, pos_id, base_vert_idx + 1, pos);
+	setAttrib(vbo, edgeMod_id, base_vert_idx + 1, vflag);
+
 	setAttrib(vbo, pos_id, base_vert_idx + 2, pos);
 	setAttrib(vbo, edgeMod_id, base_vert_idx + 2, vflag);
 }
@@ -976,12 +1087,16 @@ Batch *BKE_mesh_batch_cache_get_overlay_edges(Mesh *me)
 		}
 		VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
 
-		MeshRenderData *mrdata = mesh_render_data_create(me, MR_DATATYPE_VERT | MR_DATATYPE_EDGE |
+		MeshRenderData *mrdata = mesh_render_data_create(me, MR_DATATYPE_LOOSE_VERT | MR_DATATYPE_LOOSE_EDGE |
 		                                                     MR_DATATYPE_LOOPTRI | MR_DATATYPE_ACTIVE |
 		                                                     MR_DATATYPE_CREASE | MR_DATATYPE_BWEIGHT);
 		const int tri_ct = mesh_render_data_looptri_num_get(mrdata);
+		const int ledge_ct = mesh_render_data_loose_edges_num_get(mrdata);
+		const int lvert_ct = mesh_render_data_loose_verts_num_get(mrdata);
+		const int lvert_tri_ct = (int

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list