Commit: bab75f8bf6a7b26e824f4d76d580940a1deb4489
Author: Gaia Clary
Date:   Thu Jun 19 04:01:19 2014 +1000
https://developer.blender.org/rBbab75f8bf6a7b26e824f4d76d580940a1deb4489

Editmesh: add ability to show weights on wire T39054, D585

===================================================================

M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/editors/space_view3d/view3d_draw.c

===================================================================

diff --git a/source/blender/editors/space_view3d/drawobject.c 
b/source/blender/editors/space_view3d/drawobject.c
index 608d5d1..9c2d482 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -152,6 +152,15 @@ typedef struct drawDMEdgesSelInterp_userData {
        unsigned char *lastCol;
 } drawDMEdgesSelInterp_userData;
 
+typedef struct drawDMEdgesWeightInterp_userData {
+       int cd_dvert_offset;
+       int defgroup_tot;
+       int vgroup_index;
+       char weight_user;
+       float alert_color[3];
+
+} drawDMEdgesWeightInterp_userData;
+
 typedef struct drawDMFacesSel_userData {
 #ifdef WITH_FREESTYLE
        unsigned char *cols[4];
@@ -2420,6 +2429,79 @@ static void draw_dm_edges_sel_interp(BMEditMesh *em, 
DerivedMesh *dm, unsigned c
        dm->drawMappedEdgesInterp(dm, draw_dm_edges_sel_interp__setDrawOptions, 
draw_dm_edges_sel_interp__setDrawInterpOptions, &data);
 }
 
+static void bm_color_from_weight(float col[3], BMVert *vert, 
drawDMEdgesWeightInterp_userData *data)
+{
+       MDeformVert *dvert = BM_ELEM_CD_GET_VOID_P(vert, data->cd_dvert_offset);
+       float weight = defvert_find_weight(dvert, data->vgroup_index);
+
+       if ((weight == 0.0f) &&
+           ((data->weight_user == OB_DRAW_GROUPUSER_ACTIVE) ||
+            ((data->weight_user == OB_DRAW_GROUPUSER_ALL) && 
defvert_is_weight_zero(dvert, data->defgroup_tot))))
+       {
+               copy_v3_v3(col, data->alert_color);
+       }
+       else {
+               weight_to_rgb(col, weight);
+       }
+}
+
+static void draw_dm_edges_weight_interp__setDrawInterpOptions(void *userData, 
int index, float t)
+{
+       drawDMEdgesWeightInterp_userData *data = userData;
+       BMEdge *eed = BM_edge_at_index(((void **)userData)[0], index);
+       float col[3];
+
+       if (t == 0.0f) {
+               bm_color_from_weight(col, eed->v1, data);
+       }
+       else if (t == 1.0f) {
+               bm_color_from_weight(col, eed->v2, data);
+       }
+       else {
+               float col_v1[3];
+               float col_v2[3];
+
+               bm_color_from_weight(col_v1, eed->v1, data);
+               bm_color_from_weight(col_v2, eed->v2, data);
+               interp_v3_v3v3(col, col_v1, col_v2, t);
+       }
+
+       glColor3fv(col);
+}
+
+static void draw_dm_edges_weight_interp(BMEditMesh *em, DerivedMesh *dm, const 
char weight_user)
+{
+       drawDMEdgesWeightInterp_userData data;
+       Object *ob = em->ob;
+
+       data.cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, 
CD_MDEFORMVERT);
+       data.defgroup_tot = BLI_countlist(&ob->defbase);
+       data.vgroup_index = ob->actdef - 1;
+       data.weight_user = weight_user;
+       UI_GetThemeColor3fv(TH_VERTEX_UNREFERENCED, data.alert_color);
+
+       glEnable(GL_BLEND);
+       dm->drawMappedEdgesInterp(dm, draw_dm_edges_sel_interp__setDrawOptions, 
draw_dm_edges_weight_interp__setDrawInterpOptions, &data);
+       glDisable(GL_BLEND);
+}
+
+static bool draw_dm_edges_weight_check(Mesh *me, BMEditMesh *em, View3D *v3d)
+{
+       if ((me->drawflag & ME_DRAWEIGHT) &&
+           (em->ob->actdef) &&
+           (CustomData_has_layer(&em->bm->vdata, CD_MDEFORMVERT)))
+       {
+               if ((v3d->drawtype == OB_WIRE) ||
+                   (v3d->flag2 & V3D_SOLID_MATCAP) ||
+                   ((v3d->flag2 & V3D_OCCLUDE_WIRE) && (v3d->drawtype > 
OB_WIRE)))
+               {
+                       return true;
+               }
+       }
+
+       return false;
+}
+
 /* Draw only seam edges */
 static DMDrawOption draw_dm_edges_seams__setDrawOptions(void *userData, int 
index)
 {
@@ -2832,9 +2914,16 @@ 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);
+                               if (draw_dm_edges_weight_check(me, em, v3d)) {
+                                       draw_dm_edges_weight_interp(em, cageDM, 
ts->weightuser);
+                               }
+                               else {
+                                       draw_dm_edges_sel_interp(em, cageDM, 
wireCol, selCol);
+                               }
                                glShadeModel(GL_FLAT);
                        }
                        else {
diff --git a/source/blender/editors/space_view3d/view3d_draw.c 
b/source/blender/editors/space_view3d/view3d_draw.c
index ce74c54..5ec15a2 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"
@@ -2607,12 +2608,25 @@ static void view3d_draw_objects(
        /* 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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to