Export/Perf: use numpy in extract_primitives (2-8x speedup) #1120
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Work in progress.This is ready.Rewrite extract_primitives to use numpy and foreach_get. This gives a pretty good perf boost; export times are now comparable to the other Python exporters (eg. FBX).
Some time comparisons.
Dots
To replace the dict of verts, the idea is to use numpy.unique. We collect a "dot" for every loop in the mesh. Each dot stores the Blender vertex index (which fully determines all its per-vert data: position, vertex groups, etc), and all the per-loop data at that loop. To make a primitive, we slice out all the dots for the primitive's tris, use numpy.unique to dedupe them, and then read out the attribute arrays from the dots.
convert_swizzle_*
These aren't used by extract_primitives anymore, so I moved them to gltf2_blender_node where they're still called.
The transformations from eg. __convert_swizzle_normal are now part of the __get_normals function.
Changes
I think there are only two changes