diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2012-05-22 19:29:37 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2012-05-22 19:29:37 +0400 |
commit | 0cdd5892faa0524fc9f18fa76ce06cd66c5d75f6 (patch) | |
tree | 564ac160ce18d25db18424d9e49976c8cb0ff406 /source/blender/editors/object/object_modifier.c | |
parent | 417ac6932095f83750b4065bce9a58812023295e (diff) |
Ensure skin nodes get created when adding modifier.
Skin modifier documentation:
http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier
Diffstat (limited to 'source/blender/editors/object/object_modifier.c')
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 47748fbd53b..60a11f59f0e 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -85,6 +85,8 @@ #include "object_intern.h" +static void modifier_skin_customdata_ensure(struct Object *ob); + /******************************** API ****************************/ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type) @@ -157,6 +159,10 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc /* ensure that grid paint mask layer is created */ ED_sculpt_mask_layers_ensure(ob, (MultiresModifierData *)new_md); } + else if(type == eModifierType_Skin) { + /* ensure skin-node customdata exists */ + modifier_skin_customdata_ensure(ob); + } } DAG_id_tag_update(&ob->id, OB_RECALC_DATA); @@ -1327,6 +1333,41 @@ void OBJECT_OT_multires_base_apply(wmOperatorType *ot) } +/************************** skin modifier ***********************/ + +static void modifier_skin_customdata_ensure(Object *ob) +{ + Mesh *me = ob->data; + BMesh *bm = me->edit_btmesh ? me->edit_btmesh->bm : NULL; + MVertSkin *vs; + + if (bm && !CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) { + BMVert *v; + BMIter iter; + + BM_data_layer_add(bm, &bm->vdata, CD_MVERT_SKIN); + + /* Mark an arbitrary vertex as root */ + BM_ITER_MESH(v, &iter, bm, BM_VERTS_OF_MESH) { + vs = CustomData_bmesh_get(&bm->vdata, v->head.data, + CD_MVERT_SKIN); + vs->flag |= MVERT_SKIN_ROOT; + break; + } + } + else if (!CustomData_has_layer(&me->vdata, CD_MVERT_SKIN)) { + vs = CustomData_add_layer(&me->vdata, + CD_MVERT_SKIN, + CD_DEFAULT, + NULL, + me->totvert); + + /* Mark an arbitrary vertex as root */ + vs->flag |= MVERT_SKIN_ROOT; + } +} + + /************************ mdef bind operator *********************/ static int meshdeform_poll(bContext *C) |