[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37503] trunk/blender/source/blender: Fix #27654: vertex parenting not working with constructive modifiers.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Jun 15 11:45:27 CEST 2011


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 */




More information about the Bf-blender-cvs mailing list