Commit: 873acfb124f43246e74b8a41f123c9987dfbfc5f
Author: Clément Foucault
Date:   Wed Jun 20 15:30:58 2018 +0200
Branches: temp-eeveelightcache
https://developer.blender.org/rB873acfb124f43246e74b8a41f123c9987dfbfc5f

Eevee: LightCache: Finish basic cache support.

Still missing: Multi bounce support.

===================================================================

M       source/blender/draw/engines/eevee/eevee_engine.c
M       source/blender/draw/engines/eevee/eevee_lightcache.c
M       source/blender/draw/engines/eevee/eevee_private.h
M       source/blender/draw/engines/eevee/eevee_render.c
M       source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
M       source/blender/draw/intern/draw_manager.c

===================================================================

diff --git a/source/blender/draw/engines/eevee/eevee_engine.c 
b/source/blender/draw/engines/eevee/eevee_engine.c
index cecc76ec96a..24d2934cf91 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -123,7 +123,7 @@ static void eevee_cache_init(void *vedata)
        EEVEE_volumes_cache_init(sldata, vedata);
 }
 
-static void eevee_cache_populate(void *vedata, Object *ob)
+void EEVEE_cache_populate(void *vedata, Object *ob)
 {
        EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
 
@@ -440,7 +440,7 @@ DrawEngineType draw_engine_eevee_type = {
        &eevee_engine_init,
        &eevee_engine_free,
        &eevee_cache_init,
-       &eevee_cache_populate,
+       &EEVEE_cache_populate,
        &eevee_cache_finish,
        &eevee_draw_background,
        NULL, /* Everything is drawn in the background pass (see comment on 
function) */
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c 
b/source/blender/draw/engines/eevee/eevee_lightcache.c
index dac79c413e5..5a7fe9aa22d 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -114,6 +114,7 @@ typedef struct EEVEE_LightBake {
        /* Reflection probe */
        EEVEE_LightProbe *cube;          /* Current probe being rendered (UBO 
data). */
        int ref_cube_res;                /* Target cubemap at MIP 0. */
+       int cube_offset;                 /* Index of the current cube. */
        float probemat[6][4][4];         /* ViewProjection matrix for each cube 
face. */
        float texel_size, padding_size;  /* Texel and padding size for the 
final octahedral map. */
        float roughness;                 /* Roughness level of the current 
mipmap. */
@@ -432,13 +433,19 @@ static void eevee_lightbake_cache_create(EEVEE_Data 
*vedata, EEVEE_LightBake *lb
 
        EEVEE_effects_cache_init(sldata, vedata);
        EEVEE_materials_cache_init(sldata, vedata);
-       EEVEE_lightbake_cache_init(sldata, vedata, lbake->rt_color, 
lbake->rt_depth);
+       EEVEE_lights_cache_init(sldata, vedata);
        EEVEE_lightprobes_cache_init(sldata, vedata);
 
+       EEVEE_lightbake_cache_init(sldata, vedata, lbake->rt_color, 
lbake->rt_depth);
+
+       DRW_render_object_iter(vedata, NULL, lbake->depsgraph, 
EEVEE_render_cache);
+
        EEVEE_materials_cache_finish(vedata);
+       EEVEE_lights_cache_finish(sldata);
        EEVEE_lightprobes_cache_finish(sldata, vedata);
 
        DRW_render_instance_buffer_finish();
+       DRW_hair_update();
 }
 
 static void eevee_lightbake_render_world(void *ved, void *user_data)
@@ -467,6 +474,22 @@ static void eevee_lightbake_render_world(void *ved, void 
*user_data)
        lcache->flag &= ~LIGHTCACHE_UPDATE_WORLD;
 }
 
+static void cell_id_to_grid_loc(EEVEE_LightGrid *egrid, int cell_idx, int 
r_local_cell[3])
+{
+       /* Keep in sync with lightprobe_grid_display_vert */
+       r_local_cell[2] = cell_idx % egrid->resolution[2];
+       r_local_cell[1] = (cell_idx / egrid->resolution[2]) % 
egrid->resolution[1];
+       r_local_cell[0] = cell_idx / (egrid->resolution[2] * 
egrid->resolution[1]);
+}
+
+static void grid_loc_to_world_loc(EEVEE_LightGrid *egrid, int local_cell[3], 
float r_pos[3])
+{
+       copy_v3_v3(r_pos, egrid->corner);
+       madd_v3_v3fl(r_pos, egrid->increment_x, local_cell[0]);
+       madd_v3_v3fl(r_pos, egrid->increment_y, local_cell[1]);
+       madd_v3_v3fl(r_pos, egrid->increment_z, local_cell[2]);
+}
+
 static void eevee_lightbake_render_grid_sample(void *ved, void *user_data)
 {
        EEVEE_Data *vedata = (EEVEE_Data *)ved;
@@ -480,17 +503,17 @@ static void eevee_lightbake_render_grid_sample(void *ved, 
void *user_data)
        eevee_lightbake_cache_create(vedata, lbake);
 
        /* Compute sample position */
+       int grid_loc[3];
        float pos[3];
-       copy_v3_v3(pos, egrid->corner);
-       madd_v3_v3fl(pos, egrid->increment_x, lbake->grid_sample % 
prb->grid_resolution_x);
-       madd_v3_v3fl(pos, egrid->increment_y, lbake->grid_sample / 
prb->grid_resolution_x);
-       madd_v3_v3fl(pos, egrid->increment_z, lbake->grid_sample / 
(prb->grid_resolution_x * prb->grid_resolution_y));
+       cell_id_to_grid_loc(egrid, lbake->grid_sample, grid_loc);
+       grid_loc_to_world_loc(egrid, grid_loc, pos);
 
        /* Disable specular lighting when rendering probes to avoid feedback 
loops (looks bad). */
        common_data->spec_toggle = false;
        common_data->prb_num_planar = 0;
        common_data->prb_num_render_cube = 0;
        common_data->prb_num_render_grid = 0;
+       egrid->level_bias = 1.0f; /* No bias */
        DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
 
        int sample_offset = egrid->offset + lbake->grid_sample;
@@ -507,6 +530,8 @@ static void eevee_lightbake_render_probe(void *ved, void 
*user_data)
        EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
        EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
        EEVEE_LightBake *lbake = (EEVEE_LightBake *)user_data;
+       EEVEE_LightProbe *eprobe = lbake->cube;
+       LightProbe *prb = *lbake->probe;
 
        /* TODO do this once for the whole bake when we have independant 
DRWManagers. */
        eevee_lightbake_cache_create(vedata, lbake);
@@ -517,8 +542,8 @@ static void eevee_lightbake_render_probe(void *ved, void 
*user_data)
        common_data->prb_num_render_cube = 0;
        DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
 
-       EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, 
(float[3]){0.0f}, 1.0f, 10.0f);
-       EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, 
lbake->store_fb, 0, 1.0);
+       EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, 
eprobe->position, prb->clipsta, prb->clipend);
+       EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, 
lbake->store_fb, lbake->cube_offset, prb->intensity);
 }
 
 static void eevee_lightbake_gather_probes(EEVEE_LightBake *lbake)
