[Bf-blender-cvs] [04e4a0db0de] blender2.8: Eevee : Probe Grid : Fix Update tagging.
Clément Foucault
noreply at git.blender.org
Mon Oct 2 18:42:35 CEST 2017
Commit: 04e4a0db0dec2f52b0059c58c32fc5fa423a0407
Author: Clément Foucault
Date: Mon Oct 2 18:40:51 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB04e4a0db0dec2f52b0059c58c32fc5fa423a0407
Eevee : Probe Grid : Fix Update tagging.
===================================================================
M source/blender/draw/engines/eevee/eevee_lightprobes.c
M source/blender/draw/engines/eevee/eevee_private.h
===================================================================
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 924e83805b6..4928abe3b01 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -70,7 +70,7 @@ static struct {
struct GPUTexture *cube_face_depth;
struct GPUTexture *cube_face_minmaxz;
- bool update_world;
+ int update_world;
bool world_ready_to_shade;
} e_data = {NULL}; /* Engine data */
@@ -282,7 +282,11 @@ void EEVEE_lightprobes_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *UNUSED(ved
int prop_bounce_num = BKE_collection_engine_property_value_get_int(props, "gi_diffuse_bounces");
/* Update all probes if number of bounces mismatch. */
- e_data.update_world = (sldata->probes->num_bounce != prop_bounce_num);
+ if (sldata->probes->num_bounce != prop_bounce_num) {
+ e_data.update_world |= PROBE_UPDATE_ALL;
+ sldata->probes->updated_bounce = 0;
+ sldata->probes->grid_initialized = false;
+ }
sldata->probes->num_bounce = prop_bounce_num;
/* Setup Render Target Cubemap */
@@ -349,7 +353,11 @@ void EEVEE_lightprobes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *veda
float *col = ts.colorBackground;
if (wo) {
col = &wo->horr;
- e_data.update_world |= (wo->update_flag != 0);
+ if (wo->update_flag != 0) {
+ e_data.update_world |= PROBE_UPDATE_ALL;
+ pinfo->updated_bounce = 0;
+ pinfo->grid_initialized = false;
+ }
wo->update_flag = 0;
if (wo->use_nodes && wo->nodetree) {
@@ -492,8 +500,6 @@ void EEVEE_lightprobes_cache_add(EEVEE_SceneLayerData *sldata, Object *ob)
ped->updated_cells = 0;
ped->updated_lvl = 0;
ped->probe_id = 0;
- pinfo->updated_bounce = 0;
- pinfo->grid_initialized = false;
}
if (probe->type == LIGHTPROBE_TYPE_CUBE) {
@@ -781,10 +787,9 @@ void EEVEE_lightprobes_cache_finish(EEVEE_SceneLayerData *sldata, EEVEE_Data *ve
}
/* Tag probes to refresh */
- e_data.update_world = true;
+ e_data.update_world |= PROBE_UPDATE_CUBE;
e_data.world_ready_to_shade = false;
pinfo->num_render_cube = 0;
- pinfo->update_flag |= PROBE_UPDATE_CUBE;
pinfo->cache_num_cube = pinfo->num_cube;
for (int i = 1; (ob = pinfo->probes_cube_ref[i]) && (i < MAX_PROBE); i++) {
@@ -808,24 +813,17 @@ void EEVEE_lightprobes_cache_finish(EEVEE_SceneLayerData *sldata, EEVEE_Data *ve
#endif
/* TODO Allocate bigger storage if needed. */
- if (!sldata->irradiance_pool) {
- sldata->irradiance_pool = DRW_texture_create_2D(IRRADIANCE_POOL_SIZE, IRRADIANCE_POOL_SIZE, irradiance_format, DRW_TEX_FILTER, NULL);
- pinfo->num_render_grid = 0;
- pinfo->updated_bounce = 0;
- pinfo->grid_initialized = false;
-
- for (int i = 1; (ob = pinfo->probes_grid_ref[i]) && (i < MAX_PROBE); i++) {
- EEVEE_LightProbeEngineData *ped = EEVEE_lightprobe_data_get(ob);
- ped->need_update = true;
- ped->updated_cells = 0;
+ if (!sldata->irradiance_pool || !sldata->irradiance_rt) {
+ if (!sldata->irradiance_pool) {
+ sldata->irradiance_pool = DRW_texture_create_2D(IRRADIANCE_POOL_SIZE, IRRADIANCE_POOL_SIZE, irradiance_format, DRW_TEX_FILTER, NULL);
+ }
+ if (!sldata->irradiance_rt) {
+ sldata->irradiance_rt = DRW_texture_create_2D(IRRADIANCE_POOL_SIZE, IRRADIANCE_POOL_SIZE, irradiance_format, DRW_TEX_FILTER, NULL);
}
- }
-
- if (!sldata->irradiance_rt) {
- sldata->irradiance_rt = DRW_texture_create_2D(IRRADIANCE_POOL_SIZE, IRRADIANCE_POOL_SIZE, irradiance_format, DRW_TEX_FILTER, NULL);
pinfo->num_render_grid = 0;
pinfo->updated_bounce = 0;
pinfo->grid_initialized = false;
+ e_data.update_world |= PROBE_UPDATE_GRID;
for (int i = 1; (ob = pinfo->probes_grid_ref[i]) && (i < MAX_PROBE); i++) {
EEVEE_LightProbeEngineData *ped = EEVEE_lightprobe_data_get(ob);
@@ -1255,20 +1253,26 @@ void EEVEE_lightprobes_refresh(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
/* Render world in priority */
if (e_data.update_world) {
render_world_to_probe(sldata, psl);
- glossy_filter_probe(sldata, vedata, psl, 0);
- diffuse_filter_probe(sldata, vedata, psl, 0);
- SWAP(GPUTexture *, sldata->irradiance_pool, sldata->irradiance_rt);
+ if (e_data.update_world & PROBE_UPDATE_CUBE) {
+ glossy_filter_probe(sldata, vedata, psl, 0);
+ }
- DRW_framebuffer_texture_detach(sldata->probe_pool);
+ if (e_data.update_world & PROBE_UPDATE_GRID) {
+ diffuse_filter_probe(sldata, vedata, psl, 0);
- DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->irradiance_rt, 0, 0);
- DRW_draw_pass(psl->probe_grid_fill);
- DRW_framebuffer_texture_detach(sldata->irradiance_rt);
+ SWAP(GPUTexture *, sldata->irradiance_pool, sldata->irradiance_rt);
+
+ DRW_framebuffer_texture_detach(sldata->probe_pool);
- DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->probe_pool, 0, 0);
+ DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->irradiance_rt, 0, 0);
+ DRW_draw_pass(psl->probe_grid_fill);
+ DRW_framebuffer_texture_detach(sldata->irradiance_rt);
+
+ DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->probe_pool, 0, 0);
+ }
- e_data.update_world = false;
+ e_data.update_world = 0;
if (!e_data.world_ready_to_shade) {
e_data.world_ready_to_shade = true;
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index dad37f8e11e..3267b13e6ab 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -352,6 +352,8 @@ typedef struct EEVEE_LightProbesInfo {
/* EEVEE_LightProbesInfo->update_flag */
enum {
PROBE_UPDATE_CUBE = (1 << 0),
+ PROBE_UPDATE_GRID = (1 << 1),
+ PROBE_UPDATE_ALL = 0xFFFFFF,
};
/* ************ EFFECTS DATA ************* */
More information about the Bf-blender-cvs
mailing list