Revision: 18959 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18959 Author: blendix Date: 2009-02-13 15:48:38 +0100 (Fri, 13 Feb 2009)
Log Message: ----------- 2.5: Keyingsets now can construct rna paths including pointers and collections, which means keying for example object game settings or constraint properties should work. Modified Paths: -------------- branches/blender2.5/blender/source/blender/editors/animation/keyframing.c branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c Modified: branches/blender2.5/blender/source/blender/editors/animation/keyframing.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/animation/keyframing.c 2009-02-13 14:16:56 UTC (rev 18958) +++ branches/blender2.5/blender/source/blender/editors/animation/keyframing.c 2009-02-13 14:48:38 UTC (rev 18959) @@ -718,8 +718,8 @@ /* validate pointer first - exit if failure*/ RNA_id_pointer_create(id, &id_ptr); - if (RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) { - printf("Insert Key: Could not insert keyframe, as RNA Path is invalid for the given ID \n"); + if (RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0 || prop == NULL) { + printf("Insert Key: Could not insert keyframe, as RNA Path is invalid for the given ID (%s)\n", rna_path); return 0; } @@ -2050,7 +2050,7 @@ PropertyRNA *prop; RNA_id_pointer_create(ksp->id, &id_ptr); - if (RNA_path_resolve(&id_ptr, ksp->rna_path, &ptr, &prop)) + if (RNA_path_resolve(&id_ptr, ksp->rna_path, &ptr, &prop) && prop) arraylen= RNA_property_array_length(&ptr, prop); } Modified: branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c 2009-02-13 14:16:56 UTC (rev 18958) +++ branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c 2009-02-13 14:48:38 UTC (rev 18959) @@ -3144,10 +3144,10 @@ { ListBase hierarchy = {NULL, NULL}; LinkData *ld; - TreeElement *tem; - TreeStoreElem *tse; - PointerRNA *ptr; - PropertyRNA *prop; + TreeElement *tem, *temnext, *temsub; + TreeStoreElem *tse, *tsenext; + PointerRNA *ptr, *nextptr; + PropertyRNA *prop, *nameprop; ID *id = NULL; char *path=NULL, *newpath=NULL; int array_index= 0; @@ -3189,9 +3189,9 @@ /* check if we're looking for first ID, or appending to path */ if (id) { - if (tse->type == TSE_RNA_STRUCT) + if(tse->type == TSE_RNA_STRUCT) printf("\t tem = RNA Struct '%s' \n", tem->name); - else if (tse->type == TSE_RNA_ARRAY_ELEM) + else if(tse->type == TSE_RNA_ARRAY_ELEM) printf("\t tem = RNA Array Elem '%s' \n", tem->name); else if (tse->type == TSE_RNA_PROPERTY) printf("\t tem = RNA Property '%s' \n", tem->name); @@ -3201,22 +3201,67 @@ /* just 'append' property to path * - to prevent memory leaks, we must write to newpath not path, then free old path + swap them */ - // TODO: how should this be done? - //newpath= RNA_path_append(path, ptr, prop, tem->index, /*RNA_property_identifier(ptr, prop)*/0); - if (path) MEM_freeN(path); - path= newpath; + if(tse->type == TSE_RNA_PROPERTY) { + if(RNA_property_type(ptr, prop) == PROP_POINTER) { + /* for pointer we just append property name */ + newpath= RNA_path_append(path, ptr, prop, 0, NULL); + } + else if(RNA_property_type(ptr, prop) == PROP_COLLECTION) { + temnext= (TreeElement*)(ld->next->data); + tsenext= TREESTORE(temnext); + + nextptr= &temnext->rnaptr; + nameprop= RNA_struct_name_property(nextptr); + + if(nameprop) { + /* if possible, use name as a key in the path */ + char buf[128], *name; + name= RNA_property_string_get_alloc(nextptr, nameprop, buf, sizeof(buf)); + + newpath= RNA_path_append(path, NULL, prop, 0, name); + + if(name != buf) + MEM_freeN(name); + } + else { + /* otherwise use index */ + int index= 0; + + for(temsub=tem->subtree.first; temsub; temsub=temsub->next, index++) + if(temsub == temnext) + break; + + newpath= RNA_path_append(path, NULL, prop, index, NULL); + } + + ld= ld->next; + } + } + + if(newpath) { + if (path) MEM_freeN(path); + path= newpath; + newpath= NULL; + } } else { /* no ID, so check if entry is RNA-struct, and if that RNA-struct is an ID datablock to extract info from */ if (tse->type == TSE_RNA_STRUCT) { /* ptr->data not ptr->id.data seems to be the one we want, since ptr->data is sometimes the owner of this ID? */ - if (RNA_struct_is_ID(ptr)) + if(RNA_struct_is_ID(ptr)) { id= (ID *)ptr->data; + + /* clear path */ + if(path) { + MEM_freeN(path); + path= NULL; + } + } } } } - + /* step 3: if we've got an ID, add the current item to the path */ if (id) { /* add the active property to the path */ @@ -3246,7 +3291,7 @@ if (path) BKE_keyingset_add_destination(ks, id, NULL, path, array_index, flag, groupmode); } - + /* free temp data */ if (path) MEM_freeN(path); BLI_freelistN(&hierarchy); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs