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/
This commit is contained in:
parent
03336c0ba7
commit
47cd3d4b8e
|
@ -357,16 +357,21 @@ int modifiers_isPreview(struct Object *ob);
|
||||||
|
|
||||||
int modifiers_indexInObject(struct Object *ob, struct ModifierData *md);
|
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
|
/* Calculates and returns a linked list of CustomDataMasks indicating the
|
||||||
* data required by each modifier in the stack pointed to by md for correct
|
* 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
|
* evaluation, assuming the data indicated by dataMask is required at the
|
||||||
* end of the stack.
|
* end of the stack.
|
||||||
*/
|
*/
|
||||||
struct LinkNode *modifiers_calcDataMasks(struct Scene *scene,
|
struct CDMaskLink *modifiers_calcDataMasks(struct Scene *scene,
|
||||||
struct Object *ob,
|
struct Object *ob,
|
||||||
struct ModifierData *md,
|
struct ModifierData *md,
|
||||||
CustomDataMask dataMask,
|
CustomDataMask dataMask,
|
||||||
int required_mode);
|
int required_mode);
|
||||||
struct ModifierData *modifiers_getLastPreview(struct Scene *scene,
|
struct ModifierData *modifiers_getLastPreview(struct Scene *scene,
|
||||||
struct ModifierData *md,
|
struct ModifierData *md,
|
||||||
int required_mode);
|
int required_mode);
|
||||||
|
|
|
@ -1351,7 +1351,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
||||||
{
|
{
|
||||||
Mesh *me = ob->data;
|
Mesh *me = ob->data;
|
||||||
ModifierData *firstmd, *md, *previewmd = NULL;
|
ModifierData *firstmd, *md, *previewmd = NULL;
|
||||||
LinkNode *datamasks, *curr;
|
CDMaskLink *datamasks, *curr;
|
||||||
/* XXX Always copying POLYINDEX, else tessellated data are no more valid! */
|
/* XXX Always copying POLYINDEX, else tessellated data are no more valid! */
|
||||||
CustomDataMask mask, nextmask, append_mask = CD_MASK_POLYINDEX;
|
CustomDataMask mask, nextmask, append_mask = CD_MASK_POLYINDEX;
|
||||||
float (*deformedVerts)[3] = NULL;
|
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 */
|
/* determine which data layers are needed by following modifiers */
|
||||||
if (curr->next)
|
if (curr->next)
|
||||||
nextmask= (CustomDataMask)GET_INT_FROM_POINTER(curr->next->link);
|
nextmask= curr->next->mask;
|
||||||
else
|
else
|
||||||
nextmask= dataMask;
|
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 */
|
/* 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
|
/* needMapping check here fixes bug [#28112], otherwise its
|
||||||
* possible that it wont be copied */
|
* possible that it wont be copied */
|
||||||
mask |= append_mask;
|
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_orco_dm(ob, NULL, dm, clothorcodm, CD_CLOTH_ORCO);
|
||||||
|
|
||||||
/* add an origspace layer if needed */
|
/* 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)) {
|
if (!CustomData_has_layer(&dm->loopData, CD_ORIGSPACE_MLOOP)) {
|
||||||
DM_add_loop_layer(dm, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL);
|
DM_add_loop_layer(dm, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL);
|
||||||
DM_init_origspace(dm);
|
DM_init_origspace(dm);
|
||||||
|
@ -1823,7 +1823,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
||||||
if (deformedVerts && deformedVerts != inputVertexCos)
|
if (deformedVerts && deformedVerts != inputVertexCos)
|
||||||
MEM_freeN(deformedVerts);
|
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]
|
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;
|
CustomDataMask mask;
|
||||||
DerivedMesh *dm, *orcodm = NULL;
|
DerivedMesh *dm, *orcodm = NULL;
|
||||||
int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
|
int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
|
||||||
LinkNode *datamasks, *curr;
|
CDMaskLink *datamasks, *curr;
|
||||||
int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
|
int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
|
||||||
|
|
||||||
modifiers_clearErrors(ob);
|
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 */
|
/* create an orco derivedmesh in parallel */
|
||||||
mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
|
mask= curr->mask;
|
||||||
if (mask & CD_MASK_ORCO) {
|
if (mask & CD_MASK_ORCO) {
|
||||||
if (!orcodm)
|
if (!orcodm)
|
||||||
orcodm= create_orco_dm(ob, ob->data, em, CD_ORCO);
|
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 */
|
/* 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);
|
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
|
/* 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
|
* to apply these back onto the DerivedMesh. If we have no DerivedMesh
|
||||||
|
|
|
@ -355,21 +355,24 @@ int modifier_isEnabled(struct Scene *scene, ModifierData *md, int required_mode)
|
||||||
return 1;
|
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;
|
CDMaskLink *dataMasks = NULL;
|
||||||
LinkNode *curr, *prev;
|
CDMaskLink *curr, *prev;
|
||||||
|
|
||||||
/* build a list of modifier data requirements in reverse order */
|
/* build a list of modifier data requirements in reverse order */
|
||||||
for (; md; md = md->next) {
|
for (; md; md = md->next) {
|
||||||
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||||
CustomDataMask mask = 0;
|
|
||||||
|
|
||||||
|
curr = MEM_callocN(sizeof(CDMaskLink), "CDMaskLink");
|
||||||
|
|
||||||
if (modifier_isEnabled(scene, md, required_mode))
|
if (modifier_isEnabled(scene, md, required_mode))
|
||||||
if (mti->requiredDataMask)
|
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
|
/* 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) {
|
for (curr = dataMasks, prev = NULL; curr; prev = curr, curr = curr->next) {
|
||||||
if (prev) {
|
if (prev) {
|
||||||
CustomDataMask prev_mask = (CustomDataMask)GET_INT_FROM_POINTER(prev->link);
|
CustomDataMask prev_mask = prev->mask;
|
||||||
CustomDataMask curr_mask = (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
|
CustomDataMask curr_mask = curr->mask;
|
||||||
|
|
||||||
curr->link = SET_INT_IN_POINTER(curr_mask | prev_mask);
|
curr->mask = curr_mask | prev_mask;
|
||||||
}
|
}
|
||||||
else {
|
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 */
|
/* reverse the list so it's in the correct order */
|
||||||
BLI_linklist_reverse(&dataMasks);
|
BLI_linklist_reverse((LinkNode**)&dataMasks);
|
||||||
|
|
||||||
return dataMasks;
|
return dataMasks;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue