[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25594] trunk/blender: - object. add_shape_key(name="Key", from_mix=True)

Campbell Barton ideasman42 at gmail.com
Mon Dec 28 19:03:05 CET 2009


Revision: 25594
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25594
Author:   campbellbarton
Date:     2009-12-28 19:03:04 +0100 (Mon, 28 Dec 2009)

Log Message:
-----------
- object.add_shape_key(name="Key", from_mix=True)
- ensure new shape key names are unique
- Transfer ShapeKey now can have its settings changes (redo operator)

Modified Paths:
--------------
    trunk/blender/release/scripts/op/object.py
    trunk/blender/source/blender/blenkernel/BKE_key.h
    trunk/blender/source/blender/blenkernel/BKE_object.h
    trunk/blender/source/blender/blenkernel/intern/key.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/editors/mesh/meshtools.c
    trunk/blender/source/blender/editors/object/object_modifier.c
    trunk/blender/source/blender/editors/object/object_shapekey.c
    trunk/blender/source/blender/makesrna/intern/rna_object_api.c

Modified: trunk/blender/release/scripts/op/object.py
===================================================================
--- trunk/blender/release/scripts/op/object.py	2009-12-28 15:26:36 UTC (rev 25593)
+++ trunk/blender/release/scripts/op/object.py	2009-12-28 18:03:04 UTC (rev 25594)
@@ -170,7 +170,6 @@
                 default=False)
 
     def _main(self, ob_act, objects, mode='OFFSET', use_clamp=False):
-
         def me_nos(verts):
             return [v.normal.copy() for v in verts]
 
@@ -178,11 +177,10 @@
             return [v.co.copy() for v in verts]
 
         def ob_add_shape(ob):
-            C_tmp = {"object": ob}
             me = ob.data
-            if me.shape_keys is None: # add basis
-                bpy.ops.object.shape_key_add(C_tmp)
-            bpy.ops.object.shape_key_add(C_tmp)
+            ob.add_shape_key(from_mix=False)
+            if len(me.shape_keys.keys) == 1:
+                ob.add_shape_key(from_mix=False) # we need a rest
             ob.active_shape_key_index = len(me.shape_keys.keys) - 1
             ob.shape_key_lock = True
 

Modified: trunk/blender/source/blender/blenkernel/BKE_key.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_key.h	2009-12-28 15:26:36 UTC (rev 25593)
+++ trunk/blender/source/blender/blenkernel/BKE_key.h	2009-12-28 18:03:04 UTC (rev 25594)
@@ -59,7 +59,7 @@
 float *do_ob_key(struct Scene *scene, struct Object *ob);
 
 struct Key *ob_get_key(struct Object *ob);
-struct KeyBlock *add_keyblock(struct Key *key);
+struct KeyBlock *add_keyblock(struct Key *key, char *name);
 struct KeyBlock *ob_get_keyblock(struct Object *ob);
 struct KeyBlock *ob_get_reference_keyblock(struct Object *ob);
 struct KeyBlock *key_get_keyblock(struct Key *key, int index);

Modified: trunk/blender/source/blender/blenkernel/BKE_object.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_object.h	2009-12-28 15:26:36 UTC (rev 25593)
+++ trunk/blender/source/blender/blenkernel/BKE_object.h	2009-12-28 18:03:04 UTC (rev 25594)
@@ -120,7 +120,7 @@
 
 int object_insert_ptcache(struct Object *ob);
 // void object_delete_ptcache(struct Object *ob, int index);
-int object_insert_shape_key(struct Scene *scene, struct Object *ob, int from_mix);
+struct KeyBlock *object_insert_shape_key(struct Scene *scene, struct Object *ob, char *name, int from_mix);
 
 
 #ifdef __cplusplus

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2009-12-28 15:26:36 UTC (rev 25593)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2009-12-28 18:03:04 UTC (rev 25594)
@@ -32,6 +32,7 @@
 
 #include <math.h>
 #include <string.h>
+#include <stddef.h>
 
 #include "MEM_guardedalloc.h"
 
@@ -1395,7 +1396,7 @@
 	return NULL;
 }
 
