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:
Diffstat (limited to 'source/blender/editors/object/editkey.c')
-rw-r--r--source/blender/editors/object/editkey.c126
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
}
+