[Bf-blender-cvs] [d9de8c469b4] blender2.8: BMesh: loop-cut, display deformed coordinates

Campbell Barton noreply at git.blender.org
Wed Aug 22 07:10:40 CEST 2018


Commit: d9de8c469b404819806a63749a0e4e7cbd209044
Author: Campbell Barton
Date:   Wed Aug 22 15:11:21 2018 +1000
Branches: blender2.8
https://developer.blender.org/rBd9de8c469b404819806a63749a0e4e7cbd209044

BMesh: loop-cut, display deformed coordinates

Previously this used derived mesh, now use evaluated data.

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

M	source/blender/editors/include/ED_mesh.h
M	source/blender/editors/mesh/editmesh_loopcut.c
M	source/blender/editors/mesh/editmesh_preselect.c
M	source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c

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

diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 8fff5490d61..a9ef7d9283f 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -200,7 +200,7 @@ void EDBM_preselect_edgering_clear(struct EditMesh_PreSelEdgeRing *psel);
 void EDBM_preselect_edgering_draw(struct EditMesh_PreSelEdgeRing *psel, const float matrix[4][4]);
 void EDBM_preselect_edgering_update_from_edge(
         struct EditMesh_PreSelEdgeRing *psel,
-        struct BMesh *bm, struct BMEdge *eed_start, int previewlines);
+        struct BMesh *bm, struct BMEdge *eed_start, int previewlines, const float (*coords)[3]);
 
 /* mesh_ops.c */
 void        ED_operatortypes_mesh(void);
diff --git a/source/blender/editors/mesh/editmesh_loopcut.c b/source/blender/editors/mesh/editmesh_loopcut.c
index 4fc57224580..f239ccc5be1 100644
--- a/source/blender/editors/mesh/editmesh_loopcut.c
+++ b/source/blender/editors/mesh/editmesh_loopcut.c
@@ -38,6 +38,8 @@
 
 #include "BLT_translation.h"
 
+#include "DNA_mesh_types.h"
+
 #include "BKE_context.h"
 #include "BKE_modifier.h"
 #include "BKE_report.h"
@@ -66,6 +68,7 @@
 #include "WM_types.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
 
 #include "mesh_intern.h"  /* own include */
 
@@ -83,6 +86,8 @@ typedef struct RingSelOpData {
 
 	ViewContext vc;
 
+	Depsgraph *depsgraph;
+
 	Object **objects;
 	uint     objects_len;
 
@@ -142,7 +147,14 @@ static void edgering_select(RingSelOpData *lcd)
 static void ringsel_find_edge(RingSelOpData *lcd, const int previewlines)
 {
 	if (lcd->eed) {
-		EDBM_preselect_edgering_update_from_edge(lcd->presel_edgering, lcd->em->bm, lcd->eed, previewlines);
+		const float (*coords)[3] = NULL;
+		{
+			Mesh *me_eval = (Mesh *)DEG_get_evaluated_id(lcd->depsgraph, lcd->ob->data);
+			if (me_eval->runtime.edit_data) {
+				coords = me_eval->runtime.edit_data->vertexCos;
+			}
+		}
+		EDBM_preselect_edgering_update_from_edge(lcd->presel_edgering, lcd->em->bm, lcd->eed, previewlines, coords);
 	}
 	else {
 		EDBM_preselect_edgering_clear(lcd->presel_edgering);
@@ -253,6 +265,8 @@ static int ringsel_init(bContext *C, wmOperator *op, bool do_cut)
 
 	em_setup_viewcontext(C, &lcd->vc);
 
+	lcd->depsgraph = CTX_data_depsgraph(C);
+
 	/* assign the drawing handle for drawing preview line... */
 	lcd->ar = CTX_wm_region(C);
 	lcd->draw_handle = ED_region_draw_cb_activate(lcd->ar->type, ringsel_draw, lcd, REGION_DRAW_POST_VIEW);
diff --git a/source/blender/editors/mesh/editmesh_preselect.c b/source/blender/editors/mesh/editmesh_preselect.c
index 3763cc68e87..97a866ba9fa 100644
--- a/source/blender/editors/mesh/editmesh_preselect.c
+++ b/source/blender/editors/mesh/editmesh_preselect.c
@@ -47,21 +47,17 @@
  *
  * \{ */
 
-static void edgering_vcos_get(BMVert *v[2][2], float r_cos[2][2][3])
+static void edgering_vcos_get(BMVert *v[2][2], float r_cos[2][2][3], const float (*coords)[3])
 {
-	/* TODO, get deformed coords. */
-#if 0
-	if (dm) {
+	if (coords) {
 		int j, k;
 		for (j = 0; j < 2; j++) {
 			for (k = 0; k < 2; k++) {
-				dm->getVertCo(dm, BM_elem_index_get(v[j][k]), r_cos[j][k]);
+				copy_v3_v3(r_cos[j][k], coords[BM_elem_index_get(v[j][k])]);
 			}
 		}
 	}
-	else
-#endif
-	{
+	else {
 		int j, k;
 		for (j = 0; j < 2; j++) {
 			for (k = 0; k < 2; k++) {
@@ -71,18 +67,15 @@ static void edgering_vcos_get(BMVert *v[2][2], float r_cos[2][2][3])
 	}
 }
 
-static void edgering_vcos_get_pair(BMVert *v[2], float r_cos[2][3])
+static void edgering_vcos_get_pair(BMVert *v[2], float r_cos[2][3], const float (*coords)[3])
 {
-#if 0
-	if (dm) {
+	if (coords) {
 		int j;
 		for (j = 0; j < 2; j++) {
-			dm->getVertCo(dm, BM_elem_index_get(v[j]), r_cos[j]);
+			copy_v3_v3(r_cos[j], coords[BM_elem_index_get(v[j])]);
 		}
 	}
-	else
-#endif
-	{
+	else {
 		int j;
 		for (j = 0; j < 2; j++) {
 			copy_v3_v3(r_cos[j], v[j]->co);
@@ -216,7 +209,7 @@ void EDBM_preselect_edgering_draw(
 
 static void view3d_preselect_mesh_edgering_update_verts_from_edge(
         struct EditMesh_PreSelEdgeRing *psel,
-        BMesh *UNUSED(bm), BMEdge *eed_start, int previewlines)
+        BMesh *UNUSED(bm), BMEdge *eed_start, int previewlines, const float (*coords)[3])
 {
 	float v_cos[2][3];
 	float (*verts)[3];
@@ -224,7 +217,7 @@ static void view3d_preselect_mesh_edgering_update_verts_from_edge(
 
 	verts = MEM_mallocN(sizeof(*psel->verts) * previewlines, __func__);
 
-	edgering_vcos_get_pair(&eed_start->v1, v_cos);
+	edgering_vcos_get_pair(&eed_start->v1, v_cos, coords);
 
 	for (i = 1; i <= previewlines; i++) {
 		const float fac = (i / ((float)previewlines + 1));
@@ -238,7 +231,7 @@ static void view3d_preselect_mesh_edgering_update_verts_from_edge(
 
 static void view3d_preselect_mesh_edgering_update_edges_from_edge(
         struct EditMesh_PreSelEdgeRing *psel,
-        BMesh *bm, BMEdge *eed_start, int previewlines)
+        BMesh *bm, BMEdge *eed_start, int previewlines, const float (*coords)[3])
 {
 	BMWalker walker;
 	BMEdge *eed, *eed_last;
@@ -292,7 +285,7 @@ static void view3d_preselect_mesh_edgering_update_edges_from_edge(
 				const float fac = (i / ((float)previewlines + 1));
 				float v_cos[2][2][3];
 
-				edgering_vcos_get(v, v_cos);
+				edgering_vcos_get(v, v_cos, coords);
 
 				interp_v3_v3v3(edges[tot][0], v_cos[0][0], v_cos[0][1], fac);
 				interp_v3_v3v3(edges[tot][1], v_cos[1][0], v_cos[1][1], fac);
@@ -323,7 +316,7 @@ static void view3d_preselect_mesh_edgering_update_edges_from_edge(
 				continue;
 			}
 
-			edgering_vcos_get(v, v_cos);
+			edgering_vcos_get(v, v_cos, coords);
 
 			interp_v3_v3v3(edges[tot][0], v_cos[0][0], v_cos[0][1], fac);
 			interp_v3_v3v3(edges[tot][1], v_cos[1][0], v_cos[1][1], fac);
@@ -339,14 +332,19 @@ static void view3d_preselect_mesh_edgering_update_edges_from_edge(
 
 void EDBM_preselect_edgering_update_from_edge(
         struct EditMesh_PreSelEdgeRing *psel,
-        BMesh *bm, BMEdge *eed_start, int previewlines)
+        BMesh *bm, BMEdge *eed_start, int previewlines, const float (*coords)[3])
 {
 	EDBM_preselect_edgering_clear(psel);
+
+	if (coords) {
+		BM_mesh_elem_index_ensure(bm, BM_VERT);
+	}
+
 	if (BM_edge_is_wire(eed_start)) {
-		view3d_preselect_mesh_edgering_update_verts_from_edge(psel, bm, eed_start, previewlines);
+		view3d_preselect_mesh_edgering_update_verts_from_edge(psel, bm, eed_start, previewlines, coords);
 	}
 	else {
-		view3d_preselect_mesh_edgering_update_edges_from_edge(psel, bm, eed_start, previewlines);
+		view3d_preselect_mesh_edgering_update_edges_from_edge(psel, bm, eed_start, previewlines, coords);
 	}
 
 }
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
index 2934c55df6e..fffca6c0887 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
@@ -32,10 +32,15 @@
 
 #include "BLI_math.h"
 
+#include "DNA_mesh_types.h"
+
 #include "BKE_context.h"
 #include "BKE_layer.h"
 #include "BKE_editmesh.h"
 
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
+
 #include "RNA_access.h"
 #include "RNA_define.h"
 
@@ -134,9 +139,16 @@ static int gizmo_preselect_edgering_test_select(
 	}
 	else {
 		if (best.eed) {
-			EDBM_preselect_edgering_update_from_edge(
-			        gz_ring->psel,
-			        bm, best.eed, 1);
+			const float (*coords)[3] = NULL;
+			{
+				Object *ob = gz_ring->objects[gz_ring->object_index];
+				Depsgraph *depsgraph = CTX_data_depsgraph(C);
+				Mesh *me_eval = (Mesh *)DEG_get_evaluated_id(depsgraph, ob->data);
+				if (me_eval->runtime.edit_data) {
+					coords = me_eval->runtime.edit_data->vertexCos;
+				}
+			}
+			EDBM_preselect_edgering_update_from_edge(gz_ring->psel, bm, best.eed, 1, coords);
 		}
 		else {
 			EDBM_preselect_edgering_clear(gz_ring->psel);



More information about the Bf-blender-cvs mailing list