-KeyBlock *add_keyblock(Key *key)
+KeyBlock *add_keyblock(Key *key, char *name)
 {
 	KeyBlock *kb;
 	float curpos= -0.1;
@@ -1409,9 +1410,15 @@
 	kb->type= KEY_CARDINAL;
 	
 	tot= BLI_countlist(&key->block);
-	if(tot==1) strcpy(kb->name, "Basis");
-	else sprintf(kb->name, "Key %d", tot-1);
-	
+	if(name) {
+		strncpy(kb->name, name, sizeof(kb->name));
+	} else {
+		if(tot==1) strcpy(kb->name, "Basis");
+		else sprintf(kb->name, "Key %d", tot-1);
+	}
+
+	BLI_uniquename(&key->block, kb, "Key", '.', offsetof(KeyBlock, name), sizeof(kb->name));
+
 	// XXX this is old anim system stuff? (i.e. the 'index' of the shapekey)
 	kb->adrcode= tot-1;
 	

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2009-12-28 15:26:36 UTC (rev 25593)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2009-12-28 18:03:04 UTC (rev 25594)
@@ -2634,7 +2634,7 @@
 /* shape key utility function */
 
 /************************* Mesh ************************/
-static void insert_meshkey(Scene *scene, Object *ob, int from_mix)
+static KeyBlock *insert_meshkey(Scene *scene, Object *ob, char *name, int from_mix)
 {
 	Mesh *me= ob->data;
 	Key *key= me->key;
@@ -2647,7 +2647,7 @@
 		newkey= 1;
 	}
 
-	kb= add_keyblock(key);
+	kb= add_keyblock(key, name);
 
 	if(newkey || from_mix==FALSE) {
 		/* create from mesh */
@@ -2658,9 +2658,11 @@
 		kb->data= do_ob_key(scene, ob);
 		kb->totelem= me->totvert;
 	}
+
+	return kb;
 }
 /************************* Lattice ************************/
-static void insert_lattkey(Scene *scene, Object *ob, int from_mix)
+static KeyBlock *insert_lattkey(Scene *scene, Object *ob, char *name, int from_mix)
 {
 	Lattice *lt= ob->data;
 	Key *key= lt->key;
@@ -2673,7 +2675,7 @@
 		newkey= 1;
 	}
 
-	kb= add_keyblock(key);
+	kb= add_keyblock(key, name);
 
 	if(newkey || from_mix==FALSE) {
 		/* create from lattice */
@@ -2684,9 +2686,11 @@
 		kb->totelem= lt->pntsu*lt->pntsv*lt->pntsw;
 		kb->data= do_ob_key(scene, ob);
 	}
+
+	return kb;
 }
 /************************* Curve ************************/
-static void insert_curvekey(Scene *scene, Object *ob, int from_mix)
+static KeyBlock *insert_curvekey(Scene *scene, Object *ob, char *name, int from_mix)
 {
 	Curve *cu= ob->data;
 	Key *key= cu->key;
@@ -2700,7 +2704,7 @@
 		newkey= 1;
 	}
 
-	kb= add_keyblock(key);
+	kb= add_keyblock(key, name);
 
 	if(newkey || from_mix==FALSE) {
 		/* create from curve */
@@ -2712,14 +2716,14 @@
 		kb->data= do_ob_key(scene, ob);
 	}
 
+	return kb;
 }
 
-int object_insert_shape_key(Scene *scene, Object *ob, int from_mix)
+KeyBlock *object_insert_shape_key(Scene *scene, Object *ob, char *name, int from_mix)
 {
-	if(ob->type==OB_MESH)						insert_meshkey(scene, ob, from_mix);
-	else if ELEM(ob->type, OB_CURVE, OB_SURF)	insert_curvekey(scene, ob, from_mix);
-	else if(ob->type==OB_LATTICE)				insert_lattkey(scene, ob, from_mix);
-	else return 0;
-	return 1;
+	if(ob->type==OB_MESH)					 return insert_meshkey(scene, ob, name, from_mix);
+	else if ELEM(ob->type, OB_CURVE, OB_SURF)return insert_curvekey(scene, ob, name, from_mix);
+	else if(ob->type==OB_LATTICE)			 return insert_lattkey(scene, ob, name, from_mix);
+	else									 return NULL;
 }
 

Modified: trunk/blender/source/blender/editors/mesh/meshtools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/meshtools.c	2009-12-28 15:26:36 UTC (rev 25593)
+++ trunk/blender/source/blender/editors/mesh/meshtools.c	2009-12-28 18:03:04 UTC (rev 25594)
@@ -588,7 +588,7 @@
 		key->type= KEY_RELATIVE;
 
 		/* first key added, so it was the basis. initialise it with the existing mesh */
