Skip to content
Snippets Groups Projects
Commit e623e69d authored by DarkGod's avatar DarkGod
Browse files

Fixed strange graphical artifacts around some texts

Text outlines are much better now with shaders enabled
parent eef5e2e3
No related branches found
No related tags found
No related merge requests found
......@@ -18,6 +18,7 @@
-- darkgod@te4.org
require "engine.class"
local Shader = require "engine.Shader"
local Entity = require "engine.Entity"
local Tiles = require "engine.Tiles"
local UI = require "engine.ui.Base"
......@@ -242,6 +243,7 @@ end
function _M:toScreen()
self:display()
local shader = Shader.default.textoutline and Shader.default.textoutline.shad
if self.bg_texture then self.bg_texture:toScreenFull(self.display_x, self.display_y, self.w, self.h, self.bg_texture_w, self.bg_texture_h) end
for i = 1, #self.items do
local item = self.items[i]
......@@ -260,14 +262,23 @@ function _M:toScreen()
-- frame[1]:toScreenFull(self.display_x + item.x, self.display_y + item.y, self.frames.w, self.frames.h, frame[2] * self.frames.rw, frame[3] * self.frames.rh, pagesel, pagesel, pagesel, 255)
UI:drawFrame(self.frames.base, self.display_x + item.x, self.display_y + item.y, frame[1], frame[2], frame[3], 1)
if self.shadow then
if shader then
shader:paramNumber2("outlineSize", 0.7, 0.7)
shader:paramNumber2("textSize", key._tex_w, key._tex_h)
shader:use(true)
else
key._tex:toScreenFull(self.display_x + item.x + 1 + self.frames.fx + self.icon_w - key.w, self.display_y + item.y + 1 + self.icon_h - key.h, key.w, key.h, key._tex_w, key._tex_h, 0, 0, 0, self.shadow)
if gtxt then gtxt._tex:toScreenFull(self.display_x + item.x + self.frames.fy + 2 + (self.icon_w - gtxt.fw) / 2, self.display_y + item.y + self.frames.fy + 2 + (self.icon_h - gtxt.fh) / 2, gtxt.w, gtxt.h, gtxt._tex_w, gtxt._tex_h, 0, 0, 0, self.shadow) end
end
end
key._tex:toScreenFull(self.display_x + item.x + self.frames.fx + self.icon_w - key.w, self.display_y + item.y + self.icon_h - key.h, key.w, key.h, key._tex_w, key._tex_h)
if gtxt then
if self.shadow then gtxt._tex:toScreenFull(self.display_x + item.x + self.frames.fy + 2 + (self.icon_w - gtxt.fw) / 2, self.display_y + item.y + self.frames.fy + 2 + (self.icon_h - gtxt.fh) / 2, gtxt.w, gtxt.h, gtxt._tex_w, gtxt._tex_h, 0, 0, 0, self.shadow) end
gtxt._tex:toScreenFull(self.display_x + item.x + self.frames.fx + (self.icon_w - gtxt.fw) / 2, self.display_y + item.y + self.frames.fy + (self.icon_h - gtxt.fh) / 2, gtxt.w, gtxt.h, gtxt._tex_w, gtxt._tex_h)
end
-- core.display.drawQuad(self.display_x + item.x + 1 + self.frames.fx + self.icon_w - key.w, self.display_y + item.y + 1 + self.icon_h - key.h, key.w, key.h, 0, 128, 128, 200)
if self.shadow then key._tex:toScreenFull(self.display_x + item.x + 1 + self.frames.fx + self.icon_w - key.w, self.display_y + item.y + 1 + self.icon_h - key.h, key.w, key.h, key._tex_w, key._tex_h, 0, 0, 0, self.shadow) end
key._tex:toScreenFull(self.display_x + item.x + self.frames.fx + self.icon_w - key.w, self.display_y + item.y + self.icon_h - key.h, key.w, key.h, key._tex_w, key._tex_h)
if self.shadow and shader then shader:use(false) end
end
end
......
......@@ -230,6 +230,7 @@ function _M:toScreen()
if self.bg_texture then self.bg_texture:toScreenFull(self.display_x, self.display_y, self.w, self.h, self.bg_texture_w, self.bg_texture_h) end
local now = core.game.getTime()
local shader = Shader.default.textoutline and Shader.default.textoutline.shad
local h = self.display_y + self.h - self.fh
for i = 1, #self.dlist do
......@@ -246,15 +247,16 @@ function _M:toScreen()
self.dlist[i].dh = h
if self.shadow then
if shader.shad then
shader.shad:paramNumber2("textSize", item._tex_w, item._tex_h)
shader.shad:use(true)
if shader then
shader:paramNumber2("outlineSize", 0.7, 0.7)
shader:paramNumber2("textSize", item._tex_w, item._tex_h)
shader:use(true)
else
item._tex:toScreenFull(self.display_x+2, h+2, item.w, item.h, item._tex_w, item._tex_h, 0,0,0, self.shadow * fade)
end
end
item._tex:toScreenFull(self.display_x, h, item.w, item.h, item._tex_w, item._tex_h, 1, 1, 1, fade)
if self.shadow and shader.shad then shader.shad:use(false) end
if self.shadow and shader then shader:use(false) end
for di = 1, #item._dduids do item._dduids[di].e:toScreen(nil, self.display_x + item._dduids[di].x, h, item._dduids[di].w, item._dduids[di].w, fade, false, false) end
h = h - self.fh
end
......
......@@ -183,3 +183,12 @@ function _M:setUniform(k, v)
end
end
end
----------------------------------------------------------------------------
-- Default shaders
----------------------------------------------------------------------------
default = {}
function _M:setDefault(kind, name, args)
default[kind] = _M.new(name, args)
end
......@@ -18,6 +18,7 @@
-- darkgod@te4.org
require "engine.class"
local Shader = require "engine.Shader"
local KeyBind = require "engine.KeyBind"
local Mouse = require "engine.Mouse"
local Dialog = require "engine.ui.Dialog"
......@@ -655,6 +656,9 @@ end
function _M:toScreen()
self:display()
local shader = Shader.default.textoutline and Shader.default.textoutline.shad
if self.bg_texture then self.bg_texture:toScreenFull(self.display_x, self.display_y, self.w, self.h, self.bg_texture_w, self.bg_texture_h) end
local h = self.display_y + self.h - self.fh
local now = core.game.getTime()
......@@ -671,8 +675,17 @@ function _M:toScreen()
end
self.dlist[i].dh = h
if self.shadow then item._tex:toScreenFull(self.display_x+2, h+2, item.w, item.h, item._tex_w, item._tex_h, 0,0,0, self.shadow * fade) end
if self.shadow then
if shader then
shader:paramNumber2("outlineSize", 0.7, 0.7)
shader:paramNumber2("textSize", item._tex_w, item._tex_h)
shader:use(true)
else
item._tex:toScreenFull(self.display_x+2, h+2, item.w, item.h, item._tex_w, item._tex_h, 0,0,0, self.shadow * fade)
end
end
item._tex:toScreenFull(self.display_x, h, item.w, item.h, item._tex_w, item._tex_h, 1, 1, 1, fade)
if self.shadow and shader then shader:use(false) end
h = h - self.fh
end
......
......@@ -328,6 +328,8 @@ function _M:toggleUI()
end
function _M:activate()
Shader:setDefault("textoutline", "textoutline")
local size, size_mono, font, font_mono, font_mono_h, font_h
if config.settings.tome.fonts.type == "fantasy" then
size = ({normal=16, small=14, big=18})[config.settings.tome.fonts.size]
......
......@@ -24,7 +24,7 @@ return {
tex = { texture = 0 },
textSize = textSize or {1, 1},
intensity = intensity or 0.5,
outlineSize = outlineSize or {1.5, 1.5},
outlineSize = outlineSize or {1, 1},
outlineColor = outlineColor or {0, 0, 0, 1},
},
clone = false,
......
......@@ -264,10 +264,12 @@ static GLenum sdl_gl_texture_format(SDL_Surface *s) {
// allocate memory for a texture without copying pixels in
// caller binds texture
static char *largest_black = NULL;
static int largest_size = 0;
void make_texture_for_surface(SDL_Surface *s, int *fw, int *fh, bool clamp) {
// Paramtrage de la texture.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clamp ? GL_CLAMP_TO_EDGE : GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp ? GL_CLAMP_TO_BORDER : GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clamp ? GL_CLAMP_TO_BORDER : GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// get the number of channels in the SDL surface
......@@ -285,7 +287,13 @@ void make_texture_for_surface(SDL_Surface *s, int *fw, int *fh, bool clamp) {
if (fh) *fh = realh;
//printf("request size (%d,%d), producing size (%d,%d)\n",s->w,s->h,realw,realh);
glTexImage2D(GL_TEXTURE_2D, 0, nOfColors, realw, realh, 0, texture_format, GL_UNSIGNED_BYTE, NULL);
if (!largest_black || largest_size < realw * realh * 4) {
if (largest_black) free(largest_black);
largest_black = calloc(realh*realw*4, sizeof(char));
largest_size = realh*realw*4;
printf("Upgrading black texture to size %d\n", largest_size);
}
glTexImage2D(GL_TEXTURE_2D, 0, nOfColors, realw, realh, 0, texture_format, GL_UNSIGNED_BYTE, largest_black);
#ifdef _DEBUG
GLenum err = glGetError();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment