awful text rendering

This commit is contained in:
Mitchell Hashimoto
2022-04-04 11:24:21 -07:00
parent 1a40544220
commit 6f2be8e44b
3 changed files with 32 additions and 7 deletions

View File

@ -1,10 +1,11 @@
#version 330 core #version 330 core
layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex> layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex>
out vec2 TexCoords; out vec2 TexCoords;
uniform mat4 projection;
void main() void main()
{ {
gl_Position = vec4(vertex.xy, 0.0, 1.0); gl_Position = projection * vec4(vertex.xy, 0.0, 1.0);
TexCoords = vertex.zw; TexCoords = vertex.zw;
} }

View File

@ -12,6 +12,7 @@ chars: CharList,
vao: gl.VertexArray = undefined, vao: gl.VertexArray = undefined,
vbo: gl.Buffer = undefined, vbo: gl.Buffer = undefined,
program: gl.Program = undefined, program: gl.Program = undefined,
projection: gb.gbMat4 = undefined,
const CharList = std.ArrayListUnmanaged(Char); const CharList = std.ArrayListUnmanaged(Char);
const Char = struct { const Char = struct {
@ -114,11 +115,7 @@ pub fn init(alloc: std.mem.Allocator) !TextRenderer {
@embedFile("../shaders/text.f.glsl"), @embedFile("../shaders/text.f.glsl"),
); );
// Our project var res = TextRenderer{
var proj: gb.gbMat4 = undefined;
gb.gb_mat4_ortho2d(&proj, 0, 640, 0, 480);
return TextRenderer{
.alloc = alloc, .alloc = alloc,
.ft = ft, .ft = ft,
.face = face, .face = face,
@ -126,7 +123,14 @@ pub fn init(alloc: std.mem.Allocator) !TextRenderer {
.program = program, .program = program,
.vao = vao, .vao = vao,
.vbo = vbo, .vbo = vbo,
.projection = undefined,
}; };
// Update the initialize size so we have some projection. We
// expect this will get updated almost immediately.
try res.setScreenSize(3000, 1666);
return res;
} }
pub fn deinit(self: *TextRenderer) void { pub fn deinit(self: *TextRenderer) void {
@ -141,6 +145,19 @@ pub fn deinit(self: *TextRenderer) void {
self.* = undefined; self.* = undefined;
} }
pub fn setScreenSize(self: *TextRenderer, w: i32, h: i32) !void {
gb.gb_mat4_ortho2d(
&self.projection,
0,
@intToFloat(f32, w),
0,
@intToFloat(f32, h),
);
try self.program.use();
try self.program.setUniform("projection", self.projection);
}
pub fn render( pub fn render(
self: TextRenderer, self: TextRenderer,
text: []const u8, text: []const u8,

View File

@ -4,6 +4,7 @@ const std = @import("std");
const assert = std.debug.assert; const assert = std.debug.assert;
const log = std.log.scoped(.opengl); const log = std.log.scoped(.opengl);
const gb = @import("../gb_math.zig");
const c = @import("c.zig"); const c = @import("c.zig");
const Shader = @import("Shader.zig"); const Shader = @import("Shader.zig");
const errors = @import("errors.zig"); const errors = @import("errors.zig");
@ -76,6 +77,12 @@ pub inline fn setUniform(p: Program, n: [:0]const u8, value: anytype) !void {
switch (@TypeOf(value)) { switch (@TypeOf(value)) {
@Vector(3, f32) => c.glUniform3f(loc, value[0], value[1], value[2]), @Vector(3, f32) => c.glUniform3f(loc, value[0], value[1], value[2]),
@Vector(4, f32) => c.glUniform4f(loc, value[0], value[1], value[2], value[3]), @Vector(4, f32) => c.glUniform4f(loc, value[0], value[1], value[2], value[3]),
gb.gbMat4 => c.glUniformMatrix4fv(
loc,
1,
c.GL_FALSE,
@ptrCast([*c]const f32, &value),
),
else => unreachable, else => unreachable,
} }
try errors.getError(); try errors.getError();