diff options
-rw-r--r-- | source/blender/blenfont/intern/blf.c | 6 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_font.c | 8 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_glyph.c | 30 | ||||
-rw-r--r-- | source/blender/gpu/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader.c | 5 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_text_geom.glsl | 34 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_text_vert.glsl | 23 |
7 files changed, 66 insertions, 41 deletions
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c index 8e705616c41..30919f1acda 100644 --- a/source/blender/blenfont/intern/blf.c +++ b/source/blender/blenfont/intern/blf.c @@ -579,9 +579,9 @@ static void blf_draw_gl__start(FontBLF *font) #ifndef BLF_STANDALONE Gwn_VertFormat *format = immVertexFormat(); - unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); - unsigned int texCoord = GWN_vertformat_attr_add(format, "texCoord", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); - unsigned int color = GWN_vertformat_attr_add(format, "color", GWN_COMP_U8, 4, GWN_FETCH_INT_TO_FLOAT_UNIT); + unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 4, GWN_FETCH_FLOAT); + unsigned int texCoord = GWN_vertformat_attr_add(format, "tex", GWN_COMP_F32, 4, GWN_FETCH_FLOAT); + unsigned int color = GWN_vertformat_attr_add(format, "col", GWN_COMP_U8, 4, GWN_FETCH_INT_TO_FLOAT_UNIT); BLI_assert(pos == BLF_POS_ID); BLI_assert(texCoord == BLF_COORD_ID); diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index 5846f7a29e4..fe94270f530 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -188,7 +188,7 @@ static unsigned int verts_needed(const FontBLF *font, const char *str, size_t le quad_ct += 25; /* 5x5 kernel */ } - return length * quad_ct * 6; + return length * quad_ct; /* Only one vert per quad */ } static void blf_font_draw_ex( @@ -211,7 +211,7 @@ static void blf_font_draw_ex( blf_font_ensure_ascii_table(font); - immBeginAtMost(GWN_PRIM_TRIS, verts_needed(font, str, len)); + immBeginAtMost(GWN_PRIM_POINTS, verts_needed(font, str, len)); /* at most because some glyphs might be clipped & not drawn */ while ((i < len) && str[i]) { @@ -258,7 +258,7 @@ static void blf_font_draw_ascii_ex( blf_font_ensure_ascii_table(font); - immBeginAtMost(GWN_PRIM_TRIS, verts_needed(font, str, len)); + immBeginAtMost(GWN_PRIM_POINTS, verts_needed(font, str, len)); while ((c = *(str++)) && len--) { BLI_assert(c < 128); @@ -298,7 +298,7 @@ int blf_font_draw_mono(FontBLF *font, const char *str, size_t len, int cwidth) blf_font_ensure_ascii_table(font); - immBeginAtMost(GWN_PRIM_TRIS, verts_needed(font, str, len)); + immBeginAtMost(GWN_PRIM_POINTS, verts_needed(font, str, len)); while ((i < len) && str[i]) { BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table); diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index 1f31a2dbd0a..5e1debf1501 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -318,31 +318,11 @@ void blf_glyph_free(GlyphBLF *g) static void blf_texture_draw(const unsigned char color[4], float uv[2][2], float dx, float y1, float dx1, float y2) { - /* First triangle. */ - immAttrib2f(BLF_COORD_ID, uv[0][0], uv[0][1]); - immSkipAttrib(BLF_COLOR_ID); /* skip color of most vertices */ - immVertex2f(BLF_POS_ID, dx, y1); - - immAttrib2f(BLF_COORD_ID, uv[0][0], uv[1][1]); - immSkipAttrib(BLF_COLOR_ID); - immVertex2f(BLF_POS_ID, dx, y2); - - immAttrib2f(BLF_COORD_ID, uv[1][0], uv[1][1]); - immAttrib4ubv(BLF_COLOR_ID, color); /* set color of provoking vertex */ - immVertex2f(BLF_POS_ID, dx1, y2); - - /* Second triangle. */ - immAttrib2f(BLF_COORD_ID, uv[0][0], uv[0][1]); - immSkipAttrib(BLF_COLOR_ID); /* skip color of most vertices */ - immVertex2f(BLF_POS_ID, dx, y1); - - immAttrib2f(BLF_COORD_ID, uv[1][0], uv[1][1]); - immSkipAttrib(BLF_COLOR_ID); - immVertex2f(BLF_POS_ID, dx1, y2); - - immAttrib2f(BLF_COORD_ID, uv[1][0], uv[0][1]); - immAttrib4ubv(BLF_COLOR_ID, color); /* set color of provoking vertex */ - immVertex2f(BLF_POS_ID, dx1, y1); + /* Only one vertex per glyph, geometry shader expand it into a quad. */ + /* TODO Get rid of Geom Shader because it's not optimal AT ALL for the GPU */ + immAttrib4ubv(BLF_COLOR_ID, color); + immAttrib4fv(BLF_COORD_ID, (float *)uv); + immVertex4f(BLF_POS_ID, dx, y1, dx1, y2); } static void blf_texture5_draw(const unsigned char color_in[4], float uv[2][2], float x1, float y1, float x2, float y2) diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 48724cb0d40..c754a21b427 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -203,6 +203,7 @@ 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_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) data_to_c_simple(shaders/gpu_shader_keyframe_diamond_vert.glsl SRC) data_to_c_simple(shaders/gpu_shader_keyframe_diamond_frag.glsl SRC) diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c index 44e01d42a62..586a7b70cd9 100644 --- a/source/blender/gpu/intern/gpu_shader.c +++ b/source/blender/gpu/intern/gpu_shader.c @@ -135,6 +135,7 @@ extern char datatoc_gpu_shader_edges_overlay_geom_glsl[]; extern char datatoc_gpu_shader_edges_overlay_simple_geom_glsl[]; 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_keyframe_diamond_vert_glsl[]; extern char datatoc_gpu_shader_keyframe_diamond_frag_glsl[]; @@ -649,7 +650,9 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader) [GPU_SHADER_SMOKE_FIRE] = { datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl }, [GPU_SHADER_SMOKE_COBA] = { datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl }, - [GPU_SHADER_TEXT] = { datatoc_gpu_shader_text_vert_glsl, datatoc_gpu_shader_text_frag_glsl }, + [GPU_SHADER_TEXT] = { datatoc_gpu_shader_text_vert_glsl, + datatoc_gpu_shader_text_frag_glsl, + datatoc_gpu_shader_text_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 new file mode 100644 index 00000000000..d12b60be9e9 --- /dev/null +++ b/source/blender/gpu/shaders/gpu_shader_text_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].xw; + EmitVertex(); + + gl_Position.xy = pos_rect[0].zy; + texCoord_interp = tex_rect[0].zw; + EmitVertex(); + + gl_Position.xy = pos_rect[0].xw; + texCoord_interp = tex_rect[0].xy; + EmitVertex(); + + gl_Position.xy = pos_rect[0].zw; + texCoord_interp = tex_rect[0].zy; + EmitVertex(); + + EndPrimitive(); +} diff --git a/source/blender/gpu/shaders/gpu_shader_text_vert.glsl b/source/blender/gpu/shaders/gpu_shader_text_vert.glsl index 6129f49ce22..d8e46aca975 100644 --- a/source/blender/gpu/shaders/gpu_shader_text_vert.glsl +++ b/source/blender/gpu/shaders/gpu_shader_text_vert.glsl @@ -1,16 +1,23 @@ uniform mat4 ModelViewProjectionMatrix; -in vec2 pos; -in vec2 texCoord; -in vec4 color; -flat out vec4 color_flat; -noperspective out vec2 texCoord_interp; +in vec4 pos; /* rect */ +in vec4 tex; /* rect */ +in vec4 col; + +out vec4 pos_rect; +out vec4 tex_rect; +out vec4 color; void main() { - gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0); + /* 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); - color_flat = color; - texCoord_interp = texCoord; + tex_rect = tex; + color = col; } |