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/BKE_modifier.h | 13 ++- source/blender/blenkernel/intern/DerivedMesh.c | 7 +- source/blender/blenkernel/intern/displist.c | 13 ++- source/blender/blenkernel/intern/lattice.c | 3 +- source/blender/blenkernel/intern/modifier.c | 128 ++++++++++----------- source/blender/blenkernel/intern/object.c | 9 +- source/blender/blenkernel/intern/object_deform.c | 3 +- .../editors/interface/interface_templates.c | 4 +- source/blender/editors/sculpt_paint/sculpt.c | 9 +- source/blender/editors/util/crazyspace.c | 9 +- source/creator/creator.c | 2 + source/gameengine/GamePlayer/ghost/GPG_ghost.cpp | 2 + 12 files changed, 118 insertions(+), 84 deletions(-) diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index 0727e11f397..8f0d612d473 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -304,6 +304,9 @@ typedef struct ModifierTypeInfo { TexWalkFunc walk, void *userData); } ModifierTypeInfo; +/* Initialize modifier's global data (type info and some common global storages). */ +void BKE_modifier_init(void); + ModifierTypeInfo *modifierType_getInfo(ModifierType type); /* Modifier utility calls, do call through type pointer and return @@ -377,7 +380,15 @@ struct CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, struct ModifierData *modifiers_getLastPreview(struct Scene *scene, struct ModifierData *md, int required_mode); -struct ModifierData *modifiers_getVirtualModifierList(struct Object *ob); + +typedef struct VirtualModifierData { + ArmatureModifierData amd; + CurveModifierData cmd; + LatticeModifierData lmd; + ShapeKeyModifierData smd; +} VirtualModifierData; + +struct ModifierData *modifiers_getVirtualModifierList(struct Object *ob, struct VirtualModifierData *data); /* ensure modifier correctness when changing ob->data */ void test_object_modifiers(struct Object *ob); diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 2ece90183bd..7e069c20c24 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -1440,6 +1440,8 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos /* XXX Same as above... For now, only weights preview in WPaint mode. */ const int do_mod_wmcol = do_init_wmcol; + VirtualModifierData virtualModifierData; + ModifierApplyFlag app_flags = useRenderParams ? MOD_APPLY_RENDER : 0; ModifierApplyFlag deform_app_flags = app_flags; if (useCache) @@ -1451,7 +1453,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos has_multires = 0; if (!skipVirtualArmature) { - firstmd = modifiers_getVirtualModifierList(ob); + firstmd = modifiers_getVirtualModifierList(ob, &virtualModifierData); } else { /* game engine exception */ @@ -1961,6 +1963,7 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D int do_init_wmcol = ((((Mesh *)ob->data)->drawflag & ME_DRAWEIGHT) && !do_final_wmcol); int do_init_statvis = ((((Mesh *)ob->data)->drawflag & ME_DRAW_STATVIS) && !do_init_wmcol); const int do_mod_wmcol = do_init_wmcol; + VirtualModifierData virtualModifierData; modifiers_clearErrors(ob); @@ -1969,7 +1972,7 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D } dm = NULL; - md = modifiers_getVirtualModifierList(ob); + md = modifiers_getVirtualModifierList(ob, &virtualModifierData); /* copied from mesh_calc_modifiers */ if (do_mod_wmcol) { diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 38a0b848339..f728d06d88d 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -742,7 +742,8 @@ void BKE_displist_make_mball_forRender(Scene *scene, Object *ob, ListBase *dispb static ModifierData *curve_get_tessellate_point(Scene *scene, Object *ob, int renderResolution, int editmode) { - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); ModifierData *pretessellatePoint; int required_mode; @@ -784,7 +785,8 @@ static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, in float (**originalVerts_r)[3], float (**deformedVerts_r)[3], int *numVerts_r) { - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); ModifierData *pretessellatePoint; Curve *cu = ob->data; ListBase *nurb = BKE_curve_nurbs_get(cu); @@ -898,7 +900,8 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba int forRender, int renderResolution, float (*originalVerts)[3], float (*deformedVerts)[3]) { - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); ModifierData *pretessellatePoint; Curve *cu = ob->data; ListBase *nurb = BKE_curve_nurbs_get(cu); @@ -1142,8 +1145,8 @@ static void curve_calc_orcodm(Scene *scene, Object *ob, DerivedMesh *derivedFina /* this function represents logic of mesh's orcodm calculation * for displist-based objects */ - - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); ModifierData *pretessellatePoint; Curve *cu = ob->data; int required_mode; diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index a4892253c63..069c3ab8ea2 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -991,7 +991,8 @@ void BKE_lattice_vertexcos_apply(struct Object *ob, float (*vertexCos)[3]) void BKE_lattice_modifiers_calc(Scene *scene, Object *ob) { Lattice *lt = ob->data; - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); float (*vertexCos)[3] = NULL; int numVerts, editmode = (lt->editlatt != NULL); 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) { diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 962209bef87..d1d755bd697 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -3158,8 +3158,9 @@ int BKE_object_is_modified(Scene *scene, Object *ob) } else { ModifierData *md; + VirtualModifierData virtualModifierData; /* cloth */ - for (md = modifiers_getVirtualModifierList(ob); + for (md = modifiers_getVirtualModifierList(ob, &virtualModifierData); md && (flag != (eModifierMode_Render | eModifierMode_Realtime)); md = md->next) { @@ -3180,10 +3181,11 @@ int BKE_object_is_modified(Scene *scene, Object *ob) int BKE_object_is_deform_modified(Scene *scene, Object *ob) { ModifierData *md; + VirtualModifierData virtualModifierData; int flag = 0; /* cloth */ - for (md = modifiers_getVirtualModifierList(ob); + for (md = modifiers_getVirtualModifierList(ob, &virtualModifierData); md && (flag != (eModifierMode_Render | eModifierMode_Realtime)); md = md->next) { @@ -3205,8 +3207,9 @@ int BKE_object_is_deform_modified(Scene *scene, Object *ob) bool BKE_object_is_animated(Scene *scene, Object *ob) { ModifierData *md; + VirtualModifierData virtualModifierData; - for (md = modifiers_getVirtualModifierList(ob); md; md = md->next) + for (md = modifiers_getVirtualModifierList(ob, &virtualModifierData); md; md = md->next) if (modifier_dependsOnTime(md) && (modifier_isEnabled(scene, md, eModifierMode_Realtime) || modifier_isEnabled(scene, md, eModifierMode_Render))) diff --git a/source/blender/blenkernel/intern/object_deform.c b/source/blender/blenkernel/intern/object_deform.c index ca38aa42928..9cb7c91decd 100644 --- a/source/blender/blenkernel/intern/object_deform.c +++ b/source/blender/blenkernel/intern/object_deform.c @@ -73,6 +73,7 @@ bool *BKE_objdef_validmap_get(Object *ob, const int defbase_tot) GHash *gh; int i, step1 = 1; //int defbase_tot = BLI_countlist(&ob->defbase); + VirtualModifierData virtualModifierData; if (ob->defbase.first == NULL) { return NULL; @@ -88,7 +89,7 @@ bool *BKE_objdef_validmap_get(Object *ob, const int defbase_tot) BLI_assert(BLI_ghash_size(gh) == defbase_tot); /* now loop through the armature modifiers and identify deform bones */ - for (md = ob->modifiers.first; md; md = !md->next && step1 ? (step1 = 0), modifiers_getVirtualModifierList(ob) : md->next) { + for (md = ob->modifiers.first; md; md = !md->next && step1 ? (step1 = 0), modifiers_getVirtualModifierList(ob, &virtualModifierData) : md->next) { if (!(md->mode & (eModifierMode_Realtime | eModifierMode_Virtual))) continue; diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 61cc021800e..3e82e8da40e 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -1,4 +1,5 @@ /* + * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -1017,6 +1018,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr) Scene *scene = CTX_data_scene(C); Object *ob; ModifierData *md, *vmd; + VirtualModifierData virtualModifierData; int i, lastCageIndex, cageIndex; /* verify we have valid data */ @@ -1039,7 +1041,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr) cageIndex = modifiers_getCageIndex(scene, ob, &lastCageIndex, 0); /* XXX virtual modifiers are not accesible for python */ - vmd = modifiers_getVirtualModifierList(ob); + vmd = modifiers_getVirtualModifierList(ob, &virtualModifierData); for (i = 0; vmd; i++, vmd = vmd->next) { if (md == vmd) diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 8ab71ff5ddc..b16d5f6b4cd 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -150,6 +150,7 @@ MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob) { Mesh *me = (Mesh *)ob->data; ModifierData *md; + VirtualModifierData virtualModifierData; if (ob->sculpt && ob->sculpt->bm) { /* can't combine multires and dynamic topology */ @@ -161,7 +162,7 @@ MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob) return NULL; } - for (md = modifiers_getVirtualModifierList(ob); md; md = md->next) { + for (md = modifiers_getVirtualModifierList(ob, &virtualModifierData); md; md = md->next) { if (md->type == eModifierType_Multires) { MultiresModifierData *mmd = (MultiresModifierData *)md; @@ -180,8 +181,9 @@ MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob) static int sculpt_has_active_modifiers(Scene *scene, Object *ob) { ModifierData *md; + VirtualModifierData virtualModifierData; - md = modifiers_getVirtualModifierList(ob); + md = modifiers_getVirtualModifierList(ob, &virtualModifierData); /* exception for shape keys because we can edit those */ for (; md; md = md->next) { @@ -198,6 +200,7 @@ static int sculpt_modifiers_active(Scene *scene, Sculpt *sd, Object *ob) ModifierData *md; Mesh *me = (Mesh *)ob->data; MultiresModifierData *mmd = sculpt_multires_active(scene, ob); + VirtualModifierData virtualModifierData; if (mmd || ob->sculpt->bm) return 0; @@ -206,7 +209,7 @@ static int sculpt_modifiers_active(Scene *scene, Sculpt *sd, Object *ob) if ((ob->shapeflag & OB_SHAPE_LOCK) == 0 && me->key && ob->shapenr) return 1; - md = modifiers_getVirtualModifierList(ob); + md = modifiers_getVirtualModifierList(ob, &virtualModifierData); /* exception for shape keys because we can edit those */ for (; md; md = md->next) { diff --git a/source/blender/editors/util/crazyspace.c b/source/blender/editors/util/crazyspace.c index bed8aaaddf2..721a7a3b855 100644 --- a/source/blender/editors/util/crazyspace.c +++ b/source/blender/editors/util/crazyspace.c @@ -260,11 +260,12 @@ int editbmesh_get_first_deform_matrices(Scene *scene, Object *ob, BMEditMesh *em int i, a, numleft = 0, numVerts = 0; int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1); float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL; + VirtualModifierData virtualModifierData; modifiers_clearErrors(ob); dm = NULL; - md = modifiers_getVirtualModifierList(ob); + md = modifiers_getVirtualModifierList(ob, &virtualModifierData); /* compute the deformation matrices and coordinates for the first * modifiers with on cage editing that are enabled and support computing @@ -314,6 +315,7 @@ int sculpt_get_first_deform_matrices(Scene *scene, Object *ob, float (**deformma MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0); int has_multires = mmd != NULL && mmd->sculptlvl > 0; int numleft = 0; + VirtualModifierData virtualModifierData; if (has_multires) { *deformmats = NULL; @@ -322,7 +324,7 @@ int sculpt_get_first_deform_matrices(Scene *scene, Object *ob, float (**deformma } dm = NULL; - md = modifiers_getVirtualModifierList(ob); + md = modifiers_getVirtualModifierList(ob, &virtualModifierData); for (; md; md = md->next) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); @@ -375,7 +377,8 @@ void crazyspace_build_sculpt(Scene *scene, Object *ob, float (**deformmats)[3][3 float (*origVerts)[3] = MEM_dupallocN(deformedVerts); float *quats = NULL; int i, deformed = 0; - ModifierData *md = modifiers_getVirtualModifierList(ob); + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); Mesh *me = (Mesh *)ob->data; for (; md; md = md->next) { diff --git a/source/creator/creator.c b/source/creator/creator.c index a710c07f34b..27fd9427da7 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -92,6 +92,7 @@ #include "BKE_library.h" #include "BKE_main.h" #include "BKE_material.h" +#include "BKE_modifier.h" #include "BKE_packedFile.h" #include "BKE_scene.h" #include "BKE_node.h" @@ -1517,6 +1518,7 @@ int main(int argc, const char **argv) IMB_init(); BKE_images_init(); + BKE_modifier_init(); BKE_brush_system_init(); diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp index ccbcdd25639..aa7d41cc410 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp @@ -64,6 +64,7 @@ extern "C" #include "BKE_node.h" #include "BKE_report.h" #include "BKE_library.h" +#include "BKE_modifier.h" #include "BLI_threads.h" #include "BLI_blenlib.h" #include "DNA_scene_types.h" @@ -456,6 +457,7 @@ int main(int argc, char** argv) IMB_init(); BKE_images_init(); + BKE_modifier_init(); #ifdef WITH_FFMPEG IMB_ffmpeg_init(); -- cgit v1.2.3