[Bf-blender-cvs] [800641a77f9] master: Eevee: Make Planar reflections work with the new DRWView system
Clément Foucault
noreply at git.blender.org
Wed May 22 13:30:40 CEST 2019
Commit: 800641a77f9c12c9df76089b4ca18901390ac8c5
Author: Clément Foucault
Date: Tue May 21 17:53:49 2019 +0200
Branches: master
https://developer.blender.org/rB800641a77f9c12c9df76089b4ca18901390ac8c5
Eevee: Make Planar reflections work with the new DRWView system
Also get rid of clip_block which did the same as clipplanes inside
common_view_lib.glsl.
===================================================================
M source/blender/draw/engines/eevee/eevee_data.c
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_lightprobes.c
M source/blender/draw/engines/eevee/eevee_materials.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_vert.glsl
M source/blender/draw/engines/eevee/shaders/prepass_vert.glsl
M source/blender/draw/intern/draw_manager_data.c
===================================================================
diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index b7b8702b41a..0ce271275d0 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -62,7 +62,6 @@ void EEVEE_view_layer_data_free(void *storage)
DRW_UBO_FREE_SAFE(sldata->grid_ubo);
DRW_UBO_FREE_SAFE(sldata->planar_ubo);
DRW_UBO_FREE_SAFE(sldata->common_ubo);
- DRW_UBO_FREE_SAFE(sldata->clip_ubo);
}
EEVEE_ViewLayerData *EEVEE_view_layer_data_get(void)
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 35614ac79fc..bb37f36f935 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -79,9 +79,6 @@ static void eevee_engine_init(void *ved)
sldata->common_ubo = DRW_uniformbuffer_create(sizeof(sldata->common_data),
&sldata->common_data);
}
- if (sldata->clip_ubo == NULL) {
- sldata->clip_ubo = DRW_uniformbuffer_create(sizeof(sldata->clip_data), &sldata->clip_data);
- }
/* EEVEE_effects_init needs to go first for TAA */
EEVEE_effects_init(sldata, vedata, camera, false);
@@ -209,12 +206,22 @@ static void eevee_draw_background(void *vedata)
/* Copy previous persmat to UBO data */
copy_m4_m4(sldata->common_data.prev_persmat, stl->effects->prev_persmat);
+ /* Refresh Probes */
+ DRW_stats_group_start("Probes Refresh");
+ EEVEE_lightprobes_refresh(sldata, vedata);
+ EEVEE_lightprobes_refresh_planar(sldata, vedata);
+ DRW_stats_group_end();
+
+ /* Refresh shadows */
+ DRW_stats_group_start("Shadows");
+ EEVEE_draw_shadows(sldata, vedata, stl->effects->taa_view);
+ DRW_stats_group_end();
+
if (((stl->effects->enabled_effects & EFFECT_TAA) != 0) &&
(stl->effects->taa_current_sample > 1) && !DRW_state_is_image_render() &&
!taa_use_reprojection) {
DRW_view_set_active(stl->effects->taa_view);
}
-
/* when doing viewport rendering the overrides needs to be recalculated for
* every loop as this normally happens once inside
* `EEVEE_temporal_sampling_init` */
@@ -223,21 +230,6 @@ static void eevee_draw_background(void *vedata)
EEVEE_temporal_sampling_update_matrices(vedata);
}
- /* Refresh Probes */
- DRW_stats_group_start("Probes Refresh");
- EEVEE_lightprobes_refresh(sldata, vedata);
- /* Probes refresh can have reset the current sample. */
- if (stl->effects->taa_current_sample == 1) {
- DRW_viewport_matrix_override_unset_all();
- }
- EEVEE_lightprobes_refresh_planar(sldata, vedata);
- DRW_stats_group_end();
-
- /* Refresh shadows */
- DRW_stats_group_start("Shadows");
- EEVEE_draw_shadows(sldata, vedata, stl->effects->taa_view);
- DRW_stats_group_end();
-
/* Set ray type. */
sldata->common_data.ray_type = EEVEE_RAY_CAMERA;
sldata->common_data.ray_depth = 0.0f;
@@ -301,9 +293,7 @@ static void eevee_draw_background(void *vedata)
EEVEE_draw_effects(sldata, vedata);
DRW_stats_group_end();
- if ((stl->effects->taa_current_sample > 1)) {
- DRW_view_set_active(NULL);
- }
+ DRW_view_set_active(NULL);
}
/* Tonemapping and transfer result to default framebuffer. */
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index 3e0e5f6d00f..a3cab92774e 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -724,9 +724,6 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb
sldata->common_ubo = DRW_uniformbuffer_create(sizeof(sldata->common_data),
&sldata->common_data);
}
- if (sldata->clip_ubo == NULL) {
- sldata->clip_ubo = DRW_uniformbuffer_create(sizeof(sldata->clip_data), &sldata->clip_data);
- }
/* HACK: set txl->color but unset it before Draw Manager frees it. */
txl->color = lbake->rt_color;
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 9b193c3a837..90802a8ef00 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -679,22 +679,35 @@ void EEVEE_lightprobes_planar_data_from_object(Object *ob,
eplanar->attenuation_bias = max_dist * -eplanar->attenuation_scale;
}
-static void lightbake_planar_compute_render_matrices(EEVEE_PlanarReflection *eplanar,
- DRWMatrixState *r_matstate,
- const float viewmat[4][4],
- const float winmat[4][4])
+static void lightbake_planar_ensure_view(EEVEE_PlanarReflection *eplanar,
+ const DRWView *main_view,
+ DRWView **r_planar_view)
{
+ float winmat[4][4], viewmat[4][4];
+ DRW_view_viewmat_get(main_view, viewmat, false);
/* Temporal sampling jitter should be already applied to the DRW_MAT_WIN. */
- copy_m4_m4(r_matstate->winmat, winmat);
+ DRW_view_winmat_get(main_view, winmat, false);
/* Invert X to avoid flipping the triangle facing direction. */
- r_matstate->winmat[0][0] = -r_matstate->winmat[0][0];
- r_matstate->winmat[1][0] = -r_matstate->winmat[1][0];
- r_matstate->winmat[2][0] = -r_matstate->winmat[2][0];
- r_matstate->winmat[3][0] = -r_matstate->winmat[3][0];
+ winmat[0][0] = -winmat[0][0];
+ winmat[1][0] = -winmat[1][0];
+ winmat[2][0] = -winmat[2][0];
+ winmat[3][0] = -winmat[3][0];
/* Reflect Camera Matrix. */
- mul_m4_m4m4(r_matstate->viewmat, viewmat, eplanar->mtx);
- /* Apply Projection Matrix. */
- mul_m4_m4m4(r_matstate->persmat, r_matstate->winmat, r_matstate->viewmat);
+ mul_m4_m4m4(viewmat, viewmat, eplanar->mtx);
+
+ if (*r_planar_view == NULL) {
+ *r_planar_view = DRW_view_create(
+ viewmat, winmat, NULL, NULL, EEVEE_lightprobes_obj_visibility_cb);
+ /* Compute offset plane equation (fix missing texels near reflection plane). */
+ float clip_plane[4];
+ copy_v4_v4(clip_plane, eplanar->plane_equation);
+ clip_plane[3] += eplanar->clipsta;
+ /* Set clipping plane */
+ DRW_view_clip_planes_set(*r_planar_view, &clip_plane, 1);
+ }
+ else {
+ DRW_view_update(*r_planar_view, viewmat, winmat, NULL, NULL);
+ }
}
static void eevee_lightprobes_extract_from_cache(EEVEE_LightProbesInfo *pinfo, LightCache *lcache)
@@ -762,7 +775,7 @@ void EEVEE_lightprobes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved
}
}
- if (pinfo->num_planar) {
+ if (pinfo->num_planar > 0) {
EEVEE_PassList *psl = vedata->psl;
EEVEE_TextureList *txl = vedata->txl;
DRW_PASS_CREATE(psl->probe_planar_downsample_ps, DRW_STATE_WRITE_COLOR);
@@ -824,21 +837,16 @@ static void render_reflections(void (*callback)(int face, EEVEE_BakeRenderData *
EEVEE_PlanarReflection *planar_data,
int ref_count)
{
- DRWMatrixState matstate;
-
- float original_viewmat[4][4], original_winmat[4][4];
- DRW_viewport_matrix_get(original_viewmat, DRW_MAT_VIEW);
- DRW_viewport_matrix_get(original_winmat, DRW_MAT_WIN);
-
+ EEVEE_StorageList *stl = user_data->vedata->stl;
+ DRWView *main_view = stl->effects->taa_view;
+ DRWView **views = stl->g_data->planar_views;
+ /* Prepare views at the same time for faster culling. */
for (int i = 0; i < ref_count; ++i) {
- /* Setup custom matrices */
- lightbake_planar_compute_render_matrices(
- planar_data + i, &matstate, original_viewmat, original_winmat);
- invert_m4_m4(matstate.persinv, matstate.persmat);
- invert_m4_m4(matstate.viewinv, matstate.viewmat);
- invert_m4_m4(matstate.wininv, matstate.winmat);
- DRW_viewport_matrix_override_set_all(&matstate);
+ lightbake_planar_ensure_view(&planar_data[i], main_view, &views[i]);
+ }
+ for (int i = 0; i < ref_count; ++i) {
+ DRW_view_set_active(views[i]);
callback(i, user_data);
}
}
@@ -912,9 +920,9 @@ static void lightbake_render_scene_reflected(int layer, EEVEE_BakeRenderData *us
EEVEE_ViewLayerData *sldata = user_data->sldata;
EEVEE_PassList *psl = vedata->psl;
EEVEE_TextureList *txl = vedata->txl;
+ EEVEE_StorageList *stl = vedata->stl;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_LightProbesInfo *pinfo = sldata->probes;
- EEVEE_PlanarReflection *eplanar = pinfo->planar_data + layer;
GPU_framebuffer_ensure_config(&fbl->planarref_fb,
{GPU_ATTACHMENT_TEXTURE_LAYER(txl->planar_depth, layer),
@@ -930,18 +938,10 @@ static void lightbake_render_scene_reflected(int layer, EEVEE_BakeRenderData *us
txl->planar_pool = e_data.planar_pool_placeholder;
txl->planar_depth = e_data.depth_array_placeholder;
- /* Be sure that cascaded shadow maps are updated. */
DRW_stats_group_start("Planar Reflection");
/* Be sure that cascaded shadow maps are updated. */
- EEVEE_draw_shadows(sldata, vedata, NULL /* TODO */);
-
- /* Compute offset plane equation (fix missing texels near reflection plane). */
- copy_v4_v4(sldata->clip_data.clip_planes[0], eplanar->plane_equation);
- sldata->clip_data.clip_planes[0][3] += eplanar->clipsta;
- /* Set clipping plane */
- DRW_uniformbuffer_update(sldata->clip_ubo, &sldata->clip_data);
- DRW_state_clip_planes_len_set(1);
+ EEVEE_draw_shadows(sldata, vedata, stl->g_data->planar_views[layer]);
GPU_framebuffer_bind(fbl->planarref_fb);
GPU_framebuffer_clear_depth(fbl->planarref_fb, 1.0);
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 45b007782ba..6757c8e8958 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -386,7 +386,6 @@ static void add_standard_uniforms(DRWShadingGroup *shgrp,
DRW_shgroup_uniform_block(shgrp, "light_block", sldata
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list