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 d9d0304..22b41d0 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 e0522e6..8485a0c 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 0317e85..e2d3f85 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 c8a1893..94a2c51 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 fc76223..0d124a1 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 35eb0ce..3fcc2d1 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 b08c4ae..e05a5f6 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 f8dd33c..bc0c2a0 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 feda144..0a21ad1 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * $Id$
+ * $Id: rna_key.c 19382 2009-03-23 13:24:48Z blendix $
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
index c479e66..ca77d3b 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * $Id$
+ * $Id: rna_lattice.c 19382 2009-03-23 13:24:48Z blendix $
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
index d5caf57..3f86219 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 6b9a708..6b6db71 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * $Id$
+ * $Id: rna_packedfile.c 19382 2009-03-23 13:24:48Z blendix $
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
index dedc949..d2e93fb 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);