[Bf-blender-cvs] [c901ebcd21e] blender2.8: DRW: add mapped edit-mode face-dot drawing

Campbell Barton noreply at git.blender.org
Thu Oct 11 08:24:25 CEST 2018


Commit: c901ebcd21e620c049c33ced7daff8cafd127805
Author: Campbell Barton
Date:   Thu Oct 11 17:23:29 2018 +1100
Branches: blender2.8
https://developer.blender.org/rBc901ebcd21e620c049c33ced7daff8cafd127805

DRW: add mapped edit-mode face-dot drawing

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

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 4fce2e6ac6e..0e1b544abbe 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -1286,6 +1286,40 @@ static bool mesh_render_data_pnors_pcenter_select_get(
 
 	return true;
 }
+static bool mesh_render_data_pnors_pcenter_select_get_mapped(
+        MeshRenderData *rdata, const int poly,
+        float r_pnors[3], float r_center[3], bool *r_selected)
+{
+	BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_POLY));
+	const int *p_origindex = rdata->mapped.p_origindex;
+	const int p_orig = p_origindex[poly];
+	if (p_orig == ORIGINDEX_NONE) {
+		return false;
+	}
+	BMEditMesh *em = rdata->edit_bmesh;
+	const BMFace *efa = BM_face_at_index(rdata->edit_bmesh->bm, p_orig);
+	if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
+		return false;
+	}
+
+	Mesh *me_cage = em->mesh_eval_cage;
+	const MVert *mvert = me_cage->mvert;
+#if 0
+	const MEdge *medge = me_cage->medge;
+#endif
+	const MLoop *mloop = me_cage->mloop;
+	const MPoly *mpoly = me_cage->mpoly;
+
+	const MPoly *mp = mpoly + poly;
+	const MLoop *ml = mloop + mp->loopstart;
+
+	BKE_mesh_calc_poly_center(mp, ml, mvert, r_center);
+	BKE_mesh_calc_poly_normal(mp, ml, mvert, r_pnors);
+
+	*r_selected = (BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0) ? true : false;
+
+	return true;
+}
 
 static bool mesh_render_data_edge_vcos_manifold_pnors(
         MeshRenderData *rdata, const int edge_index,
@@ -2649,7 +2683,11 @@ static GPUVertBuf *mesh_batch_cache_get_facedot_pos_with_normals_and_flag(
 			attr_id.data = GPU_vertformat_attr_add(&format, "norAndFlag", GPU_COMP_I10, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
 		}
 
-		const int vbo_len_capacity = mesh_render_data_polys_len_get(rdata);
+		Mesh *me_cage = rdata->mapped.use ? rdata->edit_bmesh->mesh_eval_cage : NULL;
+		const int vbo_len_capacity = (
+		        rdata->mapped.use ?
+		        me_cage->totpoly :
+		        mesh_render_data_polys_len_get(rdata));
 		int vidx = 0;
 
 		GPUVertBuf *vbo = cache->ed_fcenter_pos_with_nor_and_sel = GPU_vertbuf_create_with_format(&format);
@@ -2662,20 +2700,30 @@ static GPUVertBuf *mesh_batch_cache_get_facedot_pos_with_normals_and_flag(
 			}
 		}
 
-		for (int i = 0; i < vbo_len_capacity; ++i) {
-			float pcenter[3], pnor[3];
-			bool selected = false;
-
-			if (mesh_render_data_pnors_pcenter_select_get(rdata, i, pnor, pcenter, &selected)) {
-
-				GPUPackedNormal nor = { .x = 0, .y = 0, .z = -511 };
-				nor = GPU_normal_convert_i10_v3(pnor);
-				nor.w = selected ? 1 : 0;
-				GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor);
-
-				GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter);
-
-				vidx += 1;
+		if (rdata->mapped.use == false) {
+			for (int i = 0; i < vbo_len_capacity; i++) {
+				float pcenter[3], pnor[3];
+				bool selected = false;
+				if (mesh_render_data_pnors_pcenter_select_get(rdata, i, pnor, pcenter, &selected)) {
+					GPUPackedNormal nor = GPU_normal_convert_i10_v3(pnor);
+					nor.w = selected ? 1 : 0;
+					GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor);
+					GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter);
+					vidx += 1;
+				}
+			}
+		}
+		else {
+			for (int i = 0; i < vbo_len_capacity; i++) {
+				float pcenter[3], pnor[3];
+				bool selected = false;
+				if (mesh_render_data_pnors_pcenter_select_get_mapped(rdata, i, pnor, pcenter, &selected)) {
+					GPUPackedNormal nor = GPU_normal_convert_i10_v3(pnor);
+					nor.w = selected ? 1 : 0;
+					GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor);
+					GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter);
+					vidx += 1;
+				}
 			}
 		}
 		const int vbo_len_used = vidx;



More information about the Bf-blender-cvs mailing list