daily pastebin goal
2%
SHARE
TWEET

Untitled

a guest Mar 22nd, 2012 44 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
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