[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