diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index e4330aa2..a1ebcf9a 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -79,6 +79,7 @@ void lovrGraphicsInit() { state.skyboxShader = lovrShaderCreate(lovrSkyboxVertexShader, lovrSkyboxFragmentShader); int uniformId = lovrShaderGetUniformId(state.skyboxShader, "cube"); lovrShaderSendInt(state.skyboxShader, uniformId, 1); + state.fontShader = lovrShaderCreate(lovrDefaultVertexShader, lovrFontFragmentShader); state.fullscreenShader = lovrShaderCreate(lovrNoopVertexShader, lovrDefaultFragmentShader); state.defaultTexture = lovrTextureCreate(lovrTextureDataGetBlank(1, 1, 0xff, FORMAT_RGBA)); @@ -1029,6 +1030,17 @@ void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float a } void lovrGraphicsPrint(const char* str, mat4 transform, float wrap, HorizontalAlign halign, VerticalAlign valign) { + Shader* lastShader = lovrGraphicsGetShader(); + if (lastShader == state.defaultShader) { + lovrRetain(&lastShader->ref); + lovrGraphicsSetShader(state.fontShader); + } + lovrGraphicsEnsureFont(); lovrFontPrint(state.activeFont, str, transform, wrap, halign, valign); + + if (lastShader == state.defaultShader) { + lovrGraphicsSetShader(lastShader); + lovrRelease(&lastShader->ref); + } } diff --git a/src/graphics/graphics.h b/src/graphics/graphics.h index 39714796..6ac38cff 100644 --- a/src/graphics/graphics.h +++ b/src/graphics/graphics.h @@ -73,6 +73,7 @@ typedef struct { Shader* activeShader; Shader* defaultShader; Shader* skyboxShader; + Shader* fontShader; Shader* fullscreenShader; Font* activeFont; Font* defaultFont; diff --git a/src/graphics/shader.c b/src/graphics/shader.c index 78d7cc18..b1d3b633 100644 --- a/src/graphics/shader.c +++ b/src/graphics/shader.c @@ -74,6 +74,19 @@ const char* lovrSkyboxFragmentShader = "" "}" ""; +const char* lovrFontFragmentShader = "" +"float median(float r, float g, float b) { \n" +" return max(min(r, g), min(max(r, g), b)); \n" +"} \n" +"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n" +" vec3 sample = texture(image, uv).rgb; \n" +" float sdf = median(sample.r, sample.g, sample.b); \n" +" float w = fwidth(sdf); \n" +" float alpha = smoothstep(.5 - w, .5 + w, sdf); \n" +" return vec4(graphicsColor.rgb, alpha); \n" +"}" +""; + const char* lovrNoopVertexShader = "" "vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n" " return vertex; \n" diff --git a/src/graphics/shader.h b/src/graphics/shader.h index bd90223d..e7af24e5 100644 --- a/src/graphics/shader.h +++ b/src/graphics/shader.h @@ -36,6 +36,7 @@ extern const char* lovrDefaultVertexShader; extern const char* lovrDefaultFragmentShader; extern const char* lovrSkyboxVertexShader; extern const char* lovrSkyboxFragmentShader; +extern const char* lovrFontFragmentShader; extern const char* lovrNoopVertexShader; GLuint compileShader(GLuint type, const char* source);