[Bf-codereview] Fix for truncated CustomDataMasks (issue 5905059)

NicholasBishop at gmail.com NicholasBishop at gmail.com
Sun Mar 25 22:54:53 CEST 2012


Reviewers: bf-codereview_blender.org,

Description:
Relevant bug report:
http://projects.blender.org/tracker/index.php?func=detail&aid=30680&group_id=9&atid=498

Basically just added a new link type with correct payload size/type.

Please review this at http://codereview.appspot.com/5905059/

Affected files:
   source/blender/blenkernel/BKE_modifier.h
   source/blender/blenkernel/intern/DerivedMesh.c
   source/blender/blenkernel/intern/modifier.c


Index: source/blender/blenkernel/BKE_modifier.h
===================================================================
--- source/blender/blenkernel/BKE_modifier.h	(revision 45140)
+++ source/blender/blenkernel/BKE_modifier.h	(working copy)
@@ -357,16 +357,21 @@ int           modifiers_isPreview(struct Object *ob);

  int           modifiers_indexInObject(struct Object *ob, struct  
ModifierData *md);

+typedef struct CDMaskLink {
+	struct CDMaskLink *next;
+	CustomDataMask mask;
+} CDMaskLink;
+
  /* Calculates and returns a linked list of CustomDataMasks indicating the
   * data required by each modifier in the stack pointed to by md for correct
   * evaluation, assuming the data indicated by dataMask is required at the
   * end of the stack.
   */
-struct LinkNode *modifiers_calcDataMasks(struct Scene *scene,
-										 struct Object *ob,
-										 struct ModifierData *md,
-										 CustomDataMask dataMask,
-										 int required_mode);
+struct CDMaskLink *modifiers_calcDataMasks(struct Scene *scene,
+										   struct Object *ob,
+										   struct ModifierData *md,
+										   CustomDataMask dataMask,
+										   int required_mode);
  struct ModifierData *modifiers_getLastPreview(struct Scene *scene,
                                                struct ModifierData *md,
                                                int required_mode);
