[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23088] branches/blender2.5/blender/source /blender: RNA: multidimensional & dyanmic array changes

Brecht Van Lommel brecht at blender.org
Wed Sep 9 21:40:46 CEST 2009


Revision: 23088
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23088
Author:   blendix
Date:     2009-09-09 21:40:46 +0200 (Wed, 09 Sep 2009)

Log Message:
-----------
RNA: multidimensional & dyanmic array changes

* Disable setting array length of dynamic array for now, this was not
  implemented correct, and it's not really needed now.
* Allow all dimensions to be dynamic size, not just the first.
* Change storage of multidimensional to be simpler.
* Rename API functions to be more compact.
* Fix some bugs in the implementation.
* RenderLayer.rect and RenderPass.rect use a multidimensional
  dynamic array now.

Modified Paths:
--------------
    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_mesh.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_object.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_render.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_rna.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_array.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c

Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/RNA_access.h	2009-09-09 19:31:43 UTC (rev 23087)
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_access.h	2009-09-09 19:40:46 UTC (rev 23088)
@@ -586,10 +586,9 @@
 int RNA_property_flag(PropertyRNA *prop);
 
 int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop);
-int RNA_property_multidimensional_array_length(PointerRNA *ptr, PropertyRNA *prop, int dimension);
-int RNA_property_dynamic_array_set_length(PointerRNA *ptr, PropertyRNA *prop, int length);
+int RNA_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int dimension);
+int RNA_property_array_dimension(PointerRNA *ptr, PropertyRNA *prop, int length[]);
 char RNA_property_array_item_char(PropertyRNA *prop, int index);
