diff options
author | Campbell Barton <ideasman42@gmail.com> | 2016-03-15 02:41:36 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-03-15 02:45:34 +0300 |
commit | 7db79ae57a3c119c382c0be375b79c3ce687a93d (patch) | |
tree | f6478d64c1cb5886b31493666e2e4e51269197b4 /release | |
parent | a078fe35396a34c8f6440e22c37a3b27e0c1f61a (diff) |
PyAPI: Double performance of Mesh.from_pydata
D1853 by @JacquesLucke
The speedup is mainly possible by using the `foreach_set` method for polygon data.
Diffstat (limited to 'release')
-rw-r--r-- | release/scripts/modules/bpy_types.py | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index d0607cbe675..c1a37d10961 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -409,28 +409,24 @@ class Mesh(bpy_types.ID): :type faces: iterable object """ + from itertools import chain, islice, accumulate + + face_lengths = tuple(map(len, faces)) + self.vertices.add(len(vertices)) self.edges.add(len(edges)) - self.loops.add(sum((len(f) for f in faces))) + self.loops.add(sum(face_lengths)) self.polygons.add(len(faces)) - vertices_flat = [f for v in vertices for f in v] - self.vertices.foreach_set("co", vertices_flat) - del vertices_flat - - edges_flat = [i for e in edges for i in e] - self.edges.foreach_set("vertices", edges_flat) - del edges_flat - - # this is different in bmesh - loop_index = 0 - for i, p in enumerate(self.polygons): - f = faces[i] - loop_len = len(f) - p.loop_start = loop_index - p.loop_total = loop_len - p.vertices = f - loop_index += loop_len + self.vertices.foreach_set("co", tuple(chain.from_iterable(vertices))) + self.edges.foreach_set("vertices", tuple(chain.from_iterable(edges))) + + vertex_indices = tuple(chain.from_iterable(faces)) + loop_starts = tuple(islice(chain([0], accumulate(face_lengths)), len(faces))) + + self.polygons.foreach_set("loop_total", face_lengths) + self.polygons.foreach_set("loop_start", loop_starts) + self.polygons.foreach_set("vertices", vertex_indices) # if no edges - calculate them if faces and (not edges): |