Index: source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- source/blender/blenkernel/intern/DerivedMesh.c	(revision 45140)
+++ source/blender/blenkernel/intern/DerivedMesh.c	(working copy)
@@ -1351,7 +1351,7 @@ static void mesh_calc_modifiers(Scene *scene, Object  
*ob, float (*inputVertexCos
  {
  	Mesh *me = ob->data;
  	ModifierData *firstmd, *md, *previewmd = NULL;
-	LinkNode *datamasks, *curr;
+	CDMaskLink *datamasks, *curr;
  	/* XXX Always copying POLYINDEX, else tessellated data are no more valid!  
*/
  	CustomDataMask mask, nextmask, append_mask = CD_MASK_POLYINDEX;
  	float (*deformedVerts)[3] = NULL;
@@ -1547,7 +1547,7 @@ static void mesh_calc_modifiers(Scene *scene, Object  
*ob, float (*inputVertexCos

  			/* determine which data layers are needed by following modifiers */
  			if (curr->next)
-				nextmask= (CustomDataMask)GET_INT_FROM_POINTER(curr->next->link);
+				nextmask= curr->next->mask;
  			else
  				nextmask= dataMask;

@@ -1597,7 +1597,7 @@ static void mesh_calc_modifiers(Scene *scene, Object  
*ob, float (*inputVertexCos

  			
  			/* set the DerivedMesh to only copy needed data */
-			mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
+			mask= curr->mask;
  			/* needMapping check here fixes bug [#28112], otherwise its
  			 * possible that it wont be copied */
  			mask |= append_mask;
@@ -1608,7 +1608,7 @@ static void mesh_calc_modifiers(Scene *scene, Object  
*ob, float (*inputVertexCos
  				add_orco_dm(ob, NULL, dm, clothorcodm, CD_CLOTH_ORCO);

  			/* add an origspace layer if needed */
-			if (((CustomDataMask)GET_INT_FROM_POINTER(curr->link)) &  
CD_MASK_ORIGSPACE_MLOOP) {
+			if ((curr->mask) & CD_MASK_ORIGSPACE_MLOOP) {
  				if (!CustomData_has_layer(&dm->loopData, CD_ORIGSPACE_MLOOP)) {
  					DM_add_loop_layer(dm, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL);
  					DM_init_origspace(dm);
@@ -1823,7 +1823,7 @@ static void mesh_calc_modifiers(Scene *scene, Object  
*ob, float (*inputVertexCos
  	if (deformedVerts && deformedVerts != inputVertexCos)
  		MEM_freeN(deformedVerts);

-	BLI_linklist_free(datamasks, NULL);
+	BLI_linklist_free((LinkNode*)datamasks, NULL);
  }

  float (*editbmesh_get_vertex_cos(BMEditMesh *em, int *numVerts_r))[3]
@@ -1866,7 +1866,7 @@ static void editbmesh_calc_modifiers(Scene *scene,  
Object *ob, BMEditMesh *em, D
  	CustomDataMask mask;
  	DerivedMesh *dm, *orcodm = NULL;
  	int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL,  
1);
-	LinkNode *datamasks, *curr;
+	CDMaskLink *datamasks, *curr;
  	int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;

  	modifiers_clearErrors(ob);
@@ -1953,7 +1953,7 @@ static void editbmesh_calc_modifiers(Scene *scene,  
Object *ob, BMEditMesh *em, D
  			}

  			/* create an orco derivedmesh in parallel */
-			mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
+			mask= curr->mask;
  			if (mask & CD_MASK_ORCO) {
  				if (!orcodm)
  					orcodm= create_orco_dm(ob, ob->data, em, CD_ORCO);
@@ -1974,7 +1974,7 @@ static void editbmesh_calc_modifiers(Scene *scene,  
Object *ob, BMEditMesh *em, D
  			}

  			/* set the DerivedMesh to only copy needed data */
-			mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link); /* CD_MASK_ORCO  
may have been cleared above */
+			mask= curr->mask; /* CD_MASK_ORCO may have been cleared above */

  			DM_set_only_copy(dm, mask | CD_MASK_ORIGINDEX);

@@ -2019,7 +2019,7 @@ static void editbmesh_calc_modifiers(Scene *scene,  
Object *ob, BMEditMesh *em, D
  		}
  	}

-	BLI_linklist_free(datamasks, NULL);
+	BLI_linklist_free((LinkNode*)datamasks, NULL);

  	/* Yay, we are done. If we have a DerivedMesh and deformed vertices need
  	 * to apply these back onto the DerivedMesh. If we have no DerivedMesh
Index: source/blender/blenkernel/intern/modifier.c
===================================================================
--- source/blender/blenkernel/intern/modifier.c	(revision 45140)
+++ source/blender/blenkernel/intern/modifier.c	(working copy)
@@ -355,21 +355,24 @@ int modifier_isEnabled(struct Scene *scene,  
ModifierData *md, int required_mode)
  	return 1;
  }

-LinkNode *modifiers_calcDataMasks(struct Scene *scene, Object *ob,  
ModifierData *md, CustomDataMask dataMask, int required_mode)
+CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, Object *ob,  
ModifierData *md, CustomDataMask dataMask, int required_mode)
  {
-	LinkNode *dataMasks = NULL;
-	LinkNode *curr, *prev;
+	CDMaskLink *dataMasks = NULL;
+	CDMaskLink *curr, *prev;

  	/* build a list of modifier data requirements in reverse order */
  	for (; md; md = md->next) {
  		ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-		CustomDataMask mask = 0;

+		curr = MEM_callocN(sizeof(CDMaskLink), "CDMaskLink");
+		
  		if (modifier_isEnabled(scene, md, required_mode))
  			if (mti->requiredDataMask)
-				mask = mti->requiredDataMask(ob, md);
+				curr->mask = mti->requiredDataMask(ob, md);

-		BLI_linklist_prepend(&dataMasks, SET_INT_IN_POINTER(mask));
+		/* prepend new datamask */
+		curr->next = dataMasks;
+		dataMasks = curr;
  	}

  	/* build the list of required data masks - each mask in the list must
@@ -380,20 +383,20 @@ LinkNode *modifiers_calcDataMasks(struct Scene  
*scene, Object *ob, ModifierData
  	 */
  	for (curr = dataMasks, prev = NULL; curr; prev = curr, curr = curr->next)  
{
  		if (prev) {
-			CustomDataMask prev_mask =  
(CustomDataMask)GET_INT_FROM_POINTER(prev->link);
-			CustomDataMask curr_mask =  
(CustomDataMask)GET_INT_FROM_POINTER(curr->link);
+			CustomDataMask prev_mask = prev->mask;
+			CustomDataMask curr_mask = curr->mask;

-			curr->link = SET_INT_IN_POINTER(curr_mask | prev_mask);
+			curr->mask = curr_mask | prev_mask;
  		}
  		else {
-			CustomDataMask curr_mask =  
(CustomDataMask)GET_INT_FROM_POINTER(curr->link);
+			CustomDataMask curr_mask = curr->mask;

-			curr->link = SET_INT_IN_POINTER(curr_mask | dataMask);
+			curr->mask = curr_mask | dataMask;
  		}
  	}

  	/* reverse the list so it's in the correct order */
-	BLI_linklist_reverse(&dataMasks);
+	BLI_linklist_reverse((LinkNode**)&dataMasks);

  	return dataMasks;
  }




More information about the Bf-codereview mailing list