diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index 19a621a..59c8a83 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -56,6 +56,7 @@ #include "DNA_scene_types.h" #include "DNA_object_types.h" +#include "BKE_deform.h" #include "MEM_guardedalloc.h" #include "GPU_extensions.h" @@ -304,44 +305,104 @@ static void emDM_drawEdges(DerivedMesh *dm, emDM_drawMappedEdges(dm, NULL, NULL); } +static void bm_vert_weight_gl_color(BMVert *eve, int vgroup_index, int cd_dvert_offset) +{ + MDeformVert *dvert; + float weight; + float col[3]; + + if (cd_dvert_offset != -1) { + dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset); + weight = defvert_find_weight(dvert, vgroup_index); + } + else { + weight = 0.0f; + } + + weight_to_rgb(col, weight); + glColor3fv(col); +} + static void emDM_drawMappedEdgesInterp(DerivedMesh *dm, DMSetDrawOptions setDrawOptions, DMSetDrawInterpOptions setDrawInterpOptions, void *userData) { EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; + BMesh *bm = bmdm->em->bm; + Object *ob = bmdm->em->ob; + BMEdge *eed; BMIter iter; int i; + const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT); + const bool draw_weights = ((((Mesh *)ob->data)->drawflag & ME_DRAWEIGHT) != 0); - if (bmdm->vertexCos) { + glBegin(GL_LINES); - BM_mesh_elem_index_ensure(bm, BM_VERT); + if (draw_weights) { + const int vgroup_index = ob->actdef - 1; - glBegin(GL_LINES); - BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { - if (!setDrawOptions || (setDrawOptions(userData, i) != DM_DRAW_OPTION_SKIP)) { - setDrawInterpOptions(userData, i, 0.0); - glVertex3fv(bmdm->vertexCos[BM_elem_index_get(eed->v1)]); - setDrawInterpOptions(userData, i, 1.0); - glVertex3fv(bmdm->vertexCos[BM_elem_index_get(eed->v2)]); + glEnable(GL_BLEND); + + if (bmdm->vertexCos) { + + BM_mesh_elem_index_ensure(bm, BM_VERT); + + BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { + if (!setDrawOptions || (setDrawOptions(userData, i) != DM_DRAW_OPTION_SKIP)) { + bm_vert_weight_gl_color(eed->v1, vgroup_index, cd_dvert_offset); + glVertex3fv(bmdm->vertexCos[BM_elem_index_get(eed->v1)]); + + bm_vert_weight_gl_color(eed->v2, vgroup_index, cd_dvert_offset); + glVertex3fv(bmdm->vertexCos[BM_elem_index_get(eed->v2)]); + } } } - glEnd(); + else { + + BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { + if (!setDrawOptions || (setDrawOptions(userData, i) != DM_DRAW_OPTION_SKIP)) { + bm_vert_weight_gl_color(eed->v1, vgroup_index, cd_dvert_offset); + glVertex3fv(eed->v1->co); + + bm_vert_weight_gl_color(eed->v2, vgroup_index, cd_dvert_offset); + glVertex3fv(eed->v2->co); + } + } + } + + glDisable(GL_BLEND); } else { - glBegin(GL_LINES); - BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { - if (!setDrawOptions || (setDrawOptions(userData, i) != DM_DRAW_OPTION_SKIP)) { - setDrawInterpOptions(userData, i, 0.0); - glVertex3fv(eed->v1->co); - setDrawInterpOptions(userData, i, 1.0); - glVertex3fv(eed->v2->co); + + if (bmdm->vertexCos) { + + BM_mesh_elem_index_ensure(bm, BM_VERT); + + BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { + if (!setDrawOptions || (setDrawOptions(userData, i) != DM_DRAW_OPTION_SKIP)) { + setDrawInterpOptions(userData, i, 0.0); + glVertex3fv(bmdm->vertexCos[BM_elem_index_get(eed->v1)]); + setDrawInterpOptions(userData, i, 1.0); + glVertex3fv(bmdm->vertexCos[BM_elem_index_get(eed->v2)]); + } + } + } + else { + + BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { + if (!setDrawOptions || (setDrawOptions(userData, i) != DM_DRAW_OPTION_SKIP)) { + setDrawInterpOptions(userData, i, 0.0); + glVertex3fv(eed->v1->co); + setDrawInterpOptions(userData, i, 1.0); + glVertex3fv(eed->v2->co); + } } } - glEnd(); } + + glEnd(); } static void emDM_drawUVEdges(DerivedMesh *dm) diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 178a7aa..9740eb8 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -2777,7 +2777,9 @@ static void draw_em_fancy_edges(BMEditMesh *em, Scene *scene, View3D *v3d, draw_dm_edges_sel(em, cageDM, wireCol, selCol, actCol, eed_act); } else if ((me->drawflag & ME_DRAWEDGES) || (ts->selectmode & SCE_SELECT_EDGE)) { - if (cageDM->drawMappedEdgesInterp && (ts->selectmode & SCE_SELECT_VERTEX)) { + if (cageDM->drawMappedEdgesInterp && + ((ts->selectmode & SCE_SELECT_VERTEX) || (me->drawflag & ME_DRAWEIGHT))) + { glShadeModel(GL_SMOOTH); draw_dm_edges_sel_interp(em, cageDM, wireCol, selCol); glShadeModel(GL_FLAT); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index d22dca4..c21e15a 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -37,6 +37,7 @@ #include "DNA_customdata_types.h" #include "DNA_object_types.h" #include "DNA_group_types.h" +#include "DNA_mesh_types.h" #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_scene_types.h" @@ -2580,14 +2581,28 @@ static void view3d_draw_objects( view3d_draw_clipping(rv3d); /* set zbuffer after we draw clipping region */ + if (v3d->drawtype > OB_WIRE) { v3d->zbuf = true; - glEnable(GL_DEPTH_TEST); } else { v3d->zbuf = false; } + /* special case (depth for wire color) */ + if (v3d->drawtype <= OB_WIRE) { + if (scene->obedit && scene->obedit->type == OB_MESH) { + Mesh *me = scene->obedit->data; + if (me->drawflag & ME_DRAWEIGHT) { + v3d->zbuf = true; + } + } + } + + if (v3d->zbuf) { + glEnable(GL_DEPTH_TEST); + } + if (!draw_offscreen) { /* needs to be done always, gridview is adjusted in drawgrid() now, but only for ortho views. */ rv3d->gridview = v3d->grid;