[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32209] trunk/blender/source/blender: [ #23673] Modifier construction gives correct result in viewport but incorrect in render .

Campbell Barton ideasman42 at gmail.com
Thu Sep 30 12:51:36 CEST 2010


Revision: 32209
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32209
Author:   campbellbarton
Date:     2010-09-30 12:51:36 +0200 (Thu, 30 Sep 2010)

Log Message:
-----------
[#23673] Modifier construction gives correct result in viewport but incorrect in render.

When there are 2+ consecutive deform modifiers, the second modifier was getting incorrect normals, this only showed up for the displace modifier since its the only deform modifier that uses vertex normals.

It would have been easy to fix this by always calculating normals on deform modifiers, but slow.

To fix this I added a function to check if a deform modifier needs normals, so the normal calculation function only runs if there are 2 modifiers in a row and the second uses normals.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_modifier.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/modifiers/intern/MOD_armature.c
    trunk/blender/source/blender/modifiers/intern/MOD_array.c
    trunk/blender/source/blender/modifiers/intern/MOD_bevel.c
    trunk/blender/source/blender/modifiers/intern/MOD_boolean.c
    trunk/blender/source/blender/modifiers/intern/MOD_build.c
    trunk/blender/source/blender/modifiers/intern/MOD_cast.c
    trunk/blender/source/blender/modifiers/intern/MOD_cloth.c
    trunk/blender/source/blender/modifiers/intern/MOD_collision.c
    trunk/blender/source/blender/modifiers/intern/MOD_curve.c
    trunk/blender/source/blender/modifiers/intern/MOD_decimate.c
    trunk/blender/source/blender/modifiers/intern/MOD_displace.c
    trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c
    trunk/blender/source/blender/modifiers/intern/MOD_explode.c
    trunk/blender/source/blender/modifiers/intern/MOD_fluidsim.c
    trunk/blender/source/blender/modifiers/intern/MOD_hook.c
    trunk/blender/source/blender/modifiers/intern/MOD_lattice.c
    trunk/blender/source/blender/modifiers/intern/MOD_mask.c
    trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
    trunk/blender/source/blender/modifiers/intern/MOD_mirror.c
    trunk/blender/source/blender/modifiers/intern/MOD_multires.c
    trunk/blender/source/blender/modifiers/intern/MOD_none.c
    trunk/blender/source/blender/modifiers/intern/MOD_particleinstance.c
    trunk/blender/source/blender/modifiers/intern/MOD_particlesystem.c
    trunk/blender/source/blender/modifiers/intern/MOD_screw.c
    trunk/blender/source/blender/modifiers/intern/MOD_shapekey.c
    trunk/blender/source/blender/modifiers/intern/MOD_shrinkwrap.c
    trunk/blender/source/blender/modifiers/intern/MOD_simpledeform.c
    trunk/blender/source/blender/modifiers/intern/MOD_smoke.c
    trunk/blender/source/blender/modifiers/intern/MOD_smooth.c
    trunk/blender/source/blender/modifiers/intern/MOD_softbody.c
    trunk/blender/source/blender/modifiers/intern/MOD_solidify.c
    trunk/blender/source/blender/modifiers/intern/MOD_subsurf.c
    trunk/blender/source/blender/modifiers/intern/MOD_surface.c
    trunk/blender/source/blender/modifiers/intern/MOD_uvproject.c
    trunk/blender/source/blender/modifiers/intern/MOD_wave.c
    trunk/blender/source/blender/python/doc/sphinx_doc_gen.sh

Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_modifier.h	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/blenkernel/BKE_modifier.h	2010-09-30 10:51:36 UTC (rev 32209)
@@ -245,6 +245,17 @@
 	 */
 	int (*dependsOnTime)(struct ModifierData *md);
 
+
+	/* True when a deform modifier uses normals, the requiredDataMask
+	 * cant be used here because that refers to a normal layer where as
+	 * in this case we need to know if the deform modifier uses normals.
+	 * 
+	 * this is needed because applying 2 deform modifiers will give the
+	 * second modifier bogus normals.
+	 * */
+	int (*dependsOnNormals)(struct ModifierData *md);
+
+
 	/* Should call the given walk function on with a pointer to each Object
 	 * pointer that the modifier data stores. This is used for linking on file
 	 * load and for unlinking objects or forwarding object references.

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -1670,6 +1670,7 @@
 	DerivedMesh *dm, *orcodm, *clothorcodm, *finaldm;
 	int numVerts = me->totvert;
 	int required_mode;
+	int isPrevDeform= FALSE;
 
 	md = firstmd = (useDeform<0) ? ob->modifiers.first : modifiers_getVirtualModifierList(ob);
 
@@ -1787,6 +1788,16 @@
 				}
 			}
 
+			/* if this is not the last modifier in the stack then recalculate the normals
+			 * to avoid giving bogus normals to the next modifier see: [#23673] */
+			if(isPrevDeform && mti->dependsOnNormals(md)) {
+				/* XXX, this covers bug #23673, but we may need normal calc for other types */
+				if(dm->type == DM_TYPE_CDDM) {
+					CDDM_apply_vert_coords(dm, deformedVerts);
+					CDDM_calc_normals(dm);
+				}
+			}
+
 			mti->deformVerts(md, ob, dm, deformedVerts, numVerts, useRenderParams, useDeform);
 		} else {
 			DerivedMesh *ndm;
@@ -1897,6 +1908,8 @@
 			}
 		}
 
