Advertisement
Guest User

Untitled

a guest
Mar 10th, 2012
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.24 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement