diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-12-30 13:50:47 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-12-30 14:05:34 +0300 |
commit | 68600920ced198eaa1524993f988f26118402e50 (patch) | |
tree | 6f6c6c7228cf683eeb77b7cdf471c9c1b334d4bb /source/blender/python/mathutils/mathutils.c | |
parent | d993bad5e7adc35ad984dec1bbf0a57d99000712 (diff) |
PyAPI: allow non-vector args for geometry module
Previously only vector args were accepted,
now allow generic sequence of numbers.
Was annoying to create vectors just to pass in args.
Diffstat (limited to 'source/blender/python/mathutils/mathutils.c')
-rw-r--r-- | source/blender/python/mathutils/mathutils.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c index 349f8483fb0..5c3f38e2c12 100644 --- a/source/blender/python/mathutils/mathutils.c +++ b/source/blender/python/mathutils/mathutils.c @@ -69,8 +69,11 @@ static int mathutils_array_parse_fast(float *array, /* helper functionm returns length of the 'value', -1 on error */ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix) { + const int flag = array_max; int size; + array_max &= ~(MU_ARRAY_ZERO | MU_ARRAY_SPILL); + #if 1 /* approx 6x speedup for mathutils types */ if ((size = VectorObject_Check(value) ? ((VectorObject *)value)->size : 0) || @@ -82,6 +85,10 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject * return -1; } + if (flag & MU_ARRAY_SPILL) { + CLAMP_MAX(size, array_max); + } + if (size > array_max || size < array_min) { if (array_max == array_min) { PyErr_Format(PyExc_ValueError, @@ -97,7 +104,6 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject * } memcpy(array, ((BaseMathObject *)value)->data, size * sizeof(float)); - return size; } else #endif @@ -112,6 +118,10 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject * size = PySequence_Fast_GET_SIZE(value_fast); + if (flag & MU_ARRAY_SPILL) { + CLAMP_MAX(size, array_max); + } + if (size > array_max || size < array_min) { if (array_max == array_min) { PyErr_Format(PyExc_ValueError, @@ -127,8 +137,19 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject * return -1; } - return mathutils_array_parse_fast(array, size, value_fast, error_prefix); + size = mathutils_array_parse_fast(array, size, value_fast, error_prefix); } + + if (size != -1) { + if (flag & MU_ARRAY_ZERO) { + int size_left = array_max - size; + if (size_left) { + memset(&array[size], 0, sizeof(float) * size_left); + } + } + } + + return size; } /* on error, -1 is returned and no allocation is made */ |