379 lines
16 KiB
Java
379 lines
16 KiB
Java
package electrosphere.renderer;
|
|
|
|
import electrosphere.main.Main;
|
|
import java.io.BufferedReader;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import org.lwjgl.opengl.GL20;
|
|
import static org.lwjgl.opengl.GL20.*;
|
|
|
|
/**
|
|
*
|
|
* @author amaterasu
|
|
*/
|
|
public class ShaderProgram {
|
|
//
|
|
//Program stuff
|
|
//
|
|
int vertexShader;
|
|
int fragmentShader;
|
|
int shaderProgram;
|
|
|
|
|
|
//
|
|
//Uniform locations
|
|
//
|
|
public int shaderVertexModelLoc;
|
|
public int shaderVertexViewLoc;
|
|
public int shaderVertexProjectionLoc;
|
|
public int shaderVertexViewPosLoc;
|
|
public int shaderVertexBonesLoc;
|
|
public int shaderVertexHasBonesLoc;
|
|
public int shaderVertexNumBonesLoc;
|
|
|
|
|
|
//Uniforms
|
|
//list of names of all uniforms in the shader
|
|
public ArrayList<String> uniformList;
|
|
//map
|
|
//string -> tuple
|
|
//tuple: a string describing the type of the data,the current value,location
|
|
//ie arrayVec3,[<1,0,0>,<2,0,0>],colors
|
|
// Mat4,[Matrix4f],modelMatrix
|
|
public HashMap<String,ArrayList> uniformMap;
|
|
|
|
public static ShaderProgram smart_assemble_shader(boolean ContainsBones, boolean apply_lighting){
|
|
|
|
String vertex_shader_path = "";
|
|
if(ContainsBones){
|
|
vertex_shader_path = "/Shaders/VertexShader.vs";
|
|
} else {
|
|
vertex_shader_path = "/Shaders/VertexShaderNoBones.vs";
|
|
}
|
|
|
|
String fragment_shader_path = "/Shaders/FragmentShader.fs";
|
|
//
|
|
//Create ShaderProgram object
|
|
//
|
|
ShaderProgram rVal = new ShaderProgram();
|
|
//
|
|
//Read in shader programs
|
|
//
|
|
String tempForReadingShaders = "";
|
|
try {
|
|
BufferedReader br = new BufferedReader(new FileReader(Main.class.getResource(vertex_shader_path).getFile()));
|
|
try {
|
|
StringBuilder sb = new StringBuilder();
|
|
String line = br.readLine();
|
|
|
|
while (line != null) {
|
|
sb.append(line);
|
|
sb.append(System.lineSeparator());
|
|
line = br.readLine();
|
|
}
|
|
tempForReadingShaders = sb.toString();
|
|
} finally {
|
|
br.close();
|
|
}
|
|
} catch (IOException e) {
|
|
}
|
|
String vertexShaderSource = tempForReadingShaders;
|
|
//This try-catch block reads the FragmentShader source into memory
|
|
try {
|
|
BufferedReader br = new BufferedReader(new FileReader(Main.class.getResource(fragment_shader_path).getFile()));
|
|
try {
|
|
StringBuilder sb = new StringBuilder();
|
|
String line = br.readLine();
|
|
while (line != null) {
|
|
sb.append(line);
|
|
sb.append(System.lineSeparator());
|
|
line = br.readLine();
|
|
}
|
|
tempForReadingShaders = sb.toString();
|
|
} finally {
|
|
br.close();
|
|
}
|
|
} catch (IOException e) {
|
|
}
|
|
String fragmentShaderSource = tempForReadingShaders;
|
|
//Creates a new shader object and assigns its 'pointer' to the integer "vertexShader"
|
|
rVal.vertexShader = glCreateShader(GL20.GL_VERTEX_SHADER);
|
|
//This alerts openGL to the presence of a vertex shader and points the shader at its source
|
|
glShaderSource(rVal.vertexShader, vertexShaderSource);
|
|
//Compiles the source for the vertex shader object
|
|
glCompileShader(rVal.vertexShader);
|
|
//The following tests if the vertex shader compiles successfully
|
|
int success;
|
|
success = glGetShaderi(rVal.vertexShader, GL_COMPILE_STATUS);
|
|
if (success != GL_TRUE) {
|
|
System.out.println("Vertex Shader failed to compile!");
|
|
System.out.println("Source is: ");
|
|
System.out.println(GL20.glGetShaderSource(rVal.vertexShader));
|
|
throw new RuntimeException(GL20.glGetShaderInfoLog(rVal.vertexShader));
|
|
}
|
|
//Creates and opengl object for a fragment shader and assigns its 'pointer' to the integer fragmentShader
|
|
rVal.fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
//This points the opengl shadder object to its proper source
|
|
glShaderSource(rVal.fragmentShader, fragmentShaderSource);
|
|
//This compiles the shader object
|
|
glCompileShader(rVal.fragmentShader);
|
|
//This tests for the success of the compile attempt
|
|
success = glGetShaderi(rVal.fragmentShader, GL_COMPILE_STATUS);
|
|
if (success != GL_TRUE) {
|
|
System.out.println("Fragment Shader failed to compile!");
|
|
System.out.println("Source is: ");
|
|
System.out.println(GL20.glGetShaderSource(rVal.fragmentShader));
|
|
throw new RuntimeException(GL20.glGetShaderInfoLog(rVal.fragmentShader));
|
|
}
|
|
//This creates a shader program opengl object and assigns its 'pointer' to the integer shaderProgram
|
|
rVal.shaderProgram = glCreateProgram();
|
|
//This attaches the vertex and fragment shaders to the program
|
|
glAttachShader(rVal.shaderProgram, rVal.vertexShader);
|
|
glAttachShader(rVal.shaderProgram, rVal.fragmentShader);
|
|
//This links the program to the GPU (I think its to the GPU anyway)
|
|
glLinkProgram(rVal.shaderProgram);
|
|
//Tests for the success of the shader program creation
|
|
success = glGetProgrami(rVal.shaderProgram, GL_LINK_STATUS);
|
|
if (success != GL_TRUE) {
|
|
throw new RuntimeException(glGetProgramInfoLog(rVal.shaderProgram));
|
|
}
|
|
|
|
//Deletes the individual shader objects to free up memory
|
|
glDeleteShader(rVal.vertexShader);
|
|
glDeleteShader(rVal.fragmentShader);
|
|
|
|
|
|
|
|
//
|
|
//Set locations
|
|
//
|
|
rVal.shaderVertexModelLoc = glGetUniformLocation(rVal.shaderProgram, "model");
|
|
rVal.shaderVertexViewLoc = glGetUniformLocation(rVal.shaderProgram, "view");
|
|
rVal.shaderVertexProjectionLoc = glGetUniformLocation(rVal.shaderProgram, "projection");
|
|
rVal.shaderVertexViewPosLoc = glGetUniformLocation(rVal.shaderProgram, "viewPos");
|
|
if(ContainsBones){
|
|
rVal.shaderVertexBonesLoc = glGetUniformLocation(rVal.shaderProgram, "bones");
|
|
rVal.shaderVertexNumBonesLoc = glGetUniformLocation(rVal.shaderProgram, "numBones");
|
|
}
|
|
rVal.shaderVertexHasBonesLoc = glGetUniformLocation(rVal.shaderProgram, "hasBones");
|
|
|
|
|
|
|
|
|
|
return rVal;
|
|
}
|
|
public static ShaderProgram load_default_shader_program(){
|
|
|
|
|
|
//
|
|
//Create ShaderProgram object
|
|
//
|
|
ShaderProgram rVal = new ShaderProgram();
|
|
//
|
|
//Read in shader programs
|
|
//
|
|
String tempForReadingShaders = "";
|
|
try {
|
|
BufferedReader br = new BufferedReader(new FileReader(Main.class.getResource("/Shaders/VertexShader.vs").getFile()));
|
|
try {
|
|
StringBuilder sb = new StringBuilder();
|
|
String line = br.readLine();
|
|
|
|
while (line != null) {
|
|
sb.append(line);
|
|
sb.append(System.lineSeparator());
|
|
line = br.readLine();
|
|
}
|
|
tempForReadingShaders = sb.toString();
|
|
} finally {
|
|
br.close();
|
|
}
|
|
} catch (IOException e) {
|
|
}
|
|
String vertexShaderSource = tempForReadingShaders;
|
|
//This try-catch block reads the FragmentShader source into memory
|
|
try {
|
|
BufferedReader br = new BufferedReader(new FileReader(Main.class.getResource("/Shaders/FragmentShader.fs").getFile()));
|
|
try {
|
|
StringBuilder sb = new StringBuilder();
|
|
String line = br.readLine();
|
|
while (line != null) {
|
|
sb.append(line);
|
|
sb.append(System.lineSeparator());
|
|
line = br.readLine();
|
|
}
|
|
tempForReadingShaders = sb.toString();
|
|
} finally {
|
|
br.close();
|
|
}
|
|
} catch (IOException e) {
|
|
}
|
|
String fragmentShaderSource = tempForReadingShaders;
|
|
//Creates a new shader object and assigns its 'pointer' to the integer "vertexShader"
|
|
rVal.vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
|
//This alerts openGL to the presence of a vertex shader and points the shader at its source
|
|
glShaderSource(rVal.vertexShader, vertexShaderSource);
|
|
//Compiles the source for the vertex shader object
|
|
glCompileShader(rVal.vertexShader);
|
|
//The following tests if the vertex shader compiles successfully
|
|
int success;
|
|
success = glGetShaderi(rVal.vertexShader, GL_COMPILE_STATUS);
|
|
if (success != GL_TRUE) {
|
|
System.out.println("Vertex Shader failed to compile!");
|
|
throw new RuntimeException(GL20.glGetShaderInfoLog(rVal.vertexShader));
|
|
}
|
|
//Creates and opengl object for a fragment shader and assigns its 'pointer' to the integer fragmentShader
|
|
rVal.fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
//This points the opengl shadder object to its proper source
|
|
glShaderSource(rVal.fragmentShader, fragmentShaderSource);
|
|
//This compiles the shader object
|
|
glCompileShader(rVal.fragmentShader);
|
|
//This tests for the success of the compile attempt
|
|
success = glGetShaderi(rVal.fragmentShader, GL_COMPILE_STATUS);
|
|
if (success != GL_TRUE) {
|
|
System.out.println("Fragment Shader failed to compile!");
|
|
throw new RuntimeException(GL20.glGetShaderInfoLog(rVal.fragmentShader));
|
|
}
|
|
//This creates a shader program opengl object and assigns its 'pointer' to the integer shaderProgram
|
|
rVal.shaderProgram = glCreateProgram();
|
|
//This attaches the vertex and fragment shaders to the program
|
|
glAttachShader(rVal.shaderProgram, rVal.vertexShader);
|
|
glAttachShader(rVal.shaderProgram, rVal.fragmentShader);
|
|
//This links the program to the GPU (I think its to the GPU anyway)
|
|
glLinkProgram(rVal.shaderProgram);
|
|
//Tests for the success of the shader program creation
|
|
success = glGetProgrami(rVal.shaderProgram, GL_LINK_STATUS);
|
|
if (success != GL_TRUE) {
|
|
throw new RuntimeException(glGetProgramInfoLog(rVal.shaderProgram));
|
|
}
|
|
|
|
//Deletes the individual shader objects to free up memory
|
|
glDeleteShader(rVal.vertexShader);
|
|
glDeleteShader(rVal.fragmentShader);
|
|
|
|
|
|
|
|
//
|
|
//Set locations
|
|
//
|
|
rVal.shaderVertexModelLoc = glGetUniformLocation(rVal.shaderProgram, "model");
|
|
rVal.shaderVertexViewLoc = glGetUniformLocation(rVal.shaderProgram, "view");
|
|
rVal.shaderVertexProjectionLoc = glGetUniformLocation(rVal.shaderProgram, "projection");
|
|
rVal.shaderVertexViewPosLoc = glGetUniformLocation(rVal.shaderProgram, "viewPos");
|
|
rVal.shaderVertexBonesLoc = glGetUniformLocation(rVal.shaderProgram, "bones");
|
|
rVal.shaderVertexNumBonesLoc = glGetUniformLocation(rVal.shaderProgram, "numBones");
|
|
rVal.shaderVertexHasBonesLoc = glGetUniformLocation(rVal.shaderProgram, "hasBones");
|
|
|
|
|
|
|
|
|
|
return rVal;
|
|
}
|
|
|
|
public static ShaderProgram loadSpecificShader(String vertexPath, String fragmentPath){
|
|
ShaderProgram rVal = new ShaderProgram();
|
|
|
|
String vertex_shader_path = vertexPath;
|
|
String fragment_shader_path = fragmentPath;
|
|
//
|
|
//Read in shader programs
|
|
//
|
|
String tempForReadingShaders = "";
|
|
try {
|
|
BufferedReader br = new BufferedReader(new FileReader(Main.class.getResource(vertex_shader_path).getFile()));
|
|
try {
|
|
StringBuilder sb = new StringBuilder();
|
|
String line = br.readLine();
|
|
|
|
while (line != null) {
|
|
sb.append(line);
|
|
sb.append(System.lineSeparator());
|
|
line = br.readLine();
|
|
}
|
|
tempForReadingShaders = sb.toString();
|
|
} finally {
|
|
br.close();
|
|
}
|
|
} catch (IOException e) {
|
|
}
|
|
String vertexShaderSource = tempForReadingShaders;
|
|
//This try-catch block reads the FragmentShader source into memory
|
|
try {
|
|
BufferedReader br = new BufferedReader(new FileReader(Main.class.getResource(fragment_shader_path).getFile()));
|
|
try {
|
|
StringBuilder sb = new StringBuilder();
|
|
String line = br.readLine();
|
|
while (line != null) {
|
|
sb.append(line);
|
|
sb.append(System.lineSeparator());
|
|
line = br.readLine();
|
|
}
|
|
tempForReadingShaders = sb.toString();
|
|
} finally {
|
|
br.close();
|
|
}
|
|
} catch (IOException e) {
|
|
}
|
|
String fragmentShaderSource = tempForReadingShaders;
|
|
//Creates a new shader object and assigns its 'pointer' to the integer "vertexShader"
|
|
rVal.vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
|
//This alerts openGL to the presence of a vertex shader and points the shader at its source
|
|
glShaderSource(rVal.vertexShader, vertexShaderSource);
|
|
//Compiles the source for the vertex shader object
|
|
glCompileShader(rVal.vertexShader);
|
|
//The following tests if the vertex shader compiles successfully
|
|
int success;
|
|
success = glGetShaderi(rVal.vertexShader, GL_COMPILE_STATUS);
|
|
if (success != GL_TRUE) {
|
|
System.out.println("Vertex Shader failed to compile!");
|
|
throw new RuntimeException(GL20.glGetShaderInfoLog(rVal.vertexShader));
|
|
}
|
|
//Creates and opengl object for a fragment shader and assigns its 'pointer' to the integer fragmentShader
|
|
rVal.fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
//This points the opengl shadder object to its proper source
|
|
glShaderSource(rVal.fragmentShader, fragmentShaderSource);
|
|
//This compiles the shader object
|
|
glCompileShader(rVal.fragmentShader);
|
|
//This tests for the success of the compile attempt
|
|
success = glGetShaderi(rVal.fragmentShader, GL_COMPILE_STATUS);
|
|
if (success != GL_TRUE) {
|
|
System.out.println("Fragment Shader failed to compile!");
|
|
throw new RuntimeException(GL20.glGetShaderInfoLog(rVal.fragmentShader));
|
|
}
|
|
//This creates a shader program opengl object and assigns its 'pointer' to the integer shaderProgram
|
|
rVal.shaderProgram = glCreateProgram();
|
|
//This attaches the vertex and fragment shaders to the program
|
|
glAttachShader(rVal.shaderProgram, rVal.vertexShader);
|
|
glAttachShader(rVal.shaderProgram, rVal.fragmentShader);
|
|
//This links the program to the GPU (I think its to the GPU anyway)
|
|
glLinkProgram(rVal.shaderProgram);
|
|
//Tests for the success of the shader program creation
|
|
success = glGetProgrami(rVal.shaderProgram, GL_LINK_STATUS);
|
|
if (success != GL_TRUE) {
|
|
throw new RuntimeException(glGetProgramInfoLog(rVal.shaderProgram));
|
|
}
|
|
|
|
//Deletes the individual shader objects to free up memory
|
|
glDeleteShader(rVal.vertexShader);
|
|
glDeleteShader(rVal.fragmentShader);
|
|
|
|
|
|
|
|
//
|
|
//Set locations
|
|
//
|
|
rVal.shaderVertexModelLoc = glGetUniformLocation(rVal.shaderProgram, "model");
|
|
rVal.shaderVertexViewLoc = glGetUniformLocation(rVal.shaderProgram, "view");
|
|
rVal.shaderVertexProjectionLoc = glGetUniformLocation(rVal.shaderProgram, "projection");
|
|
rVal.shaderVertexViewPosLoc = glGetUniformLocation(rVal.shaderProgram, "viewPos");
|
|
|
|
|
|
|
|
|
|
return rVal;
|
|
}
|
|
|
|
}
|