Alleviate grid creating shadows in Ambient Occlusion effect.

Draw the grid last with depth masking disabled. That should have no ill
effects otherwise as far as I can tell except from some exceptional
cases (axis lines over grid) but this is hardly annoying.

Generally to properly solve such issues we need to have a better render
pipeline with wire objects/materials being drawn after compositing. This
is not impossible but for now doing it the simple way.
This commit is contained in:
Antony Riakiotakis 2015-02-13 11:52:27 +01:00
parent e652f781a3
commit c01a2aa4bb

@ -295,7 +295,7 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char **
dx = fabs(x - (wx) * fx / fw); dx = fabs(x - (wx) * fx / fw);
if (dx == 0) dx = fabs(y - (wy) * fy / fw); if (dx == 0) dx = fabs(y - (wy) * fy / fw);
glDepthMask(0); /* disable write in zbuffer */ glDepthMask(GL_FALSE); /* disable write in zbuffer */
/* check zoom out */ /* check zoom out */
UI_ThemeColor(TH_GRID); UI_ThemeColor(TH_GRID);
@ -434,7 +434,7 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char **
fdrawline(x, 0.0, x, (float)ar->winy); fdrawline(x, 0.0, x, (float)ar->winy);
glDepthMask(1); /* enable write in zbuffer */ glDepthMask(GL_TRUE); /* enable write in zbuffer */
} }
#undef GRID_MIN_PX #undef GRID_MIN_PX
@ -476,8 +476,7 @@ static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
grid_scale = ED_view3d_grid_scale(scene, v3d, grid_unit); grid_scale = ED_view3d_grid_scale(scene, v3d, grid_unit);
grid = gridlines * grid_scale; grid = gridlines * grid_scale;
if (v3d->zbuf && scene->obedit) glDepthMask(GL_FALSE);
glDepthMask(0); /* for zbuffer-select */
UI_GetThemeColor3ubv(TH_GRID, col_grid); UI_GetThemeColor3ubv(TH_GRID, col_grid);
@ -546,7 +545,7 @@ static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
} }
} }
if (v3d->zbuf && scene->obedit) glDepthMask(1); glDepthMask(GL_TRUE);
} }
@ -2668,6 +2667,8 @@ static void view3d_draw_objects(
RegionView3D *rv3d = ar->regiondata; RegionView3D *rv3d = ar->regiondata;
Base *base; Base *base;
const bool do_camera_frame = !draw_offscreen; const bool do_camera_frame = !draw_offscreen;
const bool draw_floor = (rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO);
const bool draw_grids = !draw_offscreen && (v3d->flag2 & V3D_RENDER_OVERRIDE) == 0;
if (!draw_offscreen) { if (!draw_offscreen) {
ED_region_draw_cb_draw(C, ar, REGION_DRAW_PRE_VIEW); ED_region_draw_cb_draw(C, ar, REGION_DRAW_PRE_VIEW);
@ -2698,26 +2699,21 @@ static void view3d_draw_objects(
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
} }
if (!draw_offscreen) { /* ortho grid goes first, does not write to depth buffer and doesn't need depth test so it will override
* objects if done last */
if (draw_grids) {
/* needs to be done always, gridview is adjusted in drawgrid() now, but only for ortho views. */ /* needs to be done always, gridview is adjusted in drawgrid() now, but only for ortho views. */
rv3d->gridview = ED_view3d_grid_scale(scene, v3d, grid_unit); rv3d->gridview = ED_view3d_grid_scale(scene, v3d, grid_unit);
if ((rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO)) { if (!draw_floor) {
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { ED_region_pixelspace(ar);
drawfloor(scene, v3d, grid_unit); *grid_unit = NULL; /* drawgrid need this to detect/affect smallest valid unit... */
} drawgrid(&scene->unit, ar, v3d, grid_unit);
} /* XXX make function? replaces persp(1) */
else { glMatrixMode(GL_PROJECTION);
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { glLoadMatrixf(rv3d->winmat);
ED_region_pixelspace(ar); glMatrixMode(GL_MODELVIEW);
*grid_unit = NULL; /* drawgrid need this to detect/affect smallest valid unit... */ glLoadMatrixf(rv3d->viewmat);
drawgrid(&scene->unit, ar, v3d, grid_unit);
/* XXX make function? replaces persp(1) */
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(rv3d->winmat);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(rv3d->viewmat);
}
} }
} }
@ -2806,6 +2802,11 @@ static void view3d_draw_objects(
if (v3d->afterdraw_xray.first) view3d_draw_xray(scene, ar, v3d, true); if (v3d->afterdraw_xray.first) view3d_draw_xray(scene, ar, v3d, true);
if (v3d->afterdraw_xraytransp.first) view3d_draw_xraytransp(scene, ar, v3d, true); if (v3d->afterdraw_xraytransp.first) view3d_draw_xraytransp(scene, ar, v3d, true);
/* perspective floor goes last to use scene depth and avoid writing to depth buffer */
if (draw_grids && draw_floor) {
drawfloor(scene, v3d, grid_unit);
}
if (!draw_offscreen) { if (!draw_offscreen) {
ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW); ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
} }
@ -3546,7 +3547,7 @@ static void view3d_main_area_draw_objects(const bContext *C, Scene *scene, View3
if (do_compositing) { if (do_compositing) {
GPU_fx_do_composite_pass(rv3d->compositor, rv3d->winmat, rv3d->is_persp, scene, NULL); GPU_fx_do_composite_pass(rv3d->compositor, rv3d->winmat, rv3d->is_persp, scene, NULL);
} }
/* Disable back anti-aliasing */ /* Disable back anti-aliasing */
if (U.ogl_multisamples != USER_MULTISAMPLE_NONE) { if (U.ogl_multisamples != USER_MULTISAMPLE_NONE) {
glDisable(GL_MULTISAMPLE_ARB); glDisable(GL_MULTISAMPLE_ARB);