Pastebin is 300% more awesome when you are logged in. Sign Up, it's FREE!
Guest

Container.java

By: a guest on May 30th, 2013  |  syntax: Java  |  size: 5.53 KB  |  hits: 18  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. package net.test;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.nio.ByteBuffer;
  7. import java.nio.FloatBuffer;
  8.  
  9. import org.lwjgl.BufferUtils;
  10. import org.lwjgl.opengl.Display;
  11. import org.lwjgl.opengl.GL11;
  12. import org.lwjgl.opengl.GL15;
  13. import org.lwjgl.opengl.GL20;
  14. import org.lwjgl.opengl.GL30;
  15. import org.lwjgl.util.glu.GLU;
  16.  
  17. public class Container {
  18.  
  19.         private int vaoId = 0;
  20.         private int vboId = 0;
  21.         private int vboiId = 0;
  22.  
  23.         private int indicesCount = 0;
  24.  
  25.         private int vsId = 0;
  26.         private int fsId = 0;
  27.         private int pId = 0;
  28.  
  29.         private FloatBuffer verticesBuffer;
  30.         private ByteBuffer indicesBuffer;
  31.  
  32.         private Vertex[] vertices;
  33.         private byte[] indices;
  34.  
  35.         public Container(Vertex[] vertices, byte[] indices) {
  36.                 setupShaders();
  37.                 setupResources();
  38.  
  39.                 this.vertices = vertices;
  40.                 this.indices = indices;
  41.                 updateResources();
  42.         }
  43.  
  44.         public void setVertices(Vertex[] vertices) {
  45.                 this.vertices = vertices;
  46.         }
  47.  
  48.         public void setIndices(byte[] indices) {
  49.                 this.indices = indices;
  50.         }
  51.  
  52.         public void render() {
  53.                 GL20.glUseProgram(pId);
  54.  
  55.                 GL30.glBindVertexArray(vaoId);
  56.                 GL20.glEnableVertexAttribArray(0);
  57.                 GL20.glEnableVertexAttribArray(1);
  58.  
  59.                 GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboiId);
  60.  
  61.                 GL11.glDrawElements(GL11.GL_TRIANGLES, indicesCount,
  62.                                 GL11.GL_UNSIGNED_BYTE, 0);
  63.  
  64.                 GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
  65.  
  66.                 GL20.glDisableVertexAttribArray(0);
  67.                 GL20.glDisableVertexAttribArray(1);
  68.  
  69.                 GL30.glBindVertexArray(0);
  70.  
  71.                 GL20.glUseProgram(0);
  72.         }
  73.  
  74.         private void setupResources() {
  75.                 verticesBuffer = BufferUtils.createFloatBuffer(1);
  76.                 verticesBuffer.flip();
  77.  
  78.                 indicesBuffer = BufferUtils.createByteBuffer(1);
  79.                 indicesBuffer.flip();
  80.  
  81.                 vaoId = GL30.glGenVertexArrays();
  82.                 GL30.glBindVertexArray(vaoId);
  83.  
  84.                 vboId = GL15.glGenBuffers();
  85.                 GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
  86.                 GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticesBuffer,
  87.                                 GL15.GL_STATIC_DRAW);
  88.  
  89.                 GL20.glVertexAttribPointer(0, 4, GL11.GL_FLOAT, false,
  90.                                 Vertex.SIZE_IN_BYTES, 0);
  91.  
  92.                 GL20.glVertexAttribPointer(1, 4, GL11.GL_FLOAT, false,
  93.                                 Vertex.SIZE_IN_BYTES, Vertex.ELEMENT_BYTES * 4);
  94.                 GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
  95.  
  96.                 GL30.glBindVertexArray(0);
  97.  
  98.                 vboiId = GL15.glGenBuffers();
  99.                 GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboiId);
  100.                 GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer,
  101.                                 GL15.GL_STATIC_DRAW);
  102.                 GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
  103.         }
  104.  
  105.         public void updateResources() {
  106.                 verticesBuffer = BufferUtils.createFloatBuffer(vertices.length
  107.                                 * Vertex.ELEMENT_COUNT);
  108.                 for (int i = 0; i < vertices.length; i++) {
  109.                         verticesBuffer.put(vertices[i].getXYZW());
  110.                         verticesBuffer.put(vertices[i].getRGBA());
  111.                 }
  112.                 verticesBuffer.flip();
  113.  
  114.                 indicesCount = indices.length;
  115.                 indicesBuffer = BufferUtils.createByteBuffer(indicesCount);
  116.                 indicesBuffer.put(indices);
  117.                 indicesBuffer.flip();
  118.  
  119.                 GL30.glBindVertexArray(vaoId);
  120.  
  121.                 GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
  122.                 GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticesBuffer,
  123.                                 GL15.GL_STATIC_DRAW);
  124.                 GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
  125.  
  126.                 GL30.glBindVertexArray(0);
  127.  
  128.                 GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboiId);
  129.                 GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer,
  130.                                 GL15.GL_STATIC_DRAW);
  131.                 GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
  132.         }
  133.  
  134.         private void setupShaders() {
  135.                 int errorCheckValue = GL11.glGetError();
  136.  
  137.                 vsId = loadShader("/shaders/vertex.glsl", GL20.GL_VERTEX_SHADER);
  138.                 fsId = loadShader("/shaders/fragment.glsl", GL20.GL_FRAGMENT_SHADER);
  139.  
  140.                 pId = GL20.glCreateProgram();
  141.                 GL20.glAttachShader(pId, vsId);
  142.                 GL20.glAttachShader(pId, fsId);
  143.                 GL20.glLinkProgram(pId);
  144.  
  145.                 GL20.glBindAttribLocation(pId, 0, "in_Position");
  146.                 GL20.glBindAttribLocation(pId, 1, "in_Color");
  147.  
  148.                 GL20.glValidateProgram(pId);
  149.  
  150.                 errorCheckValue = GL11.glGetError();
  151.                 if (errorCheckValue != GL11.GL_NO_ERROR) {
  152.                         System.out.println("ERROR - Could not create the shaders:"
  153.                                         + GLU.gluErrorString(errorCheckValue));
  154.                         System.exit(-1);
  155.                 }
  156.         }
  157.  
  158.         public void destroyResources() {
  159.                 GL20.glUseProgram(0);
  160.                 GL20.glDetachShader(pId, vsId);
  161.                 GL20.glDetachShader(pId, fsId);
  162.  
  163.                 GL20.glDeleteShader(vsId);
  164.                 GL20.glDeleteShader(fsId);
  165.                 GL20.glDeleteProgram(pId);
  166.  
  167.                 GL30.glBindVertexArray(vaoId);
  168.  
  169.                 GL20.glDisableVertexAttribArray(0);
  170.                 GL20.glDisableVertexAttribArray(1);
  171.  
  172.                 GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
  173.                 GL15.glDeleteBuffers(vboId);
  174.  
  175.                 GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
  176.                 GL15.glDeleteBuffers(vboiId);
  177.  
  178.                 GL30.glBindVertexArray(0);
  179.                 GL30.glDeleteVertexArrays(vaoId);
  180.         }
  181.  
  182.         private static final int loadShader(String filename, int type) {
  183.                 StringBuilder shaderSource = new StringBuilder();
  184.                 int shaderID = 0;
  185.  
  186.                 try {
  187.                         BufferedReader reader = new BufferedReader(new InputStreamReader(
  188.                                         Main.class.getResourceAsStream(filename)));
  189.                         String line;
  190.                         while ((line = reader.readLine()) != null) {
  191.                                 shaderSource.append(line).append("\n");
  192.                         }
  193.                         reader.close();
  194.                 } catch (IOException e) {
  195.                         System.err.println("Could not read file.");
  196.                         e.printStackTrace();
  197.                         System.exit(-1);
  198.                 }
  199.  
  200.                 shaderID = GL20.glCreateShader(type);
  201.                 GL20.glShaderSource(shaderID, shaderSource);
  202.                 GL20.glCompileShader(shaderID);
  203.  
  204.                 if (GL20.glGetShader(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
  205.                         System.err.println("Could not compile shader.");
  206.                         System.exit(-1);
  207.                 }
  208.  
  209.                 return shaderID;
  210.         }
  211. }