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:
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_lookdev.c')
-rw-r--r--source/blender/draw/engines/eevee/eevee_lookdev.c96
1 files changed, 53 insertions, 43 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lookdev.c b/source/blender/draw/engines/eevee/eevee_lookdev.c
index 94d61a81fcc..d39d2a61657 100644
--- a/source/blender/draw/engines/eevee/eevee_lookdev.c
+++ b/source/blender/draw/engines/eevee/eevee_lookdev.c
@@ -57,9 +57,9 @@ static void eevee_lookdev_lightcache_delete(EEVEE_Data *vedata)
}
void EEVEE_lookdev_cache_init(EEVEE_Data *vedata,
- DRWShadingGroup **grp,
+ EEVEE_ViewLayerData *sldata,
+ DRWShadingGroup **r_grp,
DRWPass *pass,
- float background_alpha,
World *UNUSED(world),
EEVEE_LightProbesInfo *pinfo)
{
@@ -69,13 +69,27 @@ void EEVEE_lookdev_cache_init(EEVEE_Data *vedata,
EEVEE_PrivateData *g_data = stl->g_data;
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
+ View3DShading *shading = &v3d->shading;
Scene *scene = draw_ctx->scene;
+ const bool probe_render = pinfo != NULL;
+
effects->lookdev_view = NULL;
if (LOOK_DEV_OVERLAY_ENABLED(v3d)) {
/* Viewport / Spheres size. */
- const rcti *rect = ED_region_visible_rect(draw_ctx->ar);
+ const rcti *rect;
+ rcti fallback_rect;
+ if (DRW_state_is_opengl_render()) {
+ const float *vp_size = DRW_viewport_size_get();
+ fallback_rect.xmax = vp_size[0];
+ fallback_rect.ymax = vp_size[1];
+ fallback_rect.xmin = fallback_rect.ymin = 0;
+ rect = &fallback_rect;
+ }
+ else {
+ rect = ED_region_visible_rect(draw_ctx->ar);
+ }
/* Make the viewport width scale the lookdev spheres a bit.
* Scale between 1000px and 2000px. */
@@ -95,21 +109,23 @@ void EEVEE_lookdev_cache_init(EEVEE_Data *vedata,
}
if (LOOK_DEV_STUDIO_LIGHT_ENABLED(v3d)) {
- StudioLight *sl = BKE_studiolight_find(v3d->shading.lookdev_light,
+ StudioLight *sl = BKE_studiolight_find(shading->lookdev_light,
STUDIOLIGHT_ORIENTATIONS_MATERIAL_MODE);
if (sl && (sl->flag & STUDIOLIGHT_TYPE_WORLD)) {
- GPUShader *shader = EEVEE_shaders_default_studiolight_sh_get();
- struct GPUBatch *geom = DRW_cache_fullscreen_quad_get();
- GPUTexture *tex = NULL;
+ GPUShader *shader = probe_render ? EEVEE_shaders_default_studiolight_sh_get() :
+ EEVEE_shaders_background_studiolight_sh_get();
+
+ const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph);
+ int cube_res = octahedral_size_from_cubesize(scene_eval->eevee.gi_cubemap_resolution);
/* If one of the component is missing we start from scratch. */
if ((stl->lookdev_grid_data == NULL) || (stl->lookdev_cube_data == NULL) ||
- (txl->lookdev_grid_tx == NULL) || (txl->lookdev_cube_tx == NULL)) {
+ (txl->lookdev_grid_tx == NULL) || (txl->lookdev_cube_tx == NULL) ||
+ (g_data->light_cache && g_data->light_cache->ref_res != cube_res)) {
eevee_lookdev_lightcache_delete(vedata);
}
if (stl->lookdev_lightcache == NULL) {
- const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph);
#if defined(IRRADIANCE_SH_L2)
int grid_res = 4;
#elif defined(IRRADIANCE_CUBEMAP)
@@ -117,11 +133,9 @@ void EEVEE_lookdev_cache_init(EEVEE_Data *vedata,
#elif defined(IRRADIANCE_HL2)
int grid_res = 4;
#endif
- int cube_res = OCTAHEDRAL_SIZE_FROM_CUBESIZE(scene_eval->eevee.gi_cubemap_resolution);
- int vis_res = scene_eval->eevee.gi_visibility_resolution;
stl->lookdev_lightcache = EEVEE_lightcache_create(
- 1, 1, cube_res, vis_res, (int[3]){grid_res, grid_res, 1});
+ 1, 1, cube_res, 8, (int[3]){grid_res, grid_res, 1});
/* XXX: Fix memleak. TODO find out why. */
MEM_SAFE_FREE(stl->lookdev_cube_mips);
@@ -138,49 +152,45 @@ void EEVEE_lookdev_cache_init(EEVEE_Data *vedata,
txl->lookdev_cube_tx = stl->lookdev_lightcache->cube_tx.tex;
}
- stl->g_data->light_cache = stl->lookdev_lightcache;
-
- static float background_color[4];
- UI_GetThemeColor4fv(TH_BACK, background_color);
- /* XXX: Really quick conversion to avoid washed out background.
- * Needs to be addressed properly (color managed using ocio). */
- srgb_to_linearrgb_v4(background_color, background_color);
-
- *grp = DRW_shgroup_create(shader, pass);
- axis_angle_to_mat3_single(
- stl->g_data->studiolight_matrix, 'Z', v3d->shading.studiolight_rot_z);
- DRW_shgroup_uniform_mat3(*grp, "StudioLightMatrix", stl->g_data->studiolight_matrix);
- DRW_shgroup_uniform_float_copy(*grp, "backgroundAlpha", background_alpha);
- DRW_shgroup_uniform_float(
- *grp, "studioLightIntensity", &v3d->shading.studiolight_intensity, 1);
-
- DRW_shgroup_uniform_vec3(*grp, "color", background_color, 1);
- DRW_shgroup_call(*grp, geom, NULL);
- if (!pinfo) {
+ g_data->light_cache = stl->lookdev_lightcache;
+
+ DRWShadingGroup *grp = *r_grp = DRW_shgroup_create(shader, pass);
+ axis_angle_to_mat3_single(g_data->studiolight_matrix, 'Z', shading->studiolight_rot_z);
+ DRW_shgroup_uniform_mat3(grp, "StudioLightMatrix", g_data->studiolight_matrix);
+
+ if (probe_render) {
+ DRW_shgroup_uniform_float_copy(
+ grp, "studioLightIntensity", shading->studiolight_intensity);
+ BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE);
+ DRW_shgroup_uniform_texture(grp, "image", sl->equirect_radiance_gputexture);
/* Do not fadeout when doing probe rendering, only when drawing the background */
- DRW_shgroup_uniform_float(
- *grp, "studioLightBackground", &v3d->shading.studiolight_background, 1);
- BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECT_IRRADIANCE_GPUTEXTURE);
- tex = sl->equirect_irradiance_gputexture;
+ DRW_shgroup_uniform_float_copy(grp, "backgroundAlpha", 1.0f);
}
else {
- DRW_shgroup_uniform_float_copy(*grp, "studioLightBackground", 1.0f);
- BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE);
- tex = sl->equirect_radiance_gputexture;
+ float background_alpha = g_data->background_alpha * shading->studiolight_background;
+ float studiolight_blur = powf(shading->studiolight_blur, 2.5f);
+ DRW_shgroup_uniform_float_copy(grp, "backgroundAlpha", background_alpha);
+ DRW_shgroup_uniform_float_copy(grp, "studioLightBlur", studiolight_blur);
+ DRW_shgroup_uniform_texture(grp, "probeCubes", txl->lookdev_cube_tx);
+ DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo);
+ DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo);
+ DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo);
+ DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
}
- DRW_shgroup_uniform_texture(*grp, "image", tex);
+
+ DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
/* Do we need to recalc the lightprobes? */
if (g_data->studiolight_index != sl->index ||
- g_data->studiolight_rot_z != v3d->shading.studiolight_rot_z ||
- g_data->studiolight_intensity != v3d->shading.studiolight_intensity ||
+ g_data->studiolight_rot_z != shading->studiolight_rot_z ||
+ g_data->studiolight_intensity != shading->studiolight_intensity ||
g_data->studiolight_cubemap_res != scene->eevee.gi_cubemap_resolution ||
g_data->studiolight_glossy_clamp != scene->eevee.gi_glossy_clamp ||
g_data->studiolight_filter_quality != scene->eevee.gi_filter_quality) {
stl->lookdev_lightcache->flag |= LIGHTCACHE_UPDATE_WORLD;
g_data->studiolight_index = sl->index;
- g_data->studiolight_rot_z = v3d->shading.studiolight_rot_z;
- g_data->studiolight_intensity = v3d->shading.studiolight_intensity;
+ g_data->studiolight_rot_z = shading->studiolight_rot_z;
+ g_data->studiolight_intensity = shading->studiolight_intensity;
g_data->studiolight_cubemap_res = scene->eevee.gi_cubemap_resolution;
g_data->studiolight_glossy_clamp = scene->eevee.gi_glossy_clamp;
g_data->studiolight_filter_quality = scene->eevee.gi_filter_quality;