From 4241d6a9ccd0790f90ab1cc63446474dcbc08719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Fri, 30 Mar 2018 22:50:17 +0200 Subject: 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(). --- source/blender/blenfont/intern/blf_font.c | 21 +++++++++++++-------- source/blender/blenfont/intern/blf_internal_types.h | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) (limited to 'source/blender/blenfont') diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index 1df1dc5706c..745cd142467 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -124,12 +124,12 @@ void blf_batching_start(FontBLF *font) } const bool font_changed = (g_batch.font != font); - g_batch.font = font; + const bool simple_shader = ((font->flags & (BLF_ROTATION | BLF_MATRIX | BLF_ASPECT)) == 0); + const bool shader_changed = (simple_shader != g_batch.simple_shader); - const bool manual_ofs_active = ((font->flags & (BLF_ROTATION | BLF_MATRIX | BLF_ASPECT)) == 0); - g_batch.active = g_batch.enabled && manual_ofs_active; + g_batch.active = g_batch.enabled && simple_shader; - if (manual_ofs_active) { + if (g_batch.simple_shader) { /* Offset is applied to each glyph. */ copy_v2_v2(g_batch.ofs, font->pos); } @@ -143,8 +143,6 @@ void blf_batching_start(FontBLF *font) gpuGetModelViewMatrix(gpumat); bool mat_changed = (memcmp(gpumat, g_batch.mat, sizeof(g_batch.mat)) != 0); - /* Save for next memcmp. */ - memcpy(g_batch.mat, gpumat, sizeof(g_batch.mat)); if (mat_changed) { /* Modelviewmat is no longer the same. @@ -154,8 +152,12 @@ void blf_batching_start(FontBLF *font) } /* flush cache if config is not the same. */ - if (mat_changed || font_changed) { + if (mat_changed || font_changed || shader_changed) { blf_batching_draw(); + g_batch.simple_shader = simple_shader; + g_batch.font = font; + /* Save for next memcmp. */ + memcpy(g_batch.mat, gpumat, sizeof(g_batch.mat)); } else { /* Nothing changed continue batching. */ @@ -169,6 +171,8 @@ void blf_batching_start(FontBLF *font) else { /* flush cache */ blf_batching_draw(); + g_batch.font = font; + g_batch.simple_shader = simple_shader; } } @@ -187,7 +191,8 @@ void blf_batching_draw(void) GWN_vertbuf_vertex_count_set(g_batch.verts, g_batch.glyph_ct); GWN_vertbuf_use(g_batch.verts); /* send data */ - GWN_batch_program_set_builtin(g_batch.batch, GPU_SHADER_TEXT); + GPUBuiltinShader shader = (g_batch.simple_shader) ? GPU_SHADER_TEXT_SIMPLE : GPU_SHADER_TEXT; + GWN_batch_program_set_builtin(g_batch.batch, shader); GWN_batch_uniform_1i(g_batch.batch, "glyph", 0); GWN_batch_draw(g_batch.batch); diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h index 91d7917b0b5..5808bd38990 100644 --- a/source/blender/blenfont/intern/blf_internal_types.h +++ b/source/blender/blenfont/intern/blf_internal_types.h @@ -44,7 +44,7 @@ typedef struct BatchBLF{ unsigned int glyph_ct; float ofs[2]; /* copy of font->pos */ float mat[4][4]; /* previous call modelmatrix. */ - bool enabled, active; + bool enabled, active, simple_shader; } BatchBLF; extern BatchBLF g_batch; -- cgit v1.2.3