[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, ¶m);
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 *)¶m);
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, ¶m);
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, ¶m);
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