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>2019-03-11 18:00:04 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-03-11 18:09:34 +0300
commit89840b5917ee61f6430664a83f5cfc082a88704a (patch)
treebefeddbb5b10ead751acbbac1f69e31604ca3f2c /source/blender/blenkernel/intern/crazyspace.c
parentcd32acefec3977786a2ef1c2f27d85d1a65f8c61 (diff)
Fix T62423: Wrong sculpting with shape keys and modifiers
Need to use original mesh to get virtual modifiers list, otherwise key datablocks will not be properly taken into account (since evaluated mesh doesn't have key datablock).
Diffstat (limited to 'source/blender/blenkernel/intern/crazyspace.c')
-rw-r--r--source/blender/blenkernel/intern/crazyspace.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/crazyspace.c b/source/blender/blenkernel/intern/crazyspace.c
index 3b83d7308a4..f1939de32b2 100644
--- a/source/blender/blenkernel/intern/crazyspace.c
+++ b/source/blender/blenkernel/intern/crazyspace.c
@@ -305,6 +305,24 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
return numleft;
}
+/* Crazyspace evaluation needs to have an object which has all the fields
+ * evaluated, but the mesh data being at undeformed state. This way it can
+ * re-apply modifiers and also have proper pointers to key data blocks.
+ *
+ * Similar to BKE_object_eval_reset(), but does not modify the actual evaluated
+ * object. */
+static void crazyspace_init_object_for_eval(
+ struct Depsgraph *depsgraph,
+ Object *object,
+ Object *object_crazy)
+{
+ Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
+ *object_crazy = *object_eval;
+ if (object_crazy->runtime.mesh_orig != NULL) {
+ object_crazy->data = object_crazy->runtime.mesh_orig;
+ }
+}
+
int BKE_sculpt_get_first_deform_matrices(
struct Depsgraph *depsgraph, Scene *scene,
Object *object, float (**deformmats)[3][3], float (**deformcos)[3])
@@ -315,10 +333,11 @@ int BKE_sculpt_get_first_deform_matrices(
float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
int numleft = 0;
VirtualModifierData virtualModifierData;
- Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
- MultiresModifierData *mmd = get_multires_modifier(scene, object_eval, 0);
+ Object object_eval;
+ crazyspace_init_object_for_eval(depsgraph, object, &object_eval);
+ MultiresModifierData *mmd = get_multires_modifier(scene, &object_eval, 0);
const bool has_multires = mmd != NULL && mmd->sculptlvl > 0;
- const ModifierEvalContext mectx = {depsgraph, object_eval, 0};
+ const ModifierEvalContext mectx = {depsgraph, &object_eval, 0};
if (has_multires) {
*deformmats = NULL;
@@ -327,7 +346,8 @@ int BKE_sculpt_get_first_deform_matrices(
}
me_eval = NULL;
- md = modifiers_getVirtualModifierList(object_eval, &virtualModifierData);
+
+ md = modifiers_getVirtualModifierList(&object_eval, &virtualModifierData);
for (; md; md = md->next) {
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -336,8 +356,9 @@ int BKE_sculpt_get_first_deform_matrices(
if (mti->type == eModifierTypeType_OnlyDeform) {
if (!defmats) {
- /* NOTE: Need to start with original undeformed mesh. */
- Mesh *me = object->data;
+ /* NOTE: Evaluated object si re-set to its original undeformed
+ * state. */
+ Mesh *me = object_eval.data;
me_eval = BKE_mesh_copy_for_eval(me, true);
deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
defmats = MEM_callocN(sizeof(*defmats) * numVerts, "defmats");
@@ -387,9 +408,10 @@ void BKE_crazyspace_build_sculpt(
float (*quats)[4];
int i, deformed = 0;
VirtualModifierData virtualModifierData;
- Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
- ModifierData *md = modifiers_getVirtualModifierList(object_eval, &virtualModifierData);
- const ModifierEvalContext mectx = {depsgraph, object_eval, 0};
+ Object object_eval;
+ crazyspace_init_object_for_eval(depsgraph, object, &object_eval);
+ ModifierData *md = modifiers_getVirtualModifierList(&object_eval, &virtualModifierData);
+ const ModifierEvalContext mectx = {depsgraph, &object_eval, 0};
Mesh *mesh = (Mesh *)object->data;
for (; md; md = md->next) {