From 628d799c85965191d5f6231b3433bbae425e59f0 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 17 Mar 2020 15:55:59 +0100 Subject: Multires: Add utility to create deformed base mesh The new function will use original object as a starting point and apply all enabled deformation modifiers prior to the multires. --- source/blender/blenkernel/BKE_multires.h | 9 +++++++++ source/blender/blenkernel/intern/multires.c | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+) (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index 3ea5986a0ae..cccb5547603 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -90,9 +90,18 @@ int multires_get_level(const struct Scene *scene, const struct MultiresModifierData *mmd, bool render, bool ignore_simplify); + +/* Creates mesh with multires modifier applied on current object's deform mesh. */ struct Mesh *BKE_multires_create_mesh(struct Depsgraph *depsgraph, struct Object *object, struct MultiresModifierData *mmd); + +/* Creates mesh with all deform modifiers leading the multires one applied. + * NOTE: The modifiers will be re-evaluated. */ +struct Mesh *BKE_multires_create_deformed_base_mesh(struct Depsgraph *depsgraph, + struct Object *object, + struct MultiresModifierData *mmd); + void multiresModifier_del_levels(struct MultiresModifierData *mmd, struct Scene *scene, struct Object *object, diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index b8464bf02c0..fd91f80b047 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -293,6 +293,25 @@ Mesh *BKE_multires_create_mesh(struct Depsgraph *depsgraph, return result; } +Mesh *BKE_multires_create_deformed_base_mesh(struct Depsgraph *depsgraph, + Object *object, + MultiresModifierData *mmd) +{ + 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); + + return base_mesh; +} + MultiresModifierData *find_multires_modifier_before(Scene *scene, ModifierData *lastmd) { ModifierData *md; -- cgit v1.2.3