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:
Diffstat (limited to 'source/blender/blenkernel/intern/multires_reshape_apply_base.c')
-rw-r--r--source/blender/blenkernel/intern/multires_reshape_apply_base.c57
1 files changed, 49 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..62418150ff1 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,25 @@ 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);
+
+ float(*deformed_verts)[3] = BKE_multires_create_deformed_base_mesh_vert_coords(
+ depsgraph, object, mmd, NULL);
+
+ BKE_subdiv_eval_update_from_mesh(
+ reshape_context->subdiv, reshape_context->base_mesh, deformed_verts);
+
+ MEM_freeN(deformed_verts);
+}