diff options
Diffstat (limited to 'source/blender/blenkernel/intern/DerivedMesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 681e46ed24e..eeff04788f9 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -1021,7 +1021,7 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph, if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && have_non_onlydeform_modifiers_appled) { - BKE_modifier_set_error(md, "Modifier requires original data, bad stack position"); + BKE_modifier_set_error(ob, md, "Modifier requires original data, bad stack position"); continue; } @@ -1047,14 +1047,13 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph, if (unsupported) { if (sculpt_dyntopo) { - BKE_modifier_set_error(md, "Not supported in dyntopo"); + BKE_modifier_set_error(ob, md, "Not supported in dyntopo"); } else { - BKE_modifier_set_error(md, "Not supported in sculpt mode"); + BKE_modifier_set_error(ob, md, "Not supported in sculpt mode"); } continue; } - BKE_modifier_set_error(md, "Sculpt: Hide, Mask and optimized display disabled"); } if (need_mapping && !BKE_modifier_supports_mapping(md)) { @@ -1091,7 +1090,7 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph, } } /* if this is not the last modifier in the stack then recalculate the normals - * to avoid giving bogus normals to the next modifier see: [#23673] */ + * to avoid giving bogus normals to the next modifier see: T23673. */ else if (isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) { if (mesh_final == NULL) { mesh_final = BKE_mesh_copy_for_eval(mesh_input, true); @@ -1102,31 +1101,31 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph, BKE_modifier_deform_verts(md, &mectx, mesh_final, deformed_verts, num_deformed_verts); } else { - have_non_onlydeform_modifiers_appled = true; - - /* determine which data layers are needed by following modifiers */ - CustomData_MeshMasks nextmask; - if (md_datamask->next) { - nextmask = md_datamask->next->mask; - } - else { - nextmask = final_datamask; - } - + bool check_for_needs_mapping = false; /* apply vertex coordinates or build a Mesh as necessary */ - if (mesh_final) { - if (deformed_verts) { - BKE_mesh_vert_coords_apply(mesh_final, deformed_verts); + if (mesh_final != NULL) { + if (have_non_onlydeform_modifiers_appled == false) { + /* If we only deformed, we won't have initialized #CD_ORIGINDEX. + * as this is the only part of the function that initializes mapping. */ + check_for_needs_mapping = true; } } else { mesh_final = BKE_mesh_copy_for_eval(mesh_input, true); ASSERT_IS_VALID_MESH(mesh_final); + check_for_needs_mapping = true; + } - if (deformed_verts) { - BKE_mesh_vert_coords_apply(mesh_final, deformed_verts); - } + if (deformed_verts) { + BKE_mesh_vert_coords_apply(mesh_final, deformed_verts); + } + have_non_onlydeform_modifiers_appled = true; + + /* determine which data layers are needed by following modifiers */ + CustomData_MeshMasks nextmask = md_datamask->next ? md_datamask->next->mask : final_datamask; + + if (check_for_needs_mapping) { /* Initialize original indices the first time we evaluate a * constructive modifier. Modifiers will then do mapping mostly * automatic by copying them through CustomData_copy_data along @@ -1157,7 +1156,7 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph, /* set the Mesh to only copy needed data */ CustomData_MeshMasks mask = md_datamask->mask; - /* needMapping check here fixes bug [#28112], otherwise it's + /* needMapping check here fixes bug T28112, otherwise it's * possible that it won't be copied */ CustomData_MeshMasks_update(&mask, &append_mask); if (need_mapping) { @@ -1379,7 +1378,10 @@ float (*editbmesh_vert_coords_alloc(BMEditMesh *em, int *r_vert_len))[3] return cos; } -bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, bool has_prev_mesh) +bool editbmesh_modifier_is_enabled(Scene *scene, + const Object *ob, + ModifierData *md, + bool has_prev_mesh) { const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type); const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; @@ -1389,7 +1391,7 @@ bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, bool has_prev } if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && has_prev_mesh) { - BKE_modifier_set_error(md, "Modifier requires original data, bad stack position"); + BKE_modifier_set_error(ob, md, "Modifier requires original data, bad stack position"); return false; } @@ -1489,8 +1491,10 @@ static void editbmesh_calc_modifiers(struct Depsgraph *depsgraph, /* Modifier evaluation modes. */ const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; + const bool use_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER); /* Modifier evaluation contexts for different types of modifiers. */ - const ModifierEvalContext mectx = {depsgraph, ob, MOD_APPLY_USECACHE}; + ModifierApplyFlag apply_render = use_render ? MOD_APPLY_RENDER : 0; + const ModifierEvalContext mectx = {depsgraph, ob, MOD_APPLY_USECACHE | apply_render}; const ModifierEvalContext mectx_orco = {depsgraph, ob, MOD_APPLY_ORCO}; /* Get effective list of modifiers to execute. Some effects like shape keys @@ -1521,7 +1525,7 @@ static void editbmesh_calc_modifiers(struct Depsgraph *depsgraph, for (int i = 0; md; i++, md = md->next, md_datamask = md_datamask->next) { const ModifierTypeInfo *mti = BKE_modifier_get_info(md->type); - if (!editbmesh_modifier_is_enabled(scene, md, mesh_final != NULL)) { + if (!editbmesh_modifier_is_enabled(scene, ob, md, mesh_final != NULL)) { continue; } @@ -2186,7 +2190,7 @@ static void mesh_init_origspace(Mesh *mesh) for (i = 0; i < numpoly; i++, mp++) { OrigSpaceLoop *lof = lof_array + mp->loopstart; - if (mp->totloop == 3 || mp->totloop == 4) { + if (ELEM(mp->totloop, 3, 4)) { for (j = 0; j < mp->totloop; j++, lof++) { copy_v2_v2(lof->uv, default_osf[j]); } |