+		isPrevDeform= (mti->type == eModifierTypeType_OnlyDeform);
+
 		/* grab modifiers until index i */
 		if((index >= 0) && (modifiers_indexInObject(ob, md) >= index))
 			break;

Modified: trunk/blender/source/blender/modifiers/intern/MOD_armature.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_armature.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_armature.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -174,6 +174,7 @@
 	/* isDisabled */        isDisabled,
 	/* updateDepgraph */    updateDepgraph,
 	/* dependsOnTime */     0,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ foreachObjectLink,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_array.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_array.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_array.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -775,6 +775,7 @@
 	/* isDisabled */        0,
 	/* updateDepgraph */    updateDepgraph,
 	/* dependsOnTime */     0,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ foreachObjectLink,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_bevel.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_bevel.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_bevel.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -136,6 +136,7 @@
 	/* isDisabled */        0,
 	/* updateDepgraph */    0,
 	/* dependsOnTime */     0,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ 0,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_boolean.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_boolean.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_boolean.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -135,6 +135,7 @@
 	/* isDisabled */        isDisabled,
 	/* updateDepgraph */    updateDepgraph,
 	/* dependsOnTime */     0,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ foreachObjectLink,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_build.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_build.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_build.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -295,6 +295,7 @@
 	/* isDisabled */        0,
 	/* updateDepgraph */    0,
 	/* dependsOnTime */     dependsOnTime,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ 0,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_cast.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_cast.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_cast.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -623,6 +623,7 @@
 	/* isDisabled */        isDisabled,
 	/* updateDepgraph */    updateDepgraph,
 	/* dependsOnTime */     0,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ foreachObjectLink,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_cloth.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_cloth.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_cloth.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -201,6 +201,7 @@
 	/* isDisabled */        0,
 	/* updateDepgraph */    updateDepgraph,
 	/* dependsOnTime */     dependsOnTime,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ 0,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_collision.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_collision.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_collision.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -248,6 +248,7 @@
 	/* isDisabled */        0,
 	/* updateDepgraph */    0,
 	/* dependsOnTime */     dependsOnTime,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ 0,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_curve.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_curve.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_curve.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -145,6 +145,7 @@
 	/* isDisabled */        isDisabled,
 	/* updateDepgraph */    updateDepgraph,
 	/* dependsOnTime */     0,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ foreachObjectLink,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_decimate.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_decimate.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_decimate.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -194,6 +194,7 @@
 	/* isDisabled */        0,
 	/* updateDepgraph */    0,
 	/* dependsOnTime */     0,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ 0,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_displace.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_displace.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_displace.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -103,6 +103,12 @@
 	}
 }
 
+static int dependsOnNormals(ModifierData *md)
+{
+	DisplaceModifierData *dmd = (DisplaceModifierData *)md;
+	return (dmd->direction == MOD_DISP_DIR_NOR);
+}
+
 static void foreachObjectLink(ModifierData *md, Object *ob,
 						   ObjectWalkFunc walk, void *userData)
 {
@@ -349,6 +355,7 @@
 	/* isDisabled */        isDisabled,
 	/* updateDepgraph */    updateDepgraph,
 	/* dependsOnTime */     dependsOnTime,
+	/* dependsOnNormals */	dependsOnNormals,
 	/* foreachObjectLink */ foreachObjectLink,
 	/* foreachIDLink */     foreachIDLink,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -1290,6 +1290,7 @@
 	/* isDisabled */        0,
 	/* updateDepgraph */    0,
 	/* dependsOnTime */     0,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ 0,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_explode.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_explode.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_explode.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -898,6 +898,7 @@
 	/* isDisabled */        0,
 	/* updateDepgraph */    0,
 	/* dependsOnTime */     dependsOnTime,
+	/* dependsOnNormals */	0,
 	/* foreachObjectLink */ 0,
 	/* foreachIDLink */     0,
 };

Modified: trunk/blender/source/blender/modifiers/intern/MOD_fluidsim.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_fluidsim.c	2010-09-30 10:39:05 UTC (rev 32208)
+++ trunk/blender/source/blender/modifiers/intern/MOD_fluidsim.c	2010-09-30 10:51:36 UTC (rev 32209)
@@ -153,6 +153,7 @@
 	/* isDisabled */        0,
 	/* updateDepgraph */    updateDepgraph,
 	/* dependsOnTime */     dependsOnTime,
+	/* dependsOnNormals */	0,

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list