RNA:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 25 Mar 2009 20:29:01 +0000 (20:29 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 25 Mar 2009 20:29:01 +0000 (20:29 +0000)
* Test with constructing RNA paths from pointer + property, based on
  a callback per struct. For animato we'll need to be able to do this,
  for keyframing from buttons, unless we can somehow derive the paths
  from the interface code, which seems like an unnecessary burden.

  However constructing such paths is not always quick, and we need a
  fast way to find out if a property is animated for drawing buttons,
  so this may not be the best solution.

  See rna_mesh.c for some callbacks created as a test.

* Added BLI_sprintfN to mallocN a new string using printf style
  formatting.

13 files changed:
source/blender/blenlib/BLI_string.h
source/blender/blenlib/intern/string.c
source/blender/makesrna/RNA_access.h
source/blender/makesrna/RNA_define.h
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_define.c
source/blender/makesrna/intern/rna_internal_types.h
source/blender/makesrna/intern/rna_key.c
source/blender/makesrna/intern/rna_lattice.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_packedfile.c
source/blender/makesrna/intern/rna_world.c

index d9d030432d319ae067be0fc04fa028bd3e399629..22b41d0055b16353ddee38636b98e6096e727d44 100644 (file)
@@ -73,6 +73,12 @@ char *BLI_strncpy(char *dst, const char *src, int maxncpy);
         */
 int BLI_snprintf(char *buffer, size_t count, const char *format, ...);
 
+       /* 
+        * Print formatted string into a newly mallocN'd string
+        * and return it.
+        */
+char *BLI_sprintfN(const char *format, ...);
+
        /**
         * Compare two strings
         * 
index e0522e60dd015a2e719a3d623057a85303877cca..8485a0c975b6e51428c86afd9ba2e45370c3478e 100644 (file)
@@ -40,6 +40,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_dynstr.h"
 #include "BLI_string.h"
 
 char *BLI_strdupn(const char *str, int len) {
@@ -81,6 +82,24 @@ int BLI_snprintf(char *buffer, size_t count, const char *format, ...)
        return n;
 }
 
+char *BLI_sprintfN(const char *format, ...)
+{
+       DynStr *ds;
+       va_list arg;
+       char *n;
+
+       va_start(arg, format);
+
+       ds= BLI_dynstr_new();
+       BLI_dynstr_vappendf(ds, format, arg);
+       n= BLI_dynstr_get_cstring(ds);
+       BLI_dynstr_free(ds);
+
+       va_end(arg);
+
+       return n;
+}
+
 int BLI_streq(char *a, char *b) {
        return (strcmp(a, b)==0);
 }
index 0317e855b6e23dbc59fac18fbdf6a1ff068d2719..e2d3f85f55004ba824516403b5018e1f397028d9 100644 (file)
@@ -411,6 +411,8 @@ char *RNA_path_back(const char *path);
 int RNA_path_resolve(PointerRNA *ptr, const char *path,
        PointerRNA *r_ptr, PropertyRNA **r_prop);
 
+char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop);
+
 #if 0
 /* Dependency
  *
index c8a189367b5164c7c2b26fef7bef4ee07f6cf1f2..94a2c51c660a37ea56afa874b660b75aa5a7f90d 100644 (file)
@@ -53,6 +53,7 @@ void RNA_def_struct_name_property(StructRNA *srna, PropertyRNA *prop);
 void RNA_def_struct_nested(BlenderRNA *brna, StructRNA *srna, const char *structname);
 void RNA_def_struct_flag(StructRNA *srna, int flag);
 void RNA_def_struct_refine_func(StructRNA *srna, const char *refine);
+void RNA_def_struct_path_func(StructRNA *srna, const char *path);
 void RNA_def_struct_identifier(StructRNA *srna, const char *identifier);
 void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description);
 void RNA_struct_free(BlenderRNA *brna, StructRNA *srna);
index fc76223d8bf55b9ad105534d8047e7bc03ba1eb8..0d124a121d5eeac3920d27055e8da0a9bc39c000 100644 (file)
@@ -1385,6 +1385,7 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
        else fprintf(f, "\tNULL,\n");
 
        fprintf(f, "\t%s,\n", rna_function_string(srna->refine));
+       fprintf(f, "\t%s,\n", rna_function_string(srna->path));
 
        prop= srna->properties.first;
        if(prop) fprintf(f, "\t{(PropertyRNA*)&rna_%s_%s, ", srna->identifier, prop->identifier);
index 35eb0cef6676f13cf6e4f54cb6b44b5b4c58586a..3fcc2d18487e965a6ed58a94789048de3851c2f4 100644 (file)
@@ -318,7 +318,7 @@ PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
        prop= NULL;
 
        for(; iter.valid; RNA_property_collection_next(&iter), i++) {
-               if(strcmp(identifier, RNA_property_identifier(&iter.ptr, iter.ptr.data)) == 0) {
+               if(strcmp(identifier, RNA_property_identifier(ptr, iter.ptr.data)) == 0) {
                        prop= iter.ptr.data;
                        break;
                }
@@ -1462,7 +1462,7 @@ int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, Prope
                prop= NULL;
 
                for(; iter.valid; RNA_property_collection_next(&iter)) {
-                       if(strcmp(token, RNA_property_identifier(&iter.ptr, iter.ptr.data)) == 0) {
+                       if(strcmp(token, RNA_property_identifier(&curptr, iter.ptr.data)) == 0) {
                                prop= iter.ptr.data;
                                break;
                        }
@@ -1622,6 +1622,33 @@ char *RNA_path_back(const char *path)
        return result;
 }
 
+char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop)
+{
+       char *ptrpath=NULL, *path;
+       const char *propname;
+
+       if(!ptr->id.data || !ptr->data || !prop)
+               return NULL;
+       
+       if(!RNA_struct_is_ID(ptr)) {
+               if(ptr->type->path)
+                       ptrpath= ptr->type->path(ptr);
+               else
+                       return NULL;
+       }
+
+       propname= RNA_property_identifier(ptr, prop);
+
+       if(ptrpath) {
+               path= BLI_sprintfN("%s.%s", ptrpath, propname);
+               MEM_freeN(ptrpath);
+       }
+       else
+               path= BLI_strdup(propname);
+       
+       return path;
+}
+
 /* Quick name based property access */
 
 int RNA_boolean_get(PointerRNA *ptr, const char *name)
index b08c4aeaed484f858b2bf755991ff900eb1cd069..e05a5f6a20e55ce1895ff593cc00fb9b1182b6b3 100644 (file)
@@ -514,6 +514,16 @@ void RNA_def_struct_refine_func(StructRNA *srna, const char *refine)
        if(refine) srna->refine= (StructRefineFunc)refine;
 }
 
