diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2012-03-26 20:25:21 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2012-03-26 20:25:21 +0400 |
commit | 47cd3d4b8e5d8a0b7c30475a2b7944c70423eba2 (patch) | |
tree | 73666f60c341e3449a4a451146df64a8d72c0dee /source | |
parent | 03336c0ba782a1608c635226c545b57ebbcb67e3 (diff) |
Fix for truncation of 64-bit CustomDataMasks.
Can't use GET_INT_FROM_POINTER anymore with CD masks, as this
truncates to 32-bit.
Bug: http://projects.blender.org/tracker/index.php?func=detail&aid=30680&group_id=9&atid=498
CR: http://codereview.appspot.com/5905059/
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_modifier.h | 15 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 18 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 27 |
3 files changed, 34 insertions, 26 deletions
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index b73982ca852..b4320b7025a 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -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); diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 074ea741f3a..a03bcb1fde9 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -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 diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index f5a303033a3..6c855b8f242 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -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; } |