summaryrefslogtreecommitdiffstats
path: root/src/de/gamezock/metacraft/ui/ShaderLoader.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/gamezock/metacraft/ui/ShaderLoader.java')
-rw-r--r--src/de/gamezock/metacraft/ui/ShaderLoader.java72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/de/gamezock/metacraft/ui/ShaderLoader.java b/src/de/gamezock/metacraft/ui/ShaderLoader.java
new file mode 100644
index 0000000..25bc4eb
--- /dev/null
+++ b/src/de/gamezock/metacraft/ui/ShaderLoader.java
@@ -0,0 +1,72 @@
+package de.gamezock.metacraft.ui;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.media.opengl.GL2;
+
+public class ShaderLoader {
+ private static Map<Entry<String, String>, Integer> programs = new HashMap<Entry<String, String>, Integer>();
+
+ static private String readStream(InputStream stream) throws IOException {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
+ String ret = "", line;
+
+ while ((line = reader.readLine()) != null) {
+ ret += line + "\n";
+ }
+
+ return ret;
+ }
+
+ static boolean load(GL2 gl, String vsName, String fsName) {
+ Integer savedProg = programs.get(new AbstractMap.SimpleEntry<String, String>(vsName, fsName));
+ if(savedProg != null) {
+ gl.glUseProgram(savedProg);
+ return true;
+ }
+
+ int vs = gl.glCreateShader(GL2.GL_VERTEX_SHADER);
+ int fs = gl.glCreateShader(GL2.GL_FRAGMENT_SHADER);
+
+ InputStream vsStream = ShaderLoader.class.getResourceAsStream("/de/gamezock/metacraft/resources/shaders/" + vsName);
+ String vsSource;
+ try {
+ vsSource = readStream(vsStream);
+ } catch (IOException e) {
+ return false;
+ }
+
+ gl.glShaderSource(vs, 1, new String[] {vsSource}, null);
+ gl.glCompileShader(vs);
+
+ InputStream fsStream = ShaderLoader.class.getResourceAsStream("/de/gamezock/metacraft/resources/shaders/" + fsName);
+ String fsSource;
+ try {
+ fsSource = readStream(fsStream);
+ } catch (IOException e) {
+ return false;
+ }
+
+ gl.glShaderSource(fs, 1, new String[] {fsSource}, null);
+ gl.glCompileShader(fs);
+
+ int program = gl.glCreateProgram();
+ gl.glAttachShader(program, vs);
+ gl.glAttachShader(program, fs);
+ gl.glLinkProgram(program);
+ gl.glValidateProgram(program);
+
+ gl.glUseProgram(program);
+
+ programs.put(new AbstractMap.SimpleEntry<String, String>(vsName, fsName), program);
+
+ return true;
+ }
+}