Revision: 37503
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37503
Author:   blendix
Date:     2011-06-15 09:45:26 +0000 (Wed, 15 Jun 2011)
Log Message:
-----------
Fix #27654: vertex parenting not working with constructive modifiers.

Vertex parents were not requesting the original index layer, now do this as
part of depsgraph building, and make constraints with vertex groups use the
same system. Fix is based on patch by Campbell, but with some changes.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/depsgraph_private.h
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_object_types.h

Modified: trunk/blender/source/blender/blenkernel/depsgraph_private.h
===================================================================
--- trunk/blender/source/blender/blenkernel/depsgraph_private.h 2011-06-15 
08:28:56 UTC (rev 37502)
+++ trunk/blender/source/blender/blenkernel/depsgraph_private.h 2011-06-15 
09:45:26 UTC (rev 37503)
@@ -69,8 +69,9 @@
        void * ob;
        void * first_ancestor;
        int ancestor_count;
-       unsigned int lay;                       // accumulated layers of its 
relations + itself
+       unsigned int lay;                               // accumulated layers 
of its relations + itself
        unsigned int scelay;                    // layers due to being in scene
+       unsigned int customdata_mask;   // customdata mask
        int lasttime;           // if lasttime != DagForest->time, this node 
was not evaluated yet for flushing
        int BFS_dist;           // BFS distance
        int DFS_dist;           // DFS distance

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c 2011-06-15 
08:28:56 UTC (rev 37502)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c 2011-06-15 
09:45:26 UTC (rev 37503)
@@ -449,16 +449,9 @@
                freeDM= 1;
        }
        else {
-               /* when not in EditMode, use the 'final' derived mesh 
-                *      - check if the custom data masks for derivedFinal mean 
that we can just use that
-                *        (this is more effficient + sufficient for most cases)
-                */
-               if (!(ob->lastDataMask & CD_MASK_MDEFORMVERT)) {
-                       dm = mesh_get_derived_final(scene, ob, 
CD_MASK_MDEFORMVERT);
-                       freeDM= 1;
-               }
-               else 
-                       dm = (DerivedMesh *)ob->derivedFinal;
+               /* when not in EditMode, use the 'final' derived mesh, depsgraph
+                * ensures we build with CD_MDEFORMVERT layer */
+               dm = (DerivedMesh *)ob->derivedFinal;
        }
        
        /* only continue if there's a valid DerivedMesh */

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c  2011-06-15 
08:28:56 UTC (rev 37502)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c  2011-06-15 
09:45:26 UTC (rev 37503)
@@ -372,6 +372,9 @@
                node2->first_ancestor = ob;
                node2->ancestor_count += 1;
        }
+
+       /* also build a custom data mask for dependencies that need certain 
layers */
+       node->customdata_mask= 0;
        
        if (ob->type == OB_ARMATURE) {
                if (ob->pose){
@@ -451,9 +454,13 @@
                        case PARSKEL:
                                
dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_OB, "Parent");
                                break;
-                       case PARVERT1: case PARVERT3: case PARBONE:
+                       case PARVERT1: case PARVERT3:
                                
dag_add_relation(dag,node2,node,DAG_RL_DATA_OB|DAG_RL_OB_OB, "Vertex Parent");
+                               node2->customdata_mask |= CD_MASK_ORIGINDEX;
                                break;
+                       case PARBONE:
+                               
dag_add_relation(dag,node2,node,DAG_RL_DATA_OB|DAG_RL_OB_OB, "Bone Parent");
+                               break;
                        default:
                                if(ob->parent->type==OB_LATTICE) 
                                        
dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_OB, "Lattice 
Parent");
@@ -647,8 +654,11 @@
                                if (ELEM(con->type, CONSTRAINT_TYPE_FOLLOWPATH, 
CONSTRAINT_TYPE_CLAMPTO))
                                        dag_add_relation(dag, node2, node, 
DAG_RL_DATA_OB|DAG_RL_OB_OB, cti->name);
                                else {
-                                       if (ELEM3(obt->type, OB_ARMATURE, 
OB_MESH, OB_LATTICE) && (ct->subtarget[0]))
+                                       if (ELEM3(obt->type, OB_ARMATURE, 
OB_MESH, OB_LATTICE) && (ct->subtarget[0])) {
                                                dag_add_relation(dag, node2, 
node, DAG_RL_DATA_OB|DAG_RL_OB_OB, cti->name);
+                                               if (obt->type == OB_MESH)
+                                                       node2->customdata_mask 
|= CD_MASK_MDEFORMVERT;
+                                       }
                                        else
                                                dag_add_relation(dag, node2, 
node, DAG_RL_OB_OB, cti->name);
                                }
@@ -722,6 +732,9 @@
                                        itA->node->color |= itA->type;
                                }
                        }
