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

Reply via email to