[Bf-blender-cvs] [f4b0684a3fb] blender2.8: DRW: edit-mesh cage selection support

Campbell Barton noreply at git.blender.org
Fri Oct 12 04:15:31 CEST 2018


Commit: f4b0684a3fbca254ccaf7f9e1f273b7b2de1db4f
Author: Campbell Barton
Date:   Fri Oct 12 11:51:35 2018 +1100
Branches: blender2.8
https://developer.blender.org/rBf4b0684a3fbca254ccaf7f9e1f273b7b2de1db4f

DRW: edit-mesh cage selection support

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

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 0e1b544abbe..ab05874c5dc 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -147,7 +147,17 @@ typedef struct MeshRenderData {
 
 	/* Support for mapped mesh data. */
 	struct {
+		/* Must be set if we want to get mapped data. */
 		bool use;
+		bool supported;
+
+		Mesh *me_cage;
+
+		int vert_len;
+		int edge_len;
+		int tri_len;
+		int loop_len;
+		int poly_len;
 
 		/* origindex layers */
 		int *v_origindex;
@@ -429,11 +439,19 @@ static MeshRenderData *mesh_render_data_create_ex(
 
 		if (embm->mesh_eval_cage && (embm->mesh_eval_cage->runtime.is_original == false)) {
 			Mesh *me_cage = embm->mesh_eval_cage;
+
+			rdata->mapped.me_cage = me_cage;
+			rdata->mapped.vert_len = me_cage->totvert;
+			rdata->mapped.edge_len = me_cage->totedge;
+			rdata->mapped.loop_len = me_cage->totloop;
+			rdata->mapped.poly_len = me_cage->totpoly;
+			rdata->mapped.tri_len = poly_to_tri_count(me_cage->totpoly, me_cage->totloop);
+
 			rdata->mapped.v_origindex = CustomData_get_layer(&me_cage->vdata, CD_ORIGINDEX);
 			rdata->mapped.e_origindex = CustomData_get_layer(&me_cage->edata, CD_ORIGINDEX);
 			rdata->mapped.l_origindex = CustomData_get_layer(&me_cage->ldata, CD_ORIGINDEX);
 			rdata->mapped.p_origindex = CustomData_get_layer(&me_cage->pdata, CD_ORIGINDEX);
-			rdata->mapped.use = (
+			rdata->mapped.supported = (
 			        rdata->mapped.v_origindex &&
 			        rdata->mapped.e_origindex &&
 			        rdata->mapped.p_origindex);
@@ -950,6 +968,11 @@ static int mesh_render_data_verts_len_get(const MeshRenderData *rdata)
 	BLI_assert(rdata->types & MR_DATATYPE_VERT);
 	return rdata->vert_len;
 }
+static int mesh_render_data_verts_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+	BLI_assert(rdata->types & MR_DATATYPE_VERT);
+	return ((rdata->mapped.use == false) ? rdata->vert_len : rdata->mapped.vert_len);
+}
 
 static int mesh_render_data_loose_verts_len_get(const MeshRenderData *rdata)
 {
@@ -962,6 +985,11 @@ static int mesh_render_data_edges_len_get(const MeshRenderData *rdata)
 	BLI_assert(rdata->types & MR_DATATYPE_EDGE);
 	return rdata->edge_len;
 }
+static int mesh_render_data_edges_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+	BLI_assert(rdata->types & MR_DATATYPE_EDGE);
+	return ((rdata->mapped.use == false) ? rdata->edge_len : rdata->mapped.edge_len);
+}
 
 static int mesh_render_data_loose_edges_len_get(const MeshRenderData *rdata)
 {
@@ -974,6 +1002,11 @@ static int mesh_render_data_looptri_len_get(const MeshRenderData *rdata)
 	BLI_assert(rdata->types & MR_DATATYPE_LOOPTRI);
 	return rdata->tri_len;
 }
+static int mesh_render_data_looptri_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+	BLI_assert(rdata->types & MR_DATATYPE_LOOPTRI);
+	return ((rdata->mapped.use == false) ? rdata->tri_len : rdata->mapped.tri_len);
+}
 
 static int mesh_render_data_mat_len_get(const MeshRenderData *rdata)
 {
@@ -992,6 +1025,11 @@ static int mesh_render_data_polys_len_get(const MeshRenderData *rdata)
 	BLI_assert(rdata->types & MR_DATATYPE_POLY);
 	return rdata->poly_len;
 }
+static int mesh_render_data_polys_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+	BLI_assert(rdata->types & MR_DATATYPE_POLY);
+	return ((rdata->mapped.use == false) ? rdata->poly_len : rdata->mapped.poly_len);
+}
 
 /** \} */
 
