local gl = honey.gl local module = {} setmetatable(module, {__index=_G}) setfenv(1, module) Shader = {} Shader.__index = Shader local function compileShader(source, type) local shader = gl.CreateShader(type) gl.ShaderSource(shader, source) gl.CompileShader(shader) return shader end function Shader.new(_, sources) local self = {} self.locations = {} self.links = {} local shaders = {} if sources.vertex then table.insert(shaders, compileShader(sources.vertex, gl.VERTEX_SHADER)) end if sources.fragment then table.insert(shaders, compileShader(sources.fragment, gl.FRAGMENT_SHADER)) end self.program = gl.CreateProgram() for _, shader in ipairs(shaders) do gl.AttachShader(self.program, shader) end gl.LinkProgram(self.program) for _, shader in ipairs(shaders) do gl.DeleteShader(shader) end setmetatable(self, Shader) return self end setmetatable(Shader, {__call=Shader.new}) function Shader.getLocation(self, name) if self.locations[name] then return self.locations[name] end local location = gl.GetUniformLocation(self.program, name) self.locations[name] = location return location end function Shader.use(self) gl.UseProgram(self.program) end function Shader.setMatrix(self, name, matrix) local location = self:getLocation(name) gl.UniformMatrix4fv(location, false, matrix.data) end return module.Shader