[#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 95a9394427ffea4c220b7c92209071000e7f5726..51120a61e69c70eb5af6eec0ec836d646fe01f3a 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 0b3bd106544e097cc031123af7937c47ceaac60e..1f49d519e7da0def8fd5df720cd8df0b5e1a8062 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 d0e36f90ff55175191edfa689a5d004fa32771c7..6d2a3e7098f64fa9bcf54ba84ec26fb803b87681 100644 (file)
@@ -174,6 +174,7 @@ ModifierTypeInfo modifierType_Armature = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index a6fefbcd8634ef8a8c3bd2cc08a0aedefc0ce2a1..8331c3474b2317f63b887f79e34f90871c626e82 100644 (file)
@@ -775,6 +775,7 @@ ModifierTypeInfo modifierType_Array = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 62c7dfa5600c921e218f8dc68ef70df91b73045e..68274fbfd78b350982c686f949cf2f893413ff9c 100644 (file)
@@ -136,6 +136,7 @@ ModifierTypeInfo modifierType_Bevel = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 4e8e3117b7e6c9340abb21c571a6d2c8847670d7..496523a310bfcc3027853e72914b71790cfc9bdf 100644 (file)
@@ -135,6 +135,7 @@ ModifierTypeInfo modifierType_Boolean = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 8fc1be7d5ee71f6a476d20a28665b05c6fa3b35b..de913d79f01e20b9195c7cebaf2d092d39c642c6 100644 (file)
@@ -295,6 +295,7 @@ ModifierTypeInfo modifierType_Build = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 10843cf96771281a1cd0ce53c18c4c2c84895dbf..1872263848bfc29d4d7e886e95fe16c0d294604b 100644 (file)
@@ -623,6 +623,7 @@ ModifierTypeInfo modifierType_Cast = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index bfb5f6ee028a2fac80f7490a22b6f6f6079bfb28..1c0ab34f15c77f4e770ffd7dc4047ef405a60099 100644 (file)
@@ -201,6 +201,7 @@ ModifierTypeInfo modifierType_Cloth = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 32fbd58839a0ca3f9bfd38e93e99a70901213190..2651122231cde5332bd4f4492b9b6975ef01bf97 100644 (file)
@@ -248,6 +248,7 @@ ModifierTypeInfo modifierType_Collision = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 97c7a4b01d66b6633775f519df2030a2bd7218e5..998bf375e79c0981044d5b0d45d3d6789161ea32 100644 (file)
@@ -145,6 +145,7 @@ ModifierTypeInfo modifierType_Curve = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 9163a9771f0210535b209dbfc053a0f48b5f7bcc..03307934e00616d9148166cf512fdcff3027b04c 100644 (file)
@@ -194,6 +194,7 @@ ModifierTypeInfo modifierType_Decimate = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index efe57410441810d6204e734ba34b60db0c9cb5dc..2e811eb742df0fd9b3b01cd0627dbe3f352f6373 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 6614625a6500186a6adcf41cf5cac1b6f283789d..e80b80abdb5e875f513f2c7477b0b8d129260d23 100644 (file)
@@ -1290,6 +1290,7 @@ ModifierTypeInfo modifierType_EdgeSplit = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 9a42c9909a70bfe58db4e370c1f76867a92379d3..cbf5f3c3b98899c80356942a5576db831df9473b 100644 (file)
@@ -898,6 +898,7 @@ ModifierTypeInfo modifierType_Explode = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index c683bee0b3579c3c8a5b5783e09522e58c183d8e..619891e136f941f7e9949bf4e07078b3f6c9609d 100644 (file)
@@ -153,6 +153,7 @@ ModifierTypeInfo modifierType_Fluidsim = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 2c9ae3115858ee4557f006015f486d641948ce61..f2ffd486aa5a1bd78fe090f25addabb581698ae5 100644 (file)
@@ -274,6 +274,7 @@ ModifierTypeInfo modifierType_Hook = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 4270f2ff6e85607b1c2d67573244e2ea849d1be5..532475a34669098fd392899f4e57f56b47116565 100644 (file)
@@ -139,6 +139,7 @@ ModifierTypeInfo modifierType_Lattice = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 94eb2380b665c814a2f410b03178f721b0dae698..c15653521331e4327bfa61ea4f368a17667ae76a 100644 (file)
@@ -404,6 +404,7 @@ ModifierTypeInfo modifierType_Mask = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index fa1ee7e31595eee444c16bc24ab6b9503b4ef04c..af87fb6ef7403a5e9b4b35cbc8eb94c58a5d3928 100644 (file)
@@ -447,6 +447,7 @@ ModifierTypeInfo modifierType_MeshDeform = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 06c93eefc59ff6f6a20d98a40784b3351a282845..9289c44c41436798009787f3992199fe945974d2 100644 (file)
@@ -344,6 +344,7 @@ ModifierTypeInfo modifierType_Mirror = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 988ce3921a7c4a81afa9430d0c845d4eb88ae354..758809ff7ec402d0749b7da1e1c79c98854f2cc9 100644 (file)
@@ -117,6 +117,7 @@ ModifierTypeInfo modifierType_Multires = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 0c749b79f5aac2c97d129661628acf72bc14bfed..8cfb2a593766fe9dfa90c753cb92db6b3f654b5d 100644 (file)
@@ -65,6 +65,7 @@ ModifierTypeInfo modifierType_None = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 4f5acc60cda3765fa1da9da2d4245211cca938a1..bbd0219d3f88ff40e1661a9dcd746d67ae5f44ba 100644 (file)
@@ -336,6 +336,7 @@ ModifierTypeInfo modifierType_ParticleInstance = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 02480b8d2a30110aacd29ab418444982e2089057..602b6dd1d56699e32e03170a003c7a10eac6a626 100644 (file)
@@ -227,6 +227,7 @@ ModifierTypeInfo modifierType_ParticleSystem = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 2221e8cc1bf830d6c0c8d54e5351e2f265b0d76b..0016fd2d266ec5c1c3e3d48b17b7f6bd4d1b1e9d 100644 (file)
@@ -894,6 +894,7 @@ ModifierTypeInfo modifierType_Screw = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index f73dcc252355ee208aa3b2213ae0fa472a67c2a3..bf675b874f6295c0df30dddfd98f06a92cc5b044 100644 (file)
@@ -107,6 +107,7 @@ ModifierTypeInfo modifierType_ShapeKey = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 6526be4cb5336ab060a955c69f454888d9955b09..6baee9f0d98428a9370580b98d07e81a9329894d 100644 (file)
@@ -166,6 +166,7 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index c64fec4075df8daecca5304fa4e285b719ea9f7c..ab5807813511951b71cf30a33d5118dbbf6be56e 100644 (file)
@@ -372,6 +372,7 @@ ModifierTypeInfo modifierType_SimpleDeform = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     0,
 };
