[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