Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-08-22 08:11:21 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-08-22 08:15:21 +0300
commitd9de8c469b404819806a63749a0e4e7cbd209044 (patch)
tree95021f21e04624804521a555936f2e580b2f7c77 /source/blender/editors/mesh
parentf047224458774871f8bf946b86e64a6aa9c00db2 (diff)
BMesh: loop-cut, display deformed coordinates
Previously this used derived mesh, now use evaluated data.
Diffstat (limited to 'source/blender/editors/mesh')
-rw-r--r--source/blender/editors/mesh/editmesh_loopcut.c16
-rw-r--r--source/blender/editors/mesh/editmesh_preselect.c44
2 files changed, 36 insertions, 24 deletions
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);
}
}