[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33756] trunk/blender/source/blender: Fix #25272: shrinkwrap with dependency cycle could lead to eternal

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Dec 17 21:13:54 CET 2010


Revision: 33756
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33756
Author:   blendix
Date:     2010-12-17 21:13:54 +0100 (Fri, 17 Dec 2010)

Log Message:
-----------
Fix #25272: shrinkwrap with dependency cycle could lead to eternal
loop and increasing memory usage.

Modifiers should never call mesh_get_derived_final or similar, only
use ob->derivedFinal if it exists, if the dependencies are set correct
and there are no cycles, it will be there.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_shrinkwrap.h
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c
    trunk/blender/source/blender/modifiers/intern/MOD_shrinkwrap.c

Modified: trunk/blender/source/blender/blenkernel/BKE_shrinkwrap.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_shrinkwrap.h	2010-12-17 19:58:02 UTC (rev 33755)
+++ trunk/blender/source/blender/blenkernel/BKE_shrinkwrap.h	2010-12-17 20:13:54 UTC (rev 33756)
@@ -35,7 +35,7 @@
 #include "BKE_customdata.h"
 struct DerivedMesh;
 struct Object;
-struct DerivedMesh *object_get_derived_final(struct Scene *scene, struct Object *ob, CustomDataMask dataMask);
+struct DerivedMesh *object_get_derived_final(struct Object *ob);
 
 
 /* SpaceTransform stuff */
@@ -121,7 +121,7 @@
 
 } ShrinkwrapCalcData;
 
-void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
+void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
 
 /*
  * This function casts a ray in the given BVHTree.. but it takes into consideration the space_transform, that is:

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c	2010-12-17 19:58:02 UTC (rev 33755)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c	2010-12-17 20:13:54 UTC (rev 33756)
@@ -3423,7 +3423,7 @@
 		float dist;
 		
 		SpaceTransform transform;
-		DerivedMesh *target = object_get_derived_final(cob->scene, ct->tar, CD_MASK_BAREMESH);
+		DerivedMesh *target = object_get_derived_final(ct->tar);
 		BVHTreeRayHit hit;
 		BVHTreeNearest nearest;
 		

Modified: trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c	2010-12-17 19:58:02 UTC (rev 33755)
+++ trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c	2010-12-17 20:13:54 UTC (rev 33756)
@@ -48,6 +48,7 @@
 #include "BKE_mesh.h"
 #include "BKE_subsurf.h"
 
+#include "BLI_editVert.h"
 #include "BLI_math.h"
 
 
@@ -82,21 +83,18 @@
 
 /* get derived mesh */
 //TODO is anyfunction that does this? returning the derivedFinal witouth we caring if its in edit mode or not?
-DerivedMesh *object_get_derived_final(struct Scene *scene, Object *ob, CustomDataMask dataMask)
+DerivedMesh *object_get_derived_final(Object *ob)
 {
 	Mesh *me= ob->data;
-	struct EditMesh *em = BKE_mesh_get_editmesh(me);
+	EditMesh *em = BKE_mesh_get_editmesh(me);
 
-	if (em)
-	{
-		DerivedMesh *final = NULL;
-		editmesh_get_derived_cage_and_final(scene, ob, em, &final, dataMask);
-		
+	if(em) {
+		DerivedMesh *dm = em->derivedFinal;
 		BKE_mesh_end_editmesh(me, em);
-		return final;
+		return dm;
 	}
-	else
-		return mesh_get_derived_final(scene, ob, dataMask);
+
+	return ob->derivedFinal;
 }
 
 /* Space transform */
@@ -282,7 +280,7 @@
 }
 
 
-static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct Scene *scene)
+static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc)
 {
 	int i;
 
@@ -327,7 +325,9 @@
 
 	if(calc->smd->auxTarget)
 	{
-		auxMesh = object_get_derived_final(scene, calc->smd->auxTarget, CD_MASK_BAREMESH);
+		auxMesh = object_get_derived_final(calc->smd->auxTarget);
+		if(!auxMesh)
+			return;
 		space_transform_setup( &local2aux, calc->ob, calc->smd->auxTarget);
 	}
 
@@ -499,7 +499,7 @@
 }
 
 /* Main shrinkwrap function */
-void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
+void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
 {
 
 	DerivedMesh *ss_mesh	= NULL;
@@ -530,7 +530,7 @@
 
 	if(smd->target)
 	{
-		calc.target = object_get_derived_final(scene, smd->target, CD_MASK_BAREMESH);
+		calc.target = object_get_derived_final(smd->target);
 
 		//TODO there might be several "bugs" on non-uniform scales matrixs
 		//because it will no longer be nearest surface, not sphere projection
@@ -587,7 +587,7 @@
 			break;
 
 			case MOD_SHRINKWRAP_PROJECT:
-				BENCH(shrinkwrap_calc_normal_projection(&calc, scene));
+				BENCH(shrinkwrap_calc_normal_projection(&calc));
 			break;
 
 			case MOD_SHRINKWRAP_NEAREST_VERTEX:

Modified: trunk/blender/source/blender/modifiers/intern/MOD_shrinkwrap.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_shrinkwrap.c	2010-12-17 19:58:02 UTC (rev 33755)
+++ trunk/blender/source/blender/modifiers/intern/MOD_shrinkwrap.c	2010-12-17 20:13:54 UTC (rev 33756)
@@ -117,7 +117,7 @@
 	if(dataMask)
 		dm= get_cddm(ob, NULL, dm, vertexCos);
 
-	shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts);
+	shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
 
 	if(dm != derivedData)
 		dm->release(dm);
@@ -132,7 +132,7 @@
 	if(dataMask)
 		dm= get_cddm(ob, editData, dm, vertexCos);
 
-	shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts);
+	shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
 
 	if(dm != derivedData)
 		dm->release(dm);





More information about the Bf-blender-cvs mailing list