[#23673] Modifier construction gives correct result in viewport but incorrect in...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 30 Sep 2010 10:51:36 +0000 (10:51 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 30 Sep 2010 10:51:36 +0000 (10:51 +0000)
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.

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

index 95a9394..51120a6 100644 (file)
@@ -245,6 +245,17 @@ typedef struct ModifierTypeInfo {
         */
        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.
index 0b3bd10..1f49d51 100644 (file)
@@ -1670,6 +1670,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
        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 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
                                }
                        }
 
+                       /* 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 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
                        }
                }
 
+               isPrevDeform= (mti->type == eModifierTypeType_OnlyDeform);
+
                /* grab modifiers until index i */
                if((index >= 0) && (modifiers_indexInObject(ob, md) >= index))
                        break;
index d0e36f9..6d2a3e7 100644 (file)
@@ -174,6 +174,7 @@ ModifierTypeInfo modifierType_Armature = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index a6fefbc..8331c34 100644 (file)
@@ -775,6 +775,7 @@ ModifierTypeInfo modifierType_Array = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 62c7dfa..68274fb 100644 (file)
@@ -136,6 +136,7 @@ ModifierTypeInfo modifierType_Bevel = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 4e8e311..496523a 100644 (file)
@@ -135,6 +135,7 @@ ModifierTypeInfo modifierType_Boolean = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 8fc1be7..de913d7 100644 (file)
@@ -295,6 +295,7 @@ ModifierTypeInfo modifierType_Build = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 10843cf..1872263 100644 (file)
@@ -623,6 +623,7 @@ ModifierTypeInfo modifierType_Cast = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index bfb5f6e..1c0ab34 100644 (file)
@@ -201,6 +201,7 @@ ModifierTypeInfo modifierType_Cloth = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 32fbd58..2651122 100644 (file)
@@ -248,6 +248,7 @@ ModifierTypeInfo modifierType_Collision = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 97c7a4b..998bf37 100644 (file)
@@ -145,6 +145,7 @@ ModifierTypeInfo modifierType_Curve = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 9163a97..0330793 100644 (file)
@@ -194,6 +194,7 @@ ModifierTypeInfo modifierType_Decimate = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index efe5741..2e811eb 100644 (file)
@@ -103,6 +103,12 @@ static int dependsOnTime(ModifierData *md)
        }
 }
 
+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 @@ ModifierTypeInfo modifierType_Displace = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  dependsOnNormals,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     foreachIDLink,
 };
index 6614625..e80b80a 100644 (file)
@@ -1290,6 +1290,7 @@ ModifierTypeInfo modifierType_EdgeSplit = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 9a42c99..cbf5f3c 100644 (file)
@@ -898,6 +898,7 @@ ModifierTypeInfo modifierType_Explode = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index c683bee..619891e 100644 (file)
@@ -153,6 +153,7 @@ ModifierTypeInfo modifierType_Fluidsim = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 2c9ae31..f2ffd48 100644 (file)
@@ -274,6 +274,7 @@ ModifierTypeInfo modifierType_Hook = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 4270f2f..532475a 100644 (file)
@@ -139,6 +139,7 @@ ModifierTypeInfo modifierType_Lattice = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 94eb238..c156535 100644 (file)
@@ -404,6 +404,7 @@ ModifierTypeInfo modifierType_Mask = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index fa1ee7e..af87fb6 100644 (file)
@@ -447,6 +447,7 @@ ModifierTypeInfo modifierType_MeshDeform = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 06c93ee..9289c44 100644 (file)
@@ -344,6 +344,7 @@ ModifierTypeInfo modifierType_Mirror = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 988ce39..758809f 100644 (file)
@@ -117,6 +117,7 @@ ModifierTypeInfo modifierType_Multires = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 0c749b7..8cfb2a5 100644 (file)
@@ -65,6 +65,7 @@ ModifierTypeInfo modifierType_None = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 4f5acc6..bbd0219 100644 (file)
@@ -336,6 +336,7 @@ ModifierTypeInfo modifierType_ParticleInstance = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 02480b8..602b6dd 100644 (file)
@@ -227,6 +227,7 @@ ModifierTypeInfo modifierType_ParticleSystem = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 2221e8c..0016fd2 100644 (file)
@@ -894,6 +894,7 @@ ModifierTypeInfo modifierType_Screw = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index f73dcc2..bf675b8 100644 (file)
@@ -107,6 +107,7 @@ ModifierTypeInfo modifierType_ShapeKey = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 6526be4..6baee9f 100644 (file)
@@ -166,6 +166,7 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index c64fec4..ab58078 100644 (file)
@@ -372,6 +372,7 @@ ModifierTypeInfo modifierType_SimpleDeform = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 25153de..f89ff0b 100644 (file)
@@ -141,6 +141,7 @@ ModifierTypeInfo modifierType_Smoke = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index a42bf8a..96269c0 100644 (file)
@@ -264,6 +264,7 @@ ModifierTypeInfo modifierType_Smooth = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 8f62900..931cfe2 100644 (file)
@@ -72,6 +72,7 @@ ModifierTypeInfo modifierType_Softbody = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index ee608c7..57155c4 100644 (file)
@@ -661,6 +661,7 @@ ModifierTypeInfo modifierType_Solidify = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 799df64..cd3657b 100644 (file)
@@ -139,6 +139,7 @@ ModifierTypeInfo modifierType_Subsurf = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 223d8e7..b2f55bd 100644 (file)
@@ -178,6 +178,7 @@ ModifierTypeInfo modifierType_Surface = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 1a595cb..211640a 100644 (file)
@@ -418,6 +418,7 @@ ModifierTypeInfo modifierType_UVProject = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     foreachIDLink,
 };
index 191c702..42cbddc 100644 (file)
@@ -455,6 +455,7 @@ ModifierTypeInfo modifierType_Wave = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     foreachIDLink,
 };
index 989424b..607803d 100755 (executable)
@@ -9,6 +9,12 @@ SSH_UPLOAD="/data/www/vhosts/www.blender.org/documentation" # blender_python_api
 
 # sed string from hell, 'Blender 2.53 (sub 1) Build' --> '2_53_1'
 # "_".join(str(v) for v in bpy.app.version)
+# custom blender vars
+blender_srcdir=$(dirname $0)/../../../../
+blender_version=$(grep BLENDER_VERSION $blender_srcdir/source/blender/blenkernel/BKE_blender.h | tr -dc 0-9)
+blender_subversion=$(grep BLENDER_SUBVERSION $blender_srcdir/source/blender/blenkernel/BKE_blender.h | tr -dc 0-9)
+BLENDER_VERSION=$(expr $blender_version / 100)_$(expr $blender_version % 100)_$blender_subversion
+
 BLENDER_VERSION=`$BLENDER --version | cut -f2-4 -d" " | sed 's/(//g' | sed 's/)//g' | sed 's/ sub /./g' | sed 's/\./_/g'`
 SSH_UPLOAD_FULL=$SSH_UPLOAD/"blender_python_api_"$BLENDER_VERSION