/** * A utility method to load vertex data into an OpenGL "vertex array object" (VAO) for efficient * rendering. The VAO stores several "vertex buffer objects" (VBOs) that contain the vertex * attribute data. * * @param data reference to the vertex data to be loaded into a VAO */ private void initArrayBuffer(GLVertexData data) { // Make a vertex array object (VAO) for this vertex data // and store a reference to it GLVertexArrayObject vao = new GLVertexArrayObject(gl, data.getElements().size() + 1); data.setVAO(vao); // Bind (activate) the VAO for the vertex data in OpenGL. // The subsequent OpenGL operations on VBOs will be recorded (stored) // in the VAO. vao.bind(); // Store all vertex attributes in vertex buffer objects (VBOs) ListIterator<VertexData.VertexElement> itr = data.getElements().listIterator(0); data.getVAO().rewindVBO(); while (itr.hasNext()) { VertexData.VertexElement e = itr.next(); // Bind the vertex buffer object (VBO) gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, data.getVAO().getNextVBO()); // Upload vertex data gl.glBufferData( GL3.GL_ARRAY_BUFFER, e.getData().length * 4, FloatBuffer.wrap(e.getData()), GL3.GL_DYNAMIC_DRAW); } // Bind the default vertex buffer objects gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, 0); // Store the vertex data indices into the last vertex buffer gl.glBindBuffer(GL3.GL_ELEMENT_ARRAY_BUFFER, data.getVAO().getNextVBO()); gl.glBufferData( GL3.GL_ELEMENT_ARRAY_BUFFER, data.getIndices().length * 4, IntBuffer.wrap(data.getIndices()), GL3.GL_DYNAMIC_DRAW); // Bind the default vertex array object. This "deactivates" the VAO // of the vertex data gl.glBindVertexArray(0); }