From 6f2be8e44b1f1a3f619d9bf4a6bb13f7f35ad687 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 4 Apr 2022 11:24:21 -0700 Subject: [PATCH] awful text rendering --- shaders/text.v.glsl | 5 +++-- src/TextRenderer.zig | 27 ++++++++++++++++++++++----- src/opengl/Program.zig | 7 +++++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/shaders/text.v.glsl b/shaders/text.v.glsl index 2d0aba729..2f835dafa 100644 --- a/shaders/text.v.glsl +++ b/shaders/text.v.glsl @@ -1,10 +1,11 @@ #version 330 core - layout (location = 0) in vec4 vertex; // out vec2 TexCoords; +uniform mat4 projection; + void main() { - gl_Position = vec4(vertex.xy, 0.0, 1.0); + gl_Position = projection * vec4(vertex.xy, 0.0, 1.0); TexCoords = vertex.zw; } diff --git a/src/TextRenderer.zig b/src/TextRenderer.zig index c55feeaf2..4ea49875a 100644 --- a/src/TextRenderer.zig +++ b/src/TextRenderer.zig @@ -12,6 +12,7 @@ chars: CharList, vao: gl.VertexArray = undefined, vbo: gl.Buffer = undefined, program: gl.Program = undefined, +projection: gb.gbMat4 = undefined, const CharList = std.ArrayListUnmanaged(Char); const Char = struct { @@ -114,11 +115,7 @@ pub fn init(alloc: std.mem.Allocator) !TextRenderer { @embedFile("../shaders/text.f.glsl"), ); - // Our project - var proj: gb.gbMat4 = undefined; - gb.gb_mat4_ortho2d(&proj, 0, 640, 0, 480); - - return TextRenderer{ + var res = TextRenderer{ .alloc = alloc, .ft = ft, .face = face, @@ -126,7 +123,14 @@ pub fn init(alloc: std.mem.Allocator) !TextRenderer { .program = program, .vao = vao, .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 { @@ -141,6 +145,19 @@ pub fn deinit(self: *TextRenderer) void { 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( self: TextRenderer, text: []const u8, diff --git a/src/opengl/Program.zig b/src/opengl/Program.zig index 1a95dc258..1ad8e0b5d 100644 --- a/src/opengl/Program.zig +++ b/src/opengl/Program.zig @@ -4,6 +4,7 @@ const std = @import("std"); const assert = std.debug.assert; const log = std.log.scoped(.opengl); +const gb = @import("../gb_math.zig"); const c = @import("c.zig"); const Shader = @import("Shader.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)) { @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]), + gb.gbMat4 => c.glUniformMatrix4fv( + loc, + 1, + c.GL_FALSE, + @ptrCast([*c]const f32, &value), + ), else => unreachable, } try errors.getError();