-unsigned short RNA_property_array_dimension(PropertyRNA *prop, unsigned short dim_size[]);
 
 int RNA_property_string_maxlength(PropertyRNA *prop);
 

Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_define.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/RNA_define.h	2009-09-09 19:31:43 UTC (rev 23087)
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_define.h	2009-09-09 19:40:46 UTC (rev 23088)
@@ -90,7 +90,7 @@
 PropertyRNA *RNA_def_float(StructOrFunctionRNA *cont, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
 PropertyRNA *RNA_def_float_vector(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
 PropertyRNA *RNA_def_float_color(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
-PropertyRNA *RNA_def_float_matrix(StructOrFunctionRNA *cont, const char *identifier, int len, int rowsize, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
+PropertyRNA *RNA_def_float_matrix(StructOrFunctionRNA *cont, const char *identifier, int rows, int columns, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
 PropertyRNA *RNA_def_float_rotation(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value,
 	float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
 PropertyRNA *RNA_def_float_array(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value,
@@ -128,8 +128,8 @@
 
 void RNA_def_property_flag(PropertyRNA *prop, int flag);
 void RNA_def_property_clear_flag(PropertyRNA *prop, int flag);
-void RNA_def_property_array(PropertyRNA *prop, int arraylength);
-void RNA_def_property_multidimensional_array(PropertyRNA *prop, int arraylength, unsigned short arraydimension, unsigned short dimsize[]);
+void RNA_def_property_array(PropertyRNA *prop, int length);
+void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, int length[]);
 void RNA_def_property_range(PropertyRNA *prop, double min, double max);
 
 void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item);
@@ -153,7 +153,7 @@
 void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *updatefunc);
 void RNA_def_property_editable_func(PropertyRNA *prop, const char *editable);
 
-void RNA_def_property_dynamic_array_funcs(PropertyRNA *prop, const char *getlength, const char *setlength);
+void RNA_def_property_dynamic_array_funcs(PropertyRNA *prop, const char *getlength);
 void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const char *set);
 void RNA_def_property_int_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range);
 void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range);

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c	2009-09-09 19:31:43 UTC (rev 23087)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c	2009-09-09 19:40:46 UTC (rev 23088)
@@ -306,11 +306,10 @@
 static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, const char *manualfunc)
 {
 	char *func;
-	int i;
 
 	if(prop->flag & PROP_IDPROPERTY)
 		return NULL;
-	
+
 	if(!manualfunc) {
 		if(!dp->dnastructname || !dp->dnaname) {
 			fprintf(stderr, "rna_def_property_get_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
@@ -373,8 +372,11 @@
 			break;
 		}
 		default:
-			if(prop->arraylength) {
-				fprintf(f, "void %s(PointerRNA *ptr, %s values[%d])\n", func, rna_type_type(prop), prop->arraylength);
+			if(prop->arraydimension) {
+				if(prop->flag & PROP_DYNAMIC)
+					fprintf(f, "void %s(PointerRNA *ptr, %s values[])\n", func, rna_type_type(prop));
+				else
+					fprintf(f, "void %s(PointerRNA *ptr, %s values[%d])\n", func, rna_type_type(prop), prop->totarraylength);
 				fprintf(f, "{\n");
 
 				if(manualfunc) {
@@ -383,27 +385,38 @@
 				else {
 					rna_print_data_get(f, dp);
 
-					for(i=0; i<prop->arraylength; i++) {
-						if(dp->dnaarraylength == 1) {
-							if(prop->type == PROP_BOOLEAN && dp->booleanbit)
-								fprintf(f, "	values[%d]= (%s(data->%s & (%d<<%d)) != 0);\n", i, (dp->booleannegative)? "!": "", dp->dnaname, dp->booleanbit, i);
-							else
-								fprintf(f, "	values[%d]= (%s)%s((&data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname, i);
+					if(prop->flag & PROP_DYNAMIC) {
+						char *lenfunc= rna_alloc_function_name(srna->identifier, prop->identifier, "get_length");
+						fprintf(f, "	int i, arraylen[RNA_MAX_ARRAY_DIMENSION];\n");
+						fprintf(f, "	int len= %s(ptr, arraylen);\n\n", lenfunc);
+						fprintf(f, "	for(i=0; i<len; i++) {\n");
+						MEM_freeN(lenfunc);
+					}
+					else {
+						fprintf(f, "	int i;\n\n");
+						fprintf(f, "	for(i=0; i<%d; i++) {\n", prop->totarraylength);
+					}
+
+					if(dp->dnaarraylength == 1) {
+						if(prop->type == PROP_BOOLEAN && dp->booleanbit)
+							fprintf(f, "		values[i]= (%s(data->%s & (%d<<i)) != 0);\n", (dp->booleannegative)? "!": "", dp->dnaname, dp->booleanbit);
+						else
+							fprintf(f, "		values[i]= (%s)%s((&data->%s)[i]);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname);
+					}
+					else {
+						if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
+							fprintf(f, "		values[i]= (%s(data->%s[i] & ", (dp->booleannegative)? "!": "", dp->dnaname);
+							rna_int_print(f, dp->booleanbit);
+							fprintf(f, ") != 0);\n");
 						}
-						else {
-							if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
-								fprintf(f, "	values[%d]= (%s(data->%s[%d] & ", i, (dp->booleannegative)? "!": "", dp->dnaname, i);
-								rna_int_print(f, dp->booleanbit);
-								fprintf(f, ") != 0);\n");
-							}
-							else if(rna_color_quantize(prop, dp))
-								fprintf(f, "	values[%d]= (%s)(data->%s[%d]*(1.0f/255.0f));\n", i, rna_type_type(prop), dp->dnaname, i);
-							else if(dp->dnatype)
-								fprintf(f, "	values[%d]= (%s)%s(((%s*)data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnatype, dp->dnaname, i);
-							else
-								fprintf(f, "	values[%d]= (%s)%s((data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname, i);
-						}
+						else if(rna_color_quantize(prop, dp))
+							fprintf(f, "		values[i]= (%s)(data->%s[i]*(1.0f/255.0f));\n", rna_type_type(prop), dp->dnaname);
+						else if(dp->dnatype)
+							fprintf(f, "		values[i]= (%s)%s(((%s*)data->%s)[i]);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnatype, dp->dnaname);
+						else
+							fprintf(f, "		values[i]= (%s)%s((data->%s)[i]);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname);
 					}
+					fprintf(f, "	}\n");
 				}
 				fprintf(f, "}\n\n");
 			}
@@ -438,13 +451,13 @@
 	return func;
 }
 
-static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array, int i)
+static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array)
 {
 	if(prop->type == PROP_INT) {
 		IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
 
 		if(iprop->hardmin != INT_MIN || iprop->hardmax != INT_MAX) {
-			if(array) fprintf(f, "CLAMPIS(values[%d], ", i);
+			if(array) fprintf(f, "CLAMPIS(values[i], ");
 			else fprintf(f, "CLAMPIS(value, ");
 			rna_int_print(f, iprop->hardmin); fprintf(f, ", ");
 			rna_int_print(f, iprop->hardmax); fprintf(f, ");\n");
@@ -455,7 +468,7 @@
 		FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
 
 		if(fprop->hardmin != -FLT_MAX || fprop->hardmax != FLT_MAX) {
-			if(array) fprintf(f, "CLAMPIS(values[%d], ", i);
+			if(array) fprintf(f, "CLAMPIS(values[i], ");
 			else fprintf(f, "CLAMPIS(value, ");
 			rna_float_print(f, fprop->hardmin); fprintf(f, ", ");
 			rna_float_print(f, fprop->hardmax); fprintf(f, ");\n");
@@ -464,7 +477,7 @@
 	}
 
 	if(array)
-		fprintf(f, "values[%d];\n", i);
+		fprintf(f, "values[i];\n");
 	else
 		fprintf(f, "value;\n");
 }
@@ -472,7 +485,6 @@
 static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc)
 {
 	char *func;
-	int i;
 
 	if(!(prop->flag & PROP_EDITABLE))
 		return NULL;
@@ -532,8 +544,11 @@
 			break;
 		}
 		default:
-			if(prop->arraylength) {
-				fprintf(f, "void %s(PointerRNA *ptr, const %s values[%d])\n", func, rna_type_type(prop), prop->arraylength);
+			if(prop->arraydimension) {
+				if(prop->flag & PROP_DYNAMIC)
+					fprintf(f, "void %s(PointerRNA *ptr, const %s values[])\n", func, rna_type_type(prop));
+				else
+					fprintf(f, "void %s(PointerRNA *ptr, const %s values[%d])\n", func, rna_type_type(prop), prop->totarraylength);
 				fprintf(f, "{\n");
 
 				if(manualfunc) {
@@ -542,38 +557,49 @@
 				else {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list