Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-08-22 17:07:39 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-08-22 17:07:57 +0300
commit6a681981e4598f07591a4b99f624f96aea3d2522 (patch)
treecb0de0efff58dfdba1c22ed61c90794c00fb3470 /source/blender/blenkernel/intern/multires_reshape.c
parent9dd279cbdf93b21598267f1860257f0f81837732 (diff)
Multires: Fix reshape when active level is lower than the total one
Diffstat (limited to 'source/blender/blenkernel/intern/multires_reshape.c')
-rw-r--r--source/blender/blenkernel/intern/multires_reshape.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/source/blender/blenkernel/intern/multires_reshape.c b/source/blender/blenkernel/intern/multires_reshape.c
index b7f53365334..b1d56ffef1f 100644
--- a/source/blender/blenkernel/intern/multires_reshape.c
+++ b/source/blender/blenkernel/intern/multires_reshape.c
@@ -395,7 +395,7 @@ static bool multires_reshape_from_vertcos(struct Depsgraph *depsgraph,
/* Initialize mesh rasterization settings. */
SubdivToMeshSettings mesh_settings;
BKE_multires_subdiv_mesh_settings_init(
- &mesh_settings, scene_eval, object, mmd, use_render_params);
+ &mesh_settings, scene_eval, object, mmd, use_render_params, true);
/* Run all the callbacks. */
BKE_subdiv_foreach_subdiv_geometry(
ctx.subdiv,
@@ -434,20 +434,34 @@ bool multiresModifier_reshapeFromDeformModifier(
Object *object,
ModifierData *md)
{
+ /* It is possible that the current subdivision level of multires is lower
+ * that it's maximum possible one (i.e., viewport is set to a lower level
+ * for the performance purposes). But even then, we want all the multires
+ * levels to be reshaped. Most accurate way to do so is to ignore all
+ * simplifications and calculate deformation modifier for the highest
+ * possible multires level.
+ * Alternative would be propagate displacement from current level to a
+ * higher ones, but that is likely to cause artifacts.
+ */
+ MultiresModifierData highest_mmd = *mmd;
+ highest_mmd.lvl = highest_mmd.totlvl;
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
/* Perform sanity checks and early output. */
- if (multires_get_level(scene_eval, object, mmd, false, true) == 0) {
+ if (multires_get_level(
+ scene_eval, object, &highest_mmd, false, true) == 0) {
return false;
}
/* Create mesh for the multires, ignoring any further modifiers (leading
* deformation modifiers will be applied though).
*/
- Mesh *multires_mesh = get_multires_mesh(depsgraph, scene_eval, mmd, object);
+ Mesh *multires_mesh = get_multires_mesh(
+ depsgraph, scene_eval, &highest_mmd, object);
float (*deformed_verts)[3] = BKE_mesh_vertexCos_get(multires_mesh, NULL);
/* Apply deformation modifier on the multires, */
- const ModifierEvalContext modifier_ctx = {.depsgraph = depsgraph,
- .object = object,
- .flag = 0};
+ const ModifierEvalContext modifier_ctx = {
+ .depsgraph = depsgraph,
+ .object = object,
+ .flag = MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY};
modifier_deformVerts_ensure_normals(
md, &modifier_ctx, multires_mesh, deformed_verts,
multires_mesh->totvert);
@@ -457,7 +471,7 @@ bool multiresModifier_reshapeFromDeformModifier(
bool result = multires_reshape_from_vertcos(
depsgraph,
object,
- mmd,
+ &highest_mmd,
deformed_verts,
num_deformed_verts,
false);