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:
authorClément Foucault <foucault.clem@gmail.com>2019-05-20 19:01:42 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-05-22 14:29:04 +0300
commit45c085a1718eee2b5616dd2af7f37749f79ab593 (patch)
tree55bfec4b2bfd658019ebe0b0d65dfdcb01901251 /source/blender/draw/intern/draw_manager.c
parent88a725eff8f42bcaa5921f35b988fa07d0e619e7 (diff)
DRW: Add DRWView to improve different view handling
This will have multiple benefit. TODO detail benefits (culling, more explicit, handling of clipping planes) For now the view usage is wrapped to make changes needed more progressive.
Diffstat (limited to 'source/blender/draw/intern/draw_manager.c')
-rw-r--r--source/blender/draw/intern/draw_manager.c87
1 files changed, 45 insertions, 42 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 8ded73aa678..90e1ff708d9 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -538,9 +538,11 @@ static void drw_viewport_cache_resize(void)
BLI_memblock_clear(DST.vmempool->calls, NULL);
BLI_memblock_clear(DST.vmempool->states, NULL);
+ BLI_memblock_clear(DST.vmempool->cullstates, NULL);
BLI_memblock_clear(DST.vmempool->shgroups, NULL);
BLI_memblock_clear(DST.vmempool->uniforms, NULL);
BLI_memblock_clear(DST.vmempool->passes, NULL);
+ BLI_memblock_clear(DST.vmempool->views, NULL);
BLI_memblock_clear(DST.vmempool->images, NULL);
}
@@ -611,12 +613,18 @@ static void drw_viewport_var_init(void)
if (DST.vmempool->states == NULL) {
DST.vmempool->states = BLI_memblock_create(sizeof(DRWCallState), false);
}
+ if (DST.vmempool->cullstates == NULL) {
+ DST.vmempool->cullstates = BLI_memblock_create(sizeof(DRWCullingState), false);
+ }
if (DST.vmempool->shgroups == NULL) {
DST.vmempool->shgroups = BLI_memblock_create(sizeof(DRWShadingGroup), false);
}
if (DST.vmempool->uniforms == NULL) {
DST.vmempool->uniforms = BLI_memblock_create(sizeof(DRWUniform), false);
}
+ if (DST.vmempool->views == NULL) {
+ DST.vmempool->views = BLI_memblock_create(sizeof(DRWView), false);
+ }
if (DST.vmempool->passes == NULL) {
DST.vmempool->passes = BLI_memblock_create(sizeof(DRWPass), false);
}
@@ -638,31 +646,38 @@ static void drw_viewport_var_init(void)
DST.vmempool = NULL;
}
+ DST.primary_view_ct = 0;
+
if (rv3d != NULL) {
- /* Refresh DST.screenvecs */
- copy_v3_v3(DST.screenvecs[0], rv3d->viewinv[0]);
- copy_v3_v3(DST.screenvecs[1], rv3d->viewinv[1]);
- normalize_v3(DST.screenvecs[0]);
- normalize_v3(DST.screenvecs[1]);
+ normalize_v3_v3(DST.screenvecs[0], rv3d->viewinv[0]);
+ normalize_v3_v3(DST.screenvecs[1], rv3d->viewinv[1]);
- /* Refresh DST.pixelsize */
DST.pixsize = rv3d->pixsize;
+ DST.view_default = DRW_view_create(rv3d->viewmat, rv3d->winmat, NULL, NULL, NULL);
+ copy_v4_v4(DST.view_default->storage.viewcamtexcofac, rv3d->viewcamtexcofac);
- copy_m4_m4(DST.original_mat.mat[DRW_MAT_PERS], rv3d->persmat);
- copy_m4_m4(DST.original_mat.mat[DRW_MAT_PERSINV], rv3d->persinv);
- copy_m4_m4(DST.original_mat.mat[DRW_MAT_VIEW], rv3d->viewmat);
- copy_m4_m4(DST.original_mat.mat[DRW_MAT_VIEWINV], rv3d->viewinv);
- copy_m4_m4(DST.original_mat.mat[DRW_MAT_WIN], rv3d->winmat);
- invert_m4_m4(DST.original_mat.mat[DRW_MAT_WININV], rv3d->winmat);
-
- memcpy(DST.view_data.matstate.mat, DST.original_mat.mat, sizeof(DST.original_mat.mat));
+ if (DST.draw_ctx.sh_cfg == GPU_SHADER_CFG_CLIPPED) {
+ int plane_len = (rv3d->viewlock & RV3D_BOXCLIP) ? 4 : 6;
+ DRW_view_clip_planes_set(DST.view_default, rv3d->clip, plane_len);
+ }
- copy_v4_v4(DST.view_data.viewcamtexcofac, rv3d->viewcamtexcofac);
+ /* TODO should be set to NULL. */
+ DST.view_active = DRW_view_create(rv3d->viewmat, rv3d->winmat, NULL, NULL, NULL);
}
else {
- copy_v4_fl4(DST.view_data.viewcamtexcofac, 1.0f, 1.0f, 0.0f, 0.0f);
+ zero_v3(DST.screenvecs[0]);
+ zero_v3(DST.screenvecs[1]);
+
+ 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);
}
+ /* fclem: Is this still needed ? */
if (DST.draw_ctx.object_edit) {
ED_view3d_init_mats_rv3d(DST.draw_ctx.object_edit, rv3d);
}
@@ -674,61 +689,49 @@ static void drw_viewport_var_init(void)
G_draw.view_ubo = DRW_uniformbuffer_create(sizeof(ViewUboStorage), NULL);
}
- DST.override_mat = 0;
- DST.dirty_mat = true;
- DST.state_cache_id = 1;
-
- DST.clipping.updated = false;
-
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);
+ // BLI_assert(((DST.override_mat & (1 << type)) != 0) || DST.draw_ctx.rv3d != NULL);
- copy_m4_m4(mat, DST.view_data.matstate.mat[type]);
+ copy_m4_m4(mat, DST.view_active->storage.matstate.mat[type]);
}
void DRW_viewport_matrix_get_all(DRWMatrixState *state)
{
- memcpy(state, DST.view_data.matstate.mat, sizeof(DRWMatrixState));
+ 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_data.matstate.mat[type], mat);
- DST.override_mat |= (1 << type);
- DST.dirty_mat = true;
- DST.clipping.updated = false;
+ 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_data.matstate.mat[type], DST.original_mat.mat[type]);
- DST.override_mat &= ~(1 << type);
- DST.dirty_mat = true;
- DST.clipping.updated = false;
+ 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_data.matstate.mat, state, sizeof(DRWMatrixState));
- DST.override_mat = 0xFFFFFF;
- DST.dirty_mat = true;
- DST.clipping.updated = false;
+ memcpy(DST.view_active->storage.matstate.mat, state, sizeof(DRWMatrixState));
+ DST.view_active->is_dirty = true;
}
void DRW_viewport_matrix_override_unset_all(void)
{
- memcpy(DST.view_data.matstate.mat, DST.original_mat.mat, sizeof(DRWMatrixState));
- DST.override_mat = 0;
- DST.dirty_mat = true;
- DST.clipping.updated = false;
+ DRW_viewport_matrix_override_set_all(&DST.view_default->storage.matstate);
}
bool DRW_viewport_is_persp_get(void)
@@ -738,7 +741,7 @@ bool DRW_viewport_is_persp_get(void)
return rv3d->is_persp;
}
else {
- return DST.view_data.matstate.mat[DRW_MAT_WIN][3][3] == 0.0f;
+ return DST.view_active->storage.matstate.winmat[3][3] == 0.0f;
}
}