fix for crash when setting a shapekeys name in rna, (probably other properties too).
authorCampbell Barton <ideasman42@gmail.com>
Wed, 6 Jan 2010 12:19:46 +0000 (12:19 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 6 Jan 2010 12:19:46 +0000 (12:19 +0000)
When the shapekey was returned from the object it didnt use the data's ID which is expected elsewhere in RNA.

Transfer shape now also sets the name.

release/scripts/op/object.py
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_object_api.c

index f17627877405b7728d0f5cf27a53b2eda4ba004a..d68c30f0f239e3eab7039dd1596181c995fbe910 100644 (file)
@@ -176,11 +176,12 @@ class ShapeTransfer(bpy.types.Operator):
         def me_cos(verts):
             return [v.co.copy() for v in verts]
 
-        def ob_add_shape(ob):
+        def ob_add_shape(ob, name):
             me = ob.data
-            ob.add_shape_key(from_mix=False)
+            key = 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
+                key = ob.add_shape_key(from_mix=False) # we need a rest
+            key.name = name
             ob.active_shape_key_index = len(me.shape_keys.keys) - 1
             ob.shape_key_lock = True
 
@@ -191,6 +192,7 @@ class ShapeTransfer(bpy.types.Operator):
             use_clamp = False
 
         me = ob_act.data
+        orig_key_name = ob_act.active_shape_key.name
 
         orig_shape_coords = me_cos(ob_act.active_shape_key.data)
 
@@ -206,7 +208,7 @@ class ShapeTransfer(bpy.types.Operator):
             target_normals = me_nos(me_other.verts)
             target_coords = me_cos(me_other.verts)
 
-            ob_add_shape(ob_other)
+            ob_add_shape(ob_other, orig_key_name)
 
             # editing the final coords, only list that stores wrapped coords
             target_shape_coords = [v.co for v in ob_other.active_shape_key.data]
index 0a4fa71c0061a891507a0aacfc7d4cfb31a8e249..e87edabbcdfb3dd596e84361dce333d9691f6fb0 100644 (file)
@@ -930,7 +930,7 @@ static PointerRNA rna_Object_active_shape_key_get(PointerRNA *ptr)
                return PointerRNA_NULL;
        
        kb= BLI_findlink(&key->block, ob->shapenr-1);
-       RNA_pointer_create(&key->id, &RNA_ShapeKey, kb, &keyptr);
+       RNA_pointer_create((ID *)ob->data, &RNA_ShapeKey, kb, &keyptr);
        return keyptr;
 }
 
index 9426b9c9eb3f5e3737e6288da5c0e89345de850b..8379ae7995da01cff15005883a1af701bcb19bab 100644 (file)
@@ -310,19 +310,23 @@ static Object *rna_Object_find_armature(Object *ob)
        return ob_arm;
 }
 
-static KeyBlock *rna_Object_add_shape_key(Object *ob, bContext *C, ReportList *reports, char *name, int from_mix)
+static PointerRNA 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))) {
+               PointerRNA keyptr;
+
+               RNA_pointer_create((ID *)ob->data, &RNA_ShapeKey, kb, &keyptr);
                WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+               
+               return keyptr;
        }
        else {
                BKE_reportf(reports, RPT_ERROR, "Object \"%s\"does not support shapes.", ob->id.name+2);
+               return PointerRNA_NULL;
        }
-
-       return kb;
 }
 
 int rna_Object_is_visible(Object *ob, bContext *C)
@@ -476,6 +480,7 @@ void RNA_api_object(StructRNA *srna)
        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_property_flag(parm, PROP_RNAPTR);
        RNA_def_function_return(func, parm);
 
        /* Ray Cast */