Revision: 46892
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46892
Author:   nicholasbishop
Date:     2012-05-22 15:29:27 +0000 (Tue, 22 May 2012)
Log Message:
-----------
Draw skin vertex roots in edit mode.

Roots are drawn with a view-oriented dashed red circle around the
vertex location. The circle's radius is the average if the skin
vertex's X and Y radii.

Skin modifier documentation:
http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c 2012-05-22 
15:29:15 UTC (rev 46891)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c 2012-05-22 
15:29:27 UTC (rev 46892)
@@ -1161,7 +1161,7 @@
     CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_SHAPE_KEYINDEX |
     CD_MASK_MCOL | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR |
     CD_MASK_MDISPS | CD_MASK_SHAPEKEY | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
-    CD_MASK_GRID_PAINT_MASK;
+    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN;
 const CustomDataMask CD_MASK_DERIVEDMESH =
     CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
     CD_MASK_MCOL | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO |

Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c    
2012-05-22 15:29:15 UTC (rev 46891)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c    
2012-05-22 15:29:27 UTC (rev 46892)
@@ -1688,6 +1688,20 @@
                }
        }
 
+       if (CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) {
+               BMIter iter;
+               BMVert *eve;
+               int i;
+
+               DM_add_vert_layer(&bmdm->dm, CD_MVERT_SKIN, CD_CALLOC, NULL);
+
+               BM_ITER_MESH_INDEX (eve, &iter, bmdm->tc->bm, BM_VERTS_OF_MESH, 
i) {
+                       DM_set_vert_data(&bmdm->dm, i, CD_MVERT_SKIN,
+                                                        
CustomData_bmesh_get(&bm->vdata, eve->head.data,
+                                                                               
                  CD_MVERT_SKIN));
+               }
+       }
+
        if (vertexCos) {
                BMFace *efa;
                BMVert *eve;

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c      
2012-05-22 15:29:15 UTC (rev 46891)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c      
2012-05-22 15:29:27 UTC (rev 46892)
@@ -143,6 +143,17 @@
 
        int sel;
        BMVert *eve_act;
+
+       /* cached theme values */
+       unsigned char th_editmesh_active[4];
+       unsigned char th_vertex_select[4];
+       unsigned char th_vertex[4];
+       unsigned char th_skin_root[4];
+       float th_vertex_size;
+
+       /* for skin node drawing */
+       int has_vskin;
+       float imat[4][4];
 } drawDMVerts_userData;
 
 typedef struct drawDMEdgesSel_userData {
@@ -2400,20 +2411,37 @@
        BMVert *eve = EDBM_vert_at_index(data->em, index);
 
        if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN) && BM_elem_flag_test(eve, 
BM_ELEM_SELECT) == data->sel) {
+               /* skin nodes: draw a red circle around the root
+                  node(s) */
+               if(data->has_vskin) {
+                       const MVertSkin *vs = 
CustomData_bmesh_get(&data->em->bm->vdata,
+                                                                               
                           eve->head.data,
+                                                                               
                           CD_MVERT_SKIN);
+                       if (vs->flag & MVERT_SKIN_ROOT) {
+                               float radius = (vs->radius[0] + vs->radius[1]) 
* 0.5f;
+                               bglEnd();
+                       
+                               glColor4ubv(data->th_skin_root);
+                               drawcircball(GL_LINES, co, radius, data->imat);
+
+                               glColor4ubv(data->sel ? data->th_vertex_select 
: data->th_vertex);
+                               bglBegin(GL_POINTS);
+                       }
+               }
+
                /* draw active larger - need to stop/start point drawing for 
this :/ */
                if (eve == data->eve_act) {
-                       float size = UI_GetThemeValuef(TH_VERTEX_SIZE);
-                       UI_ThemeColor4(TH_EDITMESH_ACTIVE);
+                       glColor4ubv(data->th_editmesh_active);
                        
                        bglEnd();
                        
-                       glPointSize(size);
+                       glPointSize(data->th_vertex_size);
                        bglBegin(GL_POINTS);
                        bglVertex3fv(co);
                        bglEnd();
-                       
-                       UI_ThemeColor4(data->sel ? TH_VERTEX_SELECT : 
TH_VERTEX);
-                       glPointSize(size);
+
+                       glColor4ubv(data->sel ? data->th_vertex_select : 
data->th_vertex);
+                       glPointSize(data->th_vertex_size);
                        bglBegin(GL_POINTS);
                }
                else {
@@ -2422,13 +2450,27 @@
        }
 }
 
-static void draw_dm_verts(BMEditMesh *em, DerivedMesh *dm, int sel, BMVert 
*eve_act)
+static void draw_dm_verts(BMEditMesh *em, DerivedMesh *dm, int sel, BMVert 
*eve_act,
+                                                 RegionView3D *rv3d)
 {
        drawDMVerts_userData data;
        data.sel = sel;
        data.eve_act = eve_act;
        data.em = em;
 
+       /* Cache theme values */
+       UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, data.th_editmesh_active);
+       UI_GetThemeColor4ubv(TH_VERTEX_SELECT, data.th_vertex_select);
+       UI_GetThemeColor4ubv(TH_VERTEX, data.th_vertex);
+       UI_GetThemeColor4ubv(TH_SKIN_ROOT, data.th_skin_root);
+       data.th_vertex_size = UI_GetThemeValuef(TH_VERTEX_SIZE);
+
+       /* For skin root drawing */
+       data.has_vskin = CustomData_has_layer(&em->bm->vdata, CD_MVERT_SKIN);
+       /* view-aligned matrix */
+       mult_m4_m4m4(data.imat, rv3d->viewmat, em->ob->obmat);
+       invert_m4(data.imat);
+
        bglBegin(GL_POINTS);
        dm->foreachMappedVert(dm, draw_dm_verts__mapFunc, &data);
        bglEnd();
@@ -2711,7 +2753,8 @@
 /* EditMesh drawing routines*/
 
 static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, 
-                                BMEditMesh *em, DerivedMesh *cageDM, BMVert 
*eve_act)
+                                BMEditMesh *em, DerivedMesh *cageDM, BMVert 
*eve_act,
+                                                               RegionView3D 
*rv3d)
 {
        ToolSettings *ts = scene->toolsettings;
        int sel;
@@ -2750,7 +2793,7 @@
                        if (ts->selectmode & SCE_SELECT_VERTEX) {
                                glPointSize(size);
                                glColor4ubv(col);
-                               draw_dm_verts(em, cageDM, sel, eve_act);
+                               draw_dm_verts(em, cageDM, sel, eve_act, rv3d);
                        }
                        
                        if (check_ob_drawface_dot(scene, v3d, obedit->dt)) {
@@ -3228,7 +3271,7 @@
                draw_em_fancy_edges(em, scene, v3d, me, cageDM, 0, eed_act);
        }
        if (em) {
-               draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act);
+               draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act, rv3d);
 
                if (me->drawflag & ME_DRAWNORMALS) {
                        UI_ThemeColor(TH_NORMAL);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c     
2012-05-22 15:29:15 UTC (rev 46891)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c     
2012-05-22 15:29:27 UTC (rev 46892)
@@ -2335,6 +2335,9 @@
                if (ob->mode & OB_MODE_WEIGHT_PAINT) {
                        mask |= CD_MASK_PREVIEW_MCOL;
                }
+
+               if (ob->mode & OB_MODE_EDIT)
+                       mask |= CD_MASK_MVERT_SKIN;
        }
 
        return mask;

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

Reply via email to