From 9f3010e1c071fa7b99916b3d960e04855279a899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Tue, 21 May 2019 21:29:25 +0200 Subject: DRW: DRWView: Finish refactor --- source/blender/draw/engines/eevee/eevee_render.c | 2 +- .../draw/engines/eevee/eevee_screen_raytrace.c | 2 +- source/blender/draw/engines/eevee/eevee_volumes.c | 2 +- .../blender/draw/engines/gpencil/gpencil_render.c | 2 +- .../draw/engines/workbench/workbench_studiolight.c | 4 +- source/blender/draw/intern/DRW_render.h | 47 +++--------- source/blender/draw/intern/draw_manager.c | 88 +--------------------- source/blender/draw/intern/draw_manager_data.c | 12 +-- source/blender/draw/intern/draw_manager_exec.c | 10 ++- 9 files changed, 29 insertions(+), 140 deletions(-) (limited to 'source/blender/draw') diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 5141b3716f7..df587424ba2 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -350,7 +350,7 @@ static void eevee_render_result_z(RenderLayer *rl, BLI_rcti_size_y(rect), rp->rect); - bool is_persp = DRW_viewport_is_persp_get(); + bool is_persp = DRW_view_is_persp_get(NULL); float viewmat[4][4]; DRW_view_viewmat_get(NULL, viewmat, false); diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c index ca6c9cdbe94..33a8383fe90 100644 --- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c +++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c @@ -127,7 +127,7 @@ int EEVEE_screen_raytrace_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) &fbl->refract_fb, {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->refract_color)}); } - const bool is_persp = DRW_viewport_is_persp_get(); + const bool is_persp = DRW_view_is_persp_get(NULL); if (effects->ssr_was_persp != is_persp) { effects->ssr_was_persp = is_persp; DRW_viewport_request_redraw(); diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c index e4d95ee9efb..59f144b1faf 100644 --- a/source/blender/draw/engines/eevee/eevee_volumes.c +++ b/source/blender/draw/engines/eevee/eevee_volumes.c @@ -246,7 +246,7 @@ void EEVEE_volumes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_view_winmat_get(NULL, invproj, true); EEVEE_update_viewvecs(invproj, winmat, sldata->common_data.view_vecs); - if (DRW_viewport_is_persp_get()) { + if (DRW_view_is_persp_get(NULL)) { float sample_distribution = scene_eval->eevee.volumetric_sample_distribution; sample_distribution = 4.0f * (1.00001f - sample_distribution); diff --git a/source/blender/draw/engines/gpencil/gpencil_render.c b/source/blender/draw/engines/gpencil/gpencil_render.c index e4d099fbfdb..8f3382fc138 100644 --- a/source/blender/draw/engines/gpencil/gpencil_render.c +++ b/source/blender/draw/engines/gpencil/gpencil_render.c @@ -207,7 +207,7 @@ static void GPENCIL_render_result_z(struct RenderLayer *rl, BLI_rcti_size_y(rect), rp->rect); - bool is_persp = DRW_viewport_is_persp_get(); + bool is_persp = DRW_view_is_persp_get(NULL); GPENCIL_render_update_vecs(vedata); diff --git a/source/blender/draw/engines/workbench/workbench_studiolight.c b/source/blender/draw/engines/workbench/workbench_studiolight.c index fbe538c5994..944bca73993 100644 --- a/source/blender/draw/engines/workbench/workbench_studiolight.c +++ b/source/blender/draw/engines/workbench/workbench_studiolight.c @@ -165,12 +165,12 @@ void studiolight_update_light(WORKBENCH_PrivateData *wpd, const float light_dire } float planes[6][4]; - DRW_culling_frustum_planes_get(planes); + DRW_culling_frustum_planes_get(NULL, planes); /* we only need the far plane. */ copy_v4_v4(wpd->shadow_far_plane, planes[2]); BoundBox frustum_corners; - DRW_culling_frustum_corners_get(&frustum_corners); + DRW_culling_frustum_corners_get(NULL, &frustum_corners); mul_v3_mat3_m4v3(wpd->shadow_near_corners[0], wpd->shadow_inv, frustum_corners.vec[0]); mul_v3_mat3_m4v3(wpd->shadow_near_corners[1], wpd->shadow_inv, frustum_corners.vec[3]); diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 378bb23188c..bf24708a0ec 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -578,50 +578,21 @@ bool DRW_culling_box_test(const DRWView *view, const BoundBox *bbox); bool DRW_culling_plane_test(const DRWView *view, const float plane[4]); /* Viewport */ -typedef enum { - /* keep in sync with the union struct DRWMatrixState. */ - DRW_MAT_PERS = 0, - DRW_MAT_PERSINV, - DRW_MAT_VIEW, - DRW_MAT_VIEWINV, - DRW_MAT_WIN, - DRW_MAT_WININV, - - DRW_MAT_COUNT, // Don't use this. -} DRWViewportMatrixType; typedef struct DRWMatrixState { - union { - float mat[DRW_MAT_COUNT][4][4]; - struct { - /* keep in sync with the enum DRWViewportMatrixType. */ - float persmat[4][4]; - float persinv[4][4]; - float viewmat[4][4]; - float viewinv[4][4]; - float winmat[4][4]; - float wininv[4][4]; - }; - }; + /* keep in sync with the enum DRWViewportMatrixType. */ + float persmat[4][4]; + float persinv[4][4]; + float viewmat[4][4]; + float viewinv[4][4]; + float winmat[4][4]; + float wininv[4][4]; } DRWMatrixState; -void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type); -void DRW_viewport_matrix_get_all(DRWMatrixState *state); -void DRW_viewport_matrix_override_set(const float mat[4][4], DRWViewportMatrixType type); -void DRW_viewport_matrix_override_set_all(DRWMatrixState *state); -void DRW_viewport_matrix_override_unset(DRWViewportMatrixType type); -void DRW_viewport_matrix_override_unset_all(void); - -/* These are in view-space so negative if in perspective. - * Extract near and far clip distance from the projection matrix. */ -float DRW_viewport_near_distance_get(void); -float DRW_viewport_far_distance_get(void); - const float *DRW_viewport_size_get(void); const float *DRW_viewport_invert_size_get(void); const float *DRW_viewport_screenvecs_get(void); const float *DRW_viewport_pixelsize_get(void); -bool DRW_viewport_is_persp_get(void); struct DefaultFramebufferList *DRW_viewport_framebuffer_list_get(void); struct DefaultTextureList *DRW_viewport_texture_list_get(void); @@ -687,8 +658,8 @@ void DRW_state_lock(DRWState state); void DRW_state_clip_planes_len_set(uint plane_len); -void DRW_culling_frustum_corners_get(BoundBox *corners); -void DRW_culling_frustum_planes_get(float planes[6][4]); +void DRW_culling_frustum_corners_get(const DRWView *view, BoundBox *corners); +void DRW_culling_frustum_planes_get(const DRWView *view, float planes[6][4]); /* Selection */ void DRW_select_load_id(uint id); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 5f0fb582c34..a86b8e9d508 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -661,8 +661,7 @@ static void drw_viewport_var_init(void) DRW_view_clip_planes_set(DST.view_default, rv3d->clip, plane_len); } - /* TODO should be set to NULL. */ - DST.view_active = DRW_view_create(rv3d->viewmat, rv3d->winmat, NULL, NULL, NULL); + DST.view_active = DST.view_default; } else { zero_v3(DST.screenvecs[0]); @@ -670,11 +669,7 @@ static void drw_viewport_var_init(void) DST.pixsize = 1.0f; DST.view_default = NULL; - - /* TODO should be set to NULL. */ - float mat[4][4]; - unit_m4(mat); - DST.view_active = DRW_view_create(mat, mat, NULL, NULL, NULL); + DST.view_active = NULL; } /* fclem: Is this still needed ? */ @@ -692,85 +687,6 @@ static void drw_viewport_var_init(void) memset(DST.object_instance_data, 0x0, sizeof(DST.object_instance_data)); } -/* TODO remove all of the DRW_viewport_matrix_* functions. */ - -void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type) -{ - BLI_assert(type >= 0 && type < DRW_MAT_COUNT); - /* Can't use this in render mode. */ - // BLI_assert(((DST.override_mat & (1 << type)) != 0) || DST.draw_ctx.rv3d != NULL); - - copy_m4_m4(mat, DST.view_active->storage.matstate.mat[type]); -} - -void DRW_viewport_matrix_get_all(DRWMatrixState *state) -{ - memcpy(state, DST.view_active->storage.matstate.mat, sizeof(DRWMatrixState)); -} - -void DRW_viewport_matrix_override_set(const float mat[4][4], DRWViewportMatrixType type) -{ - BLI_assert(type < DRW_MAT_COUNT); - copy_m4_m4(DST.view_active->storage.matstate.mat[type], mat); - DST.view_active->is_dirty = true; -} - -void DRW_viewport_matrix_override_unset(DRWViewportMatrixType type) -{ - BLI_assert(type < DRW_MAT_COUNT); - copy_m4_m4(DST.view_active->storage.matstate.mat[type], - DST.view_default->storage.matstate.mat[type]); - DST.view_active->is_dirty = true; -} - -void DRW_viewport_matrix_override_set_all(DRWMatrixState *state) -{ - memcpy(DST.view_active->storage.matstate.mat, state, sizeof(DRWMatrixState)); - DST.view_active->is_dirty = true; -} - -void DRW_viewport_matrix_override_unset_all(void) -{ - DRW_viewport_matrix_override_set_all(&DST.view_default->storage.matstate); -} - -bool DRW_viewport_is_persp_get(void) -{ - RegionView3D *rv3d = DST.draw_ctx.rv3d; - if (rv3d) { - return rv3d->is_persp; - } - else { - return DST.view_active->storage.matstate.winmat[3][3] == 0.0f; - } -} - -float DRW_viewport_near_distance_get(void) -{ - float projmat[4][4]; - DRW_viewport_matrix_get(projmat, DRW_MAT_WIN); - - if (DRW_viewport_is_persp_get()) { - return -projmat[3][2] / (projmat[2][2] - 1.0f); - } - else { - return -(projmat[3][2] + 1.0f) / projmat[2][2]; - } -} - -float DRW_viewport_far_distance_get(void) -{ - float projmat[4][4]; - DRW_viewport_matrix_get(projmat, DRW_MAT_WIN); - - if (DRW_viewport_is_persp_get()) { - return -projmat[3][2] / (projmat[2][2] + 1.0f); - } - else { - return -(projmat[3][2] - 1.0f) / projmat[2][2]; - } -} - DefaultFramebufferList *DRW_viewport_framebuffer_list_get(void) { return GPU_viewport_framebuffer_list_get(DST.viewport); diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 4e8544f14fd..7981f1367dd 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -1488,13 +1488,13 @@ void DRW_view_frustum_planes_get(const DRWView *view, float planes[6][4]) bool DRW_view_is_persp_get(const DRWView *view) { - view = (view) ? view : DST.view_active; + view = (view) ? view : DST.view_default; return view->storage.matstate.winmat[3][3] == 0.0f; } float DRW_view_near_distance_get(const DRWView *view) { - view = (view) ? view : DST.view_active; + view = (view) ? view : DST.view_default; const float(*projmat)[4] = view->storage.matstate.winmat; if (DRW_view_is_persp_get(view)) { @@ -1507,7 +1507,7 @@ float DRW_view_near_distance_get(const DRWView *view) float DRW_view_far_distance_get(const DRWView *view) { - view = (view) ? view : DST.view_active; + view = (view) ? view : DST.view_default; const float(*projmat)[4] = view->storage.matstate.winmat; if (DRW_view_is_persp_get(view)) { @@ -1520,21 +1520,21 @@ float DRW_view_far_distance_get(const DRWView *view) void DRW_view_viewmat_get(const DRWView *view, float mat[4][4], bool inverse) { - view = (view) ? view : DST.view_active; + view = (view) ? view : DST.view_default; const DRWMatrixState *state = &view->storage.matstate; copy_m4_m4(mat, (inverse) ? state->viewinv : state->viewmat); } void DRW_view_winmat_get(const DRWView *view, float mat[4][4], bool inverse) { - view = (view) ? view : DST.view_active; + view = (view) ? view : DST.view_default; const DRWMatrixState *state = &view->storage.matstate; copy_m4_m4(mat, (inverse) ? state->wininv : state->winmat); } void DRW_view_persmat_get(const DRWView *view, float mat[4][4], bool inverse) { - view = (view) ? view : DST.view_active; + view = (view) ? view : DST.view_default; const DRWMatrixState *state = &view->storage.matstate; copy_m4_m4(mat, (inverse) ? state->persinv : state->persmat); } diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index 36e9244df06..2687d0ea094 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -501,14 +501,16 @@ bool DRW_culling_plane_test(const DRWView *view, const float plane[4]) return draw_culling_plane_test(&view->frustum_corners, plane); } -void DRW_culling_frustum_corners_get(BoundBox *corners) +void DRW_culling_frustum_corners_get(const DRWView *view, BoundBox *corners) { - *corners = DST.view_active->frustum_corners; + view = view ? view : DST.view_default; + *corners = view->frustum_corners; } -void DRW_culling_frustum_planes_get(float planes[6][4]) +void DRW_culling_frustum_planes_get(const DRWView *view, float planes[6][4]) { - memcpy(planes, DST.view_active->frustum_planes, sizeof(float) * 6 * 4); + view = view ? view : DST.view_default; + memcpy(planes, view->frustum_planes, sizeof(float) * 6 * 4); } static void draw_compute_culling(DRWView *view) -- cgit v1.2.3