merged from trunk 20741:20848
[blender-staging.git] / source / blender / blenkernel / intern / modifier.c
index 2c4528f641ea32175bda00f6bb52e5873a6d4a11..3ef7b82864c588881dd52d45eb1be4c1dcac3fac 100644 (file)
@@ -20,8 +20,6 @@
 * The Original Code is Copyright (C) 2005 by the Blender Foundation.
 * All rights reserved.
 *
-* The Original Code is: all of this file.
-*
 * Contributor(s): Daniel Dunbar
 *                 Ton Roosendaal,
 *                 Ben Batt,
@@ -77,9 +75,8 @@
 
 #include "BKE_main.h"
 #include "BKE_anim.h"
-#include "BKE_bad_level_calls.h"
 #include "BKE_bmesh.h"
-#include "BKE_booleanops.h"
+// XXX #include "BKE_booleanops.h"
 #include "BKE_cloth.h"
 #include "BKE_collision.h"
 #include "BKE_cdderivedmesh.h"
@@ -89,6 +86,7 @@
 #include "BKE_displist.h"
 #include "BKE_fluidsim.h"
 #include "BKE_global.h"
+#include "BKE_multires.h"
 #include "BKE_lattice.h"
 #include "BKE_library.h"
 #include "BKE_material.h"
 #include "BKE_shrinkwrap.h"
 #include "BKE_simple_deform.h"
 
-#include "LOD_DependKludge.h"
+//XXX #include "LOD_DependKludge.h"
 #include "LOD_decimation.h"
 
+// XXX
+static struct DerivedMesh *NewBooleanDerivedMesh() {return NULL;}
+
 #include "CCGSubSurf.h"
 
 #include "RE_shader_ext.h"
 
+//XXX #include "BIF_meshlaplacian.h"
+
 /* Utility */
 
 static int is_last_displist(Object *ob)
@@ -139,7 +142,7 @@ static int is_last_displist(Object *ob)
        return 0;
 }
 
