Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-04-24 13:45:59 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-04-24 13:48:43 +0300
commit15bfa175f849d2ca97b6680046db8b52fc0df4b7 (patch)
tree22867f822aeb674593c7420821827faddea44a04 /source/blender/draw/engines/eevee/eevee_lightprobes.c
parent2ff8f965dfa5f680f613fc33425281e398893f49 (diff)
EEVEE: LightProbe: Implement Visibility Group.
Works on every probe type. The function to see is EEVEE_lightprobes_obj_visibility_cb. Set pinfo->vis_data.cached to true makes the computation faster for multiple views using the same group. We could even sort the probes by group for that mater to speed things up even more (only applies to dynamic probes like the planar reflections because other probes are only rendered one at a time).
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_lightprobes.c')
-rw-r--r--source/blender/draw/engines/eevee/eevee_lightprobes.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 59e8e76bc52..3a7aa2b75d9 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -36,6 +36,7 @@
#include "DNA_view3d_types.h"
#include "BKE_object.h"
+#include "BKE_group.h"
#include "MEM_guardedalloc.h"
#include "GPU_material.h"
@@ -386,6 +387,9 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat
EEVEE_StorageList *stl = vedata->stl;
EEVEE_LightProbesInfo *pinfo = sldata->probes;
+ /* Make sure no aditionnal visibility check runs by default. */
+ pinfo->vis_data.group = NULL;
+
pinfo->do_cube_update = false;
pinfo->num_cube = 1; /* at least one for the world */
pinfo->num_grid = 1;
@@ -571,6 +575,30 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat
}
}
+bool EEVEE_lightprobes_obj_visibility_cb(bool vis_in, void *user_data)
+{
+ EEVEE_ObjectEngineData *oed = (EEVEE_ObjectEngineData *)user_data;
+
+ /* test disabled if group is NULL */
+ if (oed->test_data->group == NULL)
+ return vis_in;
+
+ if (oed->test_data->cached == false)
+ oed->ob_vis_dirty = true;
+
+ /* early out, don't need to compute ob_vis yet. */
+ if (vis_in == false)
+ return vis_in;
+
+ if (oed->ob_vis_dirty) {
+ oed->ob_vis_dirty = false;
+ oed->ob_vis = BKE_group_object_exists(oed->test_data->group, oed->ob);
+ oed->ob_vis = (oed->test_data->invert) ? !oed->ob_vis : oed->ob_vis;
+ }
+
+ return vis_in && oed->ob_vis;
+}
+
void EEVEE_lightprobes_cache_add(EEVEE_ViewLayerData *sldata, Object *ob)
{
EEVEE_LightProbesInfo *pinfo = sldata->probes;
@@ -1228,6 +1256,9 @@ static void render_scene_to_probe(
DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
for (int i = 0; i < 6; ++i) {
+ /* Recompute only on 1st drawloop. */
+ pinfo->vis_data.cached = (i != 0);
+
/* Setup custom matrices */
mul_m4_m4m4(viewmat, cubefacemat[i], posmat);
mul_m4_m4m4(persmat, winmat, viewmat);
@@ -1260,6 +1291,9 @@ static void render_scene_to_probe(
DRW_draw_pass(psl->sss_pass); /* Only output standard pass */
}
+ /* Make sure no aditionnal visibility check runs after this. */
+ pinfo->vis_data.group = NULL;
+
/* Restore */
txl->planar_pool = tmp_planar_pool;
txl->maxzbuffer = tmp_maxz;
@@ -1269,6 +1303,7 @@ static void render_scene_to_planar(
EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, int layer,
EEVEE_LightProbeEngineData *ped)
{
+ EEVEE_LightProbesInfo *pinfo = sldata->probes;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_TextureList *txl = vedata->txl;
EEVEE_PassList *psl = vedata->psl;
@@ -1286,6 +1321,9 @@ static void render_scene_to_planar(
DRW_viewport_matrix_override_set_all(&ped->mats);
+ /* Don't reuse previous visibility. */
+ pinfo->vis_data.cached = false;
+
/* Be sure that cascaded shadow maps are updated. */
EEVEE_draw_shadows(sldata, psl);
@@ -1348,6 +1386,9 @@ static void render_scene_to_planar(
DRW_state_invert_facing();
DRW_state_clip_planes_reset();
+ /* Make sure no aditionnal visibility check runs after this. */
+ pinfo->vis_data.group = NULL;
+
/* Restore */
txl->planar_pool = tmp_planar_pool;
txl->planar_depth = tmp_planar_depth;
@@ -1499,6 +1540,9 @@ void EEVEE_lightprobes_refresh_planar(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
for (int i = 0; (ob = pinfo->probes_planar_ref[i]) && (i < MAX_PLANAR); i++) {
EEVEE_LightProbeEngineData *ped = EEVEE_lightprobe_data_ensure(ob);
+ LightProbe *prb = (LightProbe *)ob->data;
+ pinfo->vis_data.group = prb->visibility_grp;
+ pinfo->vis_data.invert = prb->flag & LIGHTPROBE_FLAG_INVERT_GROUP;
render_scene_to_planar(sldata, vedata, i, ped);
}
@@ -1546,6 +1590,8 @@ static void lightprobes_refresh_cube(EEVEE_ViewLayerData *sldata, EEVEE_Data *ve
continue;
}
LightProbe *prb = (LightProbe *)ob->data;
+ pinfo->vis_data.group = prb->visibility_grp;
+ pinfo->vis_data.invert = prb->flag & LIGHTPROBE_FLAG_INVERT_GROUP;
render_scene_to_probe(sldata, vedata, ob->obmat[3], prb->clipsta, prb->clipend);
glossy_filter_probe(sldata, vedata, psl, i, prb->intensity);
ped->need_update = false;
@@ -1652,6 +1698,8 @@ static void lightprobes_refresh_all_no_world(EEVEE_ViewLayerData *sldata, EEVEE_
egrid->level_bias = (float)(1 << 0);
DRW_uniformbuffer_update(sldata->grid_ubo, &sldata->probes->grid_data);
}
+ pinfo->vis_data.group = prb->visibility_grp;
+ pinfo->vis_data.invert = prb->flag & LIGHTPROBE_FLAG_INVERT_GROUP;
render_scene_to_probe(sldata, vedata, pos, prb->clipsta, prb->clipend);
diffuse_filter_probe(sldata, vedata, psl, egrid->offset + cell_id,
prb->clipsta, prb->clipend, egrid->visibility_range, prb->vis_blur,