[Bf-blender-cvs] [de491abf996] blender2.8: Fix modifiers evaluation outside of depsgraph/CoW context.

Bastien Montagne noreply at git.blender.org
Fri Dec 7 18:59:09 CET 2018


Commit: de491abf996281785391b18b3547d1bff305355f
Author: Bastien Montagne
Date:   Fri Dec 7 15:45:53 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBde491abf996281785391b18b3547d1bff305355f

Fix modifiers evaluation outside of depsgraph/CoW context.

Fix T58237: Exporters: Curve Modifier not applied when "apply modifiers" are selected.
Fix T58856: Python: "to_mesh" broken in 2.8.

...And many other cases... ;)

Thing is, we need target IDs to always be evaluated ones (at least I
cannot see any case where having orig ones is desired effect here).
Depsgraph/Cow system ensures us that when modifiers are evaluated by it,
but they can also be called outside of this context, e.g. when doing
binding, or object conversion...

So we need to ensure in modifiers code that we actually are always
working with eval data for those targets.

Note that I did not touch to physics modifiers, those are a bit touchy
and rather not 'fix' something there until proven broken!

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

M	source/blender/blenkernel/BKE_shrinkwrap.h
M	source/blender/blenkernel/intern/shrinkwrap.c
M	source/blender/modifiers/intern/MOD_armature.c
M	source/blender/modifiers/intern/MOD_array.c
M	source/blender/modifiers/intern/MOD_boolean.c
M	source/blender/modifiers/intern/MOD_cast.c
M	source/blender/modifiers/intern/MOD_curve.c
M	source/blender/modifiers/intern/MOD_datatransfer.c
M	source/blender/modifiers/intern/MOD_displace.c
M	source/blender/modifiers/intern/MOD_hook.c
M	source/blender/modifiers/intern/MOD_lattice.c
M	source/blender/modifiers/intern/MOD_mask.c
M	source/blender/modifiers/intern/MOD_meshdeform.c
M	source/blender/modifiers/intern/MOD_mirror.c
M	source/blender/modifiers/intern/MOD_normal_edit.c
M	source/blender/modifiers/intern/MOD_screw.c
M	source/blender/modifiers/intern/MOD_shrinkwrap.c
M	source/blender/modifiers/intern/MOD_simpledeform.c
M	source/blender/modifiers/intern/MOD_surfacedeform.c
M	source/blender/modifiers/intern/MOD_util.c
M	source/blender/modifiers/intern/MOD_util.h
M	source/blender/modifiers/intern/MOD_uvproject.c
M	source/blender/modifiers/intern/MOD_uvwarp.c
M	source/blender/modifiers/intern/MOD_warp.c
M	source/blender/modifiers/intern/MOD_wave.c
M	source/blender/modifiers/intern/MOD_weightvg_util.c
M	source/blender/modifiers/intern/MOD_weightvgproximity.c

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

diff --git a/source/blender/blenkernel/BKE_shrinkwrap.h b/source/blender/blenkernel/BKE_shrinkwrap.h
index 3ce5aa323c5..d703e8819d7 100644
--- a/source/blender/blenkernel/BKE_shrinkwrap.h
+++ b/source/blender/blenkernel/BKE_shrinkwrap.h
@@ -105,7 +105,8 @@ void BKE_shrinkwrap_free_tree(struct ShrinkwrapTreeData *data);
 
 /* Implementation of the Shrinkwrap modifier */
 void shrinkwrapModifier_deform(
-        struct ShrinkwrapModifierData *smd, struct Scene *scene, struct Object *ob, struct Mesh *mesh,
+        struct ShrinkwrapModifierData *smd, const struct ModifierEvalContext *ctx,
+        struct Scene *scene, struct Object *ob, struct Mesh *mesh,
         struct MDeformVert *dvert, const int defgrp_index, float (*vertexCos)[3], int numVerts);
 
 /*
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index 87193df3b49..ee35876f2a3 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -60,6 +60,8 @@
 #include "BKE_subsurf.h"
 #include "BKE_mesh_runtime.h"
 
+#include "DEG_depsgraph_query.h"
+
 #include "MEM_guardedalloc.h"
 
 #include "BLI_strict_flags.h"
@@ -91,8 +93,9 @@ typedef struct ShrinkwrapCalcData {
 	struct SpaceTransform local2target;    //transform to move between local and target space
 	struct ShrinkwrapTreeData *tree; // mesh BVH tree data
 
-	float keepDist;                 //Distance to keep above target surface (units are in local space)
+	struct Object *aux_target;
 
+	float keepDist;                 //Distance to keep above target surface (units are in local space)
 } ShrinkwrapCalcData;
 
 typedef struct ShrinkwrapCalcCBData {
@@ -658,11 +661,11 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc)
 		}
 	}
 
-	if (calc->smd->auxTarget) {
-		auxMesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(calc->smd->auxTarget, &auxMesh_free);
+	if (calc->aux_target) {
+		auxMesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(calc->aux_target, &auxMesh_free);
 		if (!auxMesh)
 			return;
-		BLI_SPACE_TRANSFORM_SETUP(&local2aux, calc->ob, calc->smd->auxTarget);
+		BLI_SPACE_TRANSFORM_SETUP(&local2aux, calc->ob, calc->aux_target);
 	}
 
 	if (BKE_shrinkwrap_init_tree(&aux_tree_stack, auxMesh, calc->smd->shrinkType, calc->smd->shrinkMode, false)) {
@@ -1273,8 +1276,10 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
 }
 
 /* Main shrinkwrap function */
