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

Elia Sarti vekoon at gmail.com
Sat Apr 11 14:44:02 CEST 2009


Revision: 19657
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19657
Author:   vekoon
Date:     2009-04-11 14:44:01 +0200 (Sat, 11 Apr 2009)

Log Message:
-----------
2.5 / RNA
Committing quick RNA function calling RNA_function_call_direct* functions set ?\195?\160 la fprintf.

It works like this (with ptr being an RNA pointer to some ID):

RNA_function_call_direct_lookup(ptr, "rename", "s", "MyCamera");

the format specifier would not be strictly needed but I prefer to keep this as it gives nice error handling in case some RNA function changes. 
Format strings are very easy and similar to python ones:
"b" for booleans
"i" for integers
"f" for floats
"s" for strings
"e" for enums (using int values)
"O" for pointers (using O as in py, we can change to P)
"N" special NULL parameter, valid to skip optional parameters
For bools, ints and floats you can use a special format specifier with [n] where n is the size of an array of that type. For instance "f[4]" to set a location/vector (it expects a pointer to float* holding the array).

Return values still have to be implemented.
Also I know the name is a bit long maybe we can cut it up at RNA_call_direct or simply RNA_call.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c

Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/RNA_access.h	2009-04-11 10:01:49 UTC (rev 19656)
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_access.h	2009-04-11 12:44:01 UTC (rev 19657)
@@ -541,11 +541,10 @@
 int RNA_function_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *parms);
 int RNA_function_call_lookup(PointerRNA *ptr, const char *identifier, ParameterList *parms);
 
-/* not implemented yet
 int RNA_function_call_direct(PointerRNA *ptr, FunctionRNA *func, const char *format, ...);
 int RNA_function_call_direct_lookup(PointerRNA *ptr, const char *identifier, const char *format, ...);
 int RNA_function_call_direct_va(PointerRNA *ptr, FunctionRNA *func, const char *format, va_list args);
-int RNA_function_call_direct_va_lookup(PointerRNA *ptr, const char *identifier, const char *format, va_list args);*/
+int RNA_function_call_direct_va_lookup(PointerRNA *ptr, const char *identifier, const char *format, va_list args);
 
 #ifdef __cplusplus
 }

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c	2009-04-11 10:01:49 UTC (rev 19656)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c	2009-04-11 12:44:01 UTC (rev 19657)
@@ -2316,7 +2316,7 @@
 		return 0;
 	}
 
-	return 1;
+	return -1;
 }
 
 int RNA_function_call_lookup(PointerRNA *ptr, const char *identifier, ParameterList *parms)
@@ -2328,10 +2328,9 @@
 	if(func)
 		return RNA_function_call(ptr, func, parms);
 
-	return 0;
+	return -1;
 }
 
-#if 0
 int RNA_function_call_direct(PointerRNA *ptr, FunctionRNA *func, const char *format, ...)
 {
 	va_list args;
@@ -2365,7 +2364,7 @@
 		return ret;
 	}
 
-	return 0;
+	return -1;
 }
 
 int RNA_function_call_direct_va(PointerRNA *ptr, FunctionRNA *func, const char *format, va_list args)
@@ -2374,10 +2373,10 @@
 	ParameterList *parms;
 	ParameterIterator iter;
 	PropertyRNA *pret, *parm;
-	PropertyType ptype;
-	PropertySubType psubtype;
-	int i, tlen, alen, err= 0;
+	PropertyType type;
+	int i, ofs, flen, flag, len, alen, err= 0;
 	const char *tid, *fid, *pid;
+	char ftype, lenbuf[16];
 	void **retdata;
 
 	RNA_pointer_create(NULL, &RNA_Function, func, &funcptr);
@@ -2385,19 +2384,189 @@
 	tid= RNA_struct_identifier(ptr);
 	fid= RNA_function_identifier(ptr, func);
 	pret= RNA_function_return(ptr, func);
+	flen= strlen(format);
 
 	parms= RNA_parameter_list_create(ptr, func);
 	RNA_parameter_list_begin(parms, &iter);
 
-	for(i= 0; iter.valid; RNA_parameter_list_next(&iter), i++) {
+	for(i= 0, ofs= 0; iter.valid; RNA_parameter_list_next(&iter), i++) {
 		parm= iter.parm;
+
 		if(parm==pret) {
 			retdata= iter.data;
 			continue;
 		}
 
-		/* XXX todo later, this is not really a priority as of now */
+		pid= RNA_property_identifier(&funcptr, parm);
+		flag= RNA_property_flag(&funcptr, parm);
+
+		if (ofs>=flen || format[ofs]=='N') {
+			if (flag & PROP_REQUIRED) {
+				err= -1;
+				fprintf(stderr, "%s.%s: missing required parameter %s\n", tid, fid, pid);
+				break;
+			}
+			continue;
+		}
+
+		type= RNA_property_type(&funcptr, parm);
+		len= RNA_property_array_length(&funcptr, parm);
+		alen= 0;
+		ftype= format[ofs++];
+
+		if (len>0) {
+			int idx= 0;
+
+			if (format[ofs++]=='[')
+				for (; ofs<flen && format[ofs]!=']' && idx<sizeof(*lenbuf)-1; idx++, ofs++)
+					lenbuf[idx]= format[ofs];
+
+			if (ofs<flen && format[ofs++]==']') {
+				/* XXX put better error reporting for ofs>=flen or idx over lenbuf capacity */
+				lenbuf[idx]= '\0';
+				alen= atoi(lenbuf);
+			}
+		}
+
+		if (len!=alen) {
+			err= -1;
+			fprintf(stderr, "%s.%s: for parameter %s, was expecting an array of %i elements, passed %i elements instead\n", tid, fid, pid, len, alen);
+			break;
+		}
+ 
+		switch (type) {
+		case PROP_BOOLEAN:
+			{
+				if (format[ofs]!='b') {
+					err= -1;
+					fprintf(stderr, "%s.%s: wrong type for parameter %s, a boolean was expected\n", tid, fid, pid);
+					break;
+				}
+
+				if (len==0)
+					*((int*)iter.data)= va_arg(args, int);
+				else
+					memcpy(iter.data, va_arg(args, int*), len);
+
+				break;
+			}
+		case PROP_INT:
+			{
+				if (format[ofs]!='i') {
+					err= -1;
+					fprintf(stderr, "%s.%s: wrong type for parameter %s, an integer was expected\n", tid, fid, pid);
+					break;
+				}
+
+				if (len==0)
+					*((int*)iter.data)= va_arg(args, int);
+				else
+					memcpy(iter.data, va_arg(args, int*), len);
+
+				break;
+			}
+		case PROP_FLOAT:
+			{
+				if (format[ofs]!='f') {
+					err= -1;
+					fprintf(stderr, "%s.%s: wrong type for parameter %s, a float was expected\n", tid, fid, pid);
+					break;
+				}
+
+				if (len==0)
+					*((float*)iter.data)= va_arg(args, float);
+				else
+					memcpy(iter.data, va_arg(args, float*), len);
+
+				break;
+			}
+		case PROP_STRING:
+			{
+				if (format[ofs]!='s') {
+					err= -1;
+					fprintf(stderr, "%s.%s: wrong type for parameter %s, a string was expected\n", tid, fid, pid);
+					break;
+				}
+
+				*((char**)iter.data)= va_arg(args, char*);
+
+				break;
+			}
+		case PROP_ENUM:
+			{
+				if (format[ofs]!='e') {
+					err= -1;
+					fprintf(stderr, "%s.%s: wrong type for parameter %s, an enum was expected\n", tid, fid, pid);
+					break;
+				}
+
+				*((int*)iter.data)= va_arg(args, int);
+
+				break;
+			}
+		case PROP_POINTER:
+			{
+				StructRNA *ptype, *srna;
+				void *data;
+
+				if (format[ofs]!='O') {
+					err= -1;
+					fprintf(stderr, "%s.%s: wrong type for parameter %s, an object was expected\n", tid, fid, pid);
+					break;
+				}
+
+				ptype= RNA_property_pointer_type(&funcptr, parm);
+				/* for objects we use two parms: the first is the type and the second is the data */
+				srna= va_arg(args, StructRNA*);
+
+				if(ptype == &RNA_AnyType) {
+					*((PointerRNA*)iter.data)= va_arg(args, PointerRNA);
+				}
+				else if (ptype!=srna) {
+					PointerRNA pptr;
+
+					data= va_arg(args, void*);
+					RNA_pointer_create(NULL, srna, data, &pptr);
+
+					if (!RNA_struct_is_a(&pptr, ptype)) {
+						PointerRNA tmp;
+						RNA_pointer_create(NULL, ptype, NULL, &tmp);
+
+						err= -1;
+						fprintf(stderr, "%s.%s: wrong type for parameter %s, an object of type %s was expected, passed an object of type %s\n", tid, fid, pid, RNA_struct_identifier(&tmp), RNA_struct_identifier(&pptr));
+						break;
+					}
+
+					*((void**)iter.data)= data;
+				}
+
+				break;
+			}
+		case PROP_COLLECTION:
+			{
+				/* XXX collections are not supported yet */
+				err= -1;
+				fprintf(stderr, "%s.%s: for parameter %s, collections are not supported yet\n", tid, fid, pid);
+				break;
+			}
+		default: 
+			{
+				err= -1;
+				if (len==0)
+					fprintf(stderr, "%s.%s: unknown type for parameter %s\n", tid, fid, pid);
+				else
+					fprintf(stderr, "%s.%s: unknown array type for parameter %s\n", tid, fid, pid);
+
+				break;
+			}
+		}
 	}
+
+	if (err==0 && pret) {
+		/* XXX return values still not implemented */
+	}
+
+	return err;
 }
 
 int RNA_function_call_direct_va_lookup(PointerRNA *ptr, const char *identifier, const char *format, va_list args)
@@ -2411,5 +2580,4 @@
 
 	return 0;
 }
-#endif
 





More information about the Bf-blender-cvs mailing list