+void RNA_def_struct_path_func(StructRNA *srna, const char *path)
+{
+       if(!DefRNA.preprocess) {
+               fprintf(stderr, "RNA_def_struct_path_func: only during preprocessing.\n");
+               return;
+       }
+
+       if(path) srna->path= (StructPathFunc)path;
+}
+
 void RNA_def_struct_identifier(StructRNA *srna, const char *identifier)
 {
        if(DefRNA.preprocess) {
index f8dd33c9df42cfd1e57cf4206aa6e2c3f53cf81d..bc0c2a07b352195e6e26a5a785a7bcd9eaec41ca 100644 (file)
@@ -41,6 +41,7 @@ struct bContext;
 typedef void (*UpdateFunc)(struct bContext *C, struct PointerRNA *ptr);
 typedef int (*EditableFunc)(struct PointerRNA *ptr);
 typedef struct StructRNA *(*StructRefineFunc)(struct PointerRNA *ptr);
+typedef char *(*StructPathFunc)(struct PointerRNA *ptr);
 
 typedef int (*PropBooleanGetFunc)(struct PointerRNA *ptr);
 typedef void (*PropBooleanSetFunc)(struct PointerRNA *ptr, int value);
@@ -240,6 +241,9 @@ struct StructRNA {
        /* function to give the more specific type */
        StructRefineFunc refine; 
 
+       /* function to find path to this struct in an ID */
+       StructPathFunc path; 
+
        /* properties of this struct */
        ListBase properties; 
 };
index feda1448c8ba43bff57a71a21e6de75f1b907385..0a21ad1d940ce4c13194aef619f577f1c1b21f01 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * $Id$
+ * $Id: rna_key.c 19382 2009-03-23 13:24:48Z blendix $
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
index c479e66c08b7aa0a74ecb5ee69e86c93a3bc0f55..ca77d3b519fa881e14296c171ec51cd1595dd43d 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * $Id$
+ * $Id: rna_lattice.c 19382 2009-03-23 13:24:48Z blendix $
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
index d5caf57165f5e2326db42a99e4c5f930c5b050d8..3f862199ea002ff10cae45959eafac2e2e79b4d0 100644 (file)
@@ -467,6 +467,111 @@ static int rna_Mesh_string_layers_length(PointerRNA *ptr)
        return rna_CustomDataLayer_length(ptr, CD_PROP_STR);
 }
 
+/* path construction */
+
+static char *rna_VertexGroupElement_path(PointerRNA *ptr)
+{
+       Mesh *me= (Mesh*)ptr->id.data; /* XXX not always! */
+       MDeformWeight *dw= (MDeformWeight*)ptr->data;
+       MDeformVert *dvert;
+       int a, b;
+       
+       for(a=0, dvert=me->dvert; a<me->totvert; a++, dvert++)
+               for(b=0; b<dvert->totweight; b++)
+                       if(dw == &dvert->dw[b])
+                               return BLI_sprintfN("verts[%d].groups[%d]", a, b);
+
+       return NULL;
+}
+
+static char *rna_MeshFace_path(PointerRNA *ptr)
+{
+       return BLI_sprintfN("faces[%d]", (MFace*)ptr->data - ((Mesh*)ptr->id.data)->mface);
+}
+
+static char *rna_MeshEdge_path(PointerRNA *ptr)
+{
+       return BLI_sprintfN("edges[%d]", (MEdge*)ptr->data - ((Mesh*)ptr->id.data)->medge);
+}
+
+static char *rna_MeshVertex_path(PointerRNA *ptr)
+{
+       return BLI_sprintfN("verts[%d]", (MVert*)ptr->data - ((Mesh*)ptr->id.data)->mvert);
+}
+
+static char *rna_MeshTextureFaceLayer_path(PointerRNA *ptr)
+{
+       return BLI_sprintfN("uv_layers[%s]", ((CustomDataLayer*)ptr->data)->name);
+}
+
+static char *rna_CustomDataData_path(PointerRNA *ptr, char *collection, int type)
+{
+       Mesh *me= (Mesh*)ptr->id.data;
+       CustomDataLayer *cdl;
+       int a;
+       size_t b;
+
+       for(cdl=me->fdata.layers, a=0; a<me->fdata.totlayer; cdl++, a++) {
+               if(cdl->type == type) {
+                       b= ((char*)ptr->data - ((char*)cdl->data))/CustomData_sizeof(type);
+                       if(b >= 0 && b < me->totface)
+                               return BLI_sprintfN("%s[%s].data[%d]", collection, cdl->name, b);
+               }
+       }
+
+       return NULL;
+}
+
+static char *rna_MeshTextureFace_path(PointerRNA *ptr)
+{
+       return rna_CustomDataData_path(ptr, "uv_layers", CD_MTFACE);
+}
+
+static char *rna_MeshColorLayer_path(PointerRNA *ptr)
+{
+       return BLI_sprintfN("vcol_layers[%s]", ((CustomDataLayer*)ptr->data)->name);
+}
+
+static char *rna_MeshColor_path(PointerRNA *ptr)
+{
+       return rna_CustomDataData_path(ptr, "vcol_layers", CD_MCOL);
+}
+
+static char *rna_MeshSticky_path(PointerRNA *ptr)
+{
+       return BLI_sprintfN("sticky[%d]", (MSticky*)ptr->data - ((Mesh*)ptr->id.data)->msticky);
+}
+
+static char *rna_MeshIntPropertyLayer_path(PointerRNA *ptr)
+{
+       return BLI_sprintfN("int_layers[%s]", ((CustomDataLayer*)ptr->data)->name);
+}
+
+static char *rna_MeshIntProperty_path(PointerRNA *ptr)
+{
+       return rna_CustomDataData_path(ptr, "int_layers", CD_MCOL);
+}
+
+static char *rna_MeshFloatPropertyLayer_path(PointerRNA *ptr)
+{
+       return BLI_sprintfN("float_layers[%s]", ((CustomDataLayer*)ptr->data)->name);
+}
+
+static char *rna_MeshFloatProperty_path(PointerRNA *ptr)
+{
+       return rna_CustomDataData_path(ptr, "float_layers", CD_MCOL);
+}
+
+static char *rna_MeshStringPropertyLayer_path(PointerRNA *ptr)
+{
+       return BLI_sprintfN("string_layers[%s]", ((CustomDataLayer*)ptr->data)->name);
+}
+
+static char *rna_MeshStringProperty_path(PointerRNA *ptr)
+{
+       return rna_CustomDataData_path(ptr, "string_layers", CD_MCOL);
+}
+
 #else
 
 static void rna_def_mvert_group(BlenderRNA *brna)
@@ -477,6 +582,7 @@ static void rna_def_mvert_group(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "VertexGroupElement", NULL);
        RNA_def_struct_ui_text(srna, "Vertex Group Element", "Weight value of a vertex in a vertex group.");
        RNA_def_struct_sdna(srna, "MDeformWeight");
+       RNA_def_struct_path_func(srna, "rna_VertexGroupElement_path");
 
        /* we can't point to actual group, it is in the object and so
         * there is no unique group to point to, hence the index */
@@ -498,6 +604,7 @@ static void rna_def_mvert(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshVertex", NULL);
        RNA_def_struct_sdna(srna, "MVert");
        RNA_def_struct_ui_text(srna, "Mesh Vertex", "Vertex in a Mesh datablock.");
+       RNA_def_struct_path_func(srna, "rna_MeshVertex_path");
 
        prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
        RNA_def_property_ui_text(prop, "Location", "");
@@ -533,6 +640,7 @@ static void rna_def_medge(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshEdge", NULL);
        RNA_def_struct_sdna(srna, "MEdge");
        RNA_def_struct_ui_text(srna, "Mesh Edge", "Edge in a Mesh datablock.");
+       RNA_def_struct_path_func(srna, "rna_MeshEdge_path");
 
        prop= RNA_def_property(srna, "verts", PROP_INT, PROP_UNSIGNED);
        RNA_def_property_int_sdna(prop, NULL, "v1");
@@ -573,6 +681,7 @@ static void rna_def_mface(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshFace", NULL);
        RNA_def_struct_sdna(srna, "MFace");
        RNA_def_struct_ui_text(srna, "Mesh Face", "Face in a Mesh datablock.");
+       RNA_def_struct_path_func(srna, "rna_MeshFace_path");
 
        prop= RNA_def_property(srna, "verts", PROP_INT, PROP_UNSIGNED);
        RNA_def_property_int_sdna(prop, NULL, "v1");
@@ -613,6 +722,7 @@ static void rna_def_mtface(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshTextureFaceLayer", NULL);
        RNA_def_struct_ui_text(srna, "Mesh Texture Face Layer", "Layer of texture faces in a Mesh datablock.");
        RNA_def_struct_sdna(srna, "CustomDataLayer");
+       RNA_def_struct_path_func(srna, "rna_MeshTextureFaceLayer_path");
 
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_struct_name_property(srna, prop);
@@ -635,6 +745,7 @@ static void rna_def_mtface(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshTextureFace", NULL);
        RNA_def_struct_sdna(srna, "MTFace");
        RNA_def_struct_ui_text(srna, "Mesh Texture Face", "UV mapping, texturing and game engine data for a face.");
+       RNA_def_struct_path_func(srna, "rna_MeshTextureFace_path");
 
        /* prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "tpage");
@@ -735,6 +846,7 @@ static void rna_def_msticky(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshSticky", NULL);
        RNA_def_struct_sdna(srna, "MSticky");
        RNA_def_struct_ui_text(srna, "Mesh Vertex Sticky Texture Coordinate", "Stricky texture coordinate.");
+       RNA_def_struct_path_func(srna, "rna_MeshSticky_path");
 
        prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
        RNA_def_property_ui_text(prop, "Location", "Sticky texture coordinate location.");
@@ -748,6 +860,7 @@ static void rna_def_mcol(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshColorLayer", NULL);
        RNA_def_struct_ui_text(srna, "Mesh Vertex Color Layer", "Layer of vertex colors in a Mesh datablock.");
        RNA_def_struct_sdna(srna, "CustomDataLayer");
+       RNA_def_struct_path_func(srna, "rna_MeshColorLayer_path");
 
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_struct_name_property(srna, prop);
@@ -770,6 +883,7 @@ static void rna_def_mcol(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshColor", NULL);
        RNA_def_struct_sdna(srna, "MCol");
        RNA_def_struct_ui_text(srna, "Mesh Vertex Color", "Vertex colors for a face in a Mesh.");
+       RNA_def_struct_path_func(srna, "rna_MeshColor_path");
 
        prop= RNA_def_property(srna, "color1", PROP_FLOAT, PROP_COLOR);
        RNA_def_property_array(prop, 3);
@@ -801,6 +915,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshFloatPropertyLayer", NULL);
        RNA_def_struct_sdna(srna, "CustomDataLayer");
        RNA_def_struct_ui_text(srna, "Mesh Float Property Layer", "User defined layer of floating pointer number values.");
+       RNA_def_struct_path_func(srna, "rna_MeshFloatPropertyLayer_path");
 
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_struct_name_property(srna, prop);
@@ -814,6 +929,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshFloatProperty", NULL);
        RNA_def_struct_sdna(srna, "MFloatProperty");
        RNA_def_struct_ui_text(srna, "Mesh Float Property", "User defined floating point number value in a float properties layer.");
+       RNA_def_struct_path_func(srna, "rna_MeshFloatProperty_path");
 
        prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "f");
@@ -823,6 +939,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshIntPropertyLayer", NULL);
        RNA_def_struct_sdna(srna, "CustomDataLayer");
        RNA_def_struct_ui_text(srna, "Mesh Int Property Layer", "User defined layer of integer number values.");
+       RNA_def_struct_path_func(srna, "rna_MeshIntPropertyLayer_path");
 
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_struct_name_property(srna, prop);
@@ -836,6 +953,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshIntProperty", NULL);
        RNA_def_struct_sdna(srna, "MIntProperty");
        RNA_def_struct_ui_text(srna, "Mesh Int Property", "User defined integer number value in an integer properties layer.");
+       RNA_def_struct_path_func(srna, "rna_MeshIntProperty_path");
 
        prop= RNA_def_property(srna, "value", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "i");
@@ -845,6 +963,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshStringPropertyLayer", NULL);
        RNA_def_struct_sdna(srna, "CustomDataLayer");
        RNA_def_struct_ui_text(srna, "Mesh String Property Layer", "User defined layer of string text values.");
+       RNA_def_struct_path_func(srna, "rna_MeshStringPropertyLayer_path");
 
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_struct_name_property(srna, prop);
@@ -858,6 +977,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "MeshStringProperty", NULL);
        RNA_def_struct_sdna(srna, "MStringProperty");
        RNA_def_struct_ui_text(srna, "Mesh String Property", "User defined string text value in a string properties layer.");
+       RNA_def_struct_path_func(srna, "rna_MeshStringProperty_path");
 
        prop= RNA_def_property(srna, "value", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "s");
@@ -896,7 +1016,6 @@ void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable)
        RNA_def_property_ui_text(prop, "Materials", "");
 }
 
-
 static void rna_def_mesh(BlenderRNA *brna)
 {
        StructRNA *srna;
index 6b9a708f555075157c384264d6e8538b6075b88c..6b6db71ef879f06c876817508bc984ef4bed5ebb 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * $Id$
+ * $Id: rna_packedfile.c 19382 2009-03-23 13:24:48Z blendix $
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
index dedc9492d1fa8915f2d69b3687cf25e39b1d05ef..d2e93fb787d76251ed2043c7a6d0939a9ac2c03d 100644 (file)
@@ -411,7 +411,6 @@ void RNA_def_world(BlenderRNA *brna)
 
        prop= RNA_def_property(srna, "script_link", PROP_POINTER, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "scriptlink");
-       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Script Link", "Scripts linked to this object.");
 
        rna_def_ambient_occlusion(brna);