-void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, struct Scene *scene, Object *ob, Mesh *mesh,
-                               MDeformVert *dvert, const int defgrp_index, float (*vertexCos)[3], int numVerts)
+void shrinkwrapModifier_deform(
+        ShrinkwrapModifierData *smd, const ModifierEvalContext *ctx,
+        struct Scene *scene, Object *ob, Mesh *mesh,
+        MDeformVert *dvert, const int defgrp_index, float (*vertexCos)[3], int numVerts)
 {
 
 	DerivedMesh *ss_mesh    = NULL;
@@ -1295,17 +1300,19 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, struct Scene *scene,
 	calc.vgroup = defgrp_index;
 	calc.invert_vgroup = (smd->shrinkOpts & MOD_SHRINKWRAP_INVERT_VGROUP) != 0;
 
-	if (smd->target) {
-		calc.target = BKE_modifier_get_evaluated_mesh_from_evaluated_object(smd->target, &target_free);
+	if (smd->target != NULL) {
+		Object *ob_target = DEG_get_evaluated_object(ctx->depsgraph, smd->target);
+		calc.target = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_target, &target_free);
 
 		/* TODO there might be several "bugs" on non-uniform scales matrixs
 		 * because it will no longer be nearest surface, not sphere projection
 		 * because space has been deformed */
-		BLI_SPACE_TRANSFORM_SETUP(&calc.local2target, ob, smd->target);
+		BLI_SPACE_TRANSFORM_SETUP(&calc.local2target, ob, ob_target);
 
 		/* TODO: smd->keepDist is in global units.. must change to local */
 		calc.keepDist = smd->keepDist;
 	}
+	calc.aux_target = DEG_get_evaluated_object(ctx->depsgraph, smd->auxTarget);
 
 	if (mesh != NULL && smd->shrinkType == MOD_SHRINKWRAP_PROJECT) {
 		/* Setup arrays to get vertexs positions, normals and deform weights */
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c
index f37b5d4ec4d..fcd54639f9f 100644
--- a/source/blender/modifiers/intern/MOD_armature.c
+++ b/source/blender/modifiers/intern/MOD_armature.c
@@ -49,6 +49,8 @@
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
 
+#include "DEG_depsgraph_query.h"
+
 #include "bmesh.h"
 #include "bmesh_tools.h"
 
@@ -121,7 +123,7 @@ static void deformVerts(
 
 	MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */
 
-	armature_deform_verts(amd->object, ctx->object, mesh, vertexCos, NULL,
+	armature_deform_verts(DEG_get_evaluated_object(ctx->depsgraph, amd->object), ctx->object, mesh, vertexCos, NULL,
 	                      numVerts, amd->deformflag, (float(*)[3])amd->prevCos, amd->defgrp_name, NULL);
 
 	/* free cache */
@@ -140,7 +142,7 @@ static void deformVertsEM(
 
 	MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */
 
-	armature_deform_verts(amd->object, ctx->object, mesh_src, vertexCos, NULL,
+	armature_deform_verts(DEG_get_evaluated_object(ctx->depsgraph, amd->object), ctx->object, mesh_src, vertexCos, NULL,
 	                      numVerts, amd->deformflag, (float(*)[3])amd->prevCos, amd->defgrp_name, NULL);
 
 	/* free cache */
@@ -162,8 +164,8 @@ static void deformMatricesEM(
 	ArmatureModifierData *amd = (ArmatureModifierData *) md;
 	Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false);
 
-	armature_deform_verts(amd->object, ctx->object, mesh_src, vertexCos, defMats, numVerts,
-	                      amd->deformflag, NULL, amd->defgrp_name, NULL);
+	armature_deform_verts(DEG_get_evaluated_object(ctx->depsgraph, amd->object), ctx->object, mesh_src, vertexCos, defMats,
+	                      numVerts, amd->deformflag, NULL, amd->defgrp_name, NULL);
 
 	if (mesh_src != mesh) {
 		BKE_id_free(NULL, mesh_src);
@@ -177,8 +179,8 @@ static void deformMatrices(
 	ArmatureModifierData *amd = (ArmatureModifierData *) md;
 	Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
 
-	armature_deform_verts(amd->object, ctx->object, mesh_src, vertexCos, defMats, numVerts,
-	                      amd->deformflag, NULL, amd->defgrp_name, NULL);
+	armature_deform_verts(DEG_get_evaluated_object(ctx->depsgraph, amd->object), ctx->object, mesh_src, vertexCos, defMats,
+	                      numVerts, amd->deformflag, NULL, amd->defgrp_name, NULL);
 
 	if (mesh_src != mesh) {
 		BKE_id_free(NULL, mesh_src);
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index 9decf8e3bb5..597320c3887 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -57,6 +57,7 @@
 #include "MOD_util.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
 
 static void initData(ModifierData *md)
 {
@@ -364,7 +365,7 @@ static Mesh *arrayModifier_doArray(
 
 	const bool use_merge = (amd->flags & MOD_ARR_MERGE) != 0;
 	const bool use_recalc_normals = (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) || use_merge;
-	const bool use_offset_ob = ((amd->offset_type & MOD_ARR_OFF_OBJ) && amd->offset_ob);
+	const bool use_offset_ob = ((amd->offset_type & MOD_ARR_OFF_OBJ) && amd->offset_ob != NULL);
 
 	int start_cap_nverts = 0, start_cap_nedges = 0, start_cap_npolys = 0, start_cap_nloops = 0;
 	int end_cap_nverts = 0, end_cap_nedges = 0, end_cap_npolys = 0, end_cap_nloops = 0;
@@ -387,11 +388,12 @@ static Mesh *arrayModifier_doArray(
 
 	count = amd->count;
 
-	if (amd->start_cap && amd->start_cap != ctx->object && amd->start_cap->type == OB_MESH) {
+	Object *start_cap_ob = DEG_get_evaluated_object(ctx->depsgraph, amd->start_cap);
+	if (start_cap_ob && start_cap_ob != ctx->object && start_cap_ob->type == OB_MESH) {
 		vgroup_start_cap_remap = BKE_object_defgroup_index_map_create(
-		                             amd->start_cap, ctx->object, &vgroup_start_cap_remap_len);
+		                             start_cap_ob, ctx->object, &vgroup_start_cap_remap_len);
 
-		start_cap_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(amd->start_cap, &start_cap_mesh_free);
+		start_cap_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(start_cap_ob, &start_cap_mesh_free);
 		if (start_cap_mesh) {
 			start_cap_nverts = start_cap_mesh->totvert;
 			start_cap_nedges = start_cap_mesh->totedge;
@@ -399,11 +401,12 @@ static Mesh *arrayModifier_doArray(
 			start_cap_npolys = start_cap_mesh->totpoly;
 		}
 	}
-	if (amd->end_cap && amd->end_cap != ctx->object && amd->end_cap->type == OB_MESH) {
+	Object *end_cap_ob = DEG_get_evaluated_object(ctx->depsgraph, amd->end_cap);
+	if (end_cap_ob && end_cap_ob != ctx->object && end_cap_ob->type == OB_MESH) {
 		vgroup_end_cap_remap = BKE_object_defgroup_index_map_create(
-		                           amd->end_cap, ctx->object, &vgroup_end_cap_remap_len);
+		                           end_cap_ob, ctx->object, &vgroup_end_cap_remap_len);
 
-		end_cap_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(amd->end_cap, &end_cap_mesh_free);
+		end_cap_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(end_cap_ob, &end_cap_mesh_free);
 		if (end_cap_mesh) {
 			end_cap_nverts = end_cap_mesh->totvert;
 			end_cap_nedges = end_cap_mesh->totedge;
@@ -444,8 +447,7 @@ static Mesh *arrayModifier_doArray(
 		else
 			unit_m4(obinv);
 
-		mul_m4_series(result_mat, offset,
-		              obinv, amd->offset_ob->obmat);
+		mul_m4_series(result_mat, offset, obinv, DEG_get_evaluated_object(ctx->depsgraph, amd->offset_ob)->obmat);
 		copy_m4_m4(offset, result_mat);
 	}
 
@@ -453,12 +455,13 @@ static Mesh *arrayModifier_doArray(
 	mat4_to_size(scale, offset);
 	offset_has_scale = !is_one_v3(scale);
 
-	if (amd->fit_type == MOD_ARR_FITCURVE && amd->curve_ob) {
-		Curve *cu = amd->curve_ob->data;
+	if (amd->fit_type == MOD_ARR_FITCURVE && amd->curve_ob != NULL) {
+		Object *curve_ob = DEG_ge

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list