Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2012
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.06 KB | None | 0 0
  1. package space.engine.test;
  2.  
  3. import org.lwjgl.opengl.GL11;
  4. import org.lwjgl.opengl.GL14;
  5. import org.lwjgl.opengl.GLContext;
  6. import org.newdawn.slick.AppGameContainer;
  7. import org.newdawn.slick.BasicGame;
  8. import org.newdawn.slick.Color;
  9. import org.newdawn.slick.GameContainer;
  10. import org.newdawn.slick.Graphics;
  11. import org.newdawn.slick.Image;
  12. import org.newdawn.slick.Input;
  13. import org.newdawn.slick.SlickException;
  14. import org.newdawn.slick.opengl.renderer.SGL;
  15. import org.newdawn.slick.util.Log;
  16.  
  17. import space.engine.FBO;
  18. import space.engine.Shader;
  19. import space.engine.ShaderProgram;
  20.  
  21. public class SimpleShaderTest extends BasicGame {
  22.    
  23.     public static void main(String[] args) throws SlickException {
  24.         new AppGameContainer(new SimpleShaderTest(), 800, 600, false).start();
  25.     }
  26.    
  27.     public SimpleShaderTest() {
  28.         super("shader test");
  29.     }
  30.  
  31.     Image tex0, logo;
  32.     ShaderProgram program;
  33.     String log;
  34.     private float elapsed;
  35.    
  36.     private boolean shaderWorks, useShader=true;
  37.    
  38.     private int x=100, y=100;
  39.    
  40.     public static final String VERT_FILE = "res/hellovert.shader";
  41.     public static final String FRAG_FILE = "res/hellofrag.shader";
  42.    
  43.     private GameContainer container;
  44.    
  45.     private FBO fbo;
  46.     private Image fboImg;
  47.     private float rot;
  48.    
  49.     @Override
  50.     public void init(GameContainer container) throws SlickException {
  51.         this.container = container;
  52.         logo = new Image("res/logo.png");
  53.         tex0 = new Image("res/tex0.jpg");
  54.        
  55.         //try to load the program
  56.         try {
  57.             ShaderProgram.setStrictMode(false);
  58.             program = new ShaderProgram();
  59.             reload(0);
  60.         } catch (SlickException ex) {
  61.             //no shader support...
  62.             log = ex.getMessage();
  63.             Log.error(ex.getMessage());
  64.         }
  65.        
  66.         fbo = new FBO(256, 256);
  67.         fboImg = new Image(fbo.getTexture()).getFlippedCopy(false, true);
  68.     }
  69.    
  70.     public void reload(int type) {
  71.         if (program==null) //if the program wasn't created
  72.             return;
  73.         log = "";
  74.        
  75.         Shader vert=null, frag=null;
  76.         try {
  77.             //an exception here means we have a compiler error
  78.            
  79.             //load the vertex shader...
  80.             if (type==Shader.VERTEX_SHADER || type==0) {
  81.                 if (program.getVertexShader()!=null)
  82.                     program.getVertexShader().release();
  83.                 vert = new Shader(Shader.VERTEX_SHADER, ShaderProgram.loadSource(VERT_FILE));
  84.                 program.setVertexShader(vert);
  85.             }
  86.  
  87.             if (type==Shader.FRAGMENT_SHADER || type==0) {
  88.                 if (program.getFragmentShader()!=null)
  89.                     program.getFragmentShader().release();
  90.                 frag = new Shader(Shader.FRAGMENT_SHADER, ShaderProgram.loadSource(FRAG_FILE));
  91.                 program.setFragmentShader(frag);
  92.             }
  93.            
  94.             //an exception here means we have a link error
  95.             program.link();
  96.            
  97.             log = program.getLog();
  98.            
  99.             shaderWorks = true;
  100.         } catch (SlickException ex) {
  101.             shaderWorks = false;
  102.            
  103.             //incase we reach an error at any point, release everything that may have been created
  104.             if (vert!=null)
  105.                 vert.release();
  106.             if (frag!=null)
  107.                 frag.release();
  108.            
  109.             log = ex.getMessage();
  110.             Log.error(log);
  111.         }
  112.        
  113.         if (shaderWorks) {
  114.             //set up our uniforms...
  115.             program.bind();
  116.             //strict mode is disabled, so these will work regardless of whether the uniform is active / exists
  117.             program.setUniform1i("tex0", 0); //texture 0
  118.             program.setUniform2f("resolution", 256, 256);
  119.             program.setUniform1f("time", elapsed);
  120.            
  121.             program.unbind();
  122.         }
  123.        
  124.        
  125.        
  126.        
  127.     }
  128.    
  129.     //@Override
  130.     public void render(GameContainer container, Graphics g) throws SlickException {    
  131.         fbo.bind();
  132.         if (shaderWorks && useShader) {
  133.             program.bind();
  134.             float mx = Math.min(1f, (container.getInput().getMouseX()-x)/(float)tex0.getTextureWidth());
  135.             float my = Math.min(1f, (container.getInput().getMouseY()-y)/(float)tex0.getTextureHeight());
  136.             program.setUniform2f("mouse", (mx/(float)tex0.getTextureWidth()), (my/(float)tex0.getTextureHeight()));
  137.             program.setUniform1f("time", elapsed);
  138.            
  139.             tex0.bind();
  140.         }
  141.        
  142.         tex0.draw(0, 0, container.getWidth(), container.getHeight());
  143.        
  144.         if (shaderWorks && useShader)
  145.             program.unbind();
  146.        
  147.         //gotta flip it since FBO is flipped vertically
  148.         g.scale(1f, -1f);
  149.         g.translate(0, -fbo.getHeight());
  150.        
  151.         logo.draw(0, 50);
  152.        
  153.         g.setColor(Color.white);
  154.         g.drawString("Some slick text...", 5, 5);
  155.         g.resetTransform();
  156.        
  157.         fbo.unbind();
  158.        
  159.         fboImg.setRotation(rot);
  160.         fboImg.draw(100, 100);
  161.        
  162.         g.setColor(Color.white);
  163.         if (shaderWorks)
  164.             g.drawString("Space to toggle shader\nR to reload shader from text file", 10, 25);
  165.         else
  166.             g.drawString("Shader did not load... try again", 10, 25);
  167.         if (log.length()!=0)
  168.             g.drawString("Log:\n"+log, 10, 75);
  169.     }
  170.  
  171.     @Override
  172.     public void update(GameContainer container, int delta) throws SlickException {
  173.         elapsed += delta*0.001f;
  174.         rot += delta*0.03f;
  175.        
  176.         if (container.getInput().isKeyPressed(Input.KEY_SPACE))
  177.             useShader = !useShader;
  178.         else if (container.getInput().isKeyPressed(Input.KEY_F))
  179.             reload(Shader.FRAGMENT_SHADER);
  180.         else if (container.getInput().isKeyPressed(Input.KEY_V))
  181.             reload(Shader.VERTEX_SHADER);
  182.         else if (container.getInput().isKeyPressed(Input.KEY_R))
  183.             reload(0);
  184.     }
  185.  
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement