found moving verts in pythons 2.5 api is approx 10x slower because the multi-dimensio...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 24 Feb 2011 08:47:58 +0000 (08:47 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 24 Feb 2011 08:47:58 +0000 (08:47 +0000)
the length check was running sequence checks on every number which would fail, small speedup by avoiding this.

should eventually get this working faster by reading once into an allocated array.

source/blender/python/intern/bpy_rna.c
source/blender/python/intern/bpy_rna_array.c

index 9390cd80b7bb6983253bd08aa408eb2ebf500497..f18b1aee5abe9dad224ac3806ce2c077064c7506 100644 (file)
@@ -1042,20 +1042,12 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
 
 
        if (RNA_property_array_check(ptr, prop)) {
-
-               /* char error_str[512]; */
                int ok= 1;
 
-//             if (!PySequence_Check(value)) {
-//                     PyErr_Format(PyExc_TypeError, "%.200s RNA array assignment to %.200s.%.200s expected a sequence, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
-//                     return -1;
-//             }
-
                /* done getting the length */
                ok= pyrna_py_to_array(ptr, prop, data, value, error_prefix);
 
                if (!ok) {
-                       /* PyErr_Format(PyExc_AttributeError, "%.200s %s", error_prefix, error_str); */
                        return -1;
                }
        }
index 72b06c04943dda28a947eec34bc597324d3d1638..74ce5f66cfd6a045ca21c5a8bc644f5bd989821a 100644 (file)
@@ -110,21 +110,22 @@ static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[]
 }
 
 /* Returns the number of items in a single- or multi-dimensional sequence. */
-static int count_items(PyObject *seq)
+static int count_items(PyObject *seq, int dim)
 {
        int totitem= 0;
 
-       if (PySequence_Check(seq)) {
+       if(dim > 1) {
                const int seq_size= PySequence_Size(seq);
                int i;
                for (i= 0; i < seq_size; i++) {
                        PyObject *item= PySequence_GetItem(seq, i);
-                       totitem += count_items(item);
+                       totitem += count_items(item, dim - 1);
                        Py_DECREF(item);
                }
        }
-       else
-               totitem= 1;
+       else {
+               totitem= PySequence_Size(seq);
+       }
 
        return totitem;
 }
@@ -135,8 +136,8 @@ static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA
        int dimsize[MAX_ARRAY_DIMENSION];
        int tot, totdim, len;
 
-       tot= count_items(rvalue);
        totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+       tot= count_items(rvalue, totdim);
 
        if ((RNA_property_flag(prop) & PROP_DYNAMIC) && lvalue_dim == 0) {
                if (RNA_property_array_length(ptr, prop) != tot) {