Made modifiers_getVirtualModifierList safe for threading
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 1 Jul 2013 11:00:22 +0000 (11:00 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 1 Jul 2013 11:00:22 +0000 (11:00 +0000)
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.

12 files changed:
source/blender/blenkernel/BKE_modifier.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/displist.c
source/blender/blenkernel/intern/lattice.c
source/blender/blenkernel/intern/modifier.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/object_deform.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/sculpt_paint/sculpt.c
source/blender/editors/util/crazyspace.c
source/creator/creator.c
source/gameengine/GamePlayer/ghost/GPG_ghost.cpp

index 3f3a5739d556b8816d03116f89ff5bf2dc03d503..00ee08508742d70cbee1ad66b7f32c8e8a33cbaa 100644 (file)
@@ -307,6 +307,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
@@ -380,7 +383,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);
index b2ba1755303b4d216e2b867934fa5f4b86aba2cd..a6e28b3df02e5ae2bc5ba00fe6c057013ca9924d 100644 (file)
@@ -1443,6 +1443,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)
@@ -1454,7 +1456,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 */
@@ -1964,6 +1966,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);
 
@@ -1972,7 +1975,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) {
index edfcefe14c7f90f26a2a6adf241cccef62932626..57be3202e1f74fad743c86e4a206cbfddb4daa53 100644 (file)
@@ -736,7 +736,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;
 
@@ -778,7 +779,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);
@@ -892,7 +894,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);
@@ -1136,8 +1139,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;
index c9b904e76ac3bb47e7704bc64020e61826d71512..b07923ff8ef33422371ddfffe49f677f84a23839 100644 (file)
@@ -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);
 
index a0fa33172971e07e94a4e0ec14a52da926f3da1f..802f467d1687f1eef98ba70305e0b6d29a85e0fb 100644 (file)
 
 #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) {
index bb160cff86a281ab1e8ce839a6a85f52ecc5743b..cde24f24227a9bb136d3d6a5e2d769cd34c0da97 100644 (file)
@@ -3117,8 +3117,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)
                {
@@ -3139,10 +3140,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)
        {
@@ -3164,8 +3166,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)))
index bfec38419f18657f9c2e7f2678276df1cad9c76d..0294ff5645712f6d6c017a4f86e92819092a0d44 100644 (file)
@@ -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;
 
index 57392c60f809f2e20f9474532bf387e0ec61f9e3..699da98225a2435c187bd6e5b85bb15f47236a45 100644 (file)
@@ -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)
index 8e2a29964ee4f6e7b4459680db7693ace8ac23a4..79fab72b770dd491fcca12526fb9c90daa5a089b 100644 (file)
@@ -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) {
index ea3687ad7157e5ae878074534440f23a68abbb63..1f9ef5f5bc5588a94d39c273e4e98260c652b3c5 100644 (file)
@@ -259,11 +259,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
@@ -313,6 +314,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;
@@ -321,7 +323,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);
@@ -374,7 +376,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) {
index 84d235308002026f0071e4ee78965d79a7587cbf..bbc9d818b566153e209d93333bd0212422cebc14 100644 (file)
@@ -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();
 
index 2c642d4bd0484ba849182de950e553412fbdddd1..69137bc7842ea1ac34aea88ee4635df2f87479e6 100644 (file)
@@ -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"
@@ -448,6 +449,7 @@ int main(int argc, char** argv)
 
        IMB_init();
        BKE_images_init();
+       BKE_modifier_init();
 
 #ifdef WITH_FFMPEG
        IMB_ffmpeg_init();