diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index b3e0bfa..60a382a 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" @@ -280,44 +281,112 @@ 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; + MDeformWeight *dw; + float weight; + float col[3]; + + dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset); + + dw = defvert_find_index(dvert, vgroup_index); + + if (dw) { + weight = dw->weight; + } + 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; + GLboolean use_depth = false; + const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT); + const bool draw_weights = ((cd_dvert_offset != -1) && + ((((Mesh *)ob->data)->drawflag & ME_DRAWEIGHT) != 0) && + (glGetBooleanv(GL_DEPTH_TEST, (GLboolean *)&use_depth), !use_depth)); - 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)