@@ -2531,7 +2569,7 @@ static GPUVertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex(
 			attr_id.nor = GPU_vertformat_attr_add(&format, "nor", GPU_COMP_I10, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
 		}
 
-		const int tri_len = mesh_render_data_looptri_len_get(rdata);
+		const int tri_len = mesh_render_data_looptri_len_get_maybe_mapped(rdata);
 
 		GPUVertBuf *vbo = *r_vbo = GPU_vertbuf_create_with_format(&format);
 
@@ -2543,103 +2581,170 @@ static GPUVertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex(
 		GPU_vertbuf_attr_get_raw_data(vbo, attr_id.pos, &pos_step);
 		GPU_vertbuf_attr_get_raw_data(vbo, attr_id.nor, &nor_step);
 
-		float (*lnors)[3] = rdata->loop_normals;
-
-		if (rdata->edit_bmesh) {
-			GPUPackedNormal *pnors_pack, *vnors_pack;
+		if (rdata->mapped.use == false) {
+			float (*lnors)[3] = rdata->loop_normals;
+			if (rdata->edit_bmesh) {
+				GPUPackedNormal *pnors_pack, *vnors_pack;
 
-			if (lnors == NULL) {
-				mesh_render_data_ensure_poly_normals_pack(rdata);
-				mesh_render_data_ensure_vert_normals_pack(rdata);
+				if (lnors == NULL) {
+					mesh_render_data_ensure_poly_normals_pack(rdata);
+					mesh_render_data_ensure_vert_normals_pack(rdata);
 
-				pnors_pack = rdata->poly_normals_pack;
-				vnors_pack = rdata->vert_normals_pack;
-			}
+					pnors_pack = rdata->poly_normals_pack;
+					vnors_pack = rdata->vert_normals_pack;
+				}
 
-			for (int i = 0; i < tri_len; i++) {
-				const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
-				const BMFace *bm_face = bm_looptri[0]->f;
+				for (int i = 0; i < tri_len; i++) {
+					const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
+					const BMFace *bm_face = bm_looptri[0]->f;
 
-				/* use_hide always for edit-mode */
-				if (BM_elem_flag_test(bm_face, BM_ELEM_HIDDEN)) {
-					continue;
-				}
+					/* use_hide always for edit-mode */
+					if (BM_elem_flag_test(bm_face, BM_ELEM_HIDDEN)) {
+						continue;
+					}
 
-				if (lnors) {
-					for (uint t = 0; t < 3; t++) {
-						const float *nor = lnors[BM_elem_index_get(bm_looptri[t])];
-						*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+					if (lnors) {
+						for (uint t = 0; t < 3; t++) {
+							const float *nor = lnors[BM_elem_index_get(bm_looptri[t])];
+							*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+						}
 					}
-				}
-				else if (BM_elem_flag_test(bm_face, BM_ELEM_SMOOTH)) {
-					for (uint t = 0; t < 3; t++) {
-						*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = vnors_pack[BM_elem_index_get(bm_looptri[t]->v)];
+					else if (BM_elem_flag_test(bm_face, BM_ELEM_SMOOTH)) {
+						for (uint t = 0; t < 3; t++) {
+							*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = vnors_pack[BM_elem_index_get(bm_looptri[t]->v)];
+						}
 					}
-				}
-				else {
-					const GPUPackedNormal *snor_pack = &pnors_pack[BM_elem_index_get(bm_face)];
-					for (uint t = 0; t < 3; t++) {
-						*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *snor_pack;
+					else {
+						const GPUPackedNormal *snor_pack = &pnors_pack[BM_elem_index_get(bm_face)];
+						for (uint t = 0; t < 3; t++) {
+							*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *snor_pack;
+						}
 					}
-				}
 
-				/* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
-				if (rdata->edit_data && rdata->edit_data->vertexCos) {
-					for (uint t = 0; t < 3; t++) {
-						int vidx = BM_elem_index_get(bm_looptri[t]->v);
-						const float *pos = rdata->edit_data->vertexCos[vidx];
-						copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), pos);
+					/* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+					if (rdata->edit_data && rdata->edit_data->vertexCos) {
+						for (uint t = 0; t < 3; t++) {
+							int vidx = BM_elem_index_get(bm_looptri[t]->v);
+							const float *pos = rdata->edit_data->vertexCos[vidx];
+							copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), pos);
+						}
 					}
-				}
-				else {
-					for (uint t = 0; t < 3; t++) {
-						copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co);
+					else {
+						for (uint t = 0; t < 3; t++) {
+							copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co);
+						}
 					}
 				}
 			}
-		}
-		else {
-			if (lnors == NULL) {
-				/* Use normals from vertex. */
-				mesh_render_data_ensure_poly_normals_pack(rdata);
-			}
+			else {
+				if (lnors == NULL) {
+					/* Use normals from vertex. */
+					mesh_render_data_ensure_poly_normals_pack(rdata);
+				}
 
-			for (int i = 0; i < tri_len; i++) {
-				const MLoopTri *mlt = &rdata->mlooptri[i];
-				const MPoly *mp = &rdata->mpoly[mlt->poly];
+				for (int i = 0; i < tri_len; i++) {
+					const MLoopTri *mlt = &rdata->mlooptri[i];
+					const MPoly *mp = &rdata->mpoly[mlt->poly];
 
-				if (use_hide && (mp->flag & ME_HIDE)) {
-					continue;
-				}
+					if (use_hide && (mp->flag & ME_HIDE)) {
+						continue;
+					}
 
-				const uint vtri[3] = {
-					rdata->mloop[mlt->tri[0]].v,
-					rdata->mloop[mlt->tri[1]].v,
-					rdata->mloop[mlt->tri[2]].v,
-				};
+					const uint vtri[3] = {
+						rdata->mloop[mlt->tri[0]].v,
+						rdata->mloop[mlt->tri[1]].v,
+						rdata->mloop[mlt->tri[2]].v,
+					};
 
-				if (lnors) {
-					for (uint t = 0; t < 3; t++) {
-						const float *nor = lnors[mlt->tri[t]];
-						*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+					if (lnors) {
+						for (uint t = 0; t < 3; t++) {
+							const float *nor = lnors[mlt->tri[t]];
+							*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+						}
 					}
-				}
-				else if (mp->flag & ME_SMOOTH) {
-					for (uint t = 0; t < 3; t++) {
-						const MVert *mv = &rdata->mvert[vtri[t]];
-						*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no);
+					else if (mp->flag & ME_SMOOTH) {
+						for (uint t = 0; t < 3; t++) {
+							const MVert *mv = &rdata->mvert[vtri[t]];
+							*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no);
+						}
 					}
-				}
-				else {
-					const GPUPackedNormal *pnors_pack = &rdata->poly_normals_pack[mlt->poly];
+					else {
+						const GPUPackedNormal *pnors_pack = &rdata->poly_normals_pack[mlt->poly];
+						for (uint t = 0; t < 3; t++) {
+							*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *pnors_pack;
+						}
+					}
+
 					for (uint t = 0; t < 3; t++) {
-						*((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *pnors_pack;
+						const MVert *mv = &rdata->mvert[vtri[t]];
+						copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mv->

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list