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
diff options
context:
space:
mode:
authorNicholas Bishop <nicholasbishop@gmail.com>2012-05-22 19:29:27 +0400
committerNicholas Bishop <nicholasbishop@gmail.com>2012-05-22 19:29:27 +0400
commit417ac6932095f83750b4065bce9a58812023295e (patch)
tree2623241b65b7540d2bce649111d25577dd47cbdf /source/blender/editors
parent6485b32909e8e9d89891ac3808099425148514dc (diff)
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
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/space_view3d/drawobject.c63
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c3
2 files changed, 56 insertions, 10 deletions
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 000f81a4f32..8d72e5d47ac 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -143,6 +143,17 @@ typedef struct drawDMVerts_userData {
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 @@ static void draw_dm_verts__mapFunc(void *userData, int index, const float co[3],
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__mapFunc(void *userData, int index, const float co[3],
}
}
-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 @@ static void draw_dm_bweights(BMEditMesh *em, Scene *scene, DerivedMesh *dm)
/* 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 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit,
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 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d,
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);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 0c6e13051bb..bec07d81b84 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2335,6 +2335,9 @@ CustomDataMask ED_view3d_object_datamask(Scene *scene)
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;