[Bf-blender-cvs] [974c0cc7b68] blender2.8: Eevee: First commit of Probe support.

Clément Foucault noreply at git.blender.org
Fri Jun 9 01:27:25 CEST 2017


Commit: 974c0cc7b68da305a21c551c4298e38940e301ad
Author: Clément Foucault
Date:   Thu Jun 8 21:48:50 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB974c0cc7b68da305a21c551c4298e38940e301ad

Eevee: First commit of Probe support.

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

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_materials.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_probes.c
M	source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
M	source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl

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

diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index 66cb82ae277..514953f3d51 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -70,6 +70,13 @@ static void eevee_lamp_data_free(void *storage)
 	BLI_freelistN(&led->shadow_caster_list);
 }
 
+static void eevee_probe_data_free(void *storage)
+{
+	EEVEE_ProbeEngineData *ped = (EEVEE_ProbeEngineData *)storage;
+
+	BLI_freelistN(&ped->captured_object_list);
+}
+
 EEVEE_SceneLayerData *EEVEE_scene_layer_data_get(void)
 {
 	EEVEE_SceneLayerData **sldata = (EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &eevee_scene_layer_data_free);
@@ -92,6 +99,18 @@ EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob)
 	return *oedata;
 }
 
+EEVEE_ProbeEngineData *EEVEE_probe_data_get(Object *ob)
+{
+	EEVEE_ProbeEngineData **pedata = (EEVEE_ProbeEngineData **)DRW_object_engine_data_get(ob, &draw_engine_eevee_type, &eevee_probe_data_free);
+
+	if (*pedata == NULL) {
+		*pedata = MEM_callocN(sizeof(**pedata), "EEVEE_ProbeEngineData");
+		(*pedata)->need_update = true;
+	}
+
+	return *pedata;
+}
+
 EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob)
 {
 	EEVEE_LampEngineData **ledata = (EEVEE_LampEngineData **)DRW_object_engine_data_get(ob, &draw_engine_eevee_type, &eevee_lamp_data_free);
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 2a75777c15e..46d1a6e1ac0 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -104,6 +104,9 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
 			oedata->need_update = ((ob->deg_update_flag & DEG_RUNTIME_DATA_UPDATE) != 0);
 		}
 	}
+	else if (ob->type == OB_PROBE) {
+		EEVEE_probes_cache_add(sldata, ob);
+	}
 	else if (ob->type == OB_LAMP) {
 		EEVEE_lights_cache_add(sldata, ob);
 	}
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index a5f29872e58..6baa5351e3b 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -244,7 +244,7 @@ struct GPUMaterial *EEVEE_material_mesh_probe_get(struct Scene *scene, Material
 	return GPU_material_from_nodetree(
 	    scene, ma->nodetree, &ma->gpumaterial, &DRW_engine_viewport_eevee_type,
 	    VAR_MAT_MESH | VAR_MAT_PROBE,
-	    datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, e_data.frag_shader_lib,
+	    datatoc_probe_vert_glsl, NULL, e_data.frag_shader_lib,
 	    SHADER_DEFINES "#define MESH_SHADER\n" "#define PROBE_CAPTURE\n");
 }
 
