diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-03-17 17:55:59 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-03-17 18:41:43 +0300 |
commit | 628d799c85965191d5f6231b3433bbae425e59f0 (patch) | |
tree | 6abd0268128fc6a21402a7ec86fdf2a2e84bdcf8 | |
parent | c76d390c921de4988a48a6d143a2ef08f2165a88 (diff) |
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.
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 9 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 19 |
2 files changed, 28 insertions, 0 deletions
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; |