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