public class Mesh { public static final String TAG = "Mesh"; public FloatBuffer _vertices; public IntBuffer _indices; public List _textures = new ArrayList(); public Vec3 _min = Vec3.Max(); public Vec3 _max = Vec3.Min(); public Vec3 _center = Vec3.Zero(); public Vec3 _span = Vec3.Zero(); public int[] VAO = new int[1]; private final int[] VBO = new int[1]; private final int[] EBO = new int[1]; private final int _vertexCount; private final int _indexCount; public final int _mode = GLES30.GL_TRIANGLES; public Mesh(Vertex[] verts, int[] indices){ _vertexCount = verts.length; _indexCount = indices.length; _indices = GfxUtils.makeIntBuffer(indices); _vertices = GfxUtils.makeFloatBuffer(verts); updateBounds(); //centerAndScaleToDimensions(100.0f, 100.0f, 100.0f); // normalize(); setupMesh(); } public void render(final Shader s) { s.use(); if(_textures.size() > 0){ bindTextures(s); } GLES30.glBindVertexArray(VAO[0]); GLES30.glDrawElements(_mode, _indexCount, GLES30.GL_UNSIGNED_INT, 0); GLES30.glBindVertexArray(0); if(_textures.size() > 0) { //reset the texture unit, if used. GLES30.glActiveTexture(GLES30.GL_TEXTURE0); } checkGLError("render()"); } private void setupMesh() { _vertices.position(0); _indices.position(0); GLES30.glGenVertexArrays(1, VAO, 0); GLES30.glGenBuffers(1, VBO, 0); GLES30.glGenBuffers(1, EBO, 0); GLES30.glBindVertexArray(VAO[0]); GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, VBO[0]); GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, getVertBufferSize(), _vertices, GLES30.GL_STATIC_DRAW); GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, EBO[0]); GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, getIndexBufferSize(), _indices, GLES30.GL_STATIC_DRAW); GLES30.glVertexAttribPointer(POS_INDEX, POS_SIZE, GLES30.GL_FLOAT, false, VERTEX_STRIDE, POS_OFFSET); GLES30.glEnableVertexAttribArray(POS_INDEX); GLES30.glVertexAttribPointer(NORMAL_INDEX, NORMAL_SIZE, GLES30.GL_FLOAT, false, VERTEX_STRIDE, NORMAL_OFFSET); GLES30.glEnableVertexAttribArray(NORMAL_INDEX); GLES30.glEnableVertexAttribArray(TEXCOORD_INDEX); GLES30.glVertexAttribPointer(TEXCOORD_INDEX, TEXCOORD_SIZE, GLES30.GL_FLOAT, false, VERTEX_STRIDE, TEXCOORD_OFFSET); GLES30.glBindVertexArray(0); //reset to default render context checkGLError("setupMesh"); } private int getVertBufferSize() { return _vertexCount * Vertex.byteSize(); } private int getIndexBufferSize() { return _indexCount * Integer.BYTES; }