[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19413] branches/blender2.5/blender/source /blender: RNA:

Brecht Van Lommel brecht at blender.org
Wed Mar 25 21:29:01 CET 2009


Revision: 19413
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19413
Author:   blendix
Date:     2009-03-25 21:29:01 +0100 (Wed, 25 Mar 2009)

Log Message:
-----------
RNA:
* 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.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenlib/BLI_string.h
    branches/blender2.5/blender/source/blender/blenlib/intern/string.c
    branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
    branches/blender2.5/blender/source/blender/makesrna/RNA_define.h
    branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_key.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_lattice.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_mesh.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_packedfile.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_world.c

Modified: branches/blender2.5/blender/source/blender/blenlib/BLI_string.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/BLI_string.h	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/blenlib/BLI_string.h	2009-03-25 20:29:01 UTC (rev 19413)
@@ -73,6 +73,12 @@
 	 */
 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
 	 * 

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/string.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/string.c	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/string.c	2009-03-25 20:29:01 UTC (rev 19413)
@@ -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 @@
 	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);
 }

Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/RNA_access.h	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_access.h	2009-03-25 20:29:01 UTC (rev 19413)
@@ -411,6 +411,8 @@
 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
  *

Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_define.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/RNA_define.h	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_define.h	2009-03-25 20:29:01 UTC (rev 19413)
@@ -53,6 +53,7 @@
 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);

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c	2009-03-25 20:29:01 UTC (rev 19413)
@@ -1385,6 +1385,7 @@
 	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);

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c	2009-03-25 20:29:01 UTC (rev 19413)
@@ -318,7 +318,7 @@
 	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 @@
 		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 @@
 	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)

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c	2009-03-25 20:29:01 UTC (rev 19413)
@@ -514,6 +514,16 @@
 	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) {

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal_types.h	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal_types.h	2009-03-25 20:29:01 UTC (rev 19413)
@@ -41,6 +41,7 @@
 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 @@
 	/* 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; 
 };

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_key.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_key.c	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_key.c	2009-03-25 20:29:01 UTC (rev 19413)
@@ -1,5 +1,5 @@
 /**
- * $Id$
+ * $Id: rna_key.c 19382 2009-03-23 13:24:48Z blendix $
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_lattice.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_lattice.c	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_lattice.c	2009-03-25 20:29:01 UTC (rev 19413)
@@ -1,5 +1,5 @@
 /**
- * $Id$
+ * $Id: rna_lattice.c 19382 2009-03-23 13:24:48Z blendix $
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_mesh.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_mesh.c	2009-03-25 18:21:48 UTC (rev 19412)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_mesh.c	2009-03-25 20:29:01 UTC (rev 19413)
@@ -467,6 +467,111 @@
 	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)
+{

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list