diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-05-21 21:24:54 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-05-22 14:29:05 +0300 |
commit | 2d2ff27ce80daeb26aeb65fdf3bbe6741e7cad46 (patch) | |
tree | a0f2dc9442aafa51d615bd2e834ce18e55675f24 /source/blender | |
parent | 800641a77f9c12c9df76089b4ca18901390ac8c5 (diff) |
Eevee: Make lightprobes work with new DRWView system
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lightcache.c | 11 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lightprobes.c | 73 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_private.h | 7 |
3 files changed, 55 insertions, 36 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c index a3cab92774e..264008bf5f2 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.c +++ b/source/blender/draw/engines/eevee/eevee_lightcache.c @@ -717,8 +717,15 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb stl->g_data->background_alpha = 1.0f; /* XXX TODO remove this. This is in order to make the init functions work. */ - DRWMatrixState dummy_mats = {{{{{0}}}}}; - DRW_viewport_matrix_override_set_all(&dummy_mats); + if (DRW_view_default_get() == NULL) { + float winmat[4][4], viewmat[4][4]; + unit_m4(viewmat); + unit_m4(winmat); + negate_v3(winmat[2]); + DRWView *view = DRW_view_create(viewmat, winmat, NULL, NULL, NULL); + DRW_view_default_set(view); + DRW_view_set_active(view); + } if (sldata->common_ubo == NULL) { sldata->common_ubo = DRW_uniformbuffer_create(sizeof(sldata->common_data), diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 90802a8ef00..388a8b5e73d 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -167,7 +167,9 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) e_data.hammersley = create_hammersley_sample_texture(HAMMERSLEY_SIZE); } + memset(stl->g_data->bake_views, 0, sizeof(stl->g_data->bake_views)); memset(stl->g_data->cube_views, 0, sizeof(stl->g_data->cube_views)); + memset(stl->g_data->world_views, 0, sizeof(stl->g_data->world_views)); memset(stl->g_data->planar_views, 0, sizeof(stl->g_data->planar_views)); /* Use fallback if we don't have gpu texture allocated an we cannot restore them. */ @@ -802,32 +804,43 @@ typedef struct EEVEE_BakeRenderData { static void render_cubemap(void (*callback)(int face, EEVEE_BakeRenderData *user_data), EEVEE_BakeRenderData *user_data, const float pos[3], - float clipsta, - float clipend) + float near, + float far, + bool do_culling) { - DRWMatrixState matstate; + EEVEE_StorageList *stl = user_data->vedata->stl; + DRWView **views = do_culling ? stl->g_data->bake_views : stl->g_data->world_views; - /* Move to capture position */ - float posmat[4][4]; - unit_m4(posmat); - negate_v3_v3(posmat[3], pos); + float winmat[4][4], viewmat[4][4]; + perspective_m4(winmat, -near, near, -near, near, near, far); - perspective_m4(matstate.winmat, -clipsta, clipsta, -clipsta, clipsta, clipsta, clipend); - invert_m4_m4(matstate.wininv, matstate.winmat); + /* Prepare views at the same time for faster culling. */ + for (int i = 0; i < 6; i++) { + unit_m4(viewmat); + negate_v3_v3(viewmat[3], pos); + mul_m4_m4m4(viewmat, cubefacemat[i], viewmat); + + if (do_culling) { + if (views[i] == NULL) { + views[i] = DRW_view_create(viewmat, winmat, NULL, NULL, NULL); + } + else { + DRW_view_update(views[i], viewmat, winmat, NULL, NULL); + } + } + else { + if (views[i] == NULL) { + const DRWView *default_view = DRW_view_default_get(); + views[i] = DRW_view_create_sub(default_view, viewmat, winmat); + } + else { + DRW_view_update_sub(views[i], viewmat, winmat); + } + } + } - /* 1 - Render to each cubeface individually. - * We do this instead of using geometry shader because a) it's faster, - * b) it's easier than fixing the nodetree shaders (for view dependent effects). */ for (int i = 0; i < 6; ++i) { - /* Setup custom matrices */ - mul_m4_m4m4(matstate.viewmat, cubefacemat[i], posmat); - mul_m4_m4m4(matstate.persmat, matstate.winmat, matstate.viewmat); - invert_m4_m4(matstate.persinv, matstate.persmat); - invert_m4_m4(matstate.viewinv, matstate.viewmat); - invert_m4_m4(matstate.wininv, matstate.winmat); - - DRW_viewport_matrix_override_set_all(&matstate); - + DRW_view_set_active(views[i]); callback(i, user_data); } } @@ -872,17 +885,20 @@ void EEVEE_lightbake_render_world(EEVEE_ViewLayerData *UNUSED(sldata), .face_fb = face_fb, }; - render_cubemap(lightbake_render_world_face, &brdata, (float[3]){0.0f}, 1.0f, 10.0f); + render_cubemap(lightbake_render_world_face, &brdata, (float[3]){0.0f}, 1.0f, 10.0f, false); } static void lightbake_render_scene_face(int face, EEVEE_BakeRenderData *user_data) { EEVEE_ViewLayerData *sldata = user_data->sldata; EEVEE_PassList *psl = user_data->vedata->psl; + EEVEE_PrivateData *g_data = user_data->vedata->stl->g_data; + DRWView **views = g_data->bake_views; + struct GPUFrameBuffer **face_fb = user_data->face_fb; /* Be sure that cascaded shadow maps are updated. */ - EEVEE_draw_shadows(sldata, user_data->vedata, NULL /* TODO */); + EEVEE_draw_shadows(sldata, user_data->vedata, views[face]); GPU_framebuffer_bind(face_fb[face]); GPU_framebuffer_clear_depth(face_fb[face], 1.0f); @@ -911,7 +927,7 @@ void EEVEE_lightbake_render_scene(EEVEE_ViewLayerData *sldata, .face_fb = face_fb, }; - render_cubemap(lightbake_render_scene_face, &brdata, pos, near_clip, far_clip); + render_cubemap(lightbake_render_scene_face, &brdata, pos, near_clip, far_clip, true); } static void lightbake_render_scene_reflected(int layer, EEVEE_BakeRenderData *user_data) @@ -1225,7 +1241,6 @@ void EEVEE_lightprobes_refresh_planar(EEVEE_ViewLayerData *sldata, EEVEE_Data *v { EEVEE_CommonUniformBuffer *common_data = &sldata->common_data; EEVEE_LightProbesInfo *pinfo = sldata->probes; - DRWMatrixState saved_mats; if (pinfo->num_planar == 0) { /* Disable SSR if we cannot read previous frame */ @@ -1234,9 +1249,6 @@ void EEVEE_lightprobes_refresh_planar(EEVEE_ViewLayerData *sldata, EEVEE_Data *v return; } - /* We need to save the Matrices before overidding them */ - DRW_viewport_matrix_get_all(&saved_mats); - /* Temporary Remove all planar reflections (avoid lag effect). */ common_data->prb_num_planar = 0; /* Turn off ssr to avoid black specular */ @@ -1265,8 +1277,6 @@ void EEVEE_lightprobes_refresh_planar(EEVEE_ViewLayerData *sldata, EEVEE_Data *v EEVEE_lightbake_filter_planar(vedata); } - DRW_viewport_matrix_override_set_all(&saved_mats); - if (DRW_state_is_image_render()) { /* Sort transparents because planar reflections could have re-sorted them. */ DRW_pass_sort_shgroup_z(vedata->psl->transparent_pass); @@ -1284,10 +1294,7 @@ void EEVEE_lightprobes_refresh(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) if ((light_cache->flag & LIGHTCACHE_UPDATE_WORLD) && (light_cache->flag & LIGHTCACHE_BAKED) == 0) { - DRWMatrixState saved_mats; - DRW_viewport_matrix_get_all(&saved_mats); EEVEE_lightbake_update_world_quick(sldata, vedata, scene_eval); - DRW_viewport_matrix_override_set_all(&saved_mats); } } diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index a44d1389bc7..2e652dff232 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -836,8 +836,13 @@ typedef struct EEVEE_PrivateData { float studiolight_glossy_clamp; float studiolight_filter_quality; - /** For rendering probes and shadows. */ + /** For rendering shadows. */ struct DRWView *cube_views[6]; + /** For rendering probes. */ + struct DRWView *bake_views[6]; + /** Same as bake_views but does not generate culling infos. */ + struct DRWView *world_views[6]; + /** For rendering planar reflections. */ struct DRWView *planar_views[MAX_PLANAR]; } EEVEE_PrivateData; /* Transient data */ |