@@ -603,8 +628,7 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, 
short *do_update, float
        }
 
        /* Render irradiance grids */
-       lbake->bounce_curr = 0;
-       while (lbake->bounce_curr < lbake->bounce_count) {
+       for (lbake->bounce_curr = 0; lbake->bounce_curr < lbake->bounce_count; 
++lbake->bounce_curr) {
                lcache->grid_count = 1; /* TODO Remove */
                /* Bypass world, start at 1. */
                lbake->probe = lbake->grid_prb + 1;
@@ -620,7 +644,6 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, 
short *do_update, float
                        }
                        lcache->grid_count += 1;
                }
-               lbake->bounce_curr += 1;
        }
 
        /* Render reflections */
@@ -629,7 +652,7 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, 
short *do_update, float
                /* Bypass world, start at 1. */
                lbake->probe = lbake->cube_prb + 1;
                lbake->cube = lcache->cube_data + 1;
-               for (int p = 1; p < lbake->cube_count; ++p, lbake->probe++, 
lbake->grid++) {
+               for (lbake->cube_offset = 1; lbake->cube_offset < 
lbake->cube_count; ++lbake->cube_offset, lbake->probe++, lbake->cube++) {
                        lightbake_do_sample(lbake, 
eevee_lightbake_render_probe);
                        lcache->cube_count += 1;
                }
diff --git a/source/blender/draw/engines/eevee/eevee_private.h 
b/source/blender/draw/engines/eevee/eevee_private.h
index 591a44e5544..d487a38d388 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -987,6 +987,9 @@ void EEVEE_render_update_passes(struct RenderEngine 
*engine, struct Scene *scene
 void EEVEE_lookdev_cache_init(EEVEE_Data *vedata, DRWShadingGroup **grp, 
GPUShader *shader, DRWPass *pass, struct World *world, EEVEE_LightProbesInfo 
*pinfo);
 void EEVEE_lookdev_draw_background(EEVEE_Data *vedata);
 
+/** eevee_engine.c */
+void EEVEE_cache_populate(void *vedata, Object *ob);
+
 /* Shadow Matrix */
 static const float texcomat[4][4] = { /* From NDC to TexCo */
        {0.5f, 0.0f, 0.0f, 0.0f},
diff --git a/source/blender/draw/engines/eevee/eevee_render.c 
b/source/blender/draw/engines/eevee/eevee_render.c
index d24551976f9..935c667d261 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -134,17 +134,20 @@ void EEVEE_render_init(EEVEE_Data *ved, RenderEngine 
*engine, struct Depsgraph *
        EEVEE_volumes_cache_init(sldata, vedata);
 }
 
+/* Used by light cache. in this case engine is NULL. */
 void EEVEE_render_cache(
         void *vedata, struct Object *ob,
         struct RenderEngine *engine, struct Depsgraph *UNUSED(depsgraph))
 {
        EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
-
-       char info[42];
-       BLI_snprintf(info, sizeof(info), "Syncing %s", ob->id.name + 2);
-       RE_engine_update_stats(engine, NULL, info);
        bool cast_shadow = false;
 
+       if (engine) {
+               char info[42];
+               BLI_snprintf(info, sizeof(info), "Syncing %s", ob->id.name + 2);
+               RE_engine_update_stats(engine, NULL, info);
+       }
+
        if (ob->base_flag & BASE_VISIBLED) {
                EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow);
        }
diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl 
b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
index 644b449c03e..db1357cf884 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
@@ -404,7 +404,7 @@ void CLOSURE_NAME(
                spec_occlu = 1.0;
        }
 
-       out_spec += spec_accum.rgb * ssr_spec * spec_occlu * float(specToggle);
+       out_spec += spec_accum.rgb * ssr_spec * spec_occlu;
 #endif
 
 #ifdef CLOSURE_REFRACTION
@@ -419,7 +419,12 @@ void CLOSURE_NAME(
        vec2 C_brdf_lut = texture(utilTex, vec3(C_uv, 1.0)).rg;
        vec3 C_fresnel = F_ibl(vec3(0.04), brdf_lut) * specular_occlusion(NV, 
final_ao, C_roughness);
 
-       out_spec += C_spec_accum.rgb * C_fresnel * float(specToggle) * 
C_intensity;
+       out_spec += C_spec_accum.rgb * C_fresnel * C_intensity;
+#endif
+
+#ifdef CLOSURE_GLOSSY
+       /* Global toggle for lightprobe baking. */
+       out_spec *= float(specToggle);
 #endif
 
        /* ---------------------------------------------------------------- */
diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index a9879ce4b14..cc145f3a91d 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1612,6 +1612,8 @@ void DRW_custom_pipeline(
 
        drw_viewport_var_init();
 
+       DRW_hair_init();
+
        ViewportEngineData *data = 
drw_viewport_engine_data_ensure(draw_engine_type);
 
        /* Execute the callback */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to