Commit: c5fe6ed96bd1e6a20253bbeb2a20e4944781787a
Author: Bastien Montagne
Date:   Mon Mar 18 15:37:46 2019 +0100
Branches: master
https://developer.blender.org/rBc5fe6ed96bd1e6a20253bbeb2a20e4944781787a

Fix T62633: Model normals not updating in a modifier stack after a deform 
modifier.

A deform-only modifier that needs access to normals need a copy of
evaluated mesh with those normals updated, when it is not the first one
in the stack.

That issue had been partially fixed in Object mode a long time ago
(see T23673), but it was still broken for deform-only stacks cases.

And it was also completely missing from the Edit mode code
(`editbmesh_calc_modifiers()` function).

===================================================================

M       source/blender/blenkernel/intern/DerivedMesh.c

===================================================================

diff --git a/source/blender/blenkernel/intern/DerivedMesh.c 
b/source/blender/blenkernel/intern/DerivedMesh.c
index cdcb64fb094..86ec491b43e 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1221,6 +1221,10 @@ static void mesh_calc_modifiers(
        }
        *r_final = NULL;
 
+       /* We need mesh even for deform-only part of the stack, in cases where 
some modifier needs
+        * e.g. access to updated normals. See T62633 for an example. */
+       Mesh *me = NULL;
+
        if (useDeform) {
                if (inputVertexCos)
                        deformedVerts = inputVertexCos;
@@ -1238,10 +1242,21 @@ static void mesh_calc_modifiers(
                        }
 
                        if (mti->type == eModifierTypeType_OnlyDeform && 
!sculpt_dyntopo) {
-                               if (!deformedVerts)
+                               if (!deformedVerts) {
                                        deformedVerts = 
BKE_mesh_vertexCos_get(ob->data, &numVerts);
+                               }
+
+                               if (isPrevDeform && mti->dependsOnNormals && 
mti->dependsOnNormals(md)) {
+                                       if (me == NULL) {
+                                               me = 
BKE_mesh_copy_for_eval(ob->data, true);
+                                               ASSERT_IS_VALID_MESH(me);
+                                       }
+                                       BKE_mesh_apply_vert_coords(me, 
deformedVerts);
+                               }
+
+                               modwrap_deformVerts(md, &mectx_deform, me, 
deformedVerts, numVerts);
 
-                               modwrap_deformVerts(md, &mectx_deform, NULL, 
deformedVerts, numVerts);
+                               isPrevDeform = true;
                        }
                        else {
                                break;
@@ -1282,7 +1297,6 @@ static void mesh_calc_modifiers(
        /* Now apply all remaining modifiers. If useDeform is off then skip
         * OnlyDeform ones.
         */
-       Mesh *me = NULL;
        Mesh *me_orco = NULL;
        Mesh *me_orco_cloth = NULL;
 
@@ -1715,6 +1729,7 @@ static void editbmesh_calc_modifiers(
        const int required_mode = eModifierMode_Realtime | 
eModifierMode_Editmode;
        const bool do_init_statvis = false;  /* FIXME: use 
V3D_OVERLAY_EDIT_STATVIS. */
        VirtualModifierData virtualModifierData;
+       bool isPrevDeform = false;
 
        /* TODO(sybren): do we really need multiple objects, or shall we change 
the flags where needed? */
        const ModifierEvalContext mectx = {depsgraph, ob, 0};
@@ -1779,6 +1794,16 @@ static void editbmesh_calc_modifiers(
                                }
                        }
 
+                       if (isPrevDeform && mti->dependsOnNormals && 
mti->dependsOnNormals(md)) {
+                               if (me == NULL) {
+                                       me = 
BKE_mesh_from_bmesh_for_eval_nomain(em->bm, NULL);
+                                       ASSERT_IS_VALID_MESH(me);
+                                       mesh_copy_autosmooth(me, ob->data);
+                               }
+                               BLI_assert(deformedVerts != NULL);
+                               BKE_mesh_apply_vert_coords(me, deformedVerts);
+                       }
+
                        if (mti->deformVertsEM)
                                modwrap_deformVertsEM(md, &mectx, em, me, 
deformedVerts, numVerts);
                        else
@@ -1895,6 +1920,8 @@ static void editbmesh_calc_modifiers(
                                mesh_copy_autosmooth(*r_cage, ob->data);
                        }
                }
+
+               isPrevDeform = (mti->type == eModifierTypeType_OnlyDeform);
        }
 
        BLI_linklist_free((LinkNode *)datamasks, NULL);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to