diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-03-30 23:50:17 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-03-30 23:50:17 +0300 |
commit | 4241d6a9ccd0790f90ab1cc63446474dcbc08719 (patch) | |
tree | 71e19a53f22f7ebfb16aa4a5b6e211ee9804647a /source/blender/gpu | |
parent | 96d6a928ab4e74fe07ac337d3292057bedd9dc21 (diff) |
BFL: Fix broken vertical texts.
I've made a separate version of the geom shader that works with full
3D modelviewmat.
This commit also includes some fixup inside blf_batching_start().
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/gpu/GPU_shader.h | 1 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader.c | 5 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_text_geom.glsl | 19 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_text_simple_geom.glsl | 34 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_text_simple_vert.glsl | 22 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_text_vert.glsl | 8 |
7 files changed, 75 insertions, 16 deletions
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index c754a21b427..f0e5b0842fc 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -202,6 +202,8 @@ data_to_c_simple(shaders/gpu_shader_edges_overlay_vert.glsl SRC) data_to_c_simple(shaders/gpu_shader_edges_overlay_geom.glsl SRC) data_to_c_simple(shaders/gpu_shader_edges_overlay_simple_geom.glsl SRC) data_to_c_simple(shaders/gpu_shader_edges_overlay_frag.glsl SRC) +data_to_c_simple(shaders/gpu_shader_text_simple_vert.glsl SRC) +data_to_c_simple(shaders/gpu_shader_text_simple_geom.glsl SRC) data_to_c_simple(shaders/gpu_shader_text_vert.glsl SRC) data_to_c_simple(shaders/gpu_shader_text_geom.glsl SRC) data_to_c_simple(shaders/gpu_shader_text_frag.glsl SRC) diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h index 6a156b32c35..1a1ec120d28 100644 --- a/source/blender/gpu/GPU_shader.h +++ b/source/blender/gpu/GPU_shader.h @@ -97,6 +97,7 @@ typedef enum GPUBuiltinShader { /* specialized drawing */ GPU_SHADER_TEXT, + GPU_SHADER_TEXT_SIMPLE, GPU_SHADER_EDGES_FRONT_BACK_PERSP, GPU_SHADER_EDGES_FRONT_BACK_ORTHO, GPU_SHADER_EDGES_OVERLAY_SIMPLE, diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c index 586a7b70cd9..ad6331befce 100644 --- a/source/blender/gpu/intern/gpu_shader.c +++ b/source/blender/gpu/intern/gpu_shader.c @@ -137,6 +137,8 @@ extern char datatoc_gpu_shader_edges_overlay_frag_glsl[]; extern char datatoc_gpu_shader_text_vert_glsl[]; extern char datatoc_gpu_shader_text_geom_glsl[]; extern char datatoc_gpu_shader_text_frag_glsl[]; +extern char datatoc_gpu_shader_text_simple_vert_glsl[]; +extern char datatoc_gpu_shader_text_simple_geom_glsl[]; extern char datatoc_gpu_shader_keyframe_diamond_vert_glsl[]; extern char datatoc_gpu_shader_keyframe_diamond_frag_glsl[]; @@ -653,6 +655,9 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader) [GPU_SHADER_TEXT] = { datatoc_gpu_shader_text_vert_glsl, datatoc_gpu_shader_text_frag_glsl, datatoc_gpu_shader_text_geom_glsl }, + [GPU_SHADER_TEXT_SIMPLE] = { datatoc_gpu_shader_text_simple_vert_glsl, + datatoc_gpu_shader_text_frag_glsl, + datatoc_gpu_shader_text_simple_geom_glsl }, [GPU_SHADER_KEYFRAME_DIAMOND] = { datatoc_gpu_shader_keyframe_diamond_vert_glsl, datatoc_gpu_shader_keyframe_diamond_frag_glsl }, [GPU_SHADER_EDGES_FRONT_BACK_PERSP] = { datatoc_gpu_shader_edges_front_back_persp_vert_glsl, diff --git a/source/blender/gpu/shaders/gpu_shader_text_geom.glsl b/source/blender/gpu/shaders/gpu_shader_text_geom.glsl index d12b60be9e9..d4d86db6bc3 100644 --- a/source/blender/gpu/shaders/gpu_shader_text_geom.glsl +++ b/source/blender/gpu/shaders/gpu_shader_text_geom.glsl @@ -1,4 +1,6 @@ +uniform mat4 ModelViewProjectionMatrix; + layout(points) in; layout(triangle_strip, max_vertices = 4) out; @@ -12,22 +14,21 @@ noperspective out vec2 texCoord_interp; void main() { color_flat = color[0]; - gl_Position.zw = vec2(0.0, 1.0); - gl_Position.xy = pos_rect[0].xy; - texCoord_interp = tex_rect[0].xw; + gl_Position = (ModelViewProjectionMatrix * vec4(pos_rect[0].xy, 0.0, 1.0)); + texCoord_interp = tex_rect[0].xy; EmitVertex(); - gl_Position.xy = pos_rect[0].zy; - texCoord_interp = tex_rect[0].zw; + gl_Position = (ModelViewProjectionMatrix * vec4(pos_rect[0].zy, 0.0, 1.0)); + texCoord_interp = tex_rect[0].zy; EmitVertex(); - gl_Position.xy = pos_rect[0].xw; - texCoord_interp = tex_rect[0].xy; + gl_Position = (ModelViewProjectionMatrix * vec4(pos_rect[0].xw, 0.0, 1.0)); + texCoord_interp = tex_rect[0].xw; EmitVertex(); - gl_Position.xy = pos_rect[0].zw; - texCoord_interp = tex_rect[0].zy; + gl_Position = (ModelViewProjectionMatrix * vec4(pos_rect[0].zw, 0.0, 1.0)); + texCoord_interp = tex_rect[0].zw; EmitVertex(); EndPrimitive(); diff --git a/source/blender/gpu/shaders/gpu_shader_text_simple_geom.glsl b/source/blender/gpu/shaders/gpu_shader_text_simple_geom.glsl new file mode 100644 index 00000000000..79dc996997b --- /dev/null +++ b/source/blender/gpu/shaders/gpu_shader_text_simple_geom.glsl @@ -0,0 +1,34 @@ + +layout(points) in; +layout(triangle_strip, max_vertices = 4) out; + +in vec4 pos_rect[]; +in vec4 tex_rect[]; +in vec4 color[]; + +flat out vec4 color_flat; +noperspective out vec2 texCoord_interp; + +void main() +{ + color_flat = color[0]; + gl_Position.zw = vec2(0.0, 1.0); + + gl_Position.xy = pos_rect[0].xy; + texCoord_interp = tex_rect[0].xy; + EmitVertex(); + + gl_Position.xy = pos_rect[0].zy; + texCoord_interp = tex_rect[0].zy; + EmitVertex(); + + gl_Position.xy = pos_rect[0].xw; + texCoord_interp = tex_rect[0].xw; + EmitVertex(); + + gl_Position.xy = pos_rect[0].zw; + texCoord_interp = tex_rect[0].zw; + EmitVertex(); + + EndPrimitive(); +} diff --git a/source/blender/gpu/shaders/gpu_shader_text_simple_vert.glsl b/source/blender/gpu/shaders/gpu_shader_text_simple_vert.glsl new file mode 100644 index 00000000000..4a2cde71e07 --- /dev/null +++ b/source/blender/gpu/shaders/gpu_shader_text_simple_vert.glsl @@ -0,0 +1,22 @@ + +/* Simpler version of gpu_shader_text_vert that supports only 2D translation. */ + +uniform mat4 ModelViewProjectionMatrix; + +in vec4 pos; /* rect */ +in vec4 tex; /* rect */ +in vec4 col; + +out vec4 pos_rect; +out vec4 tex_rect; +out vec4 color; + +void main() +{ + /* Manual mat4*vec2 */ + pos_rect = ModelViewProjectionMatrix[0].xyxy * pos.xxzz; + pos_rect += ModelViewProjectionMatrix[1].xyxy * pos.yyww; + pos_rect += ModelViewProjectionMatrix[3].xyxy; + tex_rect = tex; + color = col; +} diff --git a/source/blender/gpu/shaders/gpu_shader_text_vert.glsl b/source/blender/gpu/shaders/gpu_shader_text_vert.glsl index d8e46aca975..338156f5b68 100644 --- a/source/blender/gpu/shaders/gpu_shader_text_vert.glsl +++ b/source/blender/gpu/shaders/gpu_shader_text_vert.glsl @@ -11,13 +11,7 @@ out vec4 color; void main() { - /* This won't work for real 3D ModelViewProjectionMatrix. */ - vec2 v1 = (ModelViewProjectionMatrix * vec4(pos.xy, 0.0, 1.0)).xy; - vec2 v2 = (ModelViewProjectionMatrix * vec4(pos.zw, 0.0, 1.0)).xy; - - pos_rect.xy = min(v1, v2); - pos_rect.zw = max(v1, v2); - + pos_rect = pos; tex_rect = tex; color = col; } |