[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