author Sybren A. Stüvel Thu, 19 Sep 2019 15:30:52 +0000 (17:30 +0200) committer Sybren A. Stüvel Thu, 19 Sep 2019 15:36:18 +0000 (17:36 +0200)
Creases are stored by the vertex indices of the edges. Sometimes they
were stored with (v1, v2) when the edge itself was stored with (v2, v1).
We now search for both orientations.

Sorting the vertex indices before searching avoids the second search

index 4d00b1904a86fbf75c9b57ca23e0520063743c34..12c59964a8c21e512f9f38a06b07893caa498715 100644 (file)
Int32ArraySamplePtr indices = sample.getCreaseIndices();
Alembic::Abc::FloatArraySamplePtr sharpnesses = sample.getCreaseSharpnesses();

-  MEdge *edges = mesh->medge;
-
if (indices && sharpnesses) {
+    MEdge *edges = mesh->medge;
+    int totedge = mesh->totedge;
+
for (int i = 0, s = 0, e = indices->size(); i < e; i += 2, s++) {
-      MEdge *edge = find_edge(edges, mesh->totedge, (*indices)[i], (*indices)[i + 1]);
+      int v1 = (*indices)[i];
+      int v2 = (*indices)[i + 1];
+
+      if (v2 < v1) {
+        /* It appears to be common to store edges with the smallest index first, in which case this
+         * prevents us from doing the second search below. */
+        std::swap(v1, v2);
+      }
+
+      MEdge *edge = find_edge(edges, totedge, v1, v2);
+      if (edge == NULL) {
+        edge = find_edge(edges, totedge, v2, v1);
+      }

if (edge) {
edge->crease = unit_float_to_uchar_clamp((*sharpnesses)[s]);