diff options
Diffstat (limited to 'source/blender/editors/object/editkey.c')
-rw-r--r-- | source/blender/editors/object/editkey.c | 126 |
1 files changed, 91 insertions, 35 deletions
diff --git a/source/blender/editors/object/editkey.c b/source/blender/editors/object/editkey.c index 913046c5ab8..f38c03fb284 100644 --- a/source/blender/editors/object/editkey.c +++ b/source/blender/editors/object/editkey.c @@ -55,6 +55,7 @@ #include "BKE_action.h" #include "BKE_anim.h" +#include "BKE_context.h" #include "BKE_curve.h" #include "BKE_depsgraph.h" #include "BKE_global.h" @@ -70,12 +71,12 @@ #include "ED_object.h" -#include "object_intern.h" +#include "RNA_access.h" + +#include "WM_api.h" +#include "WM_types.h" -/* XXX */ -static void BIF_undo_push() {} -static void error() {} -/* XXX */ +#include "object_intern.h" #if 0 // XXX old animation system static void default_key_ipo(Scene *scene, Key *key) @@ -112,7 +113,7 @@ static void default_key_ipo(Scene *scene, Key *key) #endif // XXX old animation system -/* **************************************** */ +/************************* Mesh ************************/ void mesh_to_key(Mesh *me, KeyBlock *kb) { @@ -208,7 +209,7 @@ void insert_meshkey(Scene *scene, Mesh *me, short rel) mesh_to_key(me, kb); } -/* ******************** */ +/************************* Lattice ************************/ void latt_to_key(Lattice *lt, KeyBlock *kb) { @@ -266,7 +267,7 @@ void insert_lattkey(Scene *scene, Lattice *lt, short rel) latt_to_key(lt, kb); } -/* ******************************** */ +/************************* Curve ************************/ void curve_to_key(Curve *cu, KeyBlock *kb, ListBase *nurb) { @@ -378,7 +379,7 @@ void insert_curvekey(Scene *scene, Curve *cu, short rel) if(cu->key==NULL) { cu->key= add_key( (ID *)cu); - if (rel) + if(rel) cu->key->type = KEY_RELATIVE; // else // default_key_ipo(scene, cu->key); // XXX old animation system @@ -391,36 +392,34 @@ void insert_curvekey(Scene *scene, Curve *cu, short rel) else curve_to_key(cu, kb, &cu->nurb); } +/*********************** add shape key ***********************/ -/* ******************** */ - -void insert_shapekey(Scene *scene, Object *ob) +void ED_object_shape_key_add(bContext *C, Scene *scene, Object *ob) { - if(get_mesh(ob) && get_mesh(ob)->mr) { - error("Cannot create shape keys on a multires mesh."); - } - else { - Key *key; - - if(ob->type==OB_MESH) insert_meshkey(scene, ob->data, 1); - else if ELEM(ob->type, OB_CURVE, OB_SURF) insert_curvekey(scene, ob->data, 1); - else if(ob->type==OB_LATTICE) insert_lattkey(scene, ob->data, 1); - - key= ob_get_key(ob); - ob->shapenr= BLI_countlist(&key->block); - - BIF_undo_push("Add Shapekey"); - } + Key *key; + + if(ob->type==OB_MESH) insert_meshkey(scene, ob->data, 1); + else if ELEM(ob->type, OB_CURVE, OB_SURF) insert_curvekey(scene, ob->data, 1); + else if(ob->type==OB_LATTICE) insert_lattkey(scene, ob->data, 1); + + key= ob_get_key(ob); + ob->shapenr= BLI_countlist(&key->block); + + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); } -void delete_key(Scene *scene, Object *ob) +/*********************** remove shape key ***********************/ + +int ED_object_shape_key_remove(bContext *C, Scene *scene, Object *ob) { + Main *bmain= CTX_data_main(C); KeyBlock *kb, *rkb; Key *key; //IpoCurve *icu; - + key= ob_get_key(ob); - if(key==NULL) return; + if(key==NULL) + return 0; kb= BLI_findlink(&key->block, ob->shapenr-1); @@ -431,15 +430,15 @@ void delete_key(Scene *scene, Object *ob) BLI_remlink(&key->block, kb); key->totkey--; - if(key->refkey== kb) key->refkey= key->block.first; + if(key->refkey== kb) + key->refkey= key->block.first; if(kb->data) MEM_freeN(kb->data); MEM_freeN(kb); - for(kb= key->block.first; kb; kb= kb->next) { + for(kb= key->block.first; kb; kb= kb->next) if(kb->adrcode>=ob->shapenr) kb->adrcode--; - } #if 0 // XXX old animation system if(key->ipo) { @@ -465,12 +464,68 @@ void delete_key(Scene *scene, Object *ob) else if(GS(key->from->name)==ID_CU) ((Curve *)key->from)->key= NULL; else if(GS(key->from->name)==ID_LT) ((Lattice *)key->from)->key= NULL; - free_libblock_us(&(G.main->key), key); + free_libblock_us(&(bmain->key), key); } DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + + return 1; +} + +/********************** shape key operators *********************/ + +static int shape_key_add_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + + if(!ob) + return OPERATOR_CANCELLED; + + ED_object_shape_key_add(C, scene, ob); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_shape_key_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Shape Key"; + ot->idname= "OBJECT_OT_shape_key_add"; + + /* api callbacks */ + ot->exec= shape_key_add_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int shape_key_remove_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + Scene *scene= CTX_data_scene(C); + + if(!ob) + return OPERATOR_CANCELLED; + + if(!ED_object_shape_key_remove(C, scene, ob)) + return OPERATOR_CANCELLED; - BIF_undo_push("Delete Shapekey"); + return OPERATOR_FINISHED; +} + +void OBJECT_OT_shape_key_remove(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Remove Shape Key"; + ot->idname= "OBJECT_OT_shape_key_remove"; + + /* api callbacks */ + ot->exec= shape_key_remove_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } void move_keys(Object *ob) @@ -560,3 +615,4 @@ void move_keys(Object *ob) BIF_undo_push("Move Shapekey(s)"); #endif } + |