SHARE
TWEET

Untitled

a guest Mar 10th, 2012 33 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.nio.FloatBuffer;
  7. import java.nio.IntBuffer;
  8. import java.util.HashMap;
  9.  
  10. import org.lwjgl.opengl.ARBShaderObjects;
  11. import org.lwjgl.opengl.GL20;
  12. import org.newdawn.slick.SlickException;
  13. import org.newdawn.slick.util.ResourceLoader;
  14.  
  15. public class ShaderProgram {
  16.  
  17.         // TODO: move to outer level ?
  18.         public static class Shader {
  19.                
  20.                 private String source;
  21.                 private int type;
  22.                 private int id;
  23.                 private String log = "";
  24.                
  25.                 public Shader(int type, String source) {
  26.                         if (source==null)
  27.                                 throw new IllegalArgumentException("shader source code must not be null");
  28.                         this.source = source;
  29.                         this.type = type;
  30.                         id = createShader(type, source);
  31.                 }
  32.  
  33.                 public boolean valid() {
  34.                         return id!=0;
  35.                 }
  36.                
  37.                 private int createShader(int type, String source) {
  38.                         int shader = GL20.glCreateShader(type);
  39.                         if (shader==0)
  40.                                 return 0;
  41.                        
  42.                         ARBShaderObjects.glShaderSourceARB(shader, source);
  43.                         ARBShaderObjects.glCompileShaderARB(shader);
  44.                         int comp = ARBShaderObjects.glGetObjectParameteriARB(shader, GL20.GL_COMPILE_STATUS);
  45.                         if (comp==0) {
  46.                                 int len = ARBShaderObjects.glGetObjectParameteriARB(shader, GL20.GL_INFO_LOG_LENGTH);
  47.                                 log = ARBShaderObjects.glGetInfoLogARB(shader, len);
  48.                                 return 0;
  49.                         }
  50.                         return shader;
  51.                 }
  52.                
  53.                 public void release() {
  54.                         if (id!=0) {
  55.                                 ARBShaderObjects.glDeleteObjectARB(id);
  56.                                 id = 0;
  57.                         }
  58.                 }
  59.                
  60.                 public String getLog() {
  61.                         return log;
  62.                 }
  63.                
  64.                 public int getID() {
  65.                         return id;
  66.                 }
  67.                
  68.                 public int getType() {
  69.                         return type;
  70.                 }
  71.                
  72.                 public String getSource() {
  73.                         return source;
  74.                 }
  75.         }
  76.        
  77.         private int program;
  78.        
  79.         private String log = "";
  80.        
  81.         protected HashMap<String, Integer> uniforms = new HashMap<String, Integer>();
  82.         protected HashMap<String, Integer> attributes = new HashMap<String, Integer>();
  83.        
  84.         private String[] uniformNames, attributeNames;
  85.        
  86.         private Shader vert, frag;
  87.        
  88.         public static ShaderProgram loadProgram(String vertFile, String fragFile) throws SlickException {
  89.                 return new ShaderProgram(loadSource(vertFile), loadSource(fragFile));
  90.         }
  91.        
  92.         public static String loadSource(String ref) throws SlickException {
  93.                 InputStream in = ResourceLoader.getResourceAsStream(ref);
  94.                 try { return loadSource(in); }
  95.                 catch (SlickException e) {
  96.                         throw new SlickException("could not load source file: "+ref);
  97.                 }
  98.         }
  99.        
  100.     public static String loadSource(InputStream in) throws SlickException{
  101.         try {
  102.                 BufferedReader br = new BufferedReader(new InputStreamReader(in));
  103.                 String line = "";
  104.                 String txt = "";
  105.                 while ((line=br.readLine()) != null)
  106.                         txt += line + "\n";
  107.                 br.close();
  108.                 return txt.trim();
  109.         } catch (IOException e) {
  110.                 throw new SlickException("could not load source file");
  111.         }
  112.     }
  113.        
  114.     public ShaderProgram(String vertexShader, String fragShader) {
  115.         this(new Shader(GL20.GL_VERTEX_SHADER, vertexShader),
  116.                  new Shader(GL20.GL_FRAGMENT_SHADER, fragShader));
  117.     }
  118.    
  119.         public ShaderProgram(Shader vertexShader, Shader fragShader) {
  120.                 if (vertexShader==null || fragShader==null)
  121.                         throw new IllegalArgumentException("shaders must be non-null");
  122.                 this.vert = vertexShader;
  123.                 this.frag = fragShader;
  124.                 log += vert.getLog() + frag.getLog();
  125.                 this.program = compile();
  126.                 if (valid()) {
  127.                         fetchUniforms();
  128.                         fetchAttributes();
  129.                 }
  130.         }
  131.        
  132.         private int compile() {
  133.                 if (!vert.valid() || !frag.valid())
  134.                         return 0;
  135.                 int program = ARBShaderObjects.glCreateProgramObjectARB();
  136.         ARBShaderObjects.glAttachObjectARB(program, vert.getID());
  137.         ARBShaderObjects.glAttachObjectARB(program, frag.getID());
  138.         ARBShaderObjects.glLinkProgramARB(program);
  139.         //GL20.glValidateProgram(program);
  140.         int comp = ARBShaderObjects.glGetObjectParameteriARB(program, GL20.GL_LINK_STATUS);
  141.         if (comp==0) {
  142.                 int len = ARBShaderObjects.glGetObjectParameteriARB(program, GL20.GL_INFO_LOG_LENGTH);
  143.                         log += ARBShaderObjects.glGetInfoLogARB(program, len);
  144.                         return 0;
  145.         }
  146.         return program;
  147.         }
  148.        
  149.         /**
  150.          * Returns the log for this shader program as well as any shaders attached to this program.
  151.          * @return
  152.          */
  153.         public String getLog() {
  154.                 return log;
  155.         }
  156.        
  157.         public void unbind() {
  158.                 ARBShaderObjects.glUseProgramObjectARB(0);
  159.         }
  160.        
  161.         public void bind() {
  162.                 if (!valid())
  163.                         throw new IllegalStateException("trying to enable a program that is not valid");
  164.                 ARBShaderObjects.glUseProgramObjectARB(program);
  165.         }
  166.        
  167.         public void release() {
  168.                 if (program != 0) {
  169.                         vert.release();
  170.                         frag.release();
  171.                         ARBShaderObjects.glDeleteObjectARB(program);
  172.                         program = 0;
  173.                 }
  174.         }
  175.        
  176.         public boolean valid() {
  177.                 return program != 0;
  178.         }
  179.        
  180.         private void fetchUniforms() {
  181.                 int len = ARBShaderObjects.glGetObjectParameteriARB(program, GL20.GL_ACTIVE_UNIFORMS);
  182.                 //max length of all uniforms stored in program
  183.                 int strLen = ARBShaderObjects.glGetObjectParameteriARB(program, GL20.GL_ACTIVE_UNIFORM_MAX_LENGTH);
  184.                 uniformNames = new String[len];
  185.                 for (int i=0; i<len; i++) {
  186.                         uniformNames[i] = ARBShaderObjects.glGetActiveUniformARB(program, i, strLen);
  187.                         int id = ARBShaderObjects.glGetUniformLocationARB(program, uniformNames[i]);
  188.                         uniforms.put(uniformNames[i], id);
  189.                 }
  190.         }
  191.        
  192.         private void fetchAttributes() {
  193.                 int len = ARBShaderObjects.glGetObjectParameteriARB(program, GL20.GL_ACTIVE_ATTRIBUTES);
  194.                 //max length of all uniforms stored in program
  195.                 int strLen = ARBShaderObjects.glGetObjectParameteriARB(program, GL20.GL_ACTIVE_ATTRIBUTE_MAX_LENGTH);
  196.                 attributeNames = new String[len];
  197.                 for (int i=0; i<len; i++) {
  198.                         attributeNames[i] = ARBShaderObjects.glGetActiveUniformARB(program, i, strLen);
  199.                         int id = ARBShaderObjects.glGetUniformLocationARB(program, attributeNames[i]);
  200.                         uniforms.put(attributeNames[i], id);
  201.                 }
  202.         }
  203.        
  204.         public int getUniformID(String name) {
  205.                 return uniforms.get(name);
  206.         }
  207.        
  208.         public int getAttributeID(String name) {
  209.                 return attributes.get(name);
  210.         }
  211.        
  212.         public String[] getAttributes() {
  213.                 return attributeNames;
  214.         }
  215.        
  216.         public String[] getUniformNames() {
  217.                 return uniformNames;
  218.         }
  219.        
  220.         public Shader getVertexShader() {
  221.                 return vert;
  222.         }
  223.        
  224.         public Shader getFragmentShader() {
  225.                 return frag;
  226.         }
  227.  
  228.         public void getUniform(String name, FloatBuffer buf) {
  229.                 ARBShaderObjects.glGetUniformARB(program, getUniformID(name), buf);
  230.         }
  231.        
  232.         public void getUniform(String name, IntBuffer buf) {
  233.                 ARBShaderObjects.glGetUniformARB(program, getUniformID(name), buf);
  234.         }
  235.  
  236.         public void setUniform1f(String name, float f) {
  237.                 ARBShaderObjects.glUniform1fARB(getUniformID(name), f);
  238.         }
  239.        
  240.         public void setUniform1i(String name, int i) {
  241.                 ARBShaderObjects.glUniform1iARB(getUniformID(name), i);
  242.         }
  243.        
  244.         public void setUniform2f(String name, float a, float b) {
  245.                 ARBShaderObjects.glUniform2fARB(getUniformID(name), a, b);
  246.         }
  247.        
  248.         public void setUniform3f(String name, float a, float b, float c) {
  249.                 ARBShaderObjects.glUniform3fARB(getUniformID(name), a, b, c);
  250.         }
  251.        
  252.         public void setUniform4f(String name, float a, float b, float c, float d) {
  253.                 ARBShaderObjects.glUniform4fARB(getUniformID(name), a, b, c, d);
  254.         }
  255.        
  256.        
  257.         // TODO: include more setUniforms/getUniforms
  258. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top