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:37 +0400
committerNicholas Bishop <nicholasbishop@gmail.com>2012-05-22 19:29:37 +0400
commit0cdd5892faa0524fc9f18fa76ce06cd66c5d75f6 (patch)
tree564ac160ce18d25db18424d9e49976c8cb0ff406 /source/blender/editors
parent417ac6932095f83750b4065bce9a58812023295e (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')
-rw-r--r--source/blender/editors/object/object_modifier.c41
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)