-static DerivedMesh *get_original_dm(Object *ob, float (*vertexCos)[3], int orco)
+static DerivedMesh *get_original_dm(Scene *scene, Object *ob, float (*vertexCos)[3], int orco)
 {
        DerivedMesh *dm= NULL;
 
@@ -167,7 +170,7 @@ static DerivedMesh *get_original_dm(Object *ob, float (*vertexCos)[3], int orco)
                        /* copies the data */
                        tmpobj->data = copy_curve((Curve *) ob->data);
 
-                       makeDispListCurveTypes(tmpobj, 1);
+                       makeDispListCurveTypes(scene, tmpobj, 1);
                        nurbs_to_mesh(tmpobj);
 
                        dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
@@ -235,7 +238,7 @@ static void curveModifier_foreachObjectLink(
 }
 
 static void curveModifier_updateDepgraph(
-                                        ModifierData *md, DagForest *forest,
+                                        ModifierData *md, DagForest *forest, Scene *scene,
       Object *ob, DagNode *obNode)
 {
        CurveModifierData *cmd = (CurveModifierData*) md;
@@ -250,11 +253,11 @@ static void curveModifier_updateDepgraph(
 
 static void curveModifier_deformVerts(
                                      ModifierData *md, Object *ob, DerivedMesh *derivedData,
-         float (*vertexCos)[3], int numVerts)
+         float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        CurveModifierData *cmd = (CurveModifierData*) md;
 
-       curve_deform_verts(cmd->object, ob, derivedData, vertexCos, numVerts,
+       curve_deform_verts(md->scene, cmd->object, ob, derivedData, vertexCos, numVerts,
                           cmd->name, cmd->defaxis);
 }
 
@@ -266,7 +269,7 @@ static void curveModifier_deformVertsEM(
 
        if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
 
-       curveModifier_deformVerts(md, ob, dm, vertexCos, numVerts);
+       curveModifier_deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
 
        if(!derivedData) dm->release(dm);
 }
@@ -310,7 +313,7 @@ static void latticeModifier_foreachObjectLink(
        walk(userData, ob, &lmd->object);
 }
 
-static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest,
+static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest,  Scene *scene,
                                           Object *ob, DagNode *obNode)
 {
        LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -339,7 +342,7 @@ static void modifier_vgroup_cache(ModifierData *md, float (*vertexCos)[3])
 
 static void latticeModifier_deformVerts(
                                        ModifierData *md, Object *ob, DerivedMesh *derivedData,
-     float (*vertexCos)[3], int numVerts)
+     float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        LatticeModifierData *lmd = (LatticeModifierData*) md;
 
@@ -358,7 +361,7 @@ static void latticeModifier_deformVertsEM(
 
        if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
 
-       latticeModifier_deformVerts(md, ob, dm, vertexCos, numVerts);
+       latticeModifier_deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
 
        if(!derivedData) dm->release(dm);
 }
@@ -486,10 +489,10 @@ static DerivedMesh *buildModifier_applyModifier(ModifierData *md, Object *ob,
        for(i = 0; i < maxFaces; ++i) faceMap[i] = i;
 
        if (ob) {
-               frac = bsystem_time(ob, (float)G.scene->r.cfra,
+               frac = bsystem_time(md->scene, ob, md->scene->r.cfra,
                                    bmd->start - 1.0f) / bmd->length;
        } else {
-               frac = G.scene->r.cfra - bmd->start / bmd->length;
+               frac = md->scene->r.cfra - bmd->start / bmd->length;
        }
        CLAMP(frac, 0.0, 1.0);
 
@@ -679,7 +682,7 @@ static void maskModifier_foreachObjectLink(
        walk(userData, ob, &mmd->ob_arm);
 }
 
-static void maskModifier_updateDepgraph(ModifierData *md, DagForest *forest,
+static void maskModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene,
                                           Object *ob, DagNode *obNode)
 {
        MaskModifierData *mmd = (MaskModifierData *)md;
@@ -1065,7 +1068,7 @@ static void arrayModifier_foreachObjectLink(
        walk(userData, ob, &amd->offset_ob);
 }
 
-static void arrayModifier_updateDepgraph(ModifierData *md, DagForest *forest,
+static void arrayModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene,
                                         Object *ob, DagNode *obNode)
 {
        ArrayModifierData *amd = (ArrayModifierData*) md;
@@ -1154,7 +1157,7 @@ static int calc_mapping(IndexMapEntry *indexMap, int oldIndex, int copyNum)
 }
 
 static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
-                                         Object *ob, DerivedMesh *dm,
+                                         Scene *scene, Object *ob, DerivedMesh *dm,
        int initFlags)
 {
        int i, j;
@@ -1178,9 +1181,9 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
 
        /* need to avoid infinite recursion here */
        if(amd->start_cap && amd->start_cap != ob)
-               start_cap = mesh_get_derived_final(amd->start_cap, CD_MASK_MESH);
+               start_cap = mesh_get_derived_final(scene, amd->start_cap, CD_MASK_MESH);
        if(amd->end_cap && amd->end_cap != ob)
-               end_cap = mesh_get_derived_final(amd->end_cap, CD_MASK_MESH);
+               end_cap = mesh_get_derived_final(scene, amd->end_cap, CD_MASK_MESH);
 
        MTC_Mat4One(offset);
 
@@ -1225,7 +1228,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
                                
                        if(!cu->path) {
                                cu->flag |= CU_PATH; // needed for path & bevlist
-                               makeDispListCurveTypes(amd->curve_ob, 0);
+                               makeDispListCurveTypes(scene, amd->curve_ob, 0);
                        }
                        if(cu->path)
                                length = scale*cu->path->totdist;
@@ -1701,7 +1704,7 @@ static DerivedMesh *arrayModifier_applyModifier(
        DerivedMesh *result;
        ArrayModifierData *amd = (ArrayModifierData*) md;
 
-       result = arrayModifier_doArray(amd, ob, derivedData, 0);
+       result = arrayModifier_doArray(amd, md->scene, ob, derivedData, 0);
 
        if(result != derivedData)
                CDDM_calc_normals(result);
@@ -1748,7 +1751,7 @@ static void mirrorModifier_foreachObjectLink(
        walk(userData, ob, &mmd->mirror_ob);
 }
 
-static void mirrorModifier_updateDepgraph(ModifierData *md, DagForest *forest,
+static void mirrorModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene,
                                          Object *ob, DagNode *obNode)
 {
        MirrorModifierData *mmd = (MirrorModifierData*) md;
@@ -3527,7 +3530,7 @@ static int displaceModifier_isDisabled(ModifierData *md)
 }
 
 static void displaceModifier_updateDepgraph(
-                                           ModifierData *md, DagForest *forest,
+                                           ModifierData *md, DagForest *forest, Scene *scene,
         Object *ob, DagNode *obNode)
 {
        DisplaceModifierData *dmd = (DisplaceModifierData*) md;
@@ -3749,7 +3752,7 @@ static void displaceModifier_do(
 
 static void displaceModifier_deformVerts(
                                         ModifierData *md, Object *ob, DerivedMesh *derivedData,
-      float (*vertexCos)[3], int numVerts)
+      float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        DerivedMesh *dm;
 
@@ -3848,7 +3851,7 @@ static void uvprojectModifier_foreachIDLink(ModifierData *md, Object *ob,
 }
 
 static void uvprojectModifier_updateDepgraph(ModifierData *md,
-                                            DagForest *forest, Object *ob, DagNode *obNode)
+                                            DagForest *forest, Scene *scene, Object *ob, DagNode *obNode)
 {
        UVProjectModifierData *umd = (UVProjectModifierData*) md;
        int i;
@@ -4125,11 +4128,11 @@ static DerivedMesh *decimateModifier_applyModifier(
                ModifierData *md, Object *ob, DerivedMesh *derivedData,
   int useRenderParams, int isFinalCalc)
 {
-       DecimateModifierData *dmd = (DecimateModifierData*) md;
+       // DecimateModifierData *dmd = (DecimateModifierData*) md;
        DerivedMesh *dm = derivedData, *result = NULL;
        MVert *mvert;
        MFace *mface;
-       LOD_Decimation_Info lod;
+       // LOD_Decimation_Info lod;
        int totvert, totface;
        int a, numTris;
 
@@ -4151,6 +4154,8 @@ static DerivedMesh *decimateModifier_applyModifier(
                goto exit;
        }
 
+       // XXX
+#if 0
        lod.vertex_buffer= MEM_mallocN(3*sizeof(float)*totvert, "vertices");
        lod.vertex_normal_buffer= MEM_mallocN(3*sizeof(float)*totvert, "normals");
        lod.triangle_index_buffer= MEM_mallocN(3*sizeof(int)*numTris, "trias");
@@ -4235,6 +4240,10 @@ static DerivedMesh *decimateModifier_applyModifier(
        MEM_freeN(lod.vertex_buffer);
        MEM_freeN(lod.vertex_normal_buffer);
        MEM_freeN(lod.triangle_index_buffer);
+#else
+       modifier_setError(md, "Modifier not working yet in 2.5.");
+       goto exit;
+#endif
 
 exit:
                return result;
@@ -4428,7 +4437,7 @@ static void smoothModifier_do(
 
 static void smoothModifier_deformVerts(
                                       ModifierData *md, Object *ob, DerivedMesh *derivedData,
-          float (*vertexCos)[3], int numVerts)
+          float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        DerivedMesh *dm;
 
@@ -4527,7 +4536,7 @@ static void castModifier_foreachObjectLink(
 }
 
 static void castModifier_updateDepgraph(
-                                       ModifierData *md, DagForest *forest, Object *ob,
+                                       ModifierData *md, DagForest *forest, Scene *scene, Object *ob,
      DagNode *obNode)
 {
        CastModifierData *cmd = (CastModifierData*) md;
@@ -5008,7 +5017,7 @@ static void castModifier_cuboid_do(
 
 static void castModifier_deformVerts(
                                     ModifierData *md, Object *ob, DerivedMesh *derivedData,
-        float (*vertexCos)[3], int numVerts)
+        float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        DerivedMesh *dm = derivedData;
        CastModifierData *cmd = (CastModifierData *)md;
@@ -5116,7 +5125,7 @@ static void waveModifier_foreachIDLink(ModifierData *md, Object *ob,
 }
 
 static void waveModifier_updateDepgraph(
-                                       ModifierData *md, DagForest *forest, Object *ob,
+                                       ModifierData *md, DagForest *forest, Scene *scene, Object *ob,
      DagNode *obNode)
 {
        WaveModifierData *wmd = (WaveModifierData*) md;
@@ -5241,15 +5250,15 @@ static void wavemod_get_texture_coords(WaveModifierData *wmd, Object *ob,
        }
 }
 
-static void waveModifier_do(
-                           WaveModifierData *md, Object *ob, DerivedMesh *dm,
+static void waveModifier_do(WaveModifierData *md, 
+               Scene *scene, Object *ob, DerivedMesh *dm,
        float (*vertexCos)[3], int numVerts)
 {
        WaveModifierData *wmd = (WaveModifierData*) md;
        MVert *mvert = NULL;
        MDeformVert *dvert = NULL;
        int defgrp_index;
-       float ctime = bsystem_time(ob, (float)G.scene->r.cfra, 0.0);
+       float ctime = bsystem_time(scene, ob, (float)scene->r.cfra, 0.0);
        float minfac =
                        (float)(1.0 / exp(wmd->width * wmd->narrow * wmd->width * wmd->narrow));
        float lifefac = wmd->height;
@@ -5411,7 +5420,7 @@ static void waveModifier_do(
 
 static void waveModifier_deformVerts(
                                     ModifierData *md, Object *ob, DerivedMesh *derivedData,
-        float (*vertexCos)[3], int numVerts)
+        float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        DerivedMesh *dm;
        WaveModifierData *wmd = (WaveModifierData *)md;
@@ -5427,7 +5436,7 @@ static void waveModifier_deformVerts(
                CDDM_calc_normals(dm);
        }
 
-       waveModifier_do(wmd, ob, dm, vertexCos, numVerts);
+       waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts);
 
        if(dm != derivedData) dm->release(dm);
 }
@@ -5449,7 +5458,7 @@ static void waveModifier_deformVertsEM(
                CDDM_calc_normals(dm);
        }
 
-       waveModifier_do(wmd, ob, dm, vertexCos, numVerts);
+       waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts);
 
        if(dm != derivedData) dm->release(dm);
 }
@@ -5501,7 +5510,7 @@ static void armatureModifier_foreachObjectLink(
 }
 
 static void armatureModifier_updateDepgraph(
-                                           ModifierData *md, DagForest *forest, Object *ob,
+                                           ModifierData *md, DagForest *forest, Scene *scene, Object *ob,
         DagNode *obNode)
 {
        ArmatureModifierData *amd = (ArmatureModifierData*) md;
@@ -5516,7 +5525,7 @@ static void armatureModifier_updateDepgraph(
 
 static void armatureModifier_deformVerts(
                                         ModifierData *md, Object *ob, DerivedMesh *derivedData,
-      float (*vertexCos)[3], int numVerts)
+      float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        ArmatureModifierData *amd = (ArmatureModifierData*) md;
 
@@ -5622,7 +5631,7 @@ static void hookModifier_foreachObjectLink(
        walk(userData, ob, &hmd->object);
 }
 
-static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest,
+static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene,
                                        Object *ob, DagNode *obNode)
 {
        HookModifierData *hmd = (HookModifierData*) md;
@@ -5637,7 +5646,7 @@ static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest,
 
 static void hookModifier_deformVerts(
                                     ModifierData *md, Object *ob, DerivedMesh *derivedData,
-        float (*vertexCos)[3], int numVerts)
+        float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        HookModifierData *hmd = (HookModifierData*) md;
        float vec[3], mat[4][4];
@@ -5758,7 +5767,7 @@ static void hookModifier_deformVertsEM(
 
        if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
 
-       hookModifier_deformVerts(md, ob, derivedData, vertexCos, numVerts);
+       hookModifier_deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0);
 
        if(!derivedData) dm->release(dm);
 }
@@ -5767,9 +5776,9 @@ static void hookModifier_deformVertsEM(
 
 static void softbodyModifier_deformVerts(
                                         ModifierData *md, Object *ob, DerivedMesh *derivedData,
-      float (*vertexCos)[3], int numVerts)
+      float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
-       sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos, numVerts);
+       sbObjectStep(md->scene, ob, (float)md->scene->r.cfra, vertexCos, numVerts);
 }
 
 static int softbodyModifier_dependsOnTime(ModifierData *md)
@@ -5810,7 +5819,7 @@ static DerivedMesh *clothModifier_applyModifier(ModifierData *md, Object *ob,
                        return derivedData;
        }
 
-       result = clothModifier_do(clmd, ob, derivedData, useRenderParams, isFinalCalc);
+       result = clothModifier_do(clmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc);
 
        if(result)
        {
@@ -5821,7 +5830,7 @@ static DerivedMesh *clothModifier_applyModifier(ModifierData *md, Object *ob,
 }
 
 static void clothModifier_updateDepgraph(
-                                        ModifierData *md, DagForest *forest, Object *ob,
+                                        ModifierData *md, DagForest *forest, Scene *scene, Object *ob,
       DagNode *obNode)
 {
        ClothModifierData *clmd = (ClothModifierData*) md;
@@ -5830,7 +5839,7 @@ static void clothModifier_updateDepgraph(
        
        if(clmd)
        {
-               for(base = G.scene->base.first; base; base= base->next) 
+               for(base = scene->base.first; base; base= base->next) 
                {
                        Object *ob1= base->object;
                        if(ob1 != ob)
@@ -5955,7 +5964,7 @@ static int collisionModifier_dependsOnTime(ModifierData *md)
 
 static void collisionModifier_deformVerts(
                                          ModifierData *md, Object *ob, DerivedMesh *derivedData,
-       float (*vertexCos)[3], int numVerts)
+       float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        CollisionModifierData *collmd = (CollisionModifierData*) md;
        DerivedMesh *dm = NULL;
@@ -5978,7 +5987,7 @@ static void collisionModifier_deformVerts(
                CDDM_apply_vert_coords(dm, vertexCos);
                CDDM_calc_normals(dm);
                
-               current_time = bsystem_time ( ob, ( float ) G.scene->r.cfra, 0.0 );
+               current_time = bsystem_time (md->scene,  ob, ( float ) md->scene->r.cfra, 0.0 );
                
                if(G.rt > 0)
                        printf("current_time %f, collmd->time %f\n", current_time, collmd->time);
@@ -6118,7 +6127,7 @@ static int surfaceModifier_dependsOnTime(ModifierData *md)
 
 static void surfaceModifier_deformVerts(
                                          ModifierData *md, Object *ob, DerivedMesh *derivedData,
-       float (*vertexCos)[3], int numVerts)
+       float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        SurfaceModifierData *surmd = (SurfaceModifierData*) md;
        unsigned int numverts = 0, i = 0;
@@ -6128,7 +6137,7 @@ static void surfaceModifier_deformVerts(
 
        /* if possible use/create DerivedMesh */
        if(derivedData) surmd->dm = CDDM_copy(derivedData);
-       else surmd->dm = get_original_dm(ob, NULL, 0);
+       else surmd->dm = get_original_dm(md->scene, ob, NULL, 0);
        
        if(!ob->pd)
        {
@@ -6186,7 +6195,7 @@ static void booleanModifier_foreachObjectLink(
 }
 
 static void booleanModifier_updateDepgraph(
-                                          ModifierData *md, DagForest *forest, Object *ob,
+                                          ModifierData *md, DagForest *forest, Scene *scene, Object *ob,
        DagNode *obNode)
 {
        BooleanModifierData *bmd = (BooleanModifierData*) md;
@@ -6205,7 +6214,7 @@ static DerivedMesh *booleanModifier_applyModifier(
 {
        // XXX doesn't handle derived data
        BooleanModifierData *bmd = (BooleanModifierData*) md;
-       DerivedMesh *dm = mesh_get_derived_final(bmd->object, CD_MASK_BAREMESH);
+       DerivedMesh *dm = mesh_get_derived_final(md->scene, bmd->object, CD_MASK_BAREMESH);
 
        /* we do a quick sanity check */
        if(dm && (derivedData->getNumFaces(derivedData) > 3)
@@ -6304,12 +6313,11 @@ CustomDataMask particleSystemModifier_requiredDataMask(ModifierData *md)
 /* saves the current emitter state for a particle system and calculates particles */
 static void particleSystemModifier_deformVerts(
                                               ModifierData *md, Object *ob, DerivedMesh *derivedData,
-           float (*vertexCos)[3], int numVerts)
+           float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        DerivedMesh *dm = derivedData;
        ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
        ParticleSystem * psys=0;
-       Mesh *me;
        int needsFree=0;
 
        if(ob->particlesystem.first)
@@ -6317,19 +6325,11 @@ static void particleSystemModifier_deformVerts(
        else
                return;
        
-       /* multires check */
-       if(ob->type == OB_MESH) {
-               me= (Mesh*)ob->data;
-               if(me->mr && me->mr->current != 1)
-                       modifier_setError(md,
-                               "Particles only supported on first multires level.");
-       }
-
        if(!psys_check_enabled(ob, psys))
                return;
 
        if(dm==0) {
-               dm= get_original_dm(ob, vertexCos, 1);
+               dm= get_original_dm(md->scene, ob, vertexCos, 1);
 
                if(!dm)
                        return;
@@ -6362,8 +6362,7 @@ static void particleSystemModifier_deformVerts(
                  psmd->dm->getNumFaces(psmd->dm)!=psmd->totdmface){
                /* in file read dm hasn't really changed but just wasn't saved in file */
 
-               psys->recalc |= PSYS_RECALC_HAIR;
-               psys->recalc |= PSYS_DISTR;
+               psys->recalc |= PSYS_RECALC_RESET;
                psmd->flag |= eParticleSystemFlag_DM_changed;
 
                psmd->totdmvert= psmd->dm->getNumVerts(psmd->dm);
@@ -6372,7 +6371,7 @@ static void particleSystemModifier_deformVerts(
                  }
 
                  if(psys){
-                         particle_system_update(ob,psys);
+                         particle_system_update(md->scene, ob, psys);
                          psmd->flag |= eParticleSystemFlag_psys_updated;
                          psmd->flag &= ~eParticleSystemFlag_DM_changed;
                  }
@@ -6420,7 +6419,7 @@ static int particleInstanceModifier_dependsOnTime(ModifierData *md)
        return 0;
 }
 static void particleInstanceModifier_updateDepgraph(ModifierData *md, DagForest *forest,
-               Object *ob, DagNode *obNode)
+                Scene *scene,Object *ob, DagNode *obNode)
 {
        ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md;
 
@@ -6488,7 +6487,7 @@ static DerivedMesh * particleInstanceModifier_applyModifier(
        maxvert=totvert*totpart;
        maxface=totface*totpart;
 
-       psys->lattice=psys_get_lattice(ob, psys);
+       psys->lattice=psys_get_lattice(md->scene, ob, psys);
 
        if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED)){
 
@@ -6523,7 +6522,7 @@ static DerivedMesh * particleInstanceModifier_applyModifier(
                        state.time=(mv->co[0]-min_co)/(max_co-min_co);
                        if(trackneg)
                                state.time=1.0f-state.time;
-                       psys_get_particle_on_path(pimd->ob,psys,first_particle + i/totvert,&state,1);
+                       psys_get_particle_on_path(md->scene, pimd->ob, psys,first_particle + i/totvert, &state,1);
 
                        mv->co[0] = 0.0;
 
@@ -6545,7 +6544,7 @@ static DerivedMesh * particleInstanceModifier_applyModifier(
                }
                else{
                        state.time=-1.0;
-                       psys_get_particle_state(pimd->ob,psys,i/totvert,&state,1);
+                       psys_get_particle_state(md->scene, pimd->ob, psys, i/totvert, &state,1);
                }       
 
                QuatMulVecf(state.rot,mv->co);
@@ -6597,8 +6596,8 @@ static DerivedMesh * particleInstanceModifier_applyModifier(
        CDDM_calc_normals(result);
 
        if(psys->lattice){
-               end_latt_deform();
-               psys->lattice=0;
+               end_latt_deform(psys->lattice);
+               psys->lattice= NULL;
        }
 
        return result;
@@ -7216,7 +7215,7 @@ static DerivedMesh * explodeModifier_splitEdges(ExplodeModifierData *emd, Derive
 
 }
 static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd, 
-               ParticleSystemModifierData *psmd, Object *ob, 
+               ParticleSystemModifierData *psmd, Scene *scene, Object *ob, 
   DerivedMesh *to_explode)
 {
        DerivedMesh *explode, *dm=to_explode;
@@ -7240,9 +7239,9 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
        timestep= psys_get_timestep(part);
 
        if(part->flag & PART_GLOB_TIME)
-               cfra=bsystem_time(0,(float)G.scene->r.cfra,0.0);
+               cfra=bsystem_time(scene, 0,(float)scene->r.cfra,0.0);
        else
-               cfra=bsystem_time(ob,(float)G.scene->r.cfra,0.0);
+               cfra=bsystem_time(scene, ob,(float)scene->r.cfra,0.0);
 
        /* hash table for vertice <-> particle relations */
        vertpahash= BLI_edgehash_new();
@@ -7280,7 +7279,7 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
        /* getting back to object space */
        Mat4Invert(imat,ob->obmat);
 
-       psmd->psys->lattice = psys_get_lattice(ob, psmd->psys);
+       psmd->psys->lattice = psys_get_lattice(scene, ob, psmd->psys);
 
        /* duplicate & displace vertices */
        ehi= BLI_edgehashIterator_new(vertpahash);
@@ -7308,7 +7307,7 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
                        Mat4MulVecfl(ob->obmat,loc0);
 
                        state.time=cfra;
-                       psys_get_particle_state(ob,psmd->psys,i,&state,1);
+                       psys_get_particle_state(scene, ob, psmd->psys, i, &state,1);
 
                        vertco=CDDM_get_vert(explode,v)->co;
                        
@@ -7373,8 +7372,8 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
        CDDM_calc_normals(explode);
 
        if(psmd->psys->lattice){
-               end_latt_deform();
-               psmd->psys->lattice=0;
+               end_latt_deform(psmd->psys->lattice);
+               psmd->psys->lattice= NULL;
        }
 
        return explode;
@@ -7424,7 +7423,7 @@ static DerivedMesh * explodeModifier_applyModifier(
                                 if(emd->flag & eExplodeFlag_EdgeSplit){
                                         int *facepa = emd->facepa;
                                         DerivedMesh *splitdm=explodeModifier_splitEdges(emd,dm);
-                                        DerivedMesh *explode=explodeModifier_explodeMesh(emd,psmd,ob,splitdm);
+                                        DerivedMesh *explode=explodeModifier_explodeMesh(emd, psmd, md->scene, ob, splitdm);
 
                                         MEM_freeN(emd->facepa);
                                         emd->facepa=facepa;
@@ -7432,7 +7431,7 @@ static DerivedMesh * explodeModifier_applyModifier(
                                         return explode;
                                 }
                                 else
-                                        return explodeModifier_explodeMesh(emd,psmd,ob,derivedData);
+                                        return explodeModifier_explodeMesh(emd, psmd, md->scene, ob, derivedData);
        }
        return derivedData;
 }
@@ -7478,7 +7477,7 @@ static DerivedMesh * fluidsimModifier_applyModifier(
                        return derivedData;
        }
 
-       result = fluidsimModifier_do(fluidmd, ob, derivedData, useRenderParams, isFinalCalc);
+       result = fluidsimModifier_do(fluidmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc);
 
        if(result) 
        { 
@@ -7489,7 +7488,7 @@ static DerivedMesh * fluidsimModifier_applyModifier(
 }
 
 static void fluidsimModifier_updateDepgraph(
-               ModifierData *md, DagForest *forest,
+               ModifierData *md, DagForest *forest, Scene *scene,
       Object *ob, DagNode *obNode)
 {
        FluidsimModifierData *fluidmd= (FluidsimModifierData*) md;
@@ -7499,7 +7498,7 @@ static void fluidsimModifier_updateDepgraph(
        {
                if(fluidmd->fss->type == OB_FLUIDSIM_DOMAIN)
                {
-                       for(base = G.scene->base.first; base; base= base->next) 
+                       for(base = scene->base.first; base; base= base->next) 
                        {
                                Object *ob1= base->object;
                                if(ob1 != ob)
@@ -7581,7 +7580,7 @@ static void meshdeformModifier_foreachObjectLink(
 }
 
 static void meshdeformModifier_updateDepgraph(
-                                             ModifierData *md, DagForest *forest, Object *ob,
+                                             ModifierData *md, DagForest *forest, Scene *scene, Object *ob,
           DagNode *obNode)
 {
        MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
@@ -7652,22 +7651,25 @@ static void meshdeformModifier_do(
       float (*vertexCos)[3], int numVerts)
 {
        MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
-       float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4];
-       float weight, totweight, fac, co[3], *weights, (*dco)[3], (*bindcos)[3];
-       int a, b, totvert, totcagevert, defgrp_index;
+       Mesh *me= ob->data;
        DerivedMesh *tmpdm, *cagedm;
        MDeformVert *dvert = NULL;
        MDeformWeight *dw;
+       EditMesh *em = BKE_mesh_get_editmesh(me);
        MVert *cagemvert;
-
+       float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4];
+       float weight, totweight, fac, co[3], *weights, (*dco)[3], (*bindcos)[3];
+       int a, b, totvert, totcagevert, defgrp_index;
+       
        if(!mmd->object || (!mmd->bindcos && !mmd->needbind))
                return;
        
        /* get cage derivedmesh */
-       if(mmd->object == G.obedit) {
-               tmpdm= editmesh_get_derived_cage_and_final(&cagedm, 0);
+       if(em) {
+               tmpdm= editmesh_get_derived_cage_and_final(md->scene, ob, em, &cagedm, 0);
                if(tmpdm)
                        tmpdm->release(tmpdm);
+               BKE_mesh_end_editmesh(me, em);
        }
        else
                cagedm= mmd->object->derivedFinal;
@@ -7675,7 +7677,7 @@ static void meshdeformModifier_do(
        /* if we don't have one computed, use derivedmesh from data
         * without any modifiers */
        if(!cagedm) {
-               cagedm= get_original_dm(mmd->object, NULL, 0);
+               cagedm= get_original_dm(md->scene, mmd->object, NULL, 0);
                if(cagedm)
                        cagedm->needsFree= 1;
        }
@@ -7697,7 +7699,7 @@ static void meshdeformModifier_do(
                /* progress bar redraw can make this recursive .. */
                if(!recursive) {
                        recursive = 1;
-                       harmonic_coordinates_bind(mmd, vertexCos, numVerts, cagemat);
+                       //XXX harmonic_coordinates_bind(mmd, vertexCos, numVerts, cagemat);
                        recursive = 0;
                }
        }
@@ -7809,7 +7811,7 @@ static void meshdeformModifier_do(
 
 static void meshdeformModifier_deformVerts(
                                           ModifierData *md, Object *ob, DerivedMesh *derivedData,
-       float (*vertexCos)[3], int numVerts)
+       float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        DerivedMesh *dm;
 
@@ -7843,6 +7845,60 @@ static void meshdeformModifier_deformVertsEM(
                dm->release(dm);
 }
 
+/* Multires */
+static void multiresModifier_initData(ModifierData *md)
+{
+       MultiresModifierData *mmd = (MultiresModifierData*)md;
+
+       mmd->lvl = mmd->totlvl = 1;
+}
+
+static void multiresModifier_freeData(ModifierData *md)
+{
+       MultiresModifierData *mmd = (MultiresModifierData*)md;
+
+       if(mmd->undo_verts)
+               MEM_freeN(mmd->undo_verts);
+}
+
+static void multiresModifier_copyData(ModifierData *md, ModifierData *target)
+{
+       MultiresModifierData *mmd = (MultiresModifierData*) md;
+       MultiresModifierData *tmmd = (MultiresModifierData*) target;
+
+       tmmd->totlvl = mmd->totlvl;
+       tmmd->lvl = mmd->lvl;
+}
+
+static DerivedMesh *multiresModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm,
+                                                  int useRenderParams, int isFinalCalc)
+{
+       MultiresModifierData *mmd = (MultiresModifierData*)md;
+       Mesh *me = get_mesh(ob);
+       DerivedMesh *final;
+
+       /* TODO: for now just skip a level1 mesh */
+       if(mmd->lvl == 1)
+               return dm;
+
+       final = multires_dm_create_from_derived(mmd, dm, me, useRenderParams, isFinalCalc);
+       if(mmd->undo_signal && mmd->undo_verts && mmd->undo_verts_tot == final->getNumVerts(final)) {
+               int i;
+               MVert *dst = CDDM_get_verts(final);
+               for(i = 0; i < mmd->undo_verts_tot; ++i) {
+                       VecCopyf(dst[i].co, mmd->undo_verts[i].co);
+               }
+               CDDM_calc_normals(final);
+
+               MultiresDM_mark_as_modified(final);
+
+               MEM_freeN(mmd->undo_verts);
+               mmd->undo_signal = 0;
+               mmd->undo_verts = NULL;
+       }
+
+       return final;
+}
 
 /* Shrinkwrap */
 
@@ -7905,7 +7961,7 @@ static void shrinkwrapModifier_foreachObjectLink(ModifierData *md, Object *ob, O
        walk(userData, ob, &smd->auxTarget);
 }
 
-static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        DerivedMesh *dm = NULL;
        CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(md);
@@ -7925,7 +7981,7 @@ static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, Derived
                }
        }
 
-       shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
+       shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts);
 
        if(dm)
                dm->release(dm);
@@ -7950,13 +8006,13 @@ static void shrinkwrapModifier_deformVertsEM(ModifierData *md, Object *ob, EditM
                }
        }
 
-       shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
+       shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts);
 
        if(dm)
                dm->release(dm);
 }
 
-static void shrinkwrapModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
+static void shrinkwrapModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode)
 {
        ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
 
@@ -8011,7 +8067,7 @@ static void simpledeformModifier_foreachObjectLink(ModifierData *md, Object *ob,
        walk(userData, ob, &smd->origin);
 }
 
-static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
+static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode)
 {
        SimpleDeformModifierData *smd  = (SimpleDeformModifierData*)md;
 
@@ -8019,7 +8075,7 @@ static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *for
                dag_add_relation(forest, dag_get_node(forest, smd->origin), obNode, DAG_RL_OB_DATA, "SimpleDeform Modifier");
 }
 
-static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
        DerivedMesh *dm = NULL;
        CustomDataMask dataMask = simpledeformModifier_requiredDataMask(md);
@@ -8451,6 +8507,14 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
                mti->foreachObjectLink = simpledeformModifier_foreachObjectLink;
                mti->updateDepgraph = simpledeformModifier_updateDepgraph;
 
+               mti = INIT_TYPE(Multires);
+               mti->type = eModifierTypeType_Constructive;
+               mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_RequiresOriginalData;
+               mti->initData = multiresModifier_initData;
+               mti->freeData = multiresModifier_freeData;
+               mti->copyData = multiresModifier_copyData;
+               mti->applyModifier = multiresModifier_applyModifier;
+
                typeArrInit = 0;
 #undef INIT_TYPE
        }
@@ -8532,8 +8596,6 @@ void modifiers_clearErrors(Object *ob)
                        qRedraw = 1;
                }
        }
-
-       if (qRedraw) allqueue(REDRAWBUTSEDIT, 0);
 }
 
 void modifiers_foreachObjectLink(Object *ob, ObjectWalkFunc walk,
@@ -8599,7 +8661,6 @@ void modifier_setError(ModifierData *md, char *format, ...)
 
        md->error = BLI_strdup(buffer);
 
-       allqueue(REDRAWBUTSEDIT, 0);
 }
 
 /* used for buttons, to find out if the 'draw deformed in editmode' option is
@@ -8668,7 +8729,7 @@ LinkNode *modifiers_calcDataMasks(ModifierData *md, CustomDataMask dataMask)
 
                if(mti->requiredDataMask) mask = mti->requiredDataMask(md);
 
-               BLI_linklist_prepend(&dataMasks, (void *)mask);
+               BLI_linklist_prepend(&dataMasks, SET_INT_IN_POINTER(mask));
        }
 
        /* build the list of required data masks - each mask in the list must
@@ -8679,14 +8740,14 @@ LinkNode *modifiers_calcDataMasks(ModifierData *md, CustomDataMask dataMask)
        */
        for(curr = dataMasks, prev = NULL; curr; prev = curr, curr = curr->next) {
                if(prev) {
-                       CustomDataMask prev_mask = (CustomDataMask)prev->link;
-                       CustomDataMask curr_mask = (CustomDataMask)curr->link;
+                       CustomDataMask prev_mask = (CustomDataMask)GET_INT_FROM_POINTER(prev->link);
+                       CustomDataMask curr_mask = (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
 
-                       curr->link = (void *)(curr_mask | prev_mask);
+                       curr->link = SET_INT_IN_POINTER(curr_mask | prev_mask);
                } else {
-                       CustomDataMask curr_mask = (CustomDataMask)curr->link;
+                       CustomDataMask curr_mask = (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
 
-                       curr->link = (void *)(curr_mask | dataMask);
+                       curr->link = SET_INT_IN_POINTER(curr_mask | dataMask);
                }
        }
 
@@ -8827,14 +8888,15 @@ int modifier_isDeformer(ModifierData *md)
        return 0;
 }
 
-int modifiers_isDeformed(Object *ob)
+int modifiers_isDeformed(Scene *scene, Object *ob)
 {
        ModifierData *md = modifiers_getVirtualModifierList(ob);
        
        for (; md; md=md->next) {
-               if(ob==G.obedit && (md->mode & eModifierMode_Editmode)==0);
-               else if(modifier_isDeformer(md))
-                       return 1;
+               if(ob==scene->obedit && (md->mode & eModifierMode_Editmode)==0);
+               else 
+                       if(modifier_isDeformer(md))
+                               return 1;
        }
        return 0;
 }