[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27056] trunk/blender/source/blender: python rna api now clamps values, ( was fun to see the spot_size go backwards)

Campbell Barton ideasman42 at gmail.com
Sun Feb 21 15:48:30 CET 2010


Revision: 27056
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27056
Author:   campbellbarton
Date:     2010-02-21 15:48:28 +0100 (Sun, 21 Feb 2010)

Log Message:
-----------
python rna api now clamps values, (was fun to see the spot_size go backwards)
Vector callbacks still missing clamp checks

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/RNA_access.h
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_access.h	2010-02-21 14:19:53 UTC (rev 27055)
+++ trunk/blender/source/blender/makesrna/RNA_access.h	2010-02-21 14:48:28 UTC (rev 27056)
@@ -648,6 +648,9 @@
 void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax);
 void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *softmin, float *softmax, float *step, float *precision);
 
+int RNA_property_float_clamp(PointerRNA *ptr, PropertyRNA *prop, float *value);
+int RNA_property_int_clamp(PointerRNA *ptr, PropertyRNA *prop, int *value);
+
 int RNA_enum_identifier(EnumPropertyItem *item, const int value, const char **identifier);
 int RNA_enum_bitflag_identifiers(EnumPropertyItem *item, const int value, const char **identifier);
 int RNA_enum_name(EnumPropertyItem *item, const int value, const char **name);

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2010-02-21 14:19:53 UTC (rev 27055)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2010-02-21 14:48:28 UTC (rev 27056)
@@ -923,6 +923,44 @@
 	*precision= (float)fprop->precision;
 }
 
+int RNA_property_float_clamp(PointerRNA *ptr, PropertyRNA *prop, float *value)
+{
+	float min, max;
+
+	RNA_property_float_range(ptr, prop, &min, &max);
+
+	if(*value < min) {
+		*value= min;
+		return -1;
+	}
+	else if(*value > max) {
+		*value= max;
+		return 1;
+	}
+	else {
+		return 0;
+	}
+}
+
+int RNA_property_int_clamp(PointerRNA *ptr, PropertyRNA *prop, int *value)
+{
+	int min, max;
+
+	RNA_property_int_range(ptr, prop, &min, &max);
+
+	if(*value < min) {
+		*value= min;
+		return -1;
+	}
+	else if(*value > max) {
+		*value= max;
+		return 1;
+	}
+	else {
+		return 0;
+	}
+}
+
 /* this is the max length including \0 terminator */
 int RNA_property_string_maxlength(PropertyRNA *prop)
 {

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2010-02-21 14:19:53 UTC (rev 27055)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2010-02-21 14:48:28 UTC (rev 27056)
@@ -62,6 +62,7 @@
 static Py_ssize_t pyrna_prop_array_length(BPy_PropertyRNA *self);
 static Py_ssize_t pyrna_prop_collection_length( BPy_PropertyRNA *self );
 
+
 /* bpyrna vector/euler/quat callbacks */
 static int mathutils_rna_array_cb_index= -1; /* index for our callbacks */
 
@@ -88,7 +89,7 @@
 {
 	if(self->prop==NULL)
 		return 0;
-
+	/* TODO, clamp */
 	RNA_property_float_set_array(&self->ptr, self->prop, vec_to);
 	RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
 	return 1;
@@ -108,6 +109,7 @@
 	if(self->prop==NULL)
 		return 0;
 
+	RNA_property_float_clamp(&self->ptr, self->prop, &vec_to[index]);
 	RNA_property_float_set_index(&self->ptr, self->prop, index, vec_to[index]);
 	RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
 	return 1;
@@ -138,7 +140,7 @@
 {
 	if(self->prop==NULL)
 		return 0;
-
+	/* can ignore clamping here */
 	RNA_property_float_set_array(&self->ptr, self->prop, mat_to);
 	RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
 	return 1;
@@ -804,6 +806,7 @@
 				PyErr_Format(PyExc_TypeError, "%.200s expected an int type", error_prefix);
 				return -1;
 			} else {
+				RNA_property_int_clamp(ptr, prop, &param);
 				if(data)	*((int*)data)= param;
 				else		RNA_property_int_set(ptr, prop, param);
 			}
@@ -816,6 +819,7 @@
 				PyErr_Format(PyExc_TypeError, "%.200s expected a float type", error_prefix);
 				return -1;
 			} else {
+				RNA_property_float_clamp(ptr, prop, (float *)&param);
 				if(data)	*((float*)data)= param;
 				else		RNA_property_float_set(ptr, prop, param);
 			}
@@ -1029,6 +1033,7 @@
 					PyErr_SetString(PyExc_TypeError, "expected an int type");
 					ret = -1;
 				} else {
+					RNA_property_int_clamp(ptr, prop, &param);
 					RNA_property_int_set_index(ptr, prop, index, param);
 				}
 				break;
@@ -1040,6 +1045,7 @@
 					PyErr_SetString(PyExc_TypeError, "expected a float type");
 					ret = -1;
 				} else {
+					RNA_property_float_clamp(ptr, prop, &param);
 					RNA_property_float_set_index(ptr, prop, index, param);
 				}
 				break;
@@ -1303,14 +1309,21 @@
 		case PROP_FLOAT:
 		{
 			float values_stack[PYRNA_STACK_ARRAY];
-			float *values;
+			float *values, fval;
+
+			float min, max;
+			RNA_property_float_range(ptr, prop, &min, &max);
+
 			if(length > PYRNA_STACK_ARRAY)	{	values= values_alloc= PyMem_MALLOC(sizeof(float) * length); }
 			else							{	values= values_stack; }
 			if(start != 0 || stop != length) /* partial assignment? - need to get the array */
 				RNA_property_float_get_array(ptr, prop, values);
 			
-			for(count=start; count<stop; count++)
-				values[count] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, count-start));
+			for(count=start; count<stop; count++) {
+				fval = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, count-start));
+				CLAMP(fval, min, max);
+				values[count] = fval;
+			}
 
 			if(PyErr_Occurred())	ret= -1;
 			else					RNA_property_float_set_array(ptr, prop, values);
@@ -1336,15 +1349,22 @@
 		case PROP_INT:
 		{
 			int values_stack[PYRNA_STACK_ARRAY];
-			int *values;
+			int *values, ival;
+
+			int min, max;
+			RNA_property_int_range(ptr, prop, &min, &max);
+
 			if(length > PYRNA_STACK_ARRAY)	{	values= values_alloc= PyMem_MALLOC(sizeof(int) * length); }
 			else							{	values= values_stack; }
 
 			if(start != 0 || stop != length) /* partial assignment? - need to get the array */
 				RNA_property_int_get_array(ptr, prop, values);
 
-			for(count=start; count<stop; count++)
-				values[count] = PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, count-start));
+			for(count=start; count<stop; count++) {
+				ival = PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, count-start));
+				CLAMP(ival, min, max);
+				values[count] = ival;
+			}
 
 			if(PyErr_Occurred())	ret= -1;
 			else					RNA_property_int_set_array(ptr, prop, values);





More information about the Bf-blender-cvs mailing list