+
+                       /* also flush custom data mask */
+                       ((Object*)node->ob)->customdata_mask= 
node->customdata_mask;
                }
        }
        /* now set relations equal, so that when only one parent changes, the 
correct recalcs are found */

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c     2011-06-15 
08:28:56 UTC (rev 37502)
+++ trunk/blender/source/blender/blenkernel/intern/object.c     2011-06-15 
09:45:26 UTC (rev 37503)
@@ -2641,11 +2641,12 @@
 
 #else                          /* ensure CD_MASK_BAREMESH for now */
                                        EditMesh *em = (ob == scene->obedit)? 
BKE_mesh_get_editmesh(ob->data): NULL;
+                                       unsigned int data_mask= 
scene->customdata_mask | ob->customdata_mask | CD_MASK_BAREMESH;
                                        if(em) {
-                                               makeDerivedMesh(scene, ob, em,  
scene->customdata_mask | CD_MASK_BAREMESH); /* was CD_MASK_BAREMESH */
+                                               makeDerivedMesh(scene, ob, em,  
data_mask); /* was CD_MASK_BAREMESH */
                                                BKE_mesh_end_editmesh(ob->data, 
em);
                                        } else
-                                               makeDerivedMesh(scene, ob, 
NULL, scene->customdata_mask | CD_MASK_BAREMESH);
+                                               makeDerivedMesh(scene, ob, 
NULL, data_mask);
 #endif
 
                                }

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2011-06-15 
08:28:56 UTC (rev 37502)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2011-06-15 
09:45:26 UTC (rev 37503)
@@ -4321,6 +4321,7 @@
                MEM_freeN(hook);
        }
        
+       ob->customdata_mask= 0;
        ob->bb= NULL;
        ob->derivedDeform= NULL;
        ob->derivedFinal= NULL;

Modified: trunk/blender/source/blender/makesdna/DNA_object_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_object_types.h    2011-06-15 
08:28:56 UTC (rev 37502)
+++ trunk/blender/source/blender/makesdna/DNA_object_types.h    2011-06-15 
09:45:26 UTC (rev 37503)
@@ -250,12 +250,11 @@
        struct FluidsimSettings *fluidsimSettings; /* if fluidsim enabled, 
store additional settings */
 
        struct DerivedMesh *derivedDeform, *derivedFinal;
-       int lastDataMask;                       /* the custom data layer mask 
that was last used to calculate derivedDeform and derivedFinal */
+       unsigned int lastDataMask;   /* the custom data layer mask that was 
last used to calculate derivedDeform and derivedFinal */
+       unsigned int customdata_mask; /* (extra) custom data layer mask to use 
for creating derivedmesh, set by depsgraph */
        unsigned int state;                     /* bit masks of game 
controllers that are active */
        unsigned int init_state;        /* bit masks of initial state as 
recorded by the users */
 
-       int pad2;
-
        ListBase gpulamp;               /* runtime, for lamps only */
        ListBase pc_ids;
        ListBase *duplilist;    /* for temporary dupli list storage, only for 
use by RNA API */

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to