diff options
author | mano-wii <germano.costa@ig.com.br> | 2018-10-30 21:31:32 +0300 |
---|---|---|
committer | mano-wii <germano.costa@ig.com.br> | 2018-10-30 21:31:32 +0300 |
commit | 603774c1eb8db827efc7a3bf9e81c230010eac8b (patch) | |
tree | fc08e863c3a0fdc9ae91c13b6ffd40a376a3adfa /source | |
parent | bf5ba496989ebb825b030f1583bfd8dc9b9a85ca (diff) |
Fix T56865: Selection of bones not working properly if the option `In Front` (old X-ray) is enabled
Differential Revision: https://developer.blender.org/D3828
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/modes/object_mode.c | 11 | ||||
-rw-r--r-- | source/blender/gpu/GPU_state.h | 1 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_state.c | 6 |
3 files changed, 18 insertions, 0 deletions
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 472de8ba47f..dc26b091832 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -2985,6 +2985,13 @@ static void OBJECT_draw_scene(void *vedata) GPU_framebuffer_bind(fbl->ghost_fb); GPU_framebuffer_clear_depth(fbl->ghost_fb, 1.0f); } + else if (DRW_state_is_select()) { + /* XXX `GPU_depth_range` is not a perfect solution + * since very distant geometries can still be occluded. + * Also the depth test precision of these geometries is impaired. + * However solves the selection for the vast majority of cases. */ + GPU_depth_range(0.0f, 0.01f); + } DRW_draw_pass(stl->g_data->sgl_ghost.spot_shapes); DRW_draw_pass(stl->g_data->sgl_ghost.bone_solid); @@ -2992,6 +2999,10 @@ static void OBJECT_draw_scene(void *vedata) DRW_draw_pass(stl->g_data->sgl_ghost.bone_outline); DRW_draw_pass(stl->g_data->sgl_ghost.non_meshes); DRW_draw_pass(stl->g_data->sgl_ghost.bone_axes); + + if (DRW_state_is_select()) { + GPU_depth_range(0.0f, 1.0f); + } } batch_camera_path_free(&stl->g_data->sgl_ghost.camera_path); diff --git a/source/blender/gpu/GPU_state.h b/source/blender/gpu/GPU_state.h index 16627fec42b..4c8ad7406df 100644 --- a/source/blender/gpu/GPU_state.h +++ b/source/blender/gpu/GPU_state.h @@ -47,6 +47,7 @@ void GPU_blend_set_func(GPUBlendFunction sfactor, GPUBlendFunction dfactor); void GPU_blend_set_func_separate( GPUBlendFunction src_rgb, GPUBlendFunction dst_rgb, GPUBlendFunction src_alpha, GPUBlendFunction dst_alpha); +void GPU_depth_range(float near, float far); void GPU_depth_test(bool enable); bool GPU_depth_test_enabled(void); void GPU_line_smooth(bool enable); diff --git a/source/blender/gpu/intern/gpu_state.c b/source/blender/gpu/intern/gpu_state.c index 803c595aaf3..c7761d43548 100644 --- a/source/blender/gpu/intern/gpu_state.c +++ b/source/blender/gpu/intern/gpu_state.c @@ -75,6 +75,12 @@ void GPU_blend_set_func_separate( gpu_get_gl_blendfunction(dst_alpha)); } +void GPU_depth_range(float near, float far) +{ + /* glDepthRangef is only for OpenGL 4.1 or higher */ + glDepthRange(near, far); +} + void GPU_depth_test(bool enable) { if (enable) { |