Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / physics / physics_fluid.c
index 4b9ce1c..130dcba 100644 (file)
@@ -54,6 +54,8 @@
 #include "BKE_report.h"
 #include "BKE_scene.h"
 
+#include "DEG_depsgraph.h"
+
 #include "LBM_fluidsim.h"
 
 #include "ED_screen.h"
@@ -245,7 +247,7 @@ static void set_channel(float *channel, float time, float *value, int i, int siz
        }
 }
 
-static void set_vertex_channel(float *channel, float time, struct Scene *scene, struct FluidObject *fobj, int i)
+static void set_vertex_channel(Depsgraph *depsgraph, float *channel, float time, struct Scene *scene, struct FluidObject *fobj, int i)
 {
        Object *ob = fobj->object;
        FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim);
@@ -258,7 +260,7 @@ static void set_vertex_channel(float *channel, float time, struct Scene *scene,
        if (channel == NULL)
                return;
 
-       initElbeemMesh(scene, ob, &numVerts, &verts, &numTris, &tris, 1, modifierIndex);
+       initElbeemMesh(depsgraph, scene, ob, &numVerts, &verts, &numTris, &tris, 1, modifierIndex);
 
        /* don't allow mesh to change number of verts in anim sequence */
        if (numVerts != fobj->numVerts) {
@@ -330,6 +332,8 @@ static void free_all_fluidobject_channels(ListBase *fobjects)
 static void fluid_init_all_channels(bContext *C, Object *UNUSED(fsDomain), FluidsimSettings *domainSettings, FluidAnimChannels *channels, ListBase *fobjects)
 {
        Scene *scene = CTX_data_scene(C);
+       ViewLayer *view_layer = CTX_data_view_layer(C);
+       Depsgraph *depsgraph = CTX_data_depsgraph(C);
        Base *base;
        int i;
        int length = channels->length;
@@ -344,7 +348,7 @@ static void fluid_init_all_channels(bContext *C, Object *UNUSED(fsDomain), Fluid
        channels->DomainTime = MEM_callocN(length * (CHANNEL_FLOAT+1) * sizeof(float), "channel DomainTime");
 
        /* allocate fluid objects */
-       for (base=scene->base.first; base; base= base->next) {
+       for (base = FIRSTBASE(view_layer); base; base = base->next) {
                Object *ob = base->object;
                FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim);
 
@@ -374,7 +378,7 @@ static void fluid_init_all_channels(bContext *C, Object *UNUSED(fsDomain), Fluid
                                float *verts=NULL;
                                int *tris=NULL, modifierIndex = BLI_findindex(&ob->modifiers, (ModifierData *)fluidmd);
 
-                               initElbeemMesh(scene, ob, &fobj->numVerts, &verts, &fobj->numTris, &tris, 0, modifierIndex);
+                               initElbeemMesh(depsgraph, scene, ob, &fobj->numVerts, &verts, &fobj->numTris, &tris, 0, modifierIndex);
                                fobj->VertexCache = MEM_callocN(length *((fobj->numVerts*CHANNEL_VEC)+1) * sizeof(float), "fluidobject VertexCache");
 
                                MEM_freeN(verts);
@@ -403,7 +407,7 @@ static void fluid_init_all_channels(bContext *C, Object *UNUSED(fsDomain), Fluid
                /* Modifying the global scene isn't nice, but we can do it in
                 * this part of the process before a threaded job is created */
                scene->r.cfra = (int)eval_time;
-               ED_update_for_newframe(CTX_data_main(C), scene, 1);
+               ED_update_for_newframe(CTX_data_main(C), depsgraph);
 
                /* now scene data should be current according to animation system, so we fill the channels */
 
@@ -462,14 +466,15 @@ static void fluid_init_all_channels(bContext *C, Object *UNUSED(fsDomain), Fluid
                        }
 
                        if (fluid_is_animated_mesh(fluidmd->fss)) {
-                               set_vertex_channel(fobj->VertexCache, timeAtFrame, scene, fobj, i);
+                               set_vertex_channel(depsgraph, fobj->VertexCache, timeAtFrame, scene, fobj, i);
                        }
                }
        }
 }
 
-static void export_fluid_objects(ListBase *fobjects, Scene *scene, int length)
+static void export_fluid_objects(const bContext *C, ListBase *fobjects, Scene *scene, int length)
 {
+       Depsgraph *depsgraph = CTX_data_depsgraph(C);
        FluidObject *fobj;
 
        for (fobj=fobjects->first; fobj; fobj=fobj->next) {
@@ -492,7 +497,7 @@ static void export_fluid_objects(ListBase *fobjects, Scene *scene, int length)
                fsmesh.type = fluidmd->fss->type;
                fsmesh.name = ob->id.name;
 
-               initElbeemMesh(scene, ob, &numVerts, &verts, &numTris, &tris, 0, modifierIndex);
+               initElbeemMesh(depsgraph, scene, ob, &numVerts, &verts, &numTris, &tris, 0, modifierIndex);
 
                fsmesh.numVertices   = numVerts;
                fsmesh.numTriangles  = numTris;
@@ -571,14 +576,14 @@ static void export_fluid_objects(ListBase *fobjects, Scene *scene, int length)
        }
 }
 
-static int fluid_validate_scene(ReportList *reports, Scene *scene, Object *fsDomain)
+static int fluid_validate_scene(ReportList *reports, ViewLayer *view_layer, Object *fsDomain)
 {
        Base *base;
        Object *newdomain = NULL;
        int channelObjCount = 0;
        int fluidInputCount = 0;
 
-       for (base=scene->base.first; base; base= base->next) {
+       for (base = FIRSTBASE(view_layer); base; base = base->next) {
                Object *ob = base->object;
                FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim);
 
@@ -837,7 +842,9 @@ static void fluidsim_delete_until_lastframe(FluidsimSettings *fss, const char *r
 static int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain, short do_job)
 {
        Main *bmain = CTX_data_main(C);
-       Scene *scene= CTX_data_scene(C);
+       Scene *scene = CTX_data_scene(C);
+       ViewLayer *view_layer = CTX_data_view_layer(C);
+       Depsgraph *depsgraph = CTX_data_depsgraph(C);
        int i;
        FluidsimSettings *domainSettings;
 
@@ -884,7 +891,7 @@ static int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain, shor
        }
 
        /* check scene for sane object/modifier settings */
-       if (!fluid_validate_scene(reports, scene, fsDomain)) {
+       if (!fluid_validate_scene(reports, view_layer, fsDomain)) {
                fluidbake_free_data(channels, fobjects, fsset, fb);
                return 0;
        }
@@ -949,7 +956,7 @@ static int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain, shor
 
        /* reset to original current frame */
        scene->r.cfra = origFrame;
-       ED_update_for_newframe(CTX_data_main(C), scene, 1);
+       ED_update_for_newframe(CTX_data_main(C), depsgraph);
 
        /* ******** init domain object's matrix ******** */
        copy_m4_m4(domainMat, fsDomain->obmat);
@@ -1036,7 +1043,7 @@ static int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain, shor
        elbeemAddDomain(fsset);
 
        /* ******** export all fluid objects to elbeem ******** */
-       export_fluid_objects(fobjects, scene, channels->length);
+       export_fluid_objects(C, fobjects, scene, channels->length);
 
        /* custom data for fluid bake job */
        fb->settings = fsset;