diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-01-21 15:51:34 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-01-21 15:55:53 +0300 |
commit | 9bc47ed0f6d0db9e43af30c741a7e5ac347cbecd (patch) | |
tree | ca8dbd6ce37e3529a3c5fe8c0bc944c535128ec3 /source/blender/draw/modes/overlay_mode.c | |
parent | 0c829e8240eebd7ce4ed9d61f8682c0d6bf534f4 (diff) |
Fix clipping shaders with some AMD/Intel drivers
Caused:
error: unsized array index must be constant
Use hard coded number of clipping planes, copying the 4th to 5 & 6
when only 4 are used.
Diffstat (limited to 'source/blender/draw/modes/overlay_mode.c')
-rw-r--r-- | source/blender/draw/modes/overlay_mode.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/source/blender/draw/modes/overlay_mode.c b/source/blender/draw/modes/overlay_mode.c index 2fc4cf3a765..16e008d349d 100644 --- a/source/blender/draw/modes/overlay_mode.c +++ b/source/blender/draw/modes/overlay_mode.c @@ -82,6 +82,8 @@ static struct { OVERLAY_ShaderData sh_data[2]; } e_data = {NULL}; +extern char datatoc_common_world_clip_lib_glsl[]; + /* Shaders */ extern char datatoc_overlay_face_orientation_frag_glsl[]; extern char datatoc_overlay_face_orientation_vert_glsl[]; @@ -112,7 +114,7 @@ static void overlay_engine_init(void *vedata) const bool is_clip = (draw_ctx->rv3d->rflag & RV3D_CLIPPING) != 0; if (is_clip) { - DRW_state_clip_planes_len_set((draw_ctx->rv3d->viewlock & RV3D_BOXCLIP) ? 4 : 6); + DRW_state_clip_planes_set_from_rv3d(draw_ctx->rv3d); } if (!stl->g_data) { @@ -123,30 +125,34 @@ static void overlay_engine_init(void *vedata) if (!sh_data->face_orientation_sh) { /* Face orientation */ - sh_data->face_orientation_sh = DRW_shader_create( + sh_data->face_orientation_sh = DRW_shader_create_with_lib( datatoc_overlay_face_orientation_vert_glsl, NULL, datatoc_overlay_face_orientation_frag_glsl, + datatoc_common_world_clip_lib_glsl, is_clip ? NULL : DEF_WORLD_CLIP_STR); } if (!sh_data->face_wireframe_sh) { - sh_data->select_wireframe_sh = DRW_shader_create( + sh_data->select_wireframe_sh = DRW_shader_create_with_lib( datatoc_overlay_face_wireframe_vert_glsl, datatoc_overlay_face_wireframe_geom_glsl, datatoc_gpu_shader_depth_only_frag_glsl, + datatoc_common_world_clip_lib_glsl, DEF_WORLD_CLIP_STR "#define SELECT_EDGES\n" + (is_clip ? 0 : strlen(DEF_WORLD_CLIP_STR))); - sh_data->face_wireframe_sh = DRW_shader_create( + sh_data->face_wireframe_sh = DRW_shader_create_with_lib( datatoc_overlay_face_wireframe_vert_glsl, NULL, datatoc_overlay_face_wireframe_frag_glsl, + datatoc_common_world_clip_lib_glsl, is_clip ? DEF_WORLD_CLIP_STR : NULL); - sh_data->face_wireframe_sculpt_sh = DRW_shader_create( + sh_data->face_wireframe_sculpt_sh = DRW_shader_create_with_lib( datatoc_overlay_face_wireframe_vert_glsl, datatoc_overlay_face_wireframe_geom_glsl, datatoc_overlay_face_wireframe_frag_glsl, + datatoc_common_world_clip_lib_glsl, DEF_WORLD_CLIP_STR "#define USE_SCULPT\n" + (is_clip ? 0 : strlen(DEF_WORLD_CLIP_STR))); } |