[Bf-blender-cvs] [89840b5917e] master: Fix T62423: Wrong sculpting with shape keys and modifiers

Sergey Sharybin noreply at git.blender.org
Mon Mar 11 16:09:38 CET 2019


Commit: 89840b5917ee61f6430664a83f5cfc082a88704a
Author: Sergey Sharybin
Date:   Mon Mar 11 16:00:04 2019 +0100
Branches: master
https://developer.blender.org/rB89840b5917ee61f6430664a83f5cfc082a88704a

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).

===================================================================

M	source/blender/blenkernel/intern/crazyspace.c

===================================================================

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) {



More information about the Bf-blender-cvs mailing list