From 866fccb01e40ab11add47511c922ec2dd8f0454e Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 23 Jan 2020 15:00:16 +0100 Subject: Code reorganisation --- src/shader.zig | 118 --------------------------------------------------------- 1 file changed, 118 deletions(-) delete mode 100644 src/shader.zig (limited to 'src/shader.zig') diff --git a/src/shader.zig b/src/shader.zig deleted file mode 100644 index ed36035..0000000 --- a/src/shader.zig +++ /dev/null @@ -1,118 +0,0 @@ -const std = @import("std"); -const panic = std.debug.panic -const c = @import("c.zig"); - - -pub const ShaderProgram = struct { - program_id: c.GLuint, - vertex_id: c.GLuint, - fragment_id: c.GLuint, - maybe_geometry_id: ?c.GLuint, - - pub fn bind(sp: ShaderProgram) void { - c.glUseProgram(sp.program_id); - } - - pub fn attribLocation(sp: ShaderProgram, name: [*]const u8) c.GLint { - const id = c.glGetAttribLocation(sp.program_id, name); - if (id == -1) { - panic("invalid attrib: {}\n", .{name}); - } - return id; - } - - pub fn uniformLocation(sp: ShaderProgram, name: [*]const u8) c.GLint { - const id = c.glGetUniformLocation(sp.program_id, name); - if (id == -1) { - panic("invalid uniform: {}\n", .{name}); - } - return id; - } - - pub fn setUniformInt(sp: ShaderProgram, uniform_id: c.GLint, value: c_int) void { - c.glUniform1i(uniform_id, value); - } - - pub fn setUniformFloat(sp: ShaderProgram, uniform_id: c.GLint, value: f32) void { - c.glUniform1f(uniform_id, value); - } - - pub fn setUniformVec3(sp: ShaderProgram, uniform_id: c.GLint, value: math3d.Vec3) void { - c.glUniform3fv(uniform_id, 1, value.data[0..].ptr); - } - - pub fn setUniformVec4(sp: ShaderProgram, uniform_id: c.GLint, value: Vec4) void { - c.glUniform4fv(uniform_id, 1, value.data[0..].ptr); - } - - pub fn setUniformMat4x4(sp: ShaderProgram, uniform_id: c.GLint, value: Mat4x4) void { - c.glUniformMatrix4fv(uniform_id, 1, c.GL_FALSE, value.data[0][0..].ptr); - } - - pub fn create( - vertex_source: []const u8, - frag_source: []const u8, - maybe_geometry_source: ?[]u8, - ) !ShaderProgram { - var sp: ShaderProgram = undefined; - sp.vertex_id = try initGlShader(vertex_source, "vertex", c.GL_VERTEX_SHADER); - sp.fragment_id = try initGlShader(frag_source, "fragment", c.GL_FRAGMENT_SHADER); - sp.maybe_geometry_id = if (maybe_geometry_source) |geo_source| - try initGlShader(geo_source, "geometry", c.GL_GEOMETRY_SHADER) - else - null; - - sp.program_id = c.glCreateProgram(); - c.glAttachShader(sp.program_id, sp.vertex_id); - c.glAttachShader(sp.program_id, sp.fragment_id); - if (sp.maybe_geometry_id) |geo_id| { - c.glAttachShader(sp.program_id, geo_id); - } - c.glLinkProgram(sp.program_id); - - var ok: c.GLint = undefined; - c.glGetProgramiv(sp.program_id, c.GL_LINK_STATUS, &ok); - if (ok != 0) return sp; - - var error_size: c.GLint = undefined; - c.glGetProgramiv(sp.program_id, c.GL_INFO_LOG_LENGTH, &error_size); - const message = try c_allocator.alloc(u8, @intCast(usize, error_size)); - c.glGetProgramInfoLog(sp.program_id, error_size, &error_size, message.ptr); - panic("Error linking shader program: {}\n", .{message.ptr}); - } - - pub fn destroy(sp: *ShaderProgram) void { - if (sp.maybe_geometry_id) |geo_id| { - c.glDetachShader(sp.program_id, geo_id); - } - c.glDetachShader(sp.program_id, sp.fragment_id); - c.glDetachShader(sp.program_id, sp.vertex_id); - - if (sp.maybe_geometry_id) |geo_id| { - c.glDeleteShader(geo_id); - } - c.glDeleteShader(sp.fragment_id); - c.glDeleteShader(sp.vertex_id); - - c.glDeleteProgram(sp.program_id); - } -}; - -fn initGlShader(source: []const u8, name: [*]const u8, kind: c.GLenum) !c.GLuint { - const shader_id = c.glCreateShader(kind); - const source_ptr: ?[*]const u8 = source.ptr; - const source_len = @intCast(c.GLint, source.len); - c.glShaderSource(shader_id, 1, &source_ptr, &source_len); - c.glCompileShader(shader_id); - - var ok: c.GLint = undefined; - c.glGetShaderiv(shader_id, c.GL_COMPILE_STATUS, &ok); - if (ok != 0) return shader_id; - - var error_size: c.GLint = undefined; - c.glGetShaderiv(shader_id, c.GL_INFO_LOG_LENGTH, &error_size); - - const message = try c_allocator.alloc(u8, @intCast(usize, error_size)); - c.glGetShaderInfoLog(shader_id, error_size, &error_size, message.ptr); - panic("Error compiling {} shader:\n{}\n", .{ name, message.ptr }); -} -- cgit v1.2.3