index 25153de7be40af525af1720eb67755c663dfc119..f89ff0bb1b5902e269639c3e6c9e189082a1a0ba 100644 (file)
@@ -141,6 +141,7 @@ ModifierTypeInfo modifierType_Smoke = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index a42bf8abbafc47724cb892646fda5137142209ba..96269c092c951e27ef65caa2a17cbb1449d273ab 100644 (file)
@@ -264,6 +264,7 @@ ModifierTypeInfo modifierType_Smooth = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 8f629001e0be732ad30a249ae480f45e4f8126dd..931cfe2e2d3e794c22e09f724a86fcc730e5286d 100644 (file)
@@ -72,6 +72,7 @@ ModifierTypeInfo modifierType_Softbody = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index ee608c7cf319964891e8f249373ffa99df471946..57155c4e1dc4ac2b619012f4696bb7c77ba068de 100644 (file)
@@ -661,6 +661,7 @@ ModifierTypeInfo modifierType_Solidify = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 799df64b2b563d2ed664c29c362291e147177a40..cd3657b967472141addc1432c928b15b6d2ba8f6 100644 (file)
@@ -139,6 +139,7 @@ ModifierTypeInfo modifierType_Subsurf = {
        /* isDisabled */        isDisabled,
        /* updateDepgraph */    0,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 223d8e7792f1cd829dd0b6f22315762254f0e29b..b2f55bde360889dddc2aef0165e803b384cb53cc 100644 (file)
@@ -178,6 +178,7 @@ ModifierTypeInfo modifierType_Surface = {
        /* isDisabled */        0,
        /* updateDepgraph */    0,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ 0,
        /* foreachIDLink */     0,
 };
index 1a595cbf0519893c01130e2a620b0fc12b59134e..211640ad77796c84d7fffe9cfd4ba8520a30130a 100644 (file)
@@ -418,6 +418,7 @@ ModifierTypeInfo modifierType_UVProject = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     0,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     foreachIDLink,
 };
index 191c702903ab738916372530cc33d055ac3f797b..42cbddce2334a45c276383921050871f6a276fa3 100644 (file)
@@ -455,6 +455,7 @@ ModifierTypeInfo modifierType_Wave = {
        /* isDisabled */        0,
        /* updateDepgraph */    updateDepgraph,
        /* dependsOnTime */     dependsOnTime,
+       /* dependsOnNormals */  0,
        /* foreachObjectLink */ foreachObjectLink,
        /* foreachIDLink */     foreachIDLink,
 };
index 989424ba7eb1aaf2b227d678d252cd72a997ccb9..607803d16d508363210bed7f4e5eb7c5f073eb49 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