diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index a25b73625fa..c37e56149eb 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -125,6 +125,11 @@ typedef enum ModifierApplyFlag { /** Ignore scene simplification flag and use subdivisions * level set in multires modifier. */ MOD_APPLY_IGNORE_SIMPLIFY = 1 << 3, + /** The effect of this modifier will be applied to the base mesh + * The modifier itself will be removed from the modifier stack. + * This flag can be checked to ignore rendering display data to the mesh. + * See `OBJECT_OT_modifier_apply` operator. */ + MOD_APPLY_TO_BASE_MESH = 1 << 4, } ModifierApplyFlag; typedef struct ModifierUpdateDepsgraphContext { diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index c805b5f53a6..fe5b8cff31c 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -197,7 +197,8 @@ void BKE_multires_subdiv_mesh_settings_init(struct SubdivToMeshSettings *mesh_se const struct Object *object, const struct MultiresModifierData *mmd, const bool use_render_params, - const bool ignore_simplify); + const bool ignore_simplify, + const bool ignore_control_edges); /* General helpers. */ diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c index 955f1aca110..74b79490d67 100644 --- a/source/blender/blenkernel/intern/mesh_convert.c +++ b/source/blender/blenkernel/intern/mesh_convert.c @@ -1304,7 +1304,7 @@ Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph *depsgraph, const ModifierTypeInfo *mti = modifierType_getInfo(md_eval->type); Mesh *result; KeyBlock *kb; - ModifierEvalContext mectx = {depsgraph, ob_eval, 0}; + ModifierEvalContext mectx = {depsgraph, ob_eval, MOD_APPLY_TO_BASE_MESH}; if (!(md_eval->mode & eModifierMode_Realtime)) { return NULL; diff --git a/source/blender/blenkernel/intern/multires_subdiv.c b/source/blender/blenkernel/intern/multires_subdiv.c index 2ea02ab6974..f7e42942f3e 100644 --- a/source/blender/blenkernel/intern/multires_subdiv.c +++ b/source/blender/blenkernel/intern/multires_subdiv.c @@ -50,9 +50,11 @@ void BKE_multires_subdiv_mesh_settings_init(SubdivToMeshSettings *mesh_settings, const Object *object, const MultiresModifierData *mmd, const bool use_render_params, - const bool ignore_simplify) + const bool ignore_simplify, + const bool ignore_control_edges) { const int level = multires_get_level(scene, object, mmd, use_render_params, ignore_simplify); mesh_settings->resolution = (1 << level) + 1; - mesh_settings->use_optimal_display = (mmd->flags & eMultiresModifierFlag_ControlEdges); + mesh_settings->use_optimal_display = (mmd->flags & eMultiresModifierFlag_ControlEdges) && + !ignore_control_edges; } diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c index 1f9052d12c9..ad8e0a9f259 100644 --- a/source/blender/modifiers/intern/MOD_multires.c +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -119,11 +119,17 @@ static Mesh *multires_as_mesh(MultiresModifierData *mmd, Mesh *result = mesh; const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER); const bool ignore_simplify = (ctx->flag & MOD_APPLY_IGNORE_SIMPLIFY); + const bool ignore_control_edges = (ctx->flag & MOD_APPLY_TO_BASE_MESH); const Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); Object *object = ctx->object; SubdivToMeshSettings mesh_settings; - BKE_multires_subdiv_mesh_settings_init( - &mesh_settings, scene, object, mmd, use_render_params, ignore_simplify); + BKE_multires_subdiv_mesh_settings_init(&mesh_settings, + scene, + object, + mmd, + use_render_params, + ignore_simplify, + ignore_control_edges); if (mesh_settings.resolution < 3) { return result; } diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c index 6fd28561fdb..b3bc5a66e8c 100644 --- a/source/blender/modifiers/intern/MOD_subsurf.c +++ b/source/blender/modifiers/intern/MOD_subsurf.c @@ -148,7 +148,8 @@ static void subdiv_mesh_settings_init(SubdivToMeshSettings *settings, { const int level = subdiv_levels_for_modifier_get(smd, ctx); settings->resolution = (1 << level) + 1; - settings->use_optimal_display = (smd->flags & eSubsurfModifierFlag_ControlEdges); + settings->use_optimal_display = (smd->flags & eSubsurfModifierFlag_ControlEdges) && + !(ctx->flag & MOD_APPLY_TO_BASE_MESH); } static Mesh *subdiv_as_mesh(SubsurfModifierData *smd,