[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34298] trunk/blender/source/blender/ makesrna: bugfix [#25588] Not work fcurve.keyframe_points.add

Campbell Barton ideasman42 at gmail.com
Thu Jan 13 15:29:58 CET 2011


Revision: 34298
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34298
Author:   campbellbarton
Date:     2011-01-13 14:29:57 +0000 (Thu, 13 Jan 2011)
Log Message:
-----------
bugfix [#25588] Not work fcurve.keyframe_points.add

The problem was flag-enums were being treated as regular enums, a default value of 0 was using the first enum item, whereas with flag enums we want to be able to use 0 as a default value to specify all flags are off.

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/RNA_define.h
    trunk/blender/source/blender/makesrna/intern/makesrna.c
    trunk/blender/source/blender/makesrna/intern/rna_ID.c
    trunk/blender/source/blender/makesrna/intern/rna_define.c
    trunk/blender/source/blender/makesrna/intern/rna_fcurve.c
    trunk/blender/source/blender/makesrna/intern/rna_wm_api.c

Modified: trunk/blender/source/blender/makesrna/RNA_define.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_define.h	2011-01-13 11:16:38 UTC (rev 34297)
+++ trunk/blender/source/blender/makesrna/RNA_define.h	2011-01-13 14:29:57 UTC (rev 34298)
@@ -86,6 +86,7 @@
 PropertyRNA *RNA_def_string_file_name(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description);
 
 PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description);
+PropertyRNA *RNA_def_enum_flag(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description);
 void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc);
 
 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);

Modified: trunk/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/makesrna.c	2011-01-13 11:16:38 UTC (rev 34297)
+++ trunk/blender/source/blender/makesrna/intern/makesrna.c	2011-01-13 14:29:57 UTC (rev 34298)
@@ -2023,7 +2023,7 @@
 	switch(prop->type) {
 			case PROP_ENUM: {
 				EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
-				int i, defaultfound= 0;
+				int i, defaultfound= 0, totflag= 0;
 
 				if(eprop->item) {
 					fprintf(f, "static EnumPropertyItem rna_%s%s_%s_items[%d] = {\n\t", srna->identifier, strnest, prop->identifier, eprop->totitem+1);
@@ -2035,17 +2035,32 @@
 						rna_print_c_string(f, eprop->item[i].name); fprintf(f, ", ");
 						rna_print_c_string(f, eprop->item[i].description); fprintf(f, "},\n\t");
 
-						if(eprop->item[i].identifier[0])
-							if(eprop->defaultvalue == eprop->item[i].value)
-								defaultfound= 1;
+						if(eprop->item[i].identifier[0]) {
+							if(prop->flag & PROP_ENUM_FLAG) {
+								totflag |= eprop->item[i].value;
+							}
+							else {
+								if(eprop->defaultvalue == eprop->item[i].value) {
+									defaultfound= 1;
+								}
+							}
+						}
 					}
 
 					fprintf(f, "{0, NULL, 0, NULL, NULL}\n};\n\n");
 
-					if(!defaultfound) {
-						fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default is not in items.\n", srna->identifier, errnest, prop->identifier);
-						DefRNA.error= 1;
+					if(prop->flag & PROP_ENUM_FLAG) {
+						if(eprop->defaultvalue & ~totflag) {
+							fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default includes unused bits (%d).\n", srna->identifier, errnest, prop->identifier, eprop->defaultvalue & ~totflag);
+							DefRNA.error= 1;
+						}
 					}
+					else {
+						if(!defaultfound) {
+							fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default is not in items.\n", srna->identifier, errnest, prop->identifier);
+							DefRNA.error= 1;
+						}
+					}
 				}
 				else {
 					fprintf(stderr, "rna_generate_structs: %s%s.%s, enum must have items defined.\n", srna->identifier, errnest, prop->identifier);

Modified: trunk/blender/source/blender/makesrna/intern/rna_ID.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ID.c	2011-01-13 11:16:38 UTC (rev 34297)
+++ trunk/blender/source/blender/makesrna/intern/rna_ID.c	2011-01-13 14:29:57 UTC (rev 34298)
@@ -481,8 +481,7 @@
 	func= RNA_def_function(srna, "update", "rna_ID_update");
 	RNA_def_function_flag(func, FUNC_USE_REPORTS);
 	RNA_def_function_ui_description(func, "Tag the id to update its display data.");
-	parm= RNA_def_enum(func, "refresh", update_flag_items, 0, "", "Type of updates to perform.");
-	RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+	RNA_def_enum_flag(func, "refresh", update_flag_items, 0, "", "Type of updates to perform.");
 }
 
 static void rna_def_library(BlenderRNA *brna)

Modified: trunk/blender/source/blender/makesrna/intern/rna_define.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_define.c	2011-01-13 11:16:38 UTC (rev 34297)
+++ trunk/blender/source/blender/makesrna/intern/rna_define.c	2011-01-13 14:29:57 UTC (rev 34298)
@@ -1393,21 +1393,37 @@
 			EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
 			eprop->defaultvalue= value;
 
-			for(i=0; i<eprop->totitem; i++) {
-				if(eprop->item[i].identifier[0] && eprop->item[i].value == eprop->defaultvalue)
-					defaultfound= 1;
-			}
+			if(prop->flag & PROP_ENUM_FLAG) {
+				/* check all bits are accounted for */
+				int totflag= 0;
+				for(i=0; i<eprop->totitem; i++) {
+					if(eprop->item[i].identifier[0]) {
+						totflag |= eprop->item[i].value;
+					}
+				}
 
-			if(!defaultfound && eprop->totitem) {
-				if(value == 0) {
-					eprop->defaultvalue= eprop->item[0].value;
-				}
-				else {
-					fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", default is not in items.\n", srna->identifier, prop->identifier);
+				if(eprop->defaultvalue & ~totflag) {
+					fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", default includes unused bits (%d).\n", srna->identifier, prop->identifier, eprop->defaultvalue & ~totflag);
 					DefRNA.error= 1;
 				}
 			}
+			else {
+				for(i=0; i<eprop->totitem; i++) {
+					if(eprop->item[i].identifier[0] && eprop->item[i].value == eprop->defaultvalue)
+						defaultfound= 1;
+				}
 
+				if(!defaultfound && eprop->totitem) {
+					if(value == 0) {
+						eprop->defaultvalue= eprop->item[0].value;
+					}
+					else {
+						fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", default is not in items.\n", srna->identifier, prop->identifier);
+						DefRNA.error= 1;
+					}
+				}
+			}
+
 			break;
 		}
 		default:
