Advertisement
Guest User

Container.java

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