diff options
Diffstat (limited to 'src/gl.zig')
| -rw-r--r-- | src/gl.zig | 65 |
1 files changed, 30 insertions, 35 deletions
@@ -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); |