@@ -2212,6 +2228,27 @@
 	return prop;
 }
 
+/* same as above but sets 'PROP_ENUM_FLAG' before setting the default value */
+PropertyRNA *RNA_def_enum_flag(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value,
+	const char *ui_name, const char *ui_description)
+{
+	ContainerRNA *cont= cont_;
+	PropertyRNA *prop;
+
+	if(!items) {
+		printf("RNA_def_enum_flag: items not allowed to be NULL.\n");
+		return NULL;
+	}
+
+	prop= RNA_def_property(cont, identifier, PROP_ENUM, PROP_NONE);
+	RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */
+	if(items) RNA_def_property_enum_items(prop, items);
+	RNA_def_property_enum_default(prop, default_value);
+	RNA_def_property_ui_text(prop, ui_name, ui_description);
+
+	return prop;
+}
+
 void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc)
 {
 	EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;

Modified: trunk/blender/source/blender/makesrna/intern/rna_fcurve.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_fcurve.c	2011-01-13 11:16:38 UTC (rev 34297)
+++ trunk/blender/source/blender/makesrna/intern/rna_fcurve.c	2011-01-13 14:29:57 UTC (rev 34298)
@@ -1333,8 +1333,7 @@
 	parm= RNA_def_float(func, "value", 0.0f, -FLT_MAX, FLT_MAX, "", "Y Value of this keyframe point", -FLT_MAX, FLT_MAX);
 	RNA_def_property_flag(parm, PROP_REQUIRED);
 
-	parm= RNA_def_enum(func, "options", keyframe_flag_items, 0, "", "Keyframe options.");
-	RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+	RNA_def_enum_flag(func, "options", keyframe_flag_items, 0, "", "Keyframe options.");
 
 	parm= RNA_def_pointer(func, "keyframe", "Keyframe", "", "Newly created keyframe");
 	RNA_def_function_return(func, parm);

Modified: trunk/blender/source/blender/makesrna/intern/rna_wm_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_wm_api.c	2011-01-13 11:16:38 UTC (rev 34297)
+++ trunk/blender/source/blender/makesrna/intern/rna_wm_api.c	2011-01-13 14:29:57 UTC (rev 34298)
@@ -93,8 +93,7 @@
 	}
 
 	if(flag & WM_GEN_INVOKE_RETURN) {
-		parm= RNA_def_enum(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
-		RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+		parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
 		RNA_def_function_return(func, parm);
 	}
 }
@@ -146,8 +145,8 @@
 
 	/* utility, not for registering */
 	func= RNA_def_function(srna, "report", "rna_Operator_report");
-	parm= RNA_def_enum(func, "type", wm_report_items, 0, "Type", "");
-	RNA_def_property_flag(parm, PROP_REQUIRED|PROP_ENUM_FLAG);
+	parm= RNA_def_enum_flag(func, "type", wm_report_items, 0, "Type", "");
+	RNA_def_property_flag(parm, PROP_REQUIRED);
 	parm= RNA_def_string(func, "message", "", 0, "Report Message", "");
 	RNA_def_property_flag(parm, PROP_REQUIRED);
 
@@ -167,8 +166,7 @@
 	RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
 	RNA_def_pointer(func, "context", "Context", "", "");
 
-	parm= RNA_def_enum(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
-	RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+	parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
 	RNA_def_function_return(func, parm);
 
 	/* check */
@@ -187,8 +185,7 @@
 	RNA_def_pointer(func, "context", "Context", "", "");
 	RNA_def_pointer(func, "event", "Event", "", "");
 
-	parm= RNA_def_enum(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
-	RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+	parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
 	RNA_def_function_return(func, parm);
 
 	func= RNA_def_function(srna, "modal", NULL); /* same as invoke */
@@ -197,8 +194,7 @@
 	RNA_def_pointer(func, "context", "Context", "", "");
 	RNA_def_pointer(func, "event", "Event", "", "");
 
-	parm= RNA_def_enum(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
-	RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+	parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
 	RNA_def_function_return(func, parm);
 
 	/* draw */
@@ -215,8 +211,8 @@
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list