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
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-07-09 16:59:31 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-07-09 16:59:31 +0400
commitc3c84521f1f936c0f3acbc21bdf895b9fb742f6b (patch)
tree381074bcfbf6d8f93e66cb61bc811c1088150145 /source
parent381df0564144dee310f37a10252b8396175352fa (diff)
fix [#36055] Edge/Face Info display on wrong position with key frames
display editmesh stats with deform modifiers.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h1
-rw-r--r--source/blender/blenkernel/intern/editderivedmesh.c64
-rw-r--r--source/blender/editors/space_view3d/drawobject.c149
3 files changed, 170 insertions, 44 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index fdb43f5467e..ae936a1659a 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -323,6 +323,7 @@ struct DerivedMesh {
/** Get smooth vertex normal, undefined if index is not valid */
void (*getVertNo)(DerivedMesh *dm, int index, float no_r[3]);
+ void (*getPolyNo)(DerivedMesh *dm, int index, float no_r[3]);
/** Get a map of vertices to faces
*/
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index 87f7da8a1fb..46cee96a537 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -1109,6 +1109,66 @@ static void emDM_getVert(DerivedMesh *dm, int index, MVert *r_vert)
copy_v3_v3(r_vert->co, bmdm->vertexCos[index]);
}
+static void emDM_getVertCo(DerivedMesh *dm, int index, float r_co[3])
+{
+ EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
+ BMesh *bm = bmdm->em->bm;
+
+ if (UNLIKELY(index < 0 || index >= bm->totvert)) {
+ BLI_assert(!"error in emDM_getVertCo");
+ return;
+ }
+
+ if (bmdm->vertexCos) {
+ copy_v3_v3(r_co, bmdm->vertexCos[index]);
+ }
+ else {
+ BMVert *ev = bmdm->em->vert_index[index]; /* should be EDBM_vert_at_index() */
+ // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
+ copy_v3_v3(r_co, ev->co);
+ }
+}
+
+static void emDM_getVertNo(DerivedMesh *dm, int index, float r_no[3])
+{
+ EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
+ BMesh *bm = bmdm->em->bm;
+
+ if (UNLIKELY(index < 0 || index >= bm->totvert)) {
+ BLI_assert(!"error in emDM_getVertNo");
+ return;
+ }
+
+ if (bmdm->vertexNos) {
+ copy_v3_v3(r_no, bmdm->vertexNos[index]);
+ }
+ else {
+ BMVert *ev = bmdm->em->vert_index[index]; /* should be EDBM_vert_at_index() */
+ // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
+ copy_v3_v3(r_no, ev->no);
+ }
+}
+
+static void emDM_getPolyNo(DerivedMesh *dm, int index, float r_no[3])
+{
+ EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
+ BMesh *bm = bmdm->em->bm;
+
+ if (UNLIKELY(index < 0 || index >= bm->totface)) {
+ BLI_assert(!"error in emDM_getPolyNo");
+ return;
+ }
+
+ if (bmdm->polyNos) {
+ copy_v3_v3(r_no, bmdm->polyNos[index]);
+ }
+ else {
+ BMFace *efa = bmdm->em->face_index[index]; /* should be EDBM_vert_at_index() */
+ // efa = BM_face_at_index(bm, index); /* warning, does list loop, _not_ ideal */
+ copy_v3_v3(r_no, efa->no);
+ }
+}
+
static void emDM_getEdge(DerivedMesh *dm, int index, MEdge *r_edge)
{
EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
@@ -1456,6 +1516,9 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em,
bmdm->dm.getNumPolys = emDM_getNumPolys;
bmdm->dm.getVert = emDM_getVert;
+ bmdm->dm.getVertCo = emDM_getVertCo;
+ bmdm->dm.getVertNo = emDM_getVertNo;
+ bmdm->dm.getPolyNo = emDM_getPolyNo;
bmdm->dm.getEdge = emDM_getEdge;
bmdm->dm.getTessFace = emDM_getTessFace;
bmdm->dm.copyVertArray = emDM_copyVertArray;
@@ -1487,6 +1550,7 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em,
bmdm->dm.release = emDM_release;
bmdm->vertexCos = vertexCos;
+ bmdm->dm.deformedOnly = (vertexCos != NULL);
if (cd_dvert_offset != -1) {
BMIter iter;
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index d5ecdaf0596..55e1fae38e4 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -2699,7 +2699,10 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe
const bool do_global = (v3d->flag & V3D_GLOBAL_STATS) != 0;
const bool do_moving = (G.moving & G_TRANSFORM_EDIT) != 0;
float clip_planes[4][4];
-
+ /* allow for displaying shape keys and deform mods */
+ DerivedMesh *dm = ((em->derivedFinal != NULL) &&
+ (em->derivedFinal->type == DM_TYPE_EDITBMESH) &&
+ (em->derivedFinal->deformedOnly != false)) ? em->derivedFinal : NULL;
BMIter iter;
int i;
@@ -2725,23 +2728,33 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe
UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGELEN, col);
- eed = BM_iter_new(&iter, em->bm, BM_EDGES_OF_MESH, NULL);
- for (; eed; eed = BM_iter_step(&iter)) {
+ if (dm) {
+ BM_mesh_elem_index_ensure(em->bm, BM_VERT);
+ }
+
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
/* draw selected edges, or edges next to selected verts while draging */
if (BM_elem_flag_test(eed, BM_ELEM_SELECT) ||
(do_moving && (BM_elem_flag_test(eed->v1, BM_ELEM_SELECT) ||
BM_elem_flag_test(eed->v2, BM_ELEM_SELECT))))
{
+ float v1_clip[3], v2_clip[3];
- copy_v3_v3(v1, eed->v1->co);
- copy_v3_v3(v2, eed->v2->co);
+ if (dm) {
+ dm->getVertCo(dm, BM_elem_index_get(eed->v1), v1);
+ dm->getVertCo(dm, BM_elem_index_get(eed->v2), v2);
+ }
+ else {
+ copy_v3_v3(v1, eed->v1->co);
+ copy_v3_v3(v2, eed->v2->co);
+ }
- if (clip_segment_v3_plane_n(v1, v2, clip_planes, 4)) {
+ copy_v3_v3(v1_clip, v1);
+ copy_v3_v3(v2_clip, v2);
- mid_v3_v3v3(vmid, v1, v2);
+ if (clip_segment_v3_plane_n(v1_clip, v2_clip, clip_planes, 4)) {
- copy_v3_v3(v1, eed->v1->co);
- copy_v3_v3(v2, eed->v2->co);
+ mid_v3_v3v3(vmid, v1_clip, v2_clip);
if (do_global) {
mul_mat3_m4_v3(ob->obmat, v1);
@@ -2768,10 +2781,13 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe
UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGEANG, col);
+ if (dm) {
+ BM_mesh_elem_index_ensure(em->bm, BM_VERT | BM_FACE);
+ }
+
// invert_m4_m4(ob->imat, ob->obmat); // this is already called
- eed = BM_iter_new(&iter, em->bm, BM_EDGES_OF_MESH, NULL);
- for (; eed; eed = BM_iter_step(&iter)) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
BMLoop *l_a, *l_b;
if (BM_edge_loop_pair(eed, &l_a, &l_b)) {
/* draw selected edges, or edges next to selected verts while draging */
@@ -2786,30 +2802,44 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe
BM_elem_flag_test(l_b->prev->v, BM_ELEM_SELECT)
)))
{
- copy_v3_v3(v1, eed->v1->co);
- copy_v3_v3(v2, eed->v2->co);
-
- if (clip_segment_v3_plane_n(v1, v2, clip_planes, 4)) {
- float angle;
-
- mid_v3_v3v3(vmid, v1, v2);
+ float v1_clip[3], v2_clip[3];
+ if (dm) {
+ dm->getVertCo(dm, BM_elem_index_get(eed->v1), v1);
+ dm->getVertCo(dm, BM_elem_index_get(eed->v2), v2);
+ }
+ else {
copy_v3_v3(v1, eed->v1->co);
copy_v3_v3(v2, eed->v2->co);
+ }
- if (do_global) {
- float no_a[3];
- float no_b[3];
+ copy_v3_v3(v1_clip, v1);
+ copy_v3_v3(v2_clip, v2);
+
+ if (clip_segment_v3_plane_n(v1_clip, v2_clip, clip_planes, 4)) {
+ float no_a[3], no_b[3];
+ float angle;
+
+ mid_v3_v3v3(vmid, v1_clip, v2_clip);
+
+ if (dm) {
+ dm->getPolyNo(dm, BM_elem_index_get(l_a->f), no_a);
+ dm->getPolyNo(dm, BM_elem_index_get(l_b->f), no_b);
+ }
+ else {
copy_v3_v3(no_a, l_a->f->no);
copy_v3_v3(no_b, l_b->f->no);
+ }
+
+ if (do_global) {
mul_mat3_m4_v3(ob->imat, no_a);
mul_mat3_m4_v3(ob->imat, no_b);
- angle = angle_v3v3(no_a, no_b);
- }
- else {
- angle = angle_normalized_v3v3(l_a->f->no, l_b->f->no);
+ normalize_v3(no_a);
+ normalize_v3(no_b);
}
+ angle = angle_normalized_v3v3(no_a, no_b);
+
BLI_snprintf(numstr, sizeof(numstr), "%.3f", is_rad ? angle : RAD2DEGF(angle));
view3d_cached_text_draw_add(vmid, numstr, 0, txt_flag, col);
@@ -2844,6 +2874,10 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe
UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEAREA, col);
+ if (dm) {
+ BM_mesh_elem_index_ensure(em->bm, BM_VERT);
+ }
+
f = NULL;
area = 0.0;
zero_v3(vmid);
@@ -2858,9 +2892,18 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe
}
f = l[0]->f;
- copy_v3_v3(v1, l[0]->v->co);
- copy_v3_v3(v2, l[1]->v->co);
- copy_v3_v3(v3, l[2]->v->co);
+
+ if (dm) {
+ dm->getVertCo(dm, BM_elem_index_get(l[0]->v), v1);
+ dm->getVertCo(dm, BM_elem_index_get(l[1]->v), v2);
+ dm->getVertCo(dm, BM_elem_index_get(l[2]->v), v3);
+ }
+ else {
+ copy_v3_v3(v1, l[0]->v->co);
+ copy_v3_v3(v2, l[1]->v->co);
+ copy_v3_v3(v3, l[2]->v->co);
+ }
+
add_v3_v3(vmid, v1);
add_v3_v3(vmid, v2);
add_v3_v3(vmid, v3);
@@ -2885,6 +2928,9 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe
UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEANG, col);
+ if (dm) {
+ BM_mesh_elem_index_ensure(em->bm, BM_VERT);
+ }
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
const int is_face_sel = BM_elem_flag_test(efa, BM_ELEM_SELECT);
@@ -2897,35 +2943,50 @@ static void draw_em_measure_stats(ARegion *ar, View3D *v3d, Object *ob, BMEditMe
BM_ITER_ELEM (loop, &liter, efa, BM_LOOPS_OF_FACE) {
if (is_face_sel || (do_moving && BM_elem_flag_test(loop->v, BM_ELEM_SELECT))) {
float angle;
+ float v2_local[3];
/* lazy init center calc */
if (is_first) {
- BM_face_calc_center_bounds(efa, vmid);
- /* Avoid triple matrix multiply every vertex for 'global' */
- if (do_global) {
- copy_v3_v3(v1, loop->prev->v->co);
- copy_v3_v3(v2, loop->v->co);
- mul_mat3_m4_v3(ob->obmat, v1);
- mul_mat3_m4_v3(ob->obmat, v2);
+ if (dm) {
+ BMLoop *l_iter, *l_first;
+ float tvec[3];
+ zero_v3(vmid);
+ l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
+ do {
+ dm->getVertCo(dm, BM_elem_index_get(l_iter->v), tvec);
+ add_v3_v3(vmid, tvec);
+ } while ((l_iter = l_iter->next) != l_first);
+ mul_v3_fl(vmid, 1.0f / (float)efa->len);
+ }
+ else {
+ BM_face_calc_center_bounds(efa, vmid);
}
is_first = false;
}
- if (do_global) {
+ if (dm) {
+ dm->getVertCo(dm, BM_elem_index_get(loop->prev->v), v1);
+ dm->getVertCo(dm, BM_elem_index_get(loop->v), v2);
+ dm->getVertCo(dm, BM_elem_index_get(loop->next->v), v3);
+ }
+ else {
+ copy_v3_v3(v1, loop->prev->v->co);
+ copy_v3_v3(v2, loop->v->co);
copy_v3_v3(v3, loop->next->v->co);
+ }
- mul_mat3_m4_v3(ob->obmat, v3);
+ copy_v3_v3(v2_local, v2);
- angle = angle_v3v3v3(v1, v2, v3);
- copy_v3_v3(v1, v2);
- copy_v3_v3(v2, v3);
- }
- else {
- angle = angle_v3v3v3(loop->prev->v->co, loop->v->co, loop->next->v->co);
+ if (do_global) {
+ mul_mat3_m4_v3(ob->obmat, v1);
+ mul_mat3_m4_v3(ob->obmat, v2);
+ mul_mat3_m4_v3(ob->obmat, v3);
}
+ angle = angle_v3v3v3(v1, v2, v3);
+
BLI_snprintf(numstr, sizeof(numstr), "%.3f", is_rad ? angle : RAD2DEGF(angle));
- interp_v3_v3v3(fvec, vmid, loop->v->co, 0.8f);
+ interp_v3_v3v3(fvec, vmid, v2_local, 0.8f);
view3d_cached_text_draw_add(fvec, numstr, 0, txt_flag, col);
}
}