diff options
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_lookdev.c')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lookdev.c | 96 |
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; |