mirror of
https://github.com/PixelGuys/Cubyz.git
synced 2025-08-04 03:37:59 -04:00
Render text "shadows", once again till++ forced me to do it.
This commit is contained in:
parent
60f0c5d3af
commit
9dee31ccbe
@ -741,6 +741,7 @@ pub const TextBuffer = struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn render(self: TextBuffer, _x: f32, _y: f32, _fontSize: f32) !void {
|
pub fn render(self: TextBuffer, _x: f32, _y: f32, _fontSize: f32) !void {
|
||||||
|
try self.renderShadow(_x, _y, _fontSize);
|
||||||
const oldTranslation = draw.setTranslation(.{_x, _y});
|
const oldTranslation = draw.setTranslation(.{_x, _y});
|
||||||
defer draw.restoreTranslation(oldTranslation);
|
defer draw.restoreTranslation(oldTranslation);
|
||||||
const oldScale = draw.setScale(_fontSize/16.0);
|
const oldScale = draw.setScale(_fontSize/16.0);
|
||||||
@ -792,6 +793,73 @@ pub const TextBuffer = struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn shadowColor(color: u24) u24 {
|
||||||
|
const r = @intToFloat(f32, color >> 16);
|
||||||
|
const g = @intToFloat(f32, color >> 8 & 255);
|
||||||
|
const b = @intToFloat(f32, color & 255);
|
||||||
|
const perceivedBrightness = @sqrt(0.299*r*r + 0.587*g*g + 0.114*b*b);
|
||||||
|
if(perceivedBrightness < 64) {
|
||||||
|
return 0xffffff; // Make shadows white for better readability.
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn renderShadow(self: TextBuffer, _x: f32, _y: f32, _fontSize: f32) !void { // Basically a copy of render with some color and position changes.
|
||||||
|
const oldTranslation = draw.setTranslation(.{_x + _fontSize/16.0, _y + _fontSize/16.0});
|
||||||
|
defer draw.restoreTranslation(oldTranslation);
|
||||||
|
const oldScale = draw.setScale(_fontSize/16.0);
|
||||||
|
defer draw.restoreScale(oldScale);
|
||||||
|
var x: f32 = 0;
|
||||||
|
var y: f32 = 0;
|
||||||
|
TextRendering.shader.bind();
|
||||||
|
c.glUniform2f(TextRendering.uniforms.scene, @intToFloat(f32, main.Window.width), @intToFloat(f32, main.Window.height));
|
||||||
|
c.glUniform1f(TextRendering.uniforms.ratio, draw.scale);
|
||||||
|
c.glUniform1f(TextRendering.uniforms.alpha, @intToFloat(f32, draw.color >> 24) / 255.0);
|
||||||
|
c.glActiveTexture(c.GL_TEXTURE0);
|
||||||
|
c.glBindTexture(c.GL_TEXTURE_2D, TextRendering.glyphTexture[0]);
|
||||||
|
c.glBindVertexArray(draw.rectVAO);
|
||||||
|
const lineWraps: []f32 = try main.threadAllocator.alloc(f32, self.lineBreaks.items.len - 1);
|
||||||
|
defer main.threadAllocator.free(lineWraps);
|
||||||
|
var i: usize = 0;
|
||||||
|
while(i < self.lineBreaks.items.len - 1) : (i += 1) {
|
||||||
|
x = self.getLineOffset(i);
|
||||||
|
for(self.glyphs[self.lineBreaks.items[i].index..self.lineBreaks.items[i+1].index]) |glyph| {
|
||||||
|
if(glyph.character != '\n') {
|
||||||
|
const ftGlyph = try TextRendering.getGlyph(glyph.index);
|
||||||
|
var fontEffect = glyph.fontEffect;
|
||||||
|
fontEffect.color = shadowColor(fontEffect.color);
|
||||||
|
TextRendering.drawGlyph(ftGlyph, x + glyph.x_offset, y - glyph.y_offset, @bitCast(u28, fontEffect));
|
||||||
|
}
|
||||||
|
x += glyph.x_advance;
|
||||||
|
y -= glyph.y_advance;
|
||||||
|
}
|
||||||
|
lineWraps[i] = x - self.getLineOffset(i);
|
||||||
|
x = 0;
|
||||||
|
y += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(self.lines.items) |_line| {
|
||||||
|
var line: Line = _line;
|
||||||
|
y = 0;
|
||||||
|
if(line.isUnderline) y += 15
|
||||||
|
else y += 8;
|
||||||
|
draw.setColor(shadowColor(line.color) | (@as(u32, 0xff000000) & draw.color));
|
||||||
|
for(lineWraps, 0..) |lineWrap, j| {
|
||||||
|
const lineStart = @max(0, line.start);
|
||||||
|
const lineEnd = @min(lineWrap, line.end);
|
||||||
|
if(lineStart < lineEnd) {
|
||||||
|
var start = Vec2f{lineStart + self.getLineOffset(j), y};
|
||||||
|
const dim = Vec2f{lineEnd - lineStart, 1};
|
||||||
|
draw.rect(start, dim);
|
||||||
|
}
|
||||||
|
line.start -= lineWrap;
|
||||||
|
line.end -= lineWrap;
|
||||||
|
y += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const TextRendering = struct {
|
const TextRendering = struct {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user