120 lines
3.4 KiB
Java
120 lines
3.4 KiB
Java
package mrdev023.rendering;
|
|
|
|
import static org.lwjgl.opengl.GL11.*;
|
|
import static org.lwjgl.opengl.GL20.*;
|
|
|
|
import java.io.*;
|
|
|
|
import mrdev023.math.*;
|
|
import mrdev023.utils.*;
|
|
|
|
public class Shader {
|
|
|
|
public int program;
|
|
public int includeV = 0,includeF = 0;
|
|
public static Shader MAIN,LIGHT,LIGHT_AMBIENT,FONT;
|
|
|
|
public static void init() {
|
|
System.out.println("---------------------------- Load Shader ---------------------------------------------");
|
|
MAIN = new Shader("res/shaders/main");
|
|
FONT = new Shader("res/shaders/font");
|
|
LIGHT = new Shader("res/shaders/light");
|
|
LIGHT_AMBIENT = new Shader("res/shaders/light_ambient");
|
|
System.out.println("--------------------------------------------------------------------------------------");
|
|
}
|
|
|
|
public Shader(String file){
|
|
String vertexShader = "";
|
|
try {
|
|
vertexShader = IO.loadFile(file + ".vert");
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
System.exit(-1);
|
|
}
|
|
vertexShader = loadShader(vertexShader,0,file + ".vert");
|
|
String fragmentShader = "";
|
|
try {
|
|
fragmentShader = IO.loadFile(file + ".frag");
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
System.exit(-1);
|
|
}
|
|
fragmentShader = loadShader(fragmentShader,1,file + ".vert");
|
|
program = glCreateProgram();
|
|
int vert = glCreateShader(GL_VERTEX_SHADER);
|
|
int frag = glCreateShader(GL_FRAGMENT_SHADER);
|
|
glShaderSource(vert, vertexShader);
|
|
glShaderSource(frag, fragmentShader);
|
|
glCompileShader(vert);
|
|
if (glGetShaderi(vert, GL_COMPILE_STATUS) == GL_FALSE) {
|
|
System.err.println(glGetShaderInfoLog(vert, 2048));
|
|
System.exit(1);
|
|
}
|
|
glCompileShader(frag);
|
|
if (glGetShaderi(frag, GL_COMPILE_STATUS) == GL_FALSE) {
|
|
System.err.println(glGetShaderInfoLog(frag, 2048));
|
|
System.exit(1);
|
|
}
|
|
glAttachShader(program, vert);
|
|
glAttachShader(program, frag);
|
|
glLinkProgram(program);
|
|
glValidateProgram(program);
|
|
System.out.println("Shader " + file + ".vert loaded with " + includeV + " include !");
|
|
System.out.println("Shader " + file + ".frag loaded with " + includeF + " include !");
|
|
}
|
|
|
|
public String loadShader(String shader,int a,String name){
|
|
String st = "";
|
|
BufferedReader reader = new BufferedReader(new StringReader(shader));
|
|
String buffer = "";
|
|
int line = 0;
|
|
try {
|
|
while ((buffer = reader.readLine()) != null) {
|
|
line++;
|
|
if(buffer.startsWith("#include")){
|
|
if(a == 0){
|
|
includeV++;
|
|
}else{
|
|
includeF++;
|
|
}
|
|
String path = buffer.substring(10, buffer.length() - 1);
|
|
String sh = IO.loadFile("res/shaders/" + path);
|
|
buffer += sh;
|
|
}else{
|
|
st += buffer + "\n";
|
|
}
|
|
}
|
|
reader.close();
|
|
} catch (IOException e) {
|
|
System.err.println("include file not found in " + name + " #" + line + " !");
|
|
System.exit(-1);
|
|
}
|
|
return st;
|
|
}
|
|
|
|
public void bind(){
|
|
glUseProgram(program);
|
|
}
|
|
|
|
public void unbind(){
|
|
glUseProgram(0);
|
|
}
|
|
|
|
public void uniform(String name,float v){
|
|
glUniform1f(glGetUniformLocation(program, name), v);
|
|
}
|
|
|
|
public void uniform(String name,Vector3f vec){
|
|
glUniform3f(glGetUniformLocation(program, name), vec.x,vec.y,vec.z);
|
|
}
|
|
|
|
public void uniform(String name,Matrix4f mat){
|
|
glUniformMatrix4fv(glGetUniformLocation(program, name),true, mat.getBuffer());
|
|
}
|
|
|
|
public void uniform(String name, Color4f v) {
|
|
glUniform4f(glGetUniformLocation(program, name), v.getR(),v.getG(),v.getB(),v.getA());
|
|
}
|
|
|
|
|
|
}
|