Fix T48084: Solidify uses alternate quad-direction
authorCampbell Barton <ideasman42@gmail.com>
Mon, 11 Apr 2016 12:56:17 +0000 (22:56 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 11 Apr 2016 13:04:11 +0000 (23:04 +1000)
This prevents twisted quads from self-intersecting.

This change makes the duplicate surface match the first vertex in the face,
so the diagonal indices match in the face copy.

source/blender/modifiers/intern/MOD_solidify.c

index 0a4d64742346fa680c1561b6ddb629c3ed1e071d..527576843e36afe21372b117414bc80b48b6aa78 100644 (file)
@@ -455,6 +455,7 @@ static DerivedMesh *applyModifier(
 
                mp = mpoly + numFaces;
                for (i = 0; i < dm->numPolyData; i++, mp++) {
+                       const int loop_end = mp->totloop - 1;
                        MLoop *ml2;
                        unsigned int e;
                        int j;
@@ -462,10 +463,20 @@ static DerivedMesh *applyModifier(
                        /* reverses the loop direction (MLoop.v as well as custom-data)
                         * MLoop.e also needs to be corrected too, done in a separate loop below. */
                        ml2 = mloop + mp->loopstart + dm->numLoopData;
+#if 0
                        for (j = 0; j < mp->totloop; j++) {
                                CustomData_copy_data(&dm->loopData, &result->loopData, mp->loopstart + j,
-                                                    mp->loopstart + (mp->totloop - j - 1) + dm->numLoopData, 1);
+                                                    mp->loopstart + (loop_end - j) + dm->numLoopData, 1);
                        }
+#else
+                       /* slightly more involved, keep the first vertex the same for the copy,
+                        * ensures the diagonals in the new face match the original. */
+                       j = 0;
+                       for (int j_prev = loop_end; j < mp->totloop; j_prev = j++) {
+                               CustomData_copy_data(&dm->loopData, &result->loopData, mp->loopstart + j,
+                                                    mp->loopstart + (loop_end - j_prev) + dm->numLoopData, 1);
+                       }
+#endif
 
                        if (mat_ofs) {
                                mp->mat_nr += mat_ofs;
@@ -473,10 +484,10 @@ static DerivedMesh *applyModifier(
                        }
 
                        e = ml2[0].e;
-                       for (j = 0; j < mp->totloop - 1; j++) {
+                       for (j = 0; j < loop_end; j++) {
                                ml2[j].e = ml2[j + 1].e;
                        }
-                       ml2[mp->totloop - 1].e = e;
+                       ml2[loop_end].e = e;
 
                        mp->loopstart += dm->numLoopData;