diff options
author | Mike Erwin <significant.bit@gmail.com> | 2016-10-25 11:39:55 +0300 |
---|---|---|
committer | Mike Erwin <significant.bit@gmail.com> | 2016-10-25 11:39:55 +0300 |
commit | bc566e9393212fd37a3d6d7d3a8eee8a1f61d9b8 (patch) | |
tree | 707db51509ccc853b58f084f6264939e01ef9661 /source/blender/editors/space_view3d/view3d_draw.c | |
parent | 94e14a2c43f60ce13bda9375d3fd6c07e964d896 (diff) |
OpenGL: 3D View background & depth buffer details
Surveying buffer usage & clears for new viewport. Not yet perfect, but closer. Committing from Mac so I can test this on Windows.
Using new matrix API (T49450) for gradient background.
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_draw.c')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 112 |
1 files changed, 59 insertions, 53 deletions
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 2e08030f49b..baa69d13ea8 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -53,6 +53,7 @@ #include "ED_screen.h" #include "ED_transform.h" +#include "GPU_matrix.h" #include "GPU_immediate.h" #include "GPU_material.h" #include "GPU_viewport.h" @@ -766,7 +767,7 @@ static bool view3d_draw_render_draw(const bContext *C, Scene *scene, glClearColor(0.0f, 0.0f, 0.0f, 0.0f); /* don't change depth buffer */ - glClear(GL_COLOR_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT); /* is this necessary? -- merwin */ /* render result draw */ type = rv3d->render_engine->type; @@ -787,45 +788,41 @@ static bool view3d_draw_render_draw(const bContext *C, Scene *scene, /* ******************** background plates ***************** */ -static void view3d_draw_background_none() +static void view3d_draw_background_gradient() { - if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) { - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); + gpuMatrixBegin3D(); /* TODO: finish 2D API */ - glClear(GL_DEPTH_BUFFER_BIT); - glDisable(GL_DEPTH_TEST); + glClear(GL_DEPTH_BUFFER_BIT); - VertexFormat *format = immVertexFormat(); - unsigned pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT); - unsigned color = add_attrib(format, "color", GL_UNSIGNED_BYTE, 3, NORMALIZE_INT_TO_FLOAT); - unsigned char col_hi[3], col_lo[3]; + VertexFormat *format = immVertexFormat(); + unsigned pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT); + unsigned color = add_attrib(format, "color", GL_UNSIGNED_BYTE, 3, NORMALIZE_INT_TO_FLOAT); + unsigned char col_hi[3], col_lo[3]; - immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR); + immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR); - UI_GetThemeColor3ubv(TH_LOW_GRAD, col_lo); - UI_GetThemeColor3ubv(TH_HIGH_GRAD, col_hi); + UI_GetThemeColor3ubv(TH_LOW_GRAD, col_lo); + UI_GetThemeColor3ubv(TH_HIGH_GRAD, col_hi); - immBegin(GL_QUADS, 4); - immAttrib3ubv(color, col_lo); - immVertex2f(pos, -1.0f, -1.0f); - immVertex2f(pos, 1.0f, -1.0f); + immBegin(GL_QUADS, 4); + immAttrib3ubv(color, col_lo); + immVertex2f(pos, -1.0f, -1.0f); + immVertex2f(pos, 1.0f, -1.0f); - immAttrib3ubv(color, col_hi); - immVertex2f(pos, 1.0f, 1.0f); - immVertex2f(pos, -1.0f, 1.0f); - immEnd(); + immAttrib3ubv(color, col_hi); + immVertex2f(pos, 1.0f, 1.0f); + immVertex2f(pos, -1.0f, 1.0f); + immEnd(); - immUnbindProgram(); + immUnbindProgram(); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); + gpuMatrixEnd(); +} + +static void view3d_draw_background_none() +{ + if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) { + view3d_draw_background_gradient(); } else { UI_ThemeClearColorAlpha(TH_HIGH_GRAD, 1.0f); @@ -833,12 +830,6 @@ static void view3d_draw_background_none() } } -static void view3d_draw_background_gradient() -{ - /* TODO viewport */ - view3d_draw_background_none(); -} - static void view3d_draw_background_world(Scene *scene, View3D *v3d, RegionView3D *rv3d) { if (scene->world) { @@ -847,25 +838,26 @@ static void view3d_draw_background_world(Scene *scene, View3D *v3d, RegionView3D /* calculate full shader for background */ GPU_material_bind(gpumat, 1, 1, 1.0f, false, rv3d->viewmat, rv3d->viewinv, rv3d->viewcamtexcofac, (v3d->scenelock != 0)); - if (!GPU_material_bound(gpumat)) { - view3d_draw_background_none(); - } + if (GPU_material_bound(gpumat)) { - glClear(GL_DEPTH_BUFFER_BIT); - glDisable(GL_DEPTH_TEST); + glClear(GL_DEPTH_BUFFER_BIT); - /* TODO viewport (dfelinto): GPU_material_bind relies on immediate mode, - * we can't get rid of the following code without a bigger refactor - * or we dropping this functionality. */ + /* TODO viewport (dfelinto): GPU_material_bind relies on immediate mode, + * we can't get rid of the following code without a bigger refactor + * or we dropping this functionality. */ - glBegin(GL_TRIANGLE_STRIP); - glVertex2f(-1.0f, -1.0f); - glVertex2f(1.0f, -1.0f); - glVertex2f(-1.0f, 1.0f); - glVertex2f(1.0f, 1.0f); - glEnd(); + glBegin(GL_TRIANGLE_STRIP); + glVertex2f(-1.0f, -1.0f); + glVertex2f(1.0f, -1.0f); + glVertex2f(-1.0f, 1.0f); + glVertex2f(1.0f, 1.0f); + glEnd(); - GPU_material_unbind(gpumat); + GPU_material_unbind(gpumat); + } + else { + view3d_draw_background_none(); + } } else { view3d_draw_background_none(); @@ -883,6 +875,12 @@ static void view3d_draw_background(const bContext *C) View3D *v3d = CTX_wm_view3d(C); RegionView3D *rv3d = CTX_wm_region_view3d(C); + glDisable(GL_DEPTH_TEST); + /* Background functions do not read or write depth, but they do clear or completely + * overwrite color buffer. It's more efficient to clear color & depth in once call, so + * background functions do this even though they don't use depth. + */ + switch (v3d->debug.background) { case V3D_DEBUG_BACKGROUND_WORLD: view3d_draw_background_world(scene, v3d, rv3d); @@ -892,7 +890,7 @@ static void view3d_draw_background(const bContext *C) break; case V3D_DEBUG_BACKGROUND_NONE: default: - view3d_draw_background_none(v3d); + view3d_draw_background_none(); break; } } @@ -1101,7 +1099,9 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char ** glLineWidth(1.0f); +#if 0 /* TODO: write to UI/widget depth buffer, not scene depth */ glDepthMask(GL_FALSE); /* disable write in zbuffer */ +#endif VertexFormat* format = immVertexFormat(); unsigned pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT); @@ -1235,7 +1235,10 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char ** drawgrid_cleanup: immUnbindProgram(); + +#if 0 /* depth write is left enabled above */ glDepthMask(GL_TRUE); /* enable write in zbuffer */ +#endif } #undef DEBUG_GRID @@ -1453,6 +1456,7 @@ static void view3d_draw_grid(const bContext *C, ARegion *ar) rv3d->gridview = ED_view3d_grid_scale(scene, v3d, &grid_unit); glEnable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); /* read & test depth, but don't alter it. TODO: separate UI depth buffer */ if (!draw_floor) { ED_region_pixelspace(ar); @@ -1587,6 +1591,8 @@ static void draw_all_objects(const bContext *C, ARegion *ar, const bool only_dep if (only_depth || use_depth) { glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + glDepthMask(GL_TRUE); v3d->zbuf = true; } |