From beffaa293ee2b111f256b989bd038460bde1eea0 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 19 Aug 2013 09:05:34 +0000 Subject: Made modifiers_getVirtualModifierList safe for threading Move static variables to context filling in by this fcuntion and owned by a callee function. This ensures no conflicts between threads happens because of static variables used in this function. Also moved modifier types and virtual modifiers data to a function called from creator. This is needed to be sure all the information is properly initialied to the time when threads starts to use this data. -- svn merge -r57899:57900 ^/branches/soc-2013-depsgraph_mt --- source/blender/blenkernel/intern/modifier.c | 128 ++++++++++++++-------------- 1 file changed, 64 insertions(+), 64 deletions(-) (limited to 'source/blender/blenkernel/intern/modifier.c') diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 41e0acf9f7a..780bd9733f5 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -69,19 +69,44 @@ #include "MOD_modifiertypes.h" -ModifierTypeInfo *modifierType_getInfo(ModifierType type) +static ModifierTypeInfo *modifier_types[NUM_MODIFIER_TYPES] = {NULL}; +static VirtualModifierData virtualModifierCommonData; + +void BKE_modifier_init(void) { - static ModifierTypeInfo *types[NUM_MODIFIER_TYPES] = {NULL}; - static int types_init = 1; + ModifierData *md; - if (types_init) { - modifier_type_init(types); /* MOD_utils.c */ - types_init = 0; - } + /* Initialize modifier types */ + modifier_type_init(modifier_types); /* MOD_utils.c */ + + /* Initialize global cmmon storage used for virtual modifier list */ + md = modifier_new(eModifierType_Armature); + virtualModifierCommonData.amd = *((ArmatureModifierData *) md); + modifier_free(md); + + md = modifier_new(eModifierType_Curve); + virtualModifierCommonData.cmd = *((CurveModifierData *) md); + modifier_free(md); + md = modifier_new(eModifierType_Lattice); + virtualModifierCommonData.lmd = *((LatticeModifierData *) md); + modifier_free(md); + + md = modifier_new(eModifierType_ShapeKey); + virtualModifierCommonData.smd = *((ShapeKeyModifierData *) md); + modifier_free(md); + + virtualModifierCommonData.amd.modifier.mode |= eModifierMode_Virtual; + virtualModifierCommonData.cmd.modifier.mode |= eModifierMode_Virtual; + virtualModifierCommonData.lmd.modifier.mode |= eModifierMode_Virtual; + virtualModifierCommonData.smd.modifier.mode |= eModifierMode_Virtual; +} + +ModifierTypeInfo *modifierType_getInfo(ModifierType type) +{ /* type unsigned, no need to check < 0 */ - if (type < NUM_MODIFIER_TYPES && types[type]->name[0] != '\0') { - return types[type]; + if (type < NUM_MODIFIER_TYPES && modifier_types[type]->name[0] != '\0') { + return modifier_types[type]; } else { return NULL; @@ -289,7 +314,8 @@ void modifier_setError(ModifierData *md, const char *_format, ...) */ int modifiers_getCageIndex(struct Scene *scene, Object *ob, int *lastPossibleCageIndex_r, int virtual_) { - ModifierData *md = (virtual_) ? modifiers_getVirtualModifierList(ob) : ob->modifiers.first; + VirtualModifierData virtualModifierData; + ModifierData *md = (virtual_) ? modifiers_getVirtualModifierList(ob, &virtualModifierData) : ob->modifiers.first; int i, cageIndex = -1; if (lastPossibleCageIndex_r) { @@ -435,74 +461,43 @@ ModifierData *modifiers_getLastPreview(struct Scene *scene, ModifierData *md, in /* NOTE: This is to support old files from before Blender supported modifiers, * in some cases versioning code updates these so for new files this will * return an empty list. */ -ModifierData *modifiers_getVirtualModifierList(Object *ob) +ModifierData *modifiers_getVirtualModifierList(Object *ob, VirtualModifierData *virtualModifierData) { - /* Kinda hacky, but should be fine since we are never - * re-entrant and avoid free hassles. - */ - static ArmatureModifierData amd; - static CurveModifierData cmd; - static LatticeModifierData lmd; - static ShapeKeyModifierData smd; - static int init = 1; ModifierData *md; - if (init) { - md = modifier_new(eModifierType_Armature); - amd = *((ArmatureModifierData *) md); - modifier_free(md); - - md = modifier_new(eModifierType_Curve); - cmd = *((CurveModifierData *) md); - modifier_free(md); - - md = modifier_new(eModifierType_Lattice); - lmd = *((LatticeModifierData *) md); - modifier_free(md); - - md = modifier_new(eModifierType_ShapeKey); - smd = *((ShapeKeyModifierData *) md); - modifier_free(md); - - amd.modifier.mode |= eModifierMode_Virtual; - cmd.modifier.mode |= eModifierMode_Virtual; - lmd.modifier.mode |= eModifierMode_Virtual; - smd.modifier.mode |= eModifierMode_Virtual; - - init = 0; - } - md = ob->modifiers.first; + *virtualModifierData = virtualModifierCommonData; + if (ob->parent) { if (ob->parent->type == OB_ARMATURE && ob->partype == PARSKEL) { - amd.object = ob->parent; - amd.modifier.next = md; - amd.deformflag = ((bArmature *)(ob->parent->data))->deformflag; - md = &amd.modifier; + virtualModifierData->amd.object = ob->parent; + virtualModifierData->amd.modifier.next = md; + virtualModifierData->amd.deformflag = ((bArmature *)(ob->parent->data))->deformflag; + md = &virtualModifierData->amd.modifier; } else if (ob->parent->type == OB_CURVE && ob->partype == PARSKEL) { - cmd.object = ob->parent; - cmd.defaxis = ob->trackflag + 1; - cmd.modifier.next = md; - md = &cmd.modifier; + virtualModifierData->cmd.object = ob->parent; + virtualModifierData->cmd.defaxis = ob->trackflag + 1; + virtualModifierData->cmd.modifier.next = md; + md = &virtualModifierData->cmd.modifier; } else if (ob->parent->type == OB_LATTICE && ob->partype == PARSKEL) { - lmd.object = ob->parent; - lmd.modifier.next = md; - md = &lmd.modifier; + virtualModifierData->lmd.object = ob->parent; + virtualModifierData->lmd.modifier.next = md; + md = &virtualModifierData->lmd.modifier; } } /* shape key modifier, not yet for curves */ if (ELEM(ob->type, OB_MESH, OB_LATTICE) && BKE_key_from_object(ob)) { if (ob->type == OB_MESH && (ob->shapeflag & OB_SHAPE_EDIT_MODE)) - smd.modifier.mode |= eModifierMode_Editmode | eModifierMode_OnCage; + virtualModifierData->smd.modifier.mode |= eModifierMode_Editmode | eModifierMode_OnCage; else - smd.modifier.mode &= ~eModifierMode_Editmode | eModifierMode_OnCage; + virtualModifierData->smd.modifier.mode &= ~eModifierMode_Editmode | eModifierMode_OnCage; - smd.modifier.next = md; - md = &smd.modifier; + virtualModifierData->smd.modifier.next = md; + md = &virtualModifierData->smd.modifier; } return md; @@ -513,7 +508,8 @@ ModifierData *modifiers_getVirtualModifierList(Object *ob) */ Object *modifiers_isDeformedByArmature(Object *ob) { - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); ArmatureModifierData *amd = NULL; /* return the first selected armature, this lets us use multiple armatures */ @@ -536,7 +532,8 @@ Object *modifiers_isDeformedByArmature(Object *ob) */ Object *modifiers_isDeformedByLattice(Object *ob) { - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); LatticeModifierData *lmd = NULL; /* return the first selected lattice, this lets us use multiple lattices */ @@ -559,7 +556,8 @@ Object *modifiers_isDeformedByLattice(Object *ob) */ Object *modifiers_isDeformedByCurve(Object *ob) { - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); CurveModifierData *cmd = NULL; /* return the first selected curve, this lets us use multiple curves */ @@ -579,7 +577,8 @@ Object *modifiers_isDeformedByCurve(Object *ob) bool modifiers_usesArmature(Object *ob, bArmature *arm) { - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); for (; md; md = md->next) { if (md->type == eModifierType_Armature) { @@ -604,7 +603,8 @@ bool modifier_isCorrectableDeformed(ModifierData *md) bool modifiers_isCorrectableDeformed(Object *ob) { - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); for (; md; md = md->next) { if (ob->mode == OB_MODE_EDIT && (md->mode & eModifierMode_Editmode) == 0) { -- cgit v1.2.3