[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56674] trunk/blender/source/blender: Fix #35289: UV layout export to image was extremely slow for large meshes.

Brecht Van Lommel brechtvanlommel at pandora.be
Sat May 11 00:05:48 CEST 2013


Revision: 56674
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56674
Author:   blendix
Date:     2013-05-10 22:05:47 +0000 (Fri, 10 May 2013)
Log Message:
-----------
Fix #35289: UV layout export to image was extremely slow for large meshes. This
was due to slow implementation of slice operation for things like mesh uv data.
Made that faster now for cases where the internal storage is an array.

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	2013-05-10 20:49:16 UTC (rev 56673)
+++ trunk/blender/source/blender/makesrna/RNA_access.h	2013-05-10 22:05:47 UTC (rev 56674)
@@ -857,6 +857,7 @@
 
 void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, CollectionPropertyIterator *iter);
 void RNA_property_collection_next(CollectionPropertyIterator *iter);
+void RNA_property_collection_skip(CollectionPropertyIterator *iter, int num);
 void RNA_property_collection_end(CollectionPropertyIterator *iter);
 int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop);
 int RNA_property_collection_lookup_index(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *t_ptr);

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2013-05-10 20:49:16 UTC (rev 56673)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2013-05-10 22:05:47 UTC (rev 56674)
@@ -2820,6 +2820,29 @@
 		cprop->next(iter);
 }
 
+void RNA_property_collection_skip(CollectionPropertyIterator *iter, int num)
+{
+	CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(iter->prop);
+	int i;
+
+	if (num > 1 && (iter->idprop || (cprop->property.flag & PROP_RAW_ARRAY))) {
+		/* fast skip for array */
+		ArrayIterator *internal = iter->internal;
+
+		if (!internal->skip) {
+			internal->ptr += internal->itemsize*(num-1);
+			iter->valid = (internal->ptr < internal->endptr);
+			if(iter->valid)
+				RNA_property_collection_next(iter);
+			return;
+		}
+	}
+
+	/* slow iteration otherwise */
+	for (i = 0; i < num && iter->valid; i++)
+		RNA_property_collection_next(iter);
+}
+
 void RNA_property_collection_end(CollectionPropertyIterator *iter)
 {
 	CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(iter->prop);

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2013-05-10 20:49:16 UTC (rev 56673)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2013-05-10 22:05:47 UTC (rev 56674)
@@ -2270,7 +2270,7 @@
 static PyObject *pyrna_prop_collection_subscript_slice(BPy_PropertyRNA *self, Py_ssize_t start, Py_ssize_t stop)
 {
 	CollectionPropertyIterator rna_macro_iter;
-	int count = 0;
+	int count;
 
 	PyObject *list;
 	PyObject *item;
@@ -2279,20 +2279,12 @@
 
 	list = PyList_New(0);
 
-	/* first loop up-until the start */
-	for (RNA_property_collection_begin(&self->ptr, self->prop, &rna_macro_iter);
-	     rna_macro_iter.valid;
-	     RNA_property_collection_next(&rna_macro_iter))
-	{
-		/* PointerRNA itemptr = rna_macro_iter.ptr; */
-		if (count == start) {
-			break;
-		}
-		count++;
-	}
+	/* skip to start */
+	RNA_property_collection_begin(&self->ptr, self->prop, &rna_macro_iter);
+	RNA_property_collection_skip(&rna_macro_iter, start);
 
 	/* add items until stop */
-	for (; rna_macro_iter.valid;
+	for (count = start; rna_macro_iter.valid;
 	     RNA_property_collection_next(&rna_macro_iter))
 	{
 		item = pyrna_struct_CreatePyObject(&rna_macro_iter.ptr);




More information about the Bf-blender-cvs mailing list