From f958560a990a8974446c2c63def7ba387dcfb275 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 17 Mar 2020 17:34:04 +0100 Subject: Multires: Properly support virtual modifiers for Apply Base The initial code from earlier from today didn't really work reliable since it is not possible to apply virtual modifiers but not the real multires one (in a situation like mesh with shapekeys and multires). New code uses less memory and has better performance for the case when there are actual modifiers leading the multires. The case when there is only multires will not be as performant as possible at this moment. --- source/blender/blenkernel/intern/multires.c | 50 +++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 9 deletions(-) (limited to 'source/blender/blenkernel/intern/multires.c') diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index fd91f80b047..234273b5158 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -293,23 +293,55 @@ Mesh *BKE_multires_create_mesh(struct Depsgraph *depsgraph, return result; } -Mesh *BKE_multires_create_deformed_base_mesh(struct Depsgraph *depsgraph, - Object *object, - MultiresModifierData *mmd) +float (*BKE_multires_create_deformed_base_mesh_vert_coords(struct Depsgraph *depsgraph, + struct Object *object, + struct MultiresModifierData *mmd, + int *r_num_deformed_verts))[3] { Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); Object *object_eval = DEG_get_evaluated_object(depsgraph, object); - const int mmd_index = BLI_findindex(&object->modifiers, &mmd->modifier); - BLI_assert(mmd_index != -1); - Object object_for_eval = *object_eval; object_for_eval.data = object->data; - Mesh *base_mesh = mesh_create_eval_final_view_index( - depsgraph, scene_eval, object, &CD_MASK_BAREMESH, mmd_index - 1); + const bool use_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER); + ModifierEvalContext mesh_eval_context = {depsgraph, &object_for_eval, 0}; + if (use_render) { + mesh_eval_context.flag |= MOD_APPLY_RENDER; + } + const int required_mode = use_render ? eModifierMode_Render : eModifierMode_Realtime; + + VirtualModifierData virtual_modifier_data; + ModifierData *first_md = modifiers_getVirtualModifierList(&object_for_eval, + &virtual_modifier_data); + + Mesh *base_mesh = object->data; + + int num_deformed_verts; + float(*deformed_verts)[3] = BKE_mesh_vert_coords_alloc(base_mesh, &num_deformed_verts); + + for (ModifierData *md = first_md; md != NULL; md = md->next) { + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (md == &mmd->modifier) { + break; + } + + if (!modifier_isEnabled(scene_eval, md, required_mode)) { + continue; + } - return base_mesh; + if (mti->type != eModifierTypeType_OnlyDeform) { + break; + } + + modwrap_deformVerts(md, &mesh_eval_context, base_mesh, deformed_verts, num_deformed_verts); + } + + if (r_num_deformed_verts != NULL) { + *r_num_deformed_verts = num_deformed_verts; + } + return deformed_verts; } MultiresModifierData *find_multires_modifier_before(Scene *scene, ModifierData *lastmd) -- cgit v1.2.3