package com.gnarwhal.ld46.engine.shaders; import org.joml.Matrix4f; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import static org.lwjgl.opengl.GL20.*; public abstract class Shader { public static Shader2c SHADER2C; public static Shader2t SHADER2T; public static Shader2b SHADER2B; protected int program; protected int mvpLoc; protected Shader(String vertPath, String fragPath) { program = glCreateProgram(); int vert = loadShader(vertPath, GL_VERTEX_SHADER); int frag = loadShader(fragPath, GL_FRAGMENT_SHADER); glAttachShader(program, vert); glAttachShader(program, frag); glLinkProgram(program); glDetachShader(program, vert); glDetachShader(program, frag); glDeleteShader(vert); glDeleteShader(frag); mvpLoc = glGetUniformLocation(program, "mvp"); } private int loadShader(String path, int type) { StringBuilder file = new StringBuilder(); try { BufferedReader reader = new BufferedReader(new FileReader(new File(path))); String line; while((line = reader.readLine()) != null) file.append(line + '\n'); reader.close(); } catch (IOException e) { e.printStackTrace(); } String source = file.toString(); int shader = glCreateShader(type); glShaderSource(shader, source); glCompileShader(shader); if(glGetShaderi(shader, GL_COMPILE_STATUS) != 1) throw new RuntimeException("Failed to compile shader: " + path + "! " + glGetShaderInfoLog(shader)); return shader; } protected abstract void getUniforms(); public void setMVP(Matrix4f matrix) { glUniformMatrix4fv(mvpLoc, false, matrix.get(new float[16])); } public void enable() { glUseProgram(program); } public void disable() { glUseProgram(0); } public void destroy() { glDeleteProgram(program); } public static void init() { SHADER2C = new Shader2c(); SHADER2T = new Shader2t(); SHADER2B = new Shader2b(); } }