BLF/OpenGL: draw text with new immediate mode
Part of T49043
This commit is contained in:
@@ -57,6 +57,7 @@
|
|||||||
|
|
||||||
#ifndef BLF_STANDALONE
|
#ifndef BLF_STANDALONE
|
||||||
#include "GPU_shader.h"
|
#include "GPU_shader.h"
|
||||||
|
#include "GPU_immediate.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "blf_internal_types.h"
|
#include "blf_internal_types.h"
|
||||||
@@ -500,10 +501,6 @@ static void blf_draw_gl__start(FontBLF *font, GLint *mode)
|
|||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
#ifndef BLF_STANDALONE
|
|
||||||
GPU_shader_bind(GPU_shader_get_builtin_shader(GPU_SHADER_TEXT));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Save the current matrix mode. */
|
/* Save the current matrix mode. */
|
||||||
glGetIntegerv(GL_MATRIX_MODE, mode);
|
glGetIntegerv(GL_MATRIX_MODE, mode);
|
||||||
|
|
||||||
@@ -522,8 +519,20 @@ static void blf_draw_gl__start(FontBLF *font, GLint *mode)
|
|||||||
if (font->flags & BLF_ROTATION) /* radians -> degrees */
|
if (font->flags & BLF_ROTATION) /* radians -> degrees */
|
||||||
glRotatef(font->angle * (float)(180.0 / M_PI), 0.0f, 0.0f, 1.0f);
|
glRotatef(font->angle * (float)(180.0 / M_PI), 0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
if (font->shadow || font->blur)
|
glGetFloatv(GL_CURRENT_COLOR, font->orig_col); /* TODO(merwin): new BLF_color function? */
|
||||||
glGetFloatv(GL_CURRENT_COLOR, font->orig_col);
|
|
||||||
|
#ifndef BLF_STANDALONE
|
||||||
|
VertexFormat *format = immVertexFormat();
|
||||||
|
unsigned pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT);
|
||||||
|
unsigned texCoord = add_attrib(format, "texCoord", GL_FLOAT, 2, KEEP_FLOAT);
|
||||||
|
unsigned color = add_attrib(format, "color", GL_FLOAT, 4, KEEP_FLOAT);
|
||||||
|
|
||||||
|
BLI_assert(pos == BLF_POS_ID);
|
||||||
|
BLI_assert(texCoord == BLF_COORD_ID);
|
||||||
|
BLI_assert(color == BLF_COLOR_ID);
|
||||||
|
|
||||||
|
immBindBuiltinProgram(GPU_SHADER_TEXT);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* always bind the texture for the first glyph */
|
/* always bind the texture for the first glyph */
|
||||||
font->tex_bind_state = -1;
|
font->tex_bind_state = -1;
|
||||||
@@ -537,7 +546,7 @@ static void blf_draw_gl__end(GLint mode)
|
|||||||
glMatrixMode(mode);
|
glMatrixMode(mode);
|
||||||
|
|
||||||
#ifndef BLF_STANDALONE
|
#ifndef BLF_STANDALONE
|
||||||
GPU_shader_unbind();
|
immUnbindProgram();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
#include "BLF_api.h"
|
#include "BLF_api.h"
|
||||||
|
|
||||||
#ifndef BLF_STANDALONE
|
#ifndef BLF_STANDALONE
|
||||||
#include "GPU_basic_shader.h"
|
#include "GPU_immediate.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "blf_internal_types.h"
|
#include "blf_internal_types.h"
|
||||||
@@ -182,17 +182,6 @@ static void blf_glyph_cache_texture(FontBLF *font, GlyphCacheBLF *gc)
|
|||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
#ifndef BLF_STANDALONE
|
|
||||||
/* needed since basic shader doesn't support alpha-only textures,
|
|
||||||
* while we could add support this is only used in a few places
|
|
||||||
* (an alternative could be to have a simple shader for BLF). */
|
|
||||||
if (GLEW_ARB_texture_swizzle && GPU_basic_shader_use_glsl_get()) {
|
|
||||||
GLint swizzle_mask[] = {GL_ONE, GL_ONE, GL_ONE, GL_ALPHA};
|
|
||||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_mask);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA8, gc->p2_width, gc->p2_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA8, gc->p2_width, gc->p2_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -328,19 +317,17 @@ void blf_glyph_free(GlyphBLF *g)
|
|||||||
|
|
||||||
static void blf_texture_draw(float uv[2][2], float dx, float y1, float dx1, float y2)
|
static void blf_texture_draw(float uv[2][2], float dx, float y1, float dx1, float y2)
|
||||||
{
|
{
|
||||||
glBegin(GL_QUADS);
|
immAttrib2f(BLF_COORD_ID, uv[0][0], uv[0][1]);
|
||||||
glTexCoord2f(uv[0][0], uv[0][1]);
|
immVertex2f(BLF_POS_ID, dx, y1);
|
||||||
glVertex2f(dx, y1);
|
|
||||||
|
|
||||||
glTexCoord2f(uv[0][0], uv[1][1]);
|
immAttrib2f(BLF_COORD_ID, uv[0][0], uv[1][1]);
|
||||||
glVertex2f(dx, y2);
|
immVertex2f(BLF_POS_ID, dx, y2);
|
||||||
|
|
||||||
glTexCoord2f(uv[1][0], uv[1][1]);
|
immAttrib2f(BLF_COORD_ID, uv[1][0], uv[1][1]);
|
||||||
glVertex2f(dx1, y2);
|
immVertex2f(BLF_POS_ID, dx1, y2);
|
||||||
|
|
||||||
glTexCoord2f(uv[1][0], uv[0][1]);
|
immAttrib2f(BLF_COORD_ID, uv[1][0], uv[0][1]);
|
||||||
glVertex2f(dx1, y1);
|
immVertex2f(BLF_POS_ID, dx1, y1);
|
||||||
glEnd();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blf_texture5_draw(const float shadow_col[4], float uv[2][2], float x1, float y1, float x2, float y2)
|
static void blf_texture5_draw(const float shadow_col[4], float uv[2][2], float x1, float y1, float x2, float y2)
|
||||||
@@ -362,12 +349,10 @@ static void blf_texture5_draw(const float shadow_col[4], float uv[2][2], float x
|
|||||||
for (dx = -2; dx < 3; dx++) {
|
for (dx = -2; dx < 3; dx++) {
|
||||||
for (dy = -2; dy < 3; dy++, fp++) {
|
for (dy = -2; dy < 3; dy++, fp++) {
|
||||||
color[3] = *(fp) * shadow_col[3];
|
color[3] = *(fp) * shadow_col[3];
|
||||||
glColor4fv(color);
|
immAttrib4fv(BLF_COLOR_ID, color);
|
||||||
blf_texture_draw(uv, x1 + dx, y1 + dy, x2 + dx, y2 + dy);
|
blf_texture_draw(uv, x1 + dx, y1 + dy, x2 + dx, y2 + dy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glColor4fv(color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blf_texture3_draw(const float shadow_col[4], float uv[2][2], float x1, float y1, float x2, float y2)
|
static void blf_texture3_draw(const float shadow_col[4], float uv[2][2], float x1, float y1, float x2, float y2)
|
||||||
@@ -387,12 +372,10 @@ static void blf_texture3_draw(const float shadow_col[4], float uv[2][2], float x
|
|||||||
for (dx = -1; dx < 2; dx++) {
|
for (dx = -1; dx < 2; dx++) {
|
||||||
for (dy = -1; dy < 2; dy++, fp++) {
|
for (dy = -1; dy < 2; dy++, fp++) {
|
||||||
color[3] = *(fp) * shadow_col[3];
|
color[3] = *(fp) * shadow_col[3];
|
||||||
glColor4fv(color);
|
immAttrib4fv(BLF_COLOR_ID, color);
|
||||||
blf_texture_draw(uv, x1 + dx, y1 + dy, x2 + dx, y2 + dy);
|
blf_texture_draw(uv, x1 + dx, y1 + dy, x2 + dx, y2 + dy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glColor4fv(color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blf_glyph_calc_rect(rctf *rect, GlyphBLF *g, float x, float y)
|
static void blf_glyph_calc_rect(rctf *rect, GlyphBLF *g, float x, float y)
|
||||||
@@ -486,6 +469,18 @@ void blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
|
|||||||
glBindTexture(GL_TEXTURE_2D, (font->tex_bind_state = g->tex));
|
glBindTexture(GL_TEXTURE_2D, (font->tex_bind_state = g->tex));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0 /* determine exact count of quads */
|
||||||
|
unsigned quad_ct = 1 + (unsigned)font->blur;
|
||||||
|
if (font->flags & BLF_SHADOW)
|
||||||
|
quad_ct += (unsigned)font->shadow;
|
||||||
|
|
||||||
|
immBegin(GL_QUADS, quad_ct * 4);
|
||||||
|
#else
|
||||||
|
immBeginAtMost(GL_QUADS, 40); /* (5 shadow + 5 blur) * 4 verts per quad */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* TODO: blur & shadow in shader, single quad per glyph */
|
||||||
|
|
||||||
if (font->flags & BLF_SHADOW) {
|
if (font->flags & BLF_SHADOW) {
|
||||||
rctf rect_ofs;
|
rctf rect_ofs;
|
||||||
blf_glyph_calc_rect(&rect_ofs, g,
|
blf_glyph_calc_rect(&rect_ofs, g,
|
||||||
@@ -500,12 +495,9 @@ void blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
|
|||||||
blf_texture5_draw(font->shadow_col, g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
|
blf_texture5_draw(font->shadow_col, g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
glColor4fv(font->shadow_col);
|
immAttrib4fv(BLF_COLOR_ID, font->shadow_col);
|
||||||
blf_texture_draw(g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
|
blf_texture_draw(g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glColor4fv(font->orig_col);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (font->blur) {
|
switch (font->blur) {
|
||||||
@@ -516,9 +508,9 @@ void blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
|
|||||||
blf_texture5_draw(font->orig_col, g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
|
blf_texture5_draw(font->orig_col, g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
immAttrib4fv(BLF_COLOR_ID, font->orig_col);
|
||||||
blf_texture_draw(g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
|
blf_texture_draw(g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
immEnd();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ struct GlyphBLF;
|
|||||||
struct GlyphCacheBLF;
|
struct GlyphCacheBLF;
|
||||||
struct rctf;
|
struct rctf;
|
||||||
|
|
||||||
|
/* vertex attribute IDs (fixed IDs so we don't have to pass them around) */
|
||||||
|
#define BLF_POS_ID 0
|
||||||
|
#define BLF_COORD_ID 1
|
||||||
|
#define BLF_COLOR_ID 2
|
||||||
|
|
||||||
unsigned int blf_next_p2(unsigned int x);
|
unsigned int blf_next_p2(unsigned int x);
|
||||||
unsigned int blf_hash(unsigned int val);
|
unsigned int blf_hash(unsigned int val);
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
|
|
||||||
#if __VERSION__ == 120
|
#if __VERSION__ == 120
|
||||||
flat varying vec4 color;
|
flat varying vec4 color_flat;
|
||||||
noperspective varying vec2 texcoord;
|
noperspective varying vec2 texCoord_interp;
|
||||||
#define fragColor gl_FragColor
|
#define fragColor gl_FragColor
|
||||||
#else
|
#else
|
||||||
flat in vec4 color;
|
flat in vec4 color_flat;
|
||||||
noperspective in vec2 texcoord;
|
noperspective in vec2 texCoord_interp;
|
||||||
out vec4 fragColor;
|
out vec4 fragColor;
|
||||||
|
#define texture2D texture
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uniform sampler2D glyph;
|
uniform sampler2D glyph;
|
||||||
@@ -14,8 +15,8 @@ uniform sampler2D glyph;
|
|||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
// input color replaces texture color
|
// input color replaces texture color
|
||||||
fragColor.rgb = color.rgb;
|
fragColor.rgb = color_flat.rgb;
|
||||||
|
|
||||||
// modulate input alpha & texture alpha
|
// modulate input alpha & texture alpha
|
||||||
fragColor.a = color.a * texture2D(glyph, texcoord).a;
|
fragColor.a = color_flat.a * texture2D(glyph, texCoord_interp).a;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,24 @@
|
|||||||
|
|
||||||
// TODO(merwin):
|
uniform mat4 ModelViewProjectionMatrix;
|
||||||
// - uniform color, not per vertex
|
|
||||||
// - generic attrib inputs (2D pos, tex coord)
|
|
||||||
|
|
||||||
#if __VERSION__ == 120
|
#if __VERSION__ == 120
|
||||||
flat varying vec4 color;
|
attribute vec2 pos;
|
||||||
noperspective varying vec2 texcoord;
|
attribute vec2 texCoord;
|
||||||
|
attribute vec4 color;
|
||||||
|
flat varying vec4 color_flat;
|
||||||
|
noperspective varying vec2 texCoord_interp;
|
||||||
#else
|
#else
|
||||||
flat out vec4 color;
|
in vec2 pos;
|
||||||
noperspective out vec2 texcoord;
|
in vec2 texCoord;
|
||||||
|
in vec4 color;
|
||||||
|
flat out vec4 color_flat;
|
||||||
|
noperspective out vec2 texCoord_interp;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
|
||||||
|
|
||||||
color = gl_Color;
|
color_flat = color;
|
||||||
texcoord = gl_MultiTexCoord0.st;
|
texCoord_interp = texCoord;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user