aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java')
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java277
1 files changed, 140 insertions, 137 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java
index 97d80832..4e934e10 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java
@@ -15,141 +15,144 @@ import java.io.InputStreamReader;
import java.util.HashMap;
public class ShaderManager {
- private final ResourceLocation shaderLocation = new ResourceLocation("notenoughupdates:shaders");
- private final HashMap<String, Shader> shaderMap = new HashMap<>();
-
- private static final ShaderManager INSTANCE = new ShaderManager();
-
- public static ShaderManager getInstance() {
- return INSTANCE;
- }
-
- public static class Shader {
- public final int program;
-
- public Shader(int program) {
- this.program = program;
- }
- }
-
- public int getShader(String name) {
- if (!shaderMap.containsKey(name)) {
- reloadShader(name);
- }
- return shaderMap.get(name).program;
- }
-
- public int loadShader(String name) {
- if (!shaderMap.containsKey(name)) {
- reloadShader(name);
- }
- GL20.glUseProgram(shaderMap.get(name).program);
- return shaderMap.get(name).program;
- }
-
- public void loadData(String name, String var, Object value) {
- int location = GL20.glGetUniformLocation(shaderMap.get(name).program, var);
-
- if (value instanceof Integer) {
- GL20.glUniform1i(location, (Integer) value);
- } else if (value instanceof Float) {
- GL20.glUniform1f(location, (Float) value);
- } else if (value instanceof Vector2f) {
- Vector2f vec = (Vector2f) value;
- GL20.glUniform2f(location, vec.x, vec.y);
- } else if (value instanceof Vector3f) {
- Vector3f vec = (Vector3f) value;
- GL20.glUniform3f(location, vec.x, vec.y, vec.z);
- } else if (value instanceof Vector4f) {
- Vector4f vec = (Vector4f) value;
- GL20.glUniform4f(location, vec.x, vec.y, vec.z, vec.w);
- } else {
- throw new UnsupportedOperationException("Failed to load data into shader: Unsupported data type.");
- }
- }
-
- private void reloadShader(String name) {
- int vertex = -1;
- String sourceVert = getShaderSource(name, GL20.GL_VERTEX_SHADER);
- if (!sourceVert.isEmpty()) {
- vertex = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);
- GL20.glShaderSource(vertex, sourceVert);
- GL20.glCompileShader(vertex);
-
- if (GL20.glGetShaderi(vertex, 35713) == 0) {
- System.err.println(GL20.glGetShaderInfoLog(vertex, 100));
- }
- }
-
- int fragment = -1;
- String sourceFrag = getShaderSource(name, GL20.GL_FRAGMENT_SHADER);
- if (!sourceFrag.isEmpty()) {
- fragment = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);
- GL20.glShaderSource(fragment, sourceFrag);
- GL20.glCompileShader(fragment);
-
- if (GL20.glGetShaderi(fragment, 35713) == 0) {
- System.err.println(GL20.glGetShaderInfoLog(fragment, 100));
- }
- }
-
- int compute = -1;
- String sourceCompute = getShaderSource(name, GL43.GL_COMPUTE_SHADER);
- if (!sourceCompute.isEmpty()) {
- compute = GL20.glCreateShader(GL43.GL_COMPUTE_SHADER);
- GL20.glShaderSource(compute, sourceCompute);
- GL20.glCompileShader(compute);
-
- if (GL20.glGetShaderi(compute, 35713) == 0) {
- System.err.println(GL20.glGetShaderInfoLog(compute, 100));
- }
- }
-
- int program = GL20.glCreateProgram();
- if (vertex != -1) GL20.glAttachShader(program, vertex);
- if (fragment != -1) GL20.glAttachShader(program, fragment);
- if (compute != -1) GL20.glAttachShader(program, compute);
-
- GL20.glLinkProgram(program);
-
- if (vertex != -1) GL20.glDeleteShader(vertex);
- if (fragment != -1) GL20.glDeleteShader(fragment);
- if (compute != -1) GL20.glDeleteShader(compute);
-
- if (GL20.glGetProgrami(program, 35714) == 0) {
- System.err.println(GL20.glGetProgramInfoLog(program, 100));
- }
- GL20.glValidateProgram(program);
- if (GL20.glGetProgrami(program, 35715) == 0) {
- System.err.println(GL20.glGetProgramInfoLog(program, 100));
- }
-
- shaderMap.put(name, new Shader(program));
- }
-
- public String getShaderSource(String name, int type) {
- String ext = "";
- if (type == GL20.GL_VERTEX_SHADER) {
- ext = ".vert";
- } else if (type == GL20.GL_FRAGMENT_SHADER) {
- ext = ".frag";
- } else if (type == GL43.GL_COMPUTE_SHADER) {
- ext = ".compute";
- } else {
- return "";
- }
- ResourceLocation location = new ResourceLocation(shaderLocation.getResourceDomain(),
- shaderLocation.getResourcePath() + "/" + name + ext);
- try (InputStream is = Minecraft.getMinecraft().getResourceManager().getResource(location).getInputStream()) {
- StringBuilder source = new StringBuilder();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
-
- String line;
- while ((line = br.readLine()) != null) {
- source.append(line).append("\n");
- }
- return source.toString();
- } catch (IOException ignored) {}
- return "";
- }
+ private final ResourceLocation shaderLocation = new ResourceLocation("notenoughupdates:shaders");
+ private final HashMap<String, Shader> shaderMap = new HashMap<>();
+
+ private static final ShaderManager INSTANCE = new ShaderManager();
+
+ public static ShaderManager getInstance() {
+ return INSTANCE;
+ }
+
+ public static class Shader {
+ public final int program;
+
+ public Shader(int program) {
+ this.program = program;
+ }
+ }
+
+ public int getShader(String name) {
+ if (!shaderMap.containsKey(name)) {
+ reloadShader(name);
+ }
+ return shaderMap.get(name).program;
+ }
+
+ public int loadShader(String name) {
+ if (!shaderMap.containsKey(name)) {
+ reloadShader(name);
+ }
+ GL20.glUseProgram(shaderMap.get(name).program);
+ return shaderMap.get(name).program;
+ }
+
+ public void loadData(String name, String var, Object value) {
+ int location = GL20.glGetUniformLocation(shaderMap.get(name).program, var);
+
+ if (value instanceof Integer) {
+ GL20.glUniform1i(location, (Integer) value);
+ } else if (value instanceof Float) {
+ GL20.glUniform1f(location, (Float) value);
+ } else if (value instanceof Vector2f) {
+ Vector2f vec = (Vector2f) value;
+ GL20.glUniform2f(location, vec.x, vec.y);
+ } else if (value instanceof Vector3f) {
+ Vector3f vec = (Vector3f) value;
+ GL20.glUniform3f(location, vec.x, vec.y, vec.z);
+ } else if (value instanceof Vector4f) {
+ Vector4f vec = (Vector4f) value;
+ GL20.glUniform4f(location, vec.x, vec.y, vec.z, vec.w);
+ } else {
+ throw new UnsupportedOperationException("Failed to load data into shader: Unsupported data type.");
+ }
+ }
+
+ private void reloadShader(String name) {
+ int vertex = -1;
+ String sourceVert = getShaderSource(name, GL20.GL_VERTEX_SHADER);
+ if (!sourceVert.isEmpty()) {
+ vertex = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);
+ GL20.glShaderSource(vertex, sourceVert);
+ GL20.glCompileShader(vertex);
+
+ if (GL20.glGetShaderi(vertex, 35713) == 0) {
+ System.err.println(GL20.glGetShaderInfoLog(vertex, 100));
+ }
+ }
+
+ int fragment = -1;
+ String sourceFrag = getShaderSource(name, GL20.GL_FRAGMENT_SHADER);
+ if (!sourceFrag.isEmpty()) {
+ fragment = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);
+ GL20.glShaderSource(fragment, sourceFrag);
+ GL20.glCompileShader(fragment);
+
+ if (GL20.glGetShaderi(fragment, 35713) == 0) {
+ System.err.println(GL20.glGetShaderInfoLog(fragment, 100));
+ }
+ }
+
+ int compute = -1;
+ String sourceCompute = getShaderSource(name, GL43.GL_COMPUTE_SHADER);
+ if (!sourceCompute.isEmpty()) {
+ compute = GL20.glCreateShader(GL43.GL_COMPUTE_SHADER);
+ GL20.glShaderSource(compute, sourceCompute);
+ GL20.glCompileShader(compute);
+
+ if (GL20.glGetShaderi(compute, 35713) == 0) {
+ System.err.println(GL20.glGetShaderInfoLog(compute, 100));
+ }
+ }
+
+ int program = GL20.glCreateProgram();
+ if (vertex != -1) GL20.glAttachShader(program, vertex);
+ if (fragment != -1) GL20.glAttachShader(program, fragment);
+ if (compute != -1) GL20.glAttachShader(program, compute);
+
+ GL20.glLinkProgram(program);
+
+ if (vertex != -1) GL20.glDeleteShader(vertex);
+ if (fragment != -1) GL20.glDeleteShader(fragment);
+ if (compute != -1) GL20.glDeleteShader(compute);
+
+ if (GL20.glGetProgrami(program, 35714) == 0) {
+ System.err.println(GL20.glGetProgramInfoLog(program, 100));
+ }
+ GL20.glValidateProgram(program);
+ if (GL20.glGetProgrami(program, 35715) == 0) {
+ System.err.println(GL20.glGetProgramInfoLog(program, 100));
+ }
+
+ shaderMap.put(name, new Shader(program));
+ }
+
+ public String getShaderSource(String name, int type) {
+ String ext = "";
+ if (type == GL20.GL_VERTEX_SHADER) {
+ ext = ".vert";
+ } else if (type == GL20.GL_FRAGMENT_SHADER) {
+ ext = ".frag";
+ } else if (type == GL43.GL_COMPUTE_SHADER) {
+ ext = ".compute";
+ } else {
+ return "";
+ }
+ ResourceLocation location = new ResourceLocation(
+ shaderLocation.getResourceDomain(),
+ shaderLocation.getResourcePath() + "/" + name + ext
+ );
+ try (InputStream is = Minecraft.getMinecraft().getResourceManager().getResource(location).getInputStream()) {
+ StringBuilder source = new StringBuilder();
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+
+ String line;
+ while ((line = br.readLine()) != null) {
+ source.append(line).append("\n");
+ }
+ return source.toString();
+ } catch (IOException ignored) {
+ }
+ return "";
+ }
}