[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45186] trunk/blender/source/blender/ blenkernel: Fix for truncation of 64-bit CustomDataMasks.
Nicholas Bishop
nicholasbishop at gmail.com
Mon Mar 26 18:25:29 CEST 2012
Revision: 45186
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45186
Author: nicholasbishop
Date: 2012-03-26 16:25:21 +0000 (Mon, 26 Mar 2012)
Log Message:
-----------
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/
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_modifier.h
trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
trunk/blender/source/blender/blenkernel/intern/modifier.c
Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_modifier.h 2012-03-26 16:04:10 UTC (rev 45185)
+++ trunk/blender/source/blender/blenkernel/BKE_modifier.h 2012-03-26 16:25:21 UTC (rev 45186)
@@ -357,16 +357,21 @@
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);
Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c 2012-03-26 16:04:10 UTC (rev 45185)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c 2012-03-26 16:25:21 UTC (rev 45186)
@@ -1351,7 +1351,7 @@
{
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 @@
/* 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 @@
/* 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 @@
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 @@
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 @@
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 @@
}
/* 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 @@
}
/* 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 @@
}
}
- 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
Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c 2012-03-26 16:04:10 UTC (rev 45185)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c 2012-03-26 16:25:21 UTC (rev 45186)
@@ -355,21 +355,24 @@
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 @@
*/
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-blender-cvs
mailing list