package net.tylermurphy.Minecraft.Render.Data; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL30; import java.io.Serializable; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.util.ArrayList; import java.util.List; public class Mesh implements Serializable { private static final long serialVersionUID = -8137846451745511907L; public static List vaos = new ArrayList<>(); public static List vbos = new ArrayList<>(); private final int id; private final int vertexCount; private int counter = 0; public Mesh(int vertexCount){ this.id = GL30.glGenVertexArrays(); vaos.add(id); this.vertexCount = vertexCount; GL30.glBindVertexArray(id); } public Mesh store(float[] data, int coordinateSize){ int id = GL15.glGenBuffers(); vbos.add(id); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, id); FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length); buffer.put(data); buffer.flip(); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); GL20.glVertexAttribPointer(counter,coordinateSize, GL11.GL_FLOAT,false,0,0); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); counter++; return this; } public Mesh finish(){ GL30.glBindVertexArray(0); return this; } public void delete(){ IntBuffer amount = BufferUtils.createIntBuffer(1); GL20.glGetIntegerv(GL20.GL_MAX_VERTEX_ATTRIBS, amount); GL30.glBindVertexArray(id); for (int i=0; i < amount.get(0); i++) { IntBuffer vbo = BufferUtils.createIntBuffer(1); GL20.glGetVertexAttribiv(i, GL20.GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, vbo); if(vbo.get(0) > 0) { GL15.glDeleteBuffers(vbo.get(0)); } } GL30.glDeleteVertexArrays(id); } public int getID() { return id; } public int getVertexCount() { return vertexCount; } public static void cleanUp() { for(int vao:vaos){ GL30.glDeleteVertexArrays(vao); } for(int vbo:vbos){ GL30.glDeleteBuffers(vbo); } } }