Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / intern / smoke.c
index 2ab892a..738be9d 100644 (file)
@@ -71,7 +71,6 @@
 #include "BKE_constraint.h"
 #include "BKE_customdata.h"
 #include "BKE_deform.h"
-#include "BKE_depsgraph.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_effect.h"
 #include "BKE_global.h"
@@ -84,6 +83,9 @@
 #include "BKE_smoke.h"
 #include "BKE_texture.h"
 
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
+
 #include "RE_shader_ext.h"
 
 #include "GPU_glew.h"
@@ -127,7 +129,7 @@ void smoke_initWaveletBlenderRNA(struct WTURBULENCE *UNUSED(wt), float *UNUSED(s
 void smoke_initBlenderRNA(struct FLUID_3D *UNUSED(fluid), float *UNUSED(alpha), float *UNUSED(beta), float *UNUSED(dt_factor), float *UNUSED(vorticity),
                           int *UNUSED(border_colli), float *UNUSED(burning_rate), float *UNUSED(flame_smoke), float *UNUSED(flame_smoke_color),
                           float *UNUSED(flame_vorticity), float *UNUSED(flame_ignition_temp), float *UNUSED(flame_max_temp)) {}
-struct DerivedMesh *smokeModifier_do(SmokeModifierData *UNUSED(smd), Scene *UNUSED(scene), Object *UNUSED(ob), DerivedMesh *UNUSED(dm)) { return NULL; }
+struct DerivedMesh *smokeModifier_do(SmokeModifierData *UNUSED(smd), struct Depsgraph *UNUSED(depsgraph), Scene *UNUSED(scene), Object *UNUSED(ob), DerivedMesh *UNUSED(dm)) { return NULL; }
 float smoke_get_velocity_at(struct Object *UNUSED(ob), float UNUSED(position[3]), float UNUSED(velocity[3])) { return 0.0f; }
 
 #endif /* WITH_SMOKE */
@@ -696,16 +698,16 @@ void smokeModifier_copy(const struct SmokeModifierData *smd, struct SmokeModifie
 #ifdef WITH_SMOKE
 
 // forward decleration
-static void smoke_calc_transparency(SmokeDomainSettings *sds, Scene *scene);
+static void smoke_calc_transparency(SmokeDomainSettings *sds, ViewLayer *view_layer);
 static float calc_voxel_transp(float *result, float *input, int res[3], int *pixel, float *tRay, float correct);
 
-static int get_lamp(Scene *scene, float *light)
+static int get_lamp(ViewLayer *view_layer, float *light)
 {
        Base *base_tmp = NULL;
        int found_lamp = 0;
 
        // try to find a lamp, preferably local
-       for (base_tmp = scene->base.first; base_tmp; base_tmp = base_tmp->next) {
+       for (base_tmp = FIRSTBASE(view_layer); base_tmp; base_tmp = base_tmp->next) {
                if (base_tmp->object->type == OB_LAMP) {
                        Lamp *la = base_tmp->object->data;
 
@@ -2107,7 +2109,7 @@ BLI_INLINE void apply_inflow_fields(SmokeFlowSettings *sfs, float emission_value
 }
 
 static void update_flowsfluids(
-        Main *bmain, EvaluationContext *eval_ctx, Scene *scene, Object *ob, SmokeDomainSettings *sds, float dt)
+        struct Depsgraph *depsgraph, Scene *scene, Object *ob, SmokeDomainSettings *sds, float dt)
 {
        Object **flowobjs = NULL;
        EmissionMap *emaps = NULL;
@@ -2214,9 +2216,7 @@ static void update_flowsfluids(
                                        else { /* MOD_SMOKE_FLOW_SOURCE_MESH */
                                                /* update flow object frame */
                                                BLI_mutex_lock(&object_update_lock);
-                                               BKE_object_modifier_update_subframe(
-                                                           bmain, eval_ctx, scene, collob,
-                                                           true, 5, BKE_scene_frame_get(scene), eModifierType_Smoke);
+                                               BKE_object_modifier_update_subframe(depsgraph, scene, collob, true, 5, BKE_scene_frame_get(scene), eModifierType_Smoke);
                                                BLI_mutex_unlock(&object_update_lock);
 
                                                /* apply flow */
@@ -2528,12 +2528,12 @@ static void update_effectors_task_cb(
        }
 }
 
-static void update_effectors(Scene *scene, Object *ob, SmokeDomainSettings *sds, float UNUSED(dt))
+static void update_effectors(struct Depsgraph *depsgraph, Scene *scene, Object *ob, SmokeDomainSettings *sds, float UNUSED(dt))
 {
        ListBase *effectors;
        /* make sure smoke flow influence is 0.0f */
        sds->effector_weights->weight[PFIELD_SMOKEFLOW] = 0.0f;
-       effectors = pdInitEffectors(scene, ob, NULL, sds->effector_weights, true);
+       effectors = pdInitEffectors(depsgraph, scene, ob, NULL, sds->effector_weights, true);
 
        if (effectors) {
                // precalculate wind forces
@@ -2564,7 +2564,7 @@ static void update_effectors(Scene *scene, Object *ob, SmokeDomainSettings *sds,
 }
 
 static void step(
-        Main *bmain, EvaluationContext *eval_ctx,
+        Depsgraph *depsgraph,
         Scene *scene, Object *ob, SmokeModifierData *smd, DerivedMesh *domain_dm, float fps)
 {
        SmokeDomainSettings *sds = smd->domain;
@@ -2635,11 +2635,11 @@ static void step(
        for (substep = 0; substep < totalSubsteps; substep++)
        {
                // calc animated obstacle velocities
-               update_flowsfluids(bmain, eval_ctx, scene, ob, sds, dtSubdiv);
+               update_flowsfluids(depsgraph, scene, ob, sds, dtSubdiv);
                update_obstacles(scene, ob, sds, dtSubdiv, substep, totalSubsteps);
 
                if (sds->total_cells > 1) {
-                       update_effectors(scene, ob, sds, dtSubdiv); // DG TODO? problem --> uses forces instead of velocity, need to check how they need to be changed with variable dt
+                       update_effectors(depsgraph, scene, ob, sds, dtSubdiv); // DG TODO? problem --> uses forces instead of velocity, need to check how they need to be changed with variable dt
                        smoke_step(sds->fluid, gravity, dtSubdiv);
                }
        }
@@ -2733,7 +2733,7 @@ static DerivedMesh *createDomainGeometry(SmokeDomainSettings *sds, Object *ob)
 }
 
 static void smokeModifier_process(
-        Main *bmain, EvaluationContext *eval_ctx, SmokeModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm)
+        SmokeModifierData *smd, struct Depsgraph *depsgraph, Scene *scene, Object *ob, DerivedMesh *dm)
 {
        if ((smd->type & MOD_SMOKE_TYPE_FLOW))
        {
@@ -2854,11 +2854,11 @@ static void smokeModifier_process(
 
                        }
 
-                       step(bmain, eval_ctx, scene, ob, smd, dm, scene->r.frs_sec / scene->r.frs_sec_base);
+                       step(depsgraph, scene, ob, smd, dm, scene->r.frs_sec / scene->r.frs_sec_base);
                }
 
                // create shadows before writing cache so they get stored
-               smoke_calc_transparency(sds, scene);
+               smoke_calc_transparency(sds, DEG_get_evaluated_view_layer(depsgraph));
 
                if (sds->wt && sds->total_cells > 1) {
                        smoke_turbulence_step(sds->wt, sds->fluid);
@@ -2875,14 +2875,14 @@ static void smokeModifier_process(
        }
 }
 
-struct DerivedMesh *smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm)
+struct DerivedMesh *smokeModifier_do(
+        SmokeModifierData *smd, struct Depsgraph *depsgraph, Scene *scene, Object *ob, DerivedMesh *dm)
 {
        /* lock so preview render does not read smoke data while it gets modified */
        if ((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
                BLI_rw_mutex_lock(smd->domain->fluid_mutex, THREAD_LOCK_WRITE);
 
-       /* Ugly G.main, hopefully won't be needed anymore in 2.8 */
-       smokeModifier_process(G.main, G.main->eval_ctx , smd, scene, ob, dm);
+       smokeModifier_process(smd, depsgraph, scene, ob, dm);
 
        if ((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
                BLI_rw_mutex_unlock(smd->domain->fluid_mutex);
@@ -2997,7 +2997,7 @@ static void bresenham_linie_3D(int x1, int y1, int z1, int x2, int y2, int z2, f
        cb(result, input, res, pixel, tRay, correct);
 }
 
-static void smoke_calc_transparency(SmokeDomainSettings *sds, Scene *scene)
+static void smoke_calc_transparency(SmokeDomainSettings *sds, ViewLayer *view_layer)
 {
        float bv[6] = {0};
        float light[3];
@@ -3005,7 +3005,7 @@ static void smoke_calc_transparency(SmokeDomainSettings *sds, Scene *scene)
        float *density = smoke_get_density(sds->fluid);
        float correct = -7.0f * sds->dx;
 
-       if (!get_lamp(scene, light)) return;
+       if (!get_lamp(view_layer, light)) return;
 
        /* convert light pos to sim cell space */
        mul_m4_v3(sds->imat, light);