diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-08-22 08:11:21 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-08-22 08:15:21 +0300 |
commit | d9de8c469b404819806a63749a0e4e7cbd209044 (patch) | |
tree | 95021f21e04624804521a555936f2e580b2f7c77 | |
parent | f047224458774871f8bf946b86e64a6aa9c00db2 (diff) |
BMesh: loop-cut, display deformed coordinates
Previously this used derived mesh, now use evaluated data.
-rw-r--r-- | source/blender/editors/include/ED_mesh.h | 2 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_loopcut.c | 16 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_preselect.c | 44 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c | 18 |
4 files changed, 52 insertions, 28 deletions
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); |