WIP: Implement text rendering
This commit is contained in:
parent
81d24ea62d
commit
ebe6aa8d9a
2
lib/zgl
2
lib/zgl
|
@ -1 +1 @@
|
||||||
Subproject commit 9fc2524bbf2e1172a5cb218eca37dc99930a31db
|
Subproject commit cac42e0692374742036f14d44379dd085c084caa
|
|
@ -80,10 +80,10 @@ pub fn getSelIdx(self: Self, offset: i32) usize {
|
||||||
}
|
}
|
||||||
//ret = len - @mod(-offset - sel, len - 1);
|
//ret = len - @mod(-offset - sel, len - 1);
|
||||||
//ret = @mod(0, 2);
|
//ret = @mod(0, 2);
|
||||||
std.debug.print("len {},offset {},ret {}, sel {}\n", .{ len, offset, ret, sel });
|
//std.debug.print("len {},offset {},ret {}, sel {}\n", .{ len, offset, ret, sel });
|
||||||
} else {
|
} else {
|
||||||
ret = @mod(offset + sel, len);
|
ret = @mod(offset + sel, len);
|
||||||
std.debug.print("len {},offset {},ret {}, sel {}\n", .{ len, offset, ret, sel });
|
//std.debug.print("len {},offset {},ret {}, sel {}\n", .{ len, offset, ret, sel });
|
||||||
}
|
}
|
||||||
|
|
||||||
return @intCast(usize, ret);
|
return @intCast(usize, ret);
|
||||||
|
|
106
src/Renderer.zig
106
src/Renderer.zig
|
@ -15,7 +15,7 @@ color: [4]f32,
|
||||||
test_counter: usize = 0,
|
test_counter: usize = 0,
|
||||||
|
|
||||||
vbo: [max_objects]f32 = .{0.0} ** max_objects,
|
vbo: [max_objects]f32 = .{0.0} ** max_objects,
|
||||||
colors: [max_objects][4]f32 = .{[4]f32{ 0.0, 0.0, 0.0, 1.0 }} ** max_objects,
|
//colors: [max_objects][4]f32 = .{[4]f32{ 0.0, 0.0, 0.0, 1.0 }} ** max_objects,
|
||||||
vbo_index: usize = 0,
|
vbo_index: usize = 0,
|
||||||
|
|
||||||
const max_objects: usize = 16384;
|
const max_objects: usize = 16384;
|
||||||
|
@ -27,6 +27,7 @@ fn glGetProcAddress(p: []const u8, proc: [:0]const u8) ?*const anyopaque {
|
||||||
|
|
||||||
pub fn init() !Self {
|
pub fn init() !Self {
|
||||||
try sdl.init(.{ .video = true, .audio = true, .events = true });
|
try sdl.init(.{ .video = true, .audio = true, .events = true });
|
||||||
|
try sdl.ttf.init();
|
||||||
|
|
||||||
try sdl.gl.setAttribute(.{ .context_major_version = 3 });
|
try sdl.gl.setAttribute(.{ .context_major_version = 3 });
|
||||||
try sdl.gl.setAttribute(.{ .context_minor_version = 3 });
|
try sdl.gl.setAttribute(.{ .context_minor_version = 3 });
|
||||||
|
@ -52,7 +53,6 @@ pub fn init() !Self {
|
||||||
|
|
||||||
// Shader stuff
|
// Shader stuff
|
||||||
var mvp_loc: u32 = undefined;
|
var mvp_loc: u32 = undefined;
|
||||||
//var color_loc: u32 = undefined;
|
|
||||||
const program = gl.Program.create();
|
const program = gl.Program.create();
|
||||||
{
|
{
|
||||||
const vs = gl.Shader.create(.vertex);
|
const vs = gl.Shader.create(.vertex);
|
||||||
|
@ -74,7 +74,6 @@ pub fn init() !Self {
|
||||||
program.link();
|
program.link();
|
||||||
|
|
||||||
mvp_loc = program.uniformLocation("mvp").?;
|
mvp_loc = program.uniformLocation("mvp").?;
|
||||||
//color_loc = program.uniformLocation("color").?;
|
|
||||||
}
|
}
|
||||||
program.use();
|
program.use();
|
||||||
|
|
||||||
|
@ -95,18 +94,24 @@ pub fn init() !Self {
|
||||||
const buf = gl.Buffer.gen();
|
const buf = gl.Buffer.gen();
|
||||||
buf.bind(.array_buffer);
|
buf.bind(.array_buffer);
|
||||||
|
|
||||||
gl.vertexAttribPointer(0, 2, .float, false, @sizeOf(f32) * 6, @sizeOf(f32) * 0);
|
gl.vertexAttribPointer(0, 2, .float, false, @sizeOf(f32) * 8, @sizeOf(f32) * 0);
|
||||||
gl.enableVertexAttribArray(0);
|
gl.enableVertexAttribArray(0);
|
||||||
|
|
||||||
gl.vertexAttribPointer(1, 4, .float, false, @sizeOf(f32) * 6, @sizeOf(f32) * 2);
|
gl.vertexAttribPointer(1, 4, .float, false, @sizeOf(f32) * 8, @sizeOf(f32) * 2);
|
||||||
gl.enableVertexAttribArray(1);
|
gl.enableVertexAttribArray(1);
|
||||||
|
|
||||||
|
gl.vertexAttribPointer(2, 2, .float, false, @sizeOf(f32) * 8, @sizeOf(f32) * 6);
|
||||||
|
gl.enableVertexAttribArray(2);
|
||||||
|
|
||||||
gl.clearColor(0.91, 0.85, 0.65, 1.00);
|
gl.clearColor(0.91, 0.85, 0.65, 1.00);
|
||||||
|
|
||||||
// TODO: See if there's a more optimal solution to this, maybe activating only when necessary
|
// TODO: See if there's a more optimal solution to this, maybe activating only when necessary
|
||||||
gl.enable(.blend);
|
gl.enable(.blend);
|
||||||
gl.blendFunc(.src_alpha, .one_minus_src_alpha);
|
gl.blendFunc(.src_alpha, .one_minus_src_alpha);
|
||||||
|
|
||||||
|
var text = Text.init("testing123");
|
||||||
|
text.deinit();
|
||||||
|
|
||||||
return Self{ .window = window, .context = ctx, .buffer = buf, .color = .{ 0, 0, 0, 0 } };
|
return Self{ .window = window, .context = ctx, .buffer = buf, .color = .{ 0, 0, 0, 0 } };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,6 +135,7 @@ pub fn render(self: *Self) void {
|
||||||
pub fn deinit(self: *Self) void {
|
pub fn deinit(self: *Self) void {
|
||||||
gl.disableVertexAttribArray(0);
|
gl.disableVertexAttribArray(0);
|
||||||
sdl.quit();
|
sdl.quit();
|
||||||
|
sdl.ttf.quit();
|
||||||
self.window.destroy();
|
self.window.destroy();
|
||||||
sdl.gl.deleteContext(self.context);
|
sdl.gl.deleteContext(self.context);
|
||||||
}
|
}
|
||||||
|
@ -158,7 +164,6 @@ pub fn drawRectangle(self: *Self, x: i32, y: i32, w: i32, h: i32) void {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fillRectangle(self: *Self, x: i32, y: i32, w: i32, h: i32) void {
|
pub fn fillRectangle(self: *Self, x: i32, y: i32, w: i32, h: i32) void {
|
||||||
//const indices = [_]u8{ 1, 3, 0, 1, 3, 2 };
|
|
||||||
self.fillRectangleEx(x, y, w, h, 0);
|
self.fillRectangleEx(x, y, w, h, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,8 +171,6 @@ pub fn fillRectangleEx(self: *Self, x: i32, y: i32, w: i32, h: i32, skew_x: i32)
|
||||||
// TODO: Is this still necessary?
|
// TODO: Is this still necessary?
|
||||||
self.test_counter += 1;
|
self.test_counter += 1;
|
||||||
|
|
||||||
//gl.uniform4fv(self.color_loc, &.{self.color});
|
|
||||||
|
|
||||||
var xf = @intToFloat(f32, x);
|
var xf = @intToFloat(f32, x);
|
||||||
var yf = @intToFloat(f32, y);
|
var yf = @intToFloat(f32, y);
|
||||||
var wf = @intToFloat(f32, w);
|
var wf = @intToFloat(f32, w);
|
||||||
|
@ -176,28 +179,28 @@ pub fn fillRectangleEx(self: *Self, x: i32, y: i32, w: i32, h: i32, skew_x: i32)
|
||||||
const skew_x_offset = @intToFloat(f32, skew_x) * hf / 100;
|
const skew_x_offset = @intToFloat(f32, skew_x) * hf / 100;
|
||||||
|
|
||||||
const i = self.vbo_index;
|
const i = self.vbo_index;
|
||||||
const vertex_data = [36]f32{
|
const vertex_data = [_]f32{
|
||||||
xf + skew_x_offset, yf, // up-left
|
xf + skew_x_offset, yf, // up-left
|
||||||
self.color[0], self.color[1],
|
self.color[0], self.color[1], self.color[2], self.color[3],
|
||||||
self.color[2], self.color[3],
|
0.0, 0.0,
|
||||||
xf + wf + skew_x_offset, yf, // up-right
|
xf + wf + skew_x_offset, yf, // up-right
|
||||||
self.color[0], self.color[1],
|
self.color[0], self.color[1], self.color[2], self.color[3],
|
||||||
self.color[2], self.color[3],
|
1.0, 0.0,
|
||||||
xf - skew_x_offset, yf + hf, // down-left
|
xf - skew_x_offset, yf + hf, // down-left
|
||||||
self.color[0], self.color[1],
|
self.color[0], self.color[1], self.color[2], self.color[3],
|
||||||
self.color[2], self.color[3],
|
0.0, 1.0,
|
||||||
xf + wf - skew_x_offset, yf + hf, // down-right
|
xf + wf - skew_x_offset, yf + hf, // down-right
|
||||||
self.color[0], self.color[1],
|
self.color[0], self.color[1], self.color[2], self.color[3],
|
||||||
self.color[2], self.color[3],
|
1.0, 1.0,
|
||||||
xf + wf + skew_x_offset, yf, // up-right
|
xf + wf + skew_x_offset, yf, // up-right
|
||||||
self.color[0], self.color[1],
|
self.color[0], self.color[1], self.color[2], self.color[3],
|
||||||
self.color[2], self.color[3],
|
1.0, 0.0,
|
||||||
xf - skew_x_offset, yf + hf, // down-left
|
xf - skew_x_offset, yf + hf, // down-left
|
||||||
self.color[0], self.color[1],
|
self.color[0], self.color[1], self.color[2], self.color[3],
|
||||||
self.color[2], self.color[3],
|
0.0, 1.0,
|
||||||
};
|
};
|
||||||
std.mem.copy(f32, self.vbo[i .. i + 36], &vertex_data);
|
std.mem.copy(f32, self.vbo[i .. i + vertex_data.len], &vertex_data);
|
||||||
self.vbo_index += 36;
|
self.vbo_index += vertex_data.len;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn renderRectangle(self: *Self, x: i32, y: i32, w: i32, h: i32) void {
|
fn renderRectangle(self: *Self, x: i32, y: i32, w: i32, h: i32) void {
|
||||||
|
@ -212,3 +215,60 @@ pub fn getOutputSize(self: Self) OutputSize {
|
||||||
.height = wsize.height,
|
.height = wsize.height,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const image = [_]u8{
|
||||||
|
// 1
|
||||||
|
0,0,0,
|
||||||
|
255,255,255,
|
||||||
|
0,0,0,
|
||||||
|
255,255,255,
|
||||||
|
// 2
|
||||||
|
255,255,255,
|
||||||
|
0,0,0,
|
||||||
|
255,255,255,
|
||||||
|
0,0,0,
|
||||||
|
// 1
|
||||||
|
0,0,0,
|
||||||
|
255,255,255,
|
||||||
|
0,0,0,
|
||||||
|
255,255,255,
|
||||||
|
// 2
|
||||||
|
255,255,255,
|
||||||
|
0,0,0,
|
||||||
|
255,255,255,
|
||||||
|
0,0,0,
|
||||||
|
};
|
||||||
|
|
||||||
|
const Text = struct {
|
||||||
|
texture: gl.Texture,
|
||||||
|
|
||||||
|
pub fn init(text: [:0]const u8) Text {
|
||||||
|
var tex = gl.genTexture();
|
||||||
|
//defer gl.Texture.delete(tex);
|
||||||
|
gl.bindTexture(tex, .@"2d");
|
||||||
|
|
||||||
|
var font = sdl.ttf.openFont("res/fonts/MarginaliaRegular-8XlZ.ttf", 200) catch unreachable;
|
||||||
|
//defer font.close();
|
||||||
|
var surface = font.renderTextBlended(text, sdl.Color.white) catch unreachable;
|
||||||
|
const width = @intCast(usize, surface.ptr.w);
|
||||||
|
const height = @intCast(usize, surface.ptr.h);
|
||||||
|
var newsurf = sdl.c.SDL_ConvertSurfaceFormat(surface.ptr, @enumToInt(sdl.PixelFormatEnum.argb8888), 0) orelse unreachable;
|
||||||
|
const data = @ptrCast([*]const u8, newsurf.pixels);
|
||||||
|
//defer surface.destroy();
|
||||||
|
|
||||||
|
gl.textureImage2D(.@"2d", 0, .rgba, width, height, .rgba, .unsigned_byte, data);
|
||||||
|
|
||||||
|
gl.texParameter(.@"2d", .wrap_s, .clamp_to_edge);
|
||||||
|
gl.texParameter(.@"2d", .wrap_r, .clamp_to_edge);
|
||||||
|
gl.texParameter(.@"2d", .min_filter, .linear);
|
||||||
|
gl.texParameter(.@"2d", .mag_filter, .linear);
|
||||||
|
|
||||||
|
return Text {
|
||||||
|
.texture = tex,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn deinit(self: *Text) void {
|
||||||
|
_ = self;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
#version 330 core
|
#version 330 core
|
||||||
|
|
||||||
in vec4 color;
|
in vec4 color;
|
||||||
|
in vec2 Texcoord;
|
||||||
|
uniform sampler2D tex;
|
||||||
|
|
||||||
void main(){
|
void main(){
|
||||||
gl_FragColor = color;
|
gl_FragColor = texture(tex, Texcoord) * color;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,15 @@
|
||||||
|
|
||||||
layout (location = 0) in vec2 pos;
|
layout (location = 0) in vec2 pos;
|
||||||
layout (location = 1) in vec4 v_color;
|
layout (location = 1) in vec4 v_color;
|
||||||
|
layout (location = 2) in vec2 texcoord;
|
||||||
|
out vec2 Texcoord;
|
||||||
|
|
||||||
uniform mat4 mvp;
|
uniform mat4 mvp;
|
||||||
|
|
||||||
out vec4 color;
|
out vec4 color;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
Texcoord = texcoord;
|
||||||
color = v_color;
|
color = v_color;
|
||||||
gl_Position = mvp * vec4((pos + vec2(0.5, 0.5)), 0, 1);
|
gl_Position = mvp * vec4((pos + vec2(0.5, 0.5)), 0, 1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue