[Bf-blender-cvs] [4370d00b0b4] master: Modifiers: Proper fix for the Apply Modifier

Sergey Sharybin noreply at git.blender.org
Mon Apr 1 14:52:19 CEST 2019


Commit: 4370d00b0b423f6467bb5d0d09de7e901d23fffe
Author: Sergey Sharybin
Date:   Tue Mar 26 11:39:11 2019 +0100
Branches: master
https://developer.blender.org/rB4370d00b0b423f6467bb5d0d09de7e901d23fffe

Modifiers: Proper fix for the Apply Modifier

It is up to the operator to pass valid object to the modifiers
evaluation.

Fixes T62916: Applying boolean modifier does not set materials properly

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

M	source/blender/blenkernel/intern/mesh_convert.c
M	source/blender/editors/object/object_modifier.c

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

diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c
index eab4862b14a..f02f1c20aba 100644
--- a/source/blender/blenkernel/intern/mesh_convert.c
+++ b/source/blender/blenkernel/intern/mesh_convert.c
@@ -1120,7 +1120,7 @@ Mesh *BKE_mesh_create_derived_for_modifier(
         struct Depsgraph *depsgraph, Scene *scene, Object *ob,
         ModifierData *md, int build_shapekey_layers)
 {
-	Mesh *me = ob->data;
+	Mesh *me = ob->runtime.mesh_orig ? ob->runtime.mesh_orig : ob->data;
 	const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 	Mesh *result;
 	KeyBlock *kb;
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index c8a755a3971..c3a562df037 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -541,6 +541,22 @@ int ED_object_modifier_convert(ReportList *UNUSED(reports),
 	return 1;
 }
 
+/* Gets mesh for the modifier which corresponds to an evaluated state. */
+static Mesh *modifier_apply_create_mesh_for_modifier(
+        Depsgraph *depsgraph,
+        Scene *UNUSED(scene),
+        Object *object,
+        ModifierData *md,
+        bool build_shapekey_layers)
+{
+	Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+	Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
+	ModifierData *md_eval = modifiers_findByName(object_eval, md->name);
+	Mesh *mesh_applied = BKE_mesh_create_derived_for_modifier(
+	        depsgraph, scene_eval, object_eval, md_eval, build_shapekey_layers);
+	return mesh_applied;
+}
+
 static int modifier_apply_shape(
 	Main *bmain, ReportList *reports, Depsgraph *depsgraph, Scene *scene, Object *ob, ModifierData *md)
 {
@@ -573,7 +589,7 @@ static int modifier_apply_shape(
 			return 0;
 		}
 
-		mesh_applied = BKE_mesh_create_derived_for_modifier(depsgraph, scene, ob, md, 0);
+		mesh_applied = modifier_apply_create_mesh_for_modifier(depsgraph, scene, ob, md, false);
 		if (!mesh_applied) {
 			BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply");
 			return 0;
@@ -630,7 +646,7 @@ static int modifier_apply_obdata(ReportList *reports, Depsgraph *depsgraph, Scen
 			}
 		}
 		else {
-			mesh_applied = BKE_mesh_create_derived_for_modifier(depsgraph, scene, ob, md, 1);
+			mesh_applied = modifier_apply_create_mesh_for_modifier(depsgraph, scene, ob, md, true);
 			if (!mesh_applied) {
 				BKE_report(reports, RPT_ERROR, "Modifier returned error, skipping apply");
 				return 0;
@@ -643,22 +659,23 @@ static int modifier_apply_obdata(ReportList *reports, Depsgraph *depsgraph, Scen
 		}
 	}
 	else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
-		Curve *cu;
+		Object *object_eval = DEG_get_evaluated_object(depsgraph, ob);
+		Curve *curve = ob->data;
+		Curve *curve_eval = (Curve *)object_eval->data;
 		int numVerts;
 		float (*vertexCos)[3];
-		ModifierEvalContext mectx = {depsgraph, ob, 0};
+		ModifierEvalContext mectx = {depsgraph, object_eval, 0};
 
 		if (ELEM(mti->type, eModifierTypeType_Constructive, eModifierTypeType_Nonconstructive)) {
 			BKE_report(reports, RPT_ERROR, "Transform curve to mesh in order to apply constructive modifiers");
 			return 0;
 		}
 
-		cu = ob->data;
 		BKE_report(reports, RPT_INFO, "Applied modifier only changed CV points, not tessellated/bevel vertices");
 
-		vertexCos = BKE_curve_nurbs_vertexCos_get(&cu->nurb, &numVerts);
+		vertexCos = BKE_curve_nurbs_vertexCos_get(&curve_eval->nurb, &numVerts);
 		mti->deformVerts(md, &mectx, NULL, vertexCos, numVerts);
-		BK_curve_nurbs_vertexCos_apply(&cu->nurb, vertexCos);
+		BK_curve_nurbs_vertexCos_apply(&curve->nurb, vertexCos);
 
 		MEM_freeN(vertexCos);



More information about the Bf-blender-cvs mailing list