aboutsummaryrefslogtreecommitdiffstats
path: root/src/gl.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/gl.zig')
-rw-r--r--src/gl.zig65
1 files changed, 30 insertions, 35 deletions
diff --git a/src/gl.zig b/src/gl.zig
index bd2c652..659911e 100644
--- a/src/gl.zig
+++ b/src/gl.zig
@@ -20,32 +20,31 @@ pub const ShaderProgram = struct {
return id;
}
- pub fn uniformLocation(self: ShaderProgram, name: [*]const u8) c.GLint {
+ pub fn uniformLocation(self: ShaderProgram, name: [*]const u8) !c.GLint {
const id = c.glGetUniformLocation(self.program_id, name);
- if (id == -1) {
- panic("invalid uniform: {}\n", .{name});
- }
+ if (id == -1)
+ return error.invalidUniform;
return id;
}
- pub fn setUniformInt(self: ShaderProgram, uniform_id: c.GLint, value: c_int) void {
+ pub fn setUniform1i(self: ShaderProgram, uniform_id: c.GLint, value: c_int) void {
c.glUniform1i(uniform_id, value);
}
- pub fn setUniformFloat(self: ShaderProgram, uniform_id: c.GLint, value: f32) void {
+ pub fn setUniform1f(self: ShaderProgram, uniform_id: c.GLint, value: f32) void {
c.glUniform1f(uniform_id, value);
}
-
- pub fn setUniformVec2(self: ShaderProgram, uniform_id: c.GLint, value: [2]f32) void {
- c.glUniform3fv(uniform_id, 1, value.ptr);
+
+ pub fn setUniform2f(self: ShaderProgram, uniform_id: c.GLint, x: f32, y: f32) void {
+ c.glUniform2f(uniform_id, x, y);
}
- pub fn setUniformVec3(self: ShaderProgram, uniform_id: c.GLint, value: [3]f32) void {
- c.glUniform3fv(uniform_id, 1, value.ptr);
+ pub fn setUniform3f(self: ShaderProgram, uniform_id: c.GLint, x: f32, y: f32, z: f32) void {
+ c.glUniform3f(uniform_id, x, y, z);
}
- pub fn setUniformVec4(self: ShaderProgram, uniform_id: c.GLint, value: [4]f32) void {
- c.glUniform4fv(uniform_id, 1, value.ptr);
+ pub fn setUniform4f(self: ShaderProgram, uniform_id: c.GLint, x: f32, y: f32, z: f32, w: f32) void {
+ c.glUniform4f(uniform_id, x, y, z, w);
}
pub fn setUniformMat4x4(self: ShaderProgram, uniform_id: c.GLint, value: [4][4]f32) void {
@@ -54,10 +53,10 @@ pub const ShaderProgram = struct {
pub fn create(vert_source: []const u8, frag_source: []const u8) !ShaderProgram {
var self: ShaderProgram = undefined;
-
+
self.vert_id = try initGlShader(vert_source, "vertex", c.GL_VERTEX_SHADER);
errdefer c.glDeleteShader(self.vert_id);
-
+
self.frag_id = try initGlShader(frag_source, "fragment", c.GL_FRAGMENT_SHADER);
errdefer c.glDeleteShader(self.frag_id);
@@ -65,7 +64,7 @@ pub const ShaderProgram = struct {
c.glAttachShader(self.program_id, self.vert_id);
c.glAttachShader(self.program_id, self.frag_id);
c.glLinkProgram(self.program_id);
-
+
errdefer c.glDeleteProgram(self.program_id);
errdefer c.glDetachShader(self.program_id, self.frag_id);
errdefer c.glDetachShader(self.program_id, self.vert_id);
@@ -78,7 +77,7 @@ pub const ShaderProgram = struct {
c.glGetProgramiv(self.program_id, c.GL_INFO_LOG_LENGTH, &error_size);
const message = try c_allocator.alloc(u8, @intCast(usize, error_size));
c.glGetProgramInfoLog(self.program_id, error_size, &error_size, message.ptr);
- std.debug.warn("Error linking shader program: {s}\n", .{ @ptrCast([*:0]const u8, message.ptr) });
+ std.debug.warn("Error linking shader program: {s}\n", .{@ptrCast([*:0]const u8, message.ptr)});
return error.LinkError;
}
@@ -117,7 +116,7 @@ fn initGlShader(source: []const u8, name: []const u8, kind: c.GLenum) !c.GLuint
pub const FramebufferObject = struct {
buffer_id: c.GLuint,
texture_id: c.GLuint,
-
+
pub fn bind(self: FramebufferObject) void {
c.glBindFramebuffer(c.GL_FRAMEBUFFER, self.buffer_id);
}
@@ -130,7 +129,7 @@ pub const FramebufferObject = struct {
var self: FramebufferObject = undefined;
c.glGenFramebuffers(1, &self.buffer_id);
c.glBindFramebuffer(c.GL_FRAMEBUFFER, self.buffer_id);
-
+
c.glGenTextures(1, &self.texture_id);
c.glBindTexture(c.GL_TEXTURE_2D, self.texture_id);
c.glTexImage2D(c.GL_TEXTURE_2D, 0, c.GL_RGBA, width, height, 0, c.GL_RGBA, c.GL_UNSIGNED_BYTE, null);
@@ -140,10 +139,9 @@ pub const FramebufferObject = struct {
c.glFramebufferTexture2D(c.GL_FRAMEBUFFER, c.GL_COLOR_ATTACHMENT0, c.GL_TEXTURE_2D, self.texture_id, 0);
-
if (c.glCheckFramebufferStatus(c.GL_FRAMEBUFFER) != c.GL_FRAMEBUFFER_COMPLETE)
return error.FBONotComplete;
-
+
c.glBindFramebuffer(c.GL_FRAMEBUFFER, 0);
return self;
}
@@ -159,13 +157,13 @@ pub const VertexObject = struct {
buffer_id: c.GLuint,
vertex_size: i32,
vertex_count: i32,
-
+
pub fn bind(self: VertexObject, attrib: u32) void {
c.glBindBuffer(c.GL_ARRAY_BUFFER, self.buffer_id);
c.glEnableVertexAttribArray(attrib);
c.glVertexAttribPointer(attrib, self.vertex_size, c.GL_FLOAT, c.GL_FALSE, 0, null);
}
-
+
pub fn draw(self: VertexObject) void {
c.glDrawArrays(c.GL_TRIANGLE_STRIP, 0, self.vertex_count);
}
@@ -175,20 +173,17 @@ pub const VertexObject = struct {
self.vertex_size = vertex_size;
self.vertex_count = @intCast(i32, vertices.len);
-
+
c.glGenVertexArrays(1, &self.array_id);
c.glBindVertexArray(self.array_id);
-
+
c.glGenBuffers(1, &self.buffer_id);
c.glBindBuffer(c.GL_ARRAY_BUFFER, self.buffer_id);
- c.glBufferData(c.GL_ARRAY_BUFFER,
- @intCast(c_long, @sizeOf(T) * vertices.len),
- @ptrCast(*const c_void, &vertices[0]),
- c.GL_STATIC_DRAW);
+ c.glBufferData(c.GL_ARRAY_BUFFER, @intCast(c_long, @sizeOf(T) * vertices.len), @ptrCast(*const c_void, &vertices[0]), c.GL_STATIC_DRAW);
return self;
}
-
+
pub fn destroy(self: *VertexObject) void {
defer c.glDeleteBuffers(1, &self.*.buffer_id);
defer c.glDeleteVertexArrays(1, &self.*.array_id);
@@ -202,10 +197,10 @@ pub const Constants = struct {
pub fn create(main_window: *c.GLFWwindow) !Constants {
var self: Constants = undefined;
-
+
c.glfwMakeContextCurrent(main_window);
self.main_window = main_window;
-
+
self.textureShader = try ShaderProgram.create(
\\#version 330 core
\\
@@ -231,9 +226,9 @@ pub const Constants = struct {
const vertices = [_]c.GLfloat{
-1.0, -1.0,
- -1.0, 1.0,
- 1.0, -1.0,
- 1.0, 1.0,
+ -1.0, 1.0,
+ 1.0, -1.0,
+ 1.0, 1.0,
};
self.normalizedQuad = VertexObject.create(f32, vertices[0..], 2);