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>2020-03-17 18:08:31 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2020-03-17 18:41:43 +0300
commit24e44143a192053f552e4c4b1655146be3aaed61 (patch)
treecd0e026b8f0f7c9cd9d7b0cb4f67225d85266e05 /source/blender/blenkernel/intern/multires_reshape_apply_base.c
parent628d799c85965191d5f6231b3433bbae425e59f0 (diff)
Multires: Fix Apply Base when there are deform modifiers
Their effect was applied twice after hitting Apply Base since the operator was also applying deformation caused by those modifiers.
Diffstat (limited to 'source/blender/blenkernel/intern/multires_reshape_apply_base.c')
-rw-r--r--source/blender/blenkernel/intern/multires_reshape_apply_base.c62
1 files changed, 54 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/multires_reshape_apply_base.c b/source/blender/blenkernel/intern/multires_reshape_apply_base.c
index e05b5bb3179..958fb60bbdc 100644
--- a/source/blender/blenkernel/intern/multires_reshape_apply_base.c
+++ b/source/blender/blenkernel/intern/multires_reshape_apply_base.c
@@ -27,23 +27,46 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
#include "BLI_math_vector.h"
+#include "BLI_listbase.h"
+#include "BKE_customdata.h"
+#include "BKE_lib_id.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_runtime.h"
#include "BKE_mesh_mapping.h"
+#include "BKE_multires.h"
#include "BKE_subdiv_eval.h"
+#include "DEG_depsgraph_query.h"
+
void multires_reshape_apply_base_update_mesh_coords(MultiresReshapeContext *reshape_context)
{
Mesh *base_mesh = reshape_context->base_mesh;
- const int grid_size = reshape_context->top.grid_size;
- const int grid_index = grid_size * grid_size - 1;
- for (int i = 0; i < base_mesh->totloop; ++i) {
- MDisps *displacement_grid = &reshape_context->mdisps[i];
- const MLoop *loop = &base_mesh->mloop[i];
- MVert *vert = &base_mesh->mvert[loop->v];
- copy_v3_v3(vert->co, displacement_grid->disps[grid_index]);
+ const MLoop *mloop = base_mesh->mloop;
+ MVert *mvert = base_mesh->mvert;
+ for (int loop_index = 0; loop_index < base_mesh->totloop; ++loop_index) {
+ const MLoop *loop = &mloop[loop_index];
+ MVert *vert = &mvert[loop->v];
+
+ GridCoord grid_coord;
+ grid_coord.grid_index = loop_index;
+ grid_coord.u = 1.0f;
+ grid_coord.v = 1.0f;
+
+ float P[3];
+ float tangent_matrix[3][3];
+ multires_reshape_evaluate_limit_at_grid(reshape_context, &grid_coord, P, tangent_matrix);
+
+ ReshapeConstGridElement grid_element = multires_reshape_orig_grid_element_for_grid_coord(
+ reshape_context, &grid_coord);
+ float D[3];
+ mul_v3_m3v3(D, tangent_matrix, grid_element.displacement);
+
+ add_v3_v3v3(vert->co, P, D);
}
}
@@ -152,7 +175,30 @@ void multires_reshape_apply_base_refit_base_mesh(MultiresReshapeContext *reshape
BKE_mesh_calc_normals(base_mesh);
}
-void multires_reshape_apply_base_refine_subdiv(MultiresReshapeContext *reshape_context)
+void multires_reshape_apply_base_refine_from_base(MultiresReshapeContext *reshape_context)
{
BKE_subdiv_eval_update_from_mesh(reshape_context->subdiv, reshape_context->base_mesh, NULL);
}
+
+void multires_reshape_apply_base_refine_from_deform(MultiresReshapeContext *reshape_context)
+{
+ struct Depsgraph *depsgraph = reshape_context->depsgraph;
+ Object *object = reshape_context->object;
+ MultiresModifierData *mmd = reshape_context->mmd;
+ BLI_assert(depsgraph != NULL);
+ BLI_assert(object != NULL);
+ BLI_assert(mmd != NULL);
+
+ /* If there are no modifiers prior to the multires can use base mesh as it have all the updated
+ * vertices already. */
+ if (mmd->modifier.prev == NULL) {
+ BKE_subdiv_eval_update_from_mesh(reshape_context->subdiv, reshape_context->base_mesh, NULL);
+ }
+ else {
+ /* TODO(sergey): Possible optimization is to only evaluate new verticies positions without
+ * construction of the entire mesh. */
+ Mesh *deformed_base_mesh = BKE_multires_create_deformed_base_mesh(depsgraph, object, mmd);
+ BKE_subdiv_eval_update_from_mesh(reshape_context->subdiv, deformed_base_mesh, NULL);
+ BKE_id_free(NULL, deformed_base_mesh);
+ }
+}