-		kb= add_keyblock(key);
+		kb= add_keyblock(key, NULL);
 		mesh_to_key(me, kb);
 	}
 	
@@ -604,9 +604,7 @@
 				
 				if (!dm) continue;
 					
-				kb= add_keyblock(key);
-				strcpy(kb->name, base->object->id.name+2);
-				BLI_uniquename(&key->block, kb, "Key", '.', offsetof(KeyBlock, name), 32);
+				kb= add_keyblock(key, base->object->id.name+2);
 				
 				DM_to_meshkey(dm, me, kb);
 				

Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c	2009-12-28 15:26:36 UTC (rev 25593)
+++ trunk/blender/source/blender/editors/object/object_modifier.c	2009-12-28 18:03:04 UTC (rev 25594)
@@ -370,11 +370,11 @@
 			key->type= KEY_RELATIVE;
 			/* if that was the first key block added, then it was the basis.
 			 * Initialise it with the mesh, and add another for the modifier */
-			kb= add_keyblock(key);
+			kb= add_keyblock(key, NULL);
 			mesh_to_key(me, kb);
 		}
 
-		kb= add_keyblock(key);
+		kb= add_keyblock(key, md->name);
 		DM_to_meshkey(dm, me, kb);
 		
 		dm->release(dm);

Modified: trunk/blender/source/blender/editors/object/object_shapekey.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_shapekey.c	2009-12-28 15:26:36 UTC (rev 25593)
+++ trunk/blender/source/blender/editors/object/object_shapekey.c	2009-12-28 18:03:04 UTC (rev 25594)
@@ -84,7 +84,7 @@
 
 static void ED_object_shape_key_add(bContext *C, Scene *scene, Object *ob, int from_mix)
 {
-	if(object_insert_shape_key(scene, ob, from_mix)) {
+	if(object_insert_shape_key(scene, ob, NULL, from_mix)) {
 		Key *key= ob_get_key(ob);
 		ob->shapenr= BLI_countlist(&key->block);
 
@@ -241,7 +241,7 @@
 	int from_mix = RNA_boolean_get(op->ptr, "from_mix");
 
 	ED_object_shape_key_add(C, scene, ob, from_mix);
-	
+
 	return OPERATOR_FINISHED;
 }
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_object_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object_api.c	2009-12-28 15:26:36 UTC (rev 25593)
+++ trunk/blender/source/blender/makesrna/intern/rna_object_api.c	2009-12-28 18:03:04 UTC (rev 25594)
@@ -309,6 +309,21 @@
 	return ob_arm;
 }
 
+static KeyBlock *rna_Object_add_shape_key(Object *ob, bContext *C, ReportList *reports, char *name, int from_mix)
+{
+	Scene *scene= CTX_data_scene(C);
+	KeyBlock *kb= NULL;
+
+	if((kb=object_insert_shape_key(scene, ob, name, from_mix))) {
+		WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+	}
+	else {
+		BKE_reportf(reports, RPT_ERROR, "Object \"%s\"does not support shapes.", ob->id.name+2);
+	}
+
+	return kb;
+}
+
 int rna_Object_is_visible(Object *ob, bContext *C)
 {
 	return !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->lay & CTX_data_scene(C)->lay;
@@ -414,6 +429,15 @@
 	parm= RNA_def_pointer(func, "ob_arm", "Object", "", "Armature object influencing this object or NULL.");
 	RNA_def_function_return(func, parm);
 
+	/* Shape key */
+	func= RNA_def_function(srna, "add_shape_key", "rna_Object_add_shape_key");
+	RNA_def_function_ui_description(func, "Add shape key to an object.");
+	RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+	parm= RNA_def_string(func, "name", "Key", 0, "", "Unique name for the new keylock."); /* optional */
+	parm= RNA_def_boolean(func, "from_mix", 1, "", "Create new shape from existing mix of shapes.");
+	parm= RNA_def_pointer(func, "key", "ShapeKey", "", "New shape keyblock.");
+	RNA_def_function_return(func, parm);
+
 	/* DAG */
 	func= RNA_def_function(srna, "make_display_list", "rna_Object_make_display_list");

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list