/** * This class was created by . It's distributed as * part of the Botania Mod. Get the Source Code in github: * https://github.com/Vazkii/Botania * * Botania is Open Source and distributed under a * Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License * (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB) * * File Created @ [Apr 9, 2014, 11:20:26 PM (GMT)] */ package WayofTime.alchemicalWizardry.common.renderer.block; import org.lwjgl.opengl.ARBFragmentShader; import org.lwjgl.opengl.ARBShaderObjects; import org.lwjgl.opengl.ARBVertexShader; import org.lwjgl.opengl.GL11; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; public final class ShaderHelper { private static final int VERT = ARBVertexShader.GL_VERTEX_SHADER_ARB; private static final int FRAG = ARBFragmentShader.GL_FRAGMENT_SHADER_ARB; public static int beam = 0; public static void initShaders() { beam = createProgram(null, "/assets/alchemicalwizardry/shaders/beam.frag"); } public static void useShaderWithProps(int shader, Object... props) { ARBShaderObjects.glUseProgramObjectARB(shader); if (shader != 0 && props.length % 2 == 0) { int propCount = props.length / 2; for (int i = 0; i < propCount; i++) { String propName = (String) props[i * 2]; Object propVal = props[i * 2 + 1]; int uniform = ARBShaderObjects.glGetUniformLocationARB(shader, propName); if (propVal instanceof Integer) ARBShaderObjects.glUniform1iARB(uniform, (Integer) propVal); if (propVal instanceof Float) ARBShaderObjects.glUniform1fARB(uniform, (Float) propVal); } } } public static void useShader(int shader) { useShaderWithProps(shader); } public static void releaseShader() { useShader(0); } public static boolean useShaders() { return true; } // Most of the code taken from the LWJGL wiki // http://lwjgl.org/wiki/index.php?title=GLSL_Shaders_with_LWJGL private static int createProgram(String vert, String frag) { int vertId = 0, fragId = 0, program = 0; if (vert != null) vertId = createShader(vert, VERT); if (frag != null) fragId = createShader(frag, FRAG); program = ARBShaderObjects.glCreateProgramObjectARB(); if (program == 0) return 0; if (vert != null) ARBShaderObjects.glAttachObjectARB(program, vertId); if (frag != null) ARBShaderObjects.glAttachObjectARB(program, fragId); ARBShaderObjects.glLinkProgramARB(program); if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_LINK_STATUS_ARB) == GL11.GL_FALSE) { return 0; } ARBShaderObjects.glValidateProgramARB(program); if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_VALIDATE_STATUS_ARB) == GL11.GL_FALSE) { return 0; } return program; } private static int createShader(String filename, int shaderType) { int shader = 0; try { shader = ARBShaderObjects.glCreateShaderObjectARB(shaderType); if (shader == 0) return 0; ARBShaderObjects.glShaderSourceARB(shader, readFileAsString(filename)); ARBShaderObjects.glCompileShaderARB(shader); if (ARBShaderObjects.glGetObjectParameteriARB(shader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB) == GL11.GL_FALSE) throw new RuntimeException("Error creating shader: " + getLogInfo(shader)); return shader; } catch (Exception e) { ARBShaderObjects.glDeleteObjectARB(shader); e.printStackTrace(); return -1; } } private static String getLogInfo(int obj) { return ARBShaderObjects.glGetInfoLogARB(obj, ARBShaderObjects.glGetObjectParameteriARB(obj, ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB)); } private static String readFileAsString(String filename) throws Exception { StringBuilder source = new StringBuilder(); InputStream in = ShaderHelper.class.getResourceAsStream(filename); Exception exception = null; BufferedReader reader; if (in == null) return ""; try { reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); Exception innerExc = null; try { String line; while ((line = reader.readLine()) != null) source.append(line).append('\n'); } catch (Exception exc) { exception = exc; } finally { try { reader.close(); } catch (Exception exc) { if (innerExc == null) innerExc = exc; else exc.printStackTrace(); } } if (innerExc != null) throw innerExc; } catch (Exception exc) { exception = exc; } finally { try { in.close(); } catch (Exception exc) { if (exception == null) exception = exc; else exc.printStackTrace(); } if (exception != null) throw exception; } return source.toString(); } }