@@ -263,7 +263,7 @@ static void add_standard_uniforms(DRWShadingGroup *shgrp, EEVEE_SceneLayerData *
 	DRW_shgroup_uniform_block(shgrp, "light_block", sldata->light_ubo);
 	DRW_shgroup_uniform_block(shgrp, "shadow_block", sldata->shadow_ubo);
 	DRW_shgroup_uniform_int(shgrp, "light_count", &sldata->lamps->num_light, 1);
-	DRW_shgroup_uniform_int(shgrp, "probe_count", &sldata->probes->num_cube, 1);
+	DRW_shgroup_uniform_int(shgrp, "probe_count", &sldata->probes->num_render_probe, 1);
 	DRW_shgroup_uniform_float(shgrp, "lodMax", &sldata->probes->lodmax, 1);
 	DRW_shgroup_uniform_texture(shgrp, "utilTex", e_data.util_tex);
 	DRW_shgroup_uniform_buffer(shgrp, "probeCubes", &sldata->probe_pool);
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 84c6de8593c..eb89ee999f4 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -48,6 +48,7 @@ typedef struct EEVEE_PassList {
 
 	/* Probes */
 	struct DRWPass *probe_background;
+	struct DRWPass *probe_meshes;
 	struct DRWPass *probe_prefilter;
 	struct DRWPass *probe_sh_compute;
 
@@ -166,14 +167,17 @@ enum {
 
 /* ************ PROBE UBO ************* */
 typedef struct EEVEE_Probe {
-	float position[3], dist;
-	float shcoefs[9][3], pad;
+	float position[3], pad1;
+	float shcoefs[9][3], pad2;
+	float attenuation_bias, attenuation_scale, pad3[2];
 } EEVEE_Probe;
 
 /* ************ PROBE DATA ************* */
 typedef struct EEVEE_ProbesInfo {
 	int num_cube, cache_num_cube;
 	int update_flag;
+	/* Actual number of probes that have datas. */
+	int num_render_probe;
 	/* For rendering probes */
 	float probemat[6][4][4];
 	int layer;
@@ -285,6 +289,12 @@ typedef struct EEVEE_LampEngineData {
 	void *storage; /* either EEVEE_LightData, EEVEE_ShadowCubeData, EEVEE_ShadowCascadeData */
 } EEVEE_LampEngineData;
 
+typedef struct EEVEE_ProbeEngineData {
+	bool need_update;
+	bool ready_to_shade;
+	struct ListBase captured_object_list;
+} EEVEE_ProbeEngineData;
+
 typedef struct EEVEE_ObjectEngineData {
 	bool need_update;
 } EEVEE_ObjectEngineData;
@@ -309,6 +319,7 @@ typedef struct EEVEE_PrivateData {
 /* eevee_data.c */
 EEVEE_SceneLayerData *EEVEE_scene_layer_data_get(void);
 EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob);
+EEVEE_ProbeEngineData *EEVEE_probe_data_get(Object *ob);
 EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob);
 
 
diff --git a/source/blender/draw/engines/eevee/eevee_probes.c b/source/blender/draw/engines/eevee/eevee_probes.c
index 10ba7bafde7..48947e004b6 100644
--- a/source/blender/draw/engines/eevee/eevee_probes.c
+++ b/source/blender/draw/engines/eevee/eevee_probes.c
@@ -26,22 +26,24 @@
 #include "DNA_world_types.h"
 #include "DNA_texture_types.h"
 #include "DNA_image_types.h"
+#include "DNA_probe_types.h"
+#include "DNA_view3d_types.h"
 
 #include "BLI_dynstr.h"
 
+#include "ED_screen.h"
+
 #include "DRW_render.h"
 
 #include "GPU_material.h"
 #include "GPU_texture.h"
 #include "GPU_glew.h"
 
+#include "DRW_render.h"
+
 #include "eevee_engine.h"
 #include "eevee_private.h"
 
-typedef struct EEVEE_ProbeCubeData {
-	short probe_id;
-} EEVEE_ProbeCubeData;
-
 /* TODO Option */
 #define PROBE_CUBE_SIZE 512
 #define PROBE_SIZE 1024
@@ -54,6 +56,7 @@ static struct {
 	struct GPUTexture *hammersley;
 
 	bool update_world;
+	bool world_ready_to_shade;
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_default_world_frag_glsl[];
@@ -156,7 +159,7 @@ void EEVEE_probes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl)
 	memset(pinfo->probes_ref, 0, sizeof(pinfo->probes_ref));
 
 	{
-		psl->probe_background = DRW_pass_create("World Probe Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR);
+		psl->probe_background = DRW_pass_create("World Probe Pass", DRW_STATE_WRITE_COLOR);
 
 		struct Batch *geom = DRW_cache_fullscreen_quad_get();
 		DRWShadingGroup *grp = NULL;
@@ -203,6 +206,10 @@ void EEVEE_probes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl)
 	}
 
 	{
+		psl->probe_meshes = DRW_pass_create("Probe Meshes", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+	}
+
+	{
 		psl->probe_prefilter = DRW_pass_create("Probe Filtering", DRW_STATE_WRITE_COLOR);
 
 		struct Batch *geom = DRW_cache_fullscreen_quad_get();
@@ -236,84 +243,90 @@ void EEVEE_probes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl)
 	}
 }
 
-void EEVEE_probes_cache_add(EEVEE_SceneLayerData *UNUSED(sldata), Object *UNUSED(ob))
+void EEVEE_probes_cache_add(EEVEE_SceneLayerData *sldata, Object *ob)
 {
-	return;
+	EEVEE_ProbesInfo *pinfo = sldata->probes;
+
+	/* Step 1 find all lamps in the scene and setup them */
+	if (pinfo->num_cube > MAX_PROBE) {
+		printf("Too much probes in the scene !!!\n");
+		pinfo->num_cube = MAX_PROBE;
+	}
+	else {
+		EEVEE_ProbeEngineData *ped = EEVEE_probe_data_get(ob);
+
+		if ((ob->deg_update_flag & DEG_RUNTIME_DATA_UPDATE) != 0) {
+			ped->need_update = true;
+		}
+
+		if (e_data.update_world) {
+			ped->need_update = true;
+		}
+
+		pinfo->probes_ref[pinfo->num_cube] = ob;
+		pinfo->num_cube++;
+	}
+}
+
+static void EEVEE_probes_updates(EEVEE_SceneLayerData *sldata)
+{
+	EEVEE_ProbesInfo *pinfo = sldata->probes;
+	Object *ob;
+
+	for (int i = 1; (ob = pinfo->probes_ref[i]) && (i < MAX_PROBE); i++) {
+		Probe *probe = (Probe *)ob->data;
+		EEVEE_Probe *eprobe = &pinfo->probe_data[i];
+
+		float dist_minus_falloff = probe->dist - (1.0f - probe->falloff) * probe->dist;
+		eprobe->attenuation_bias = probe->dist / max_ff(1e-8f, dist_minus_falloff);
+		eprobe->attenuation_scale = 1.0f / max_ff(1e-8f, dist_minus_falloff);
+	}
 }
 
 void EEVEE_probes_cache_finish(EEVEE_SceneLayerData *sldata)
 {
 	EEVEE_ProbesInfo *pinfo = sldata->probes;
+	Object *ob;
 
 	/* Setup enough layers. */
 	/* Free textures if number mismatch. */
 	if (pinfo->num_cube != pinfo->cache_num_cube) {
 		DRW_TEXTURE_FREE_SAFE(sldata->probe_pool);
-		pinfo->cache_num_cube = pinfo->num_cube;
-		pinfo->update_flag |= PROBE_UPDATE_CUBE;
 	}
 
 	if (!sldata->probe_pool) {
 		sldata->probe_pool = DRW_texture_create_2D_array(PROBE_SIZE, PROBE_SIZE, max_ff(1, pinfo->num_cube),
 		                                                 DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL);
+		if (sldata->probe_filter_fb) {
+			DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->probe_pool, 0, 0);
+		}
+
+		/* Tag probes to refresh */
+		e_data.update_world = true;
+		e_data.world_ready_to_shade = false;
+		pinfo->num_render_probe = 0;
+		pinfo->update_flag |= PROBE_UPDATE_CUBE;
+		pinfo->cache_num_cube = pinfo->num_cube;
+
+		for (int i = 1; (ob = pinfo->probes_ref[i]) && (i < MAX_PROBE); i++) {
+			EEVEE_ProbeEngineData *ped = EEVEE_probe_data_get(ob);
+			ped->need_update = true;
+			ped->ready_to_shade = false;
+		}
 	}
 
 	DRWFboTexture tex_filter = {&sldata->probe_pool, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP};
 
 	DRW_framebuffer_init(&sldata->probe_filter_fb, &draw_engine_eevee_type, PROBE_SIZE, PROBE_SIZE, &tex_filter, 1);
 
+	EEVEE_probes_updates(sldata);
+
 	DRW_uniformbuffer_update(sldata->probe_ubo, &sldata->probes->probe_data);
 }
 
-/* Renders the probe with index probe_idx.
- * Renders the world probe if probe_idx = -1. */
-static void render_one_probe(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl, int probe_idx)
+static void filter_probe(EEVEE_Probe *eprobe, EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl, int 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list