I'm hoping someone could look through this code for my Chunk, Mesh and ChunkManager classes and tell me what I need to do to improve.For some reason, when I wrote it in NetBeans and transferred it to Eclipse it deleted all my comments.I especially don't understand the buffer system. Can I use backbuffers in OpenGL?Chunk class:public class Chunk{    public static final int X_CHUNK_SIZE = 16;    public static final int Y_CHUNK_SIZE = 64;    public static final int Z_CHUNK_SIZE = 16;    public int chunkXNumber;    public int chunkZNumber;    private Mesh mesh;    private Shader shader;    private Material material;    private Texture texture;    private Transform transform;    private boolean chunkUpdateNeeded;    private ArrayList<Integer> indiceList = new ArrayList<Integer>();    private Block [][][] blocks = new Block[X_CHUNK_SIZE][Y_CHUNK_SIZE][Z_CHUNK_SIZE];    public Chunk(int chunkXNumber, int chunkZNumber)    {        this.chunkXNumber = chunkXNumber;        this.chunkZNumber = chunkZNumber;        createBlocks(chunkXNumber, chunkZNumber);        boolean[][][] blocksActive = getActiveBlocks();        texture = new Texture(terrain.png);        material = new Material(texture, new Vector3f(1.0f, 1.0f, 1.0f));           transform = new Transform();        //shader = BasicShader.getInstance();        shader = BasicShader.getInstance();        generateChunk(blocksActive);    }    private void generateChunk(boolean[][][] blocksActive)    {        Vertex[] allVertices = createVertices(blocksActive);        int[] indices = new int[indiceList.size()];        for(int i = 0; i < indices.length; i++)        {            indices[i] = indiceList.get(i);        }        indiceList.clear();        mesh = new Mesh(allVertices, indices, false);        transform.setTranslation(chunkXNumber * X_CHUNK_SIZE, -64, chunkZNumber * Z_CHUNK_SIZE);//      transform.setScale(new Vector3f(1, 1, 1));    }    private void createBlocks(int chunkXNum, int chunkZNum)    {        float density ;        for(int i = 0; i < X_CHUNK_SIZE; i++)        {            for(int j = 0; j < Y_CHUNK_SIZE; j++)            {                for(int k = 0; k < Z_CHUNK_SIZE; k++)                {                    density = getDensity(new Vector3f(i ,j ,k ), chunkXNum, chunkZNum);                    int material = getMaterial(density,j);                    boolean isActive = setMaterialRules(material);                    blocks[i][j][k] = new Block(material, isActive);                }            }        }       }       public void update()    {            boolean[][][] blocksActive = getActiveBlocks();            Vertex[] allChangedVertices = createVertices(blocksActive);            int[] indices = new int[indiceList.size()];            for(int h = 0; h < indices.length; h++)            {                indices[h] = indiceList.get(h);            }            mesh = new Mesh(allChangedVertices, indices, false);            setChunkUpdateNeeded(false);        }       }    public void render()    {         shader.bind();         shader.updateUniforms(transform.getTransformation(), transform.getProjectedTransformation(), material);         mesh.draw();    }    private boolean[][][] getActiveBlocks()    {        boolean [][][] activeBlocks = new boolean[X_CHUNK_SIZE][Y_CHUNK_SIZE][Z_CHUNK_SIZE];        for(int i = 0; i < X_CHUNK_SIZE; i++)        {            for(int j = 0; j < Y_CHUNK_SIZE; j++)            {                for(int k = 0; k < Z_CHUNK_SIZE; k++)                {                    activeBlocks[i][j][k] = blocks[i][j][k].isBlockEnabled();                }               }           }           return activeBlocks;    }    private float getDensity(Vector3f chunkPos, int chunkXNum, int chunkZNum)    {        float density = 0;        //TODO check to see if double is necessary        for(float i = 1; i <= Game.octaveLimit; i *= 8)        {            density += (1/i) * (Noise. noise(((chunkPos.getX() + (chunkXNum * X_CHUNK_SIZE) + .001) / 190.0f) * i, ((chunkPos.getY() + .001) /27.0f) * i,( (chunkPos.getZ() + (chunkZNum * Z_CHUNK_SIZE) + .001) / 190.0f) * i));            density = (density);        }//      density += (1/i) * (Noise.noise((x / 790.0f) * i, (y / 590.0f) * i,( z / 790.0f) * i));//      density = Math.abs(density);        return density;    }    private int getMaterial(float density, int yVal)    {           int material;        if(density > .52)        {            if(yVal >= 38)            {                material = 0;            }            else            {                material = 1;            }        }        else        {            if(yVal >= 8)            {                material = 0;            }            else if(yVal > -12 && yVal < 8)            {                material = 2;            }            else            {                material = 0;            }        }        return material;    }    private boolean setMaterialRules(int material)    {        if(material == 1)        {            return true;        }        else if(material == 2)        {            return true;        }        else        {            return false;        }    }    private Vertex[] createVertices(boolean[][][] blockActive)     {           ArrayList<Vertex> vertexList = new ArrayList<Vertex> ();        int v1 = X_CHUNK_SIZE;        int v2 = Y_CHUNK_SIZE;        int v3 = Z_CHUNK_SIZE;        for(int i = 0; i < v1; i++)        {            for(int j = 0; j < v2; j++)            {                for(int k = 0; k < v3; k++)                {                    if(blockActive[i][j][k])                    {                        Vertex[] blockVerts = createBlock(i, j, k);                        for(int h = 0; h < blockVerts.length; h++)                        {                            vertexList.add(blockVerts[h]);                            indiceList.add(h);                        }                    }                }            }        }        Vertex[] finalVertices = new Vertex[vertexList.size()];        finalVertices = vertexList.toArray(finalVertices);        return finalVertices;    }    private Vertex[] createBlock(int x, int y, int z)    {        ArrayList <Vertex> vertexList = new ArrayList<Vertex> ();        int whichTexture = blocks[x][y][z].getBlockType();        if(z > 0)        {            if(!blocks[x][y][z - 1].isBlockEnabled())            {                //Front face                vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));                vertexList.add(new Vertex(new Vector3f(x, y + 1, z), getTexCoords(whichTexture, 1)));                vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z), getTexCoords(whichTexture, 2)));                vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));                vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z), getTexCoords(whichTexture, 2)));                vertexList.add(new Vertex(new Vector3f(x + 1, y, z), getTexCoords(whichTexture, 3)));            }        }        else if(z == 0)        {            //Front face            vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x, y + 1, z), getTexCoords(whichTexture, 1)));            vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x + 1, y, z), getTexCoords(whichTexture, 3)));        }        if(z < Z_CHUNK_SIZE - 1)        {            if(!blocks[x][y][z + 1].isBlockEnabled())            {                //Back face                vertexList.add(new Vertex(new Vector3f(x, y, z + 1), getTexCoords(whichTexture, 0)));                vertexList.add(new Vertex(new Vector3f(x, y + 1, z + 1), getTexCoords(whichTexture, 1)));                vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));                vertexList.add(new Vertex(new Vector3f(x, y, z + 1), getTexCoords(whichTexture, 0)));                vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));                vertexList.add(new Vertex(new Vector3f(x + 1, y, z + 1), getTexCoords(whichTexture, 3)));            }        }        else        {            //Back face            vertexList.add(new Vertex(new Vector3f(x, y, z + 1), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x, y + 1, z + 1), getTexCoords(whichTexture, 1)));            vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x, y, z + 1), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x + 1, y, z + 1), getTexCoords(whichTexture, 3)));        }        if(x > 0)        {            if(!blocks[x - 1][y][z].isBlockEnabled())            {                //Left face                vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));                vertexList.add(new Vertex(new Vector3f(x, y + 1, z), getTexCoords(whichTexture, 1)));                vertexList.add(new Vertex(new Vector3f(x, y + 1, z + 1), getTexCoords(whichTexture, 2)));                vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));                vertexList.add(new Vertex(new Vector3f(x, y + 1, z + 1), getTexCoords(whichTexture, 2)));                vertexList.add(new Vertex(new Vector3f(x, y, z + 1), getTexCoords(whichTexture, 3)));            }        }        else if(x == 0)        {            //Left face            vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x, y + 1, z), getTexCoords(whichTexture, 1)));            vertexList.add(new Vertex(new Vector3f(x, y + 1, z + 1), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x, y + 1, z + 1), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x, y, z + 1), getTexCoords(whichTexture, 3)));        }        if(x < X_CHUNK_SIZE - 1)        {            if(!blocks[x + 1][y][z].isBlockEnabled())            {                //Right face                vertexList.add(new Vertex(new Vector3f(x + 1, y, z), getTexCoords(whichTexture, 0)));                vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z), getTexCoords(whichTexture, 1)));                vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));                vertexList.add(new Vertex(new Vector3f(x + 1, y, z), getTexCoords(whichTexture, 0)));                vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));                vertexList.add(new Vertex(new Vector3f(x + 1, y, z + 1), getTexCoords(whichTexture, 3)));            }        }        else        {            //Right face            vertexList.add(new Vertex(new Vector3f(x + 1, y, z), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z), getTexCoords(whichTexture, 1)));            vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x + 1, y, z), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x + 1, y, z + 1), getTexCoords(whichTexture, 3)));           }        if(y > 0)        {            if(!blocks[x][y - 1][z].isBlockEnabled())            {                //Bottom face                vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));                vertexList.add(new Vertex(new Vector3f(x, y, z + 1), getTexCoords(whichTexture, 1)));                vertexList.add(new Vertex(new Vector3f(x + 1, y, z + 1), getTexCoords(whichTexture, 2)));                vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));                vertexList.add(new Vertex(new Vector3f(x + 1, y, z + 1), getTexCoords(whichTexture, 2)));                vertexList.add(new Vertex(new Vector3f(x + 1, y, z), getTexCoords(whichTexture, 3)));            }        }        else if(y == 0)        {            //Bottom face            vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x, y, z + 1), getTexCoords(whichTexture, 1)));            vertexList.add(new Vertex(new Vector3f(x + 1, y, z + 1), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x, y, z), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x + 1, y, z + 1), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x + 1, y, z), getTexCoords(whichTexture, 3)));        }        if(y < Y_CHUNK_SIZE - 1)        {            if(!blocks[x][y + 1][z].isBlockEnabled())            {                    //Top face                    vertexList.add(new Vertex(new Vector3f(x, y + 1, z), getTexCoords(whichTexture, 0)));                    vertexList.add(new Vertex(new Vector3f(x, y + 1, z + 1), getTexCoords(whichTexture, 1)));                    vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));                    vertexList.add(new Vertex(new Vector3f(x, y + 1, z), getTexCoords(whichTexture, 0)));                    vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));                    vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z), getTexCoords(whichTexture, 3)));            }        }        else        {            //Top face            vertexList.add(new Vertex(new Vector3f(x, y + 1, z), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x, y + 1, z + 1), getTexCoords(whichTexture, 1)));            vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x, y + 1, z), getTexCoords(whichTexture, 0)));            vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z + 1), getTexCoords(whichTexture, 2)));            vertexList.add(new Vertex(new Vector3f(x + 1, y + 1, z), getTexCoords(whichTexture, 3)));           }        Vertex[] vertices = new Vertex[vertexList.size()];        vertices = vertexList.toArray(vertices);        return vertices;    }    private Vector2f getTexCoords(int whichTexture, int whichCorner)    {            if(whichTexture == 1)            {                switch(whichCorner)                {                    getTexture();                }            }            else if(whichTexture == 2)            {                switch(whichCorner)                {                    getTexture();                }            }            return null;    }    public Vector2f getChunkValues()    {        return new Vector2f(chunkXNumber, chunkZNumber);    }    public Transform getTransform()     {        return transform;    }    public void setTransform(Transform transform)     {        this.transform = transform;    }    public boolean isChunkUpdateNeeded()     {        return chunkUpdateNeeded;    }    public void setChunkUpdateNeeded(boolean chunkUpdateNeeded)    {        this.chunkUpdateNeeded = chunkUpdateNeeded;    }}Mesh class:public class Mesh {    private int vbo;    private int backVbo;    private int size;    public Mesh(String fileName)    {        vbo = glGenBuffers();        size = 0;        loadMesh(fileName);    }    public Mesh(Vertex[] vertices, int[] indices)    {        this(vertices, indices, false);    }    public Mesh(Vertex[] vertices, int[] indices, boolean calcNormals)    {        initMeshData();        addVertices(vertices, indices, calcNormals);        }    private void initMeshData()    {        vbo = glGenBuffers();        size = 0;    }    private void addVertices(Vertex[] vertices, int[] indices, boolean calcNormals)    {        if(calcNormals)        {            calcNormals(vertices, indices);        }        size = indices.length;        glBindBuffer(GL_ARRAY_BUFFER, vbo);        glBufferData(GL_ARRAY_BUFFER, Util.createFlippedBuffer(vertices), GL_DYNAMIC_DRAW);    }    public void draw()    {        glEnableVertexAttribArray(0);        glEnableVertexAttribArray(1);        glEnableVertexAttribArray(2);        glBindBuffer(GL_ARRAY_BUFFER, vbo);        glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0);        glVertexAttribPointer(1, 2, GL_FLOAT, false, Vertex.SIZE * 4, 12);        glVertexAttribPointer(2, 3, GL_FLOAT, false, Vertex.SIZE * 4, 20);        glDrawArrays(GL_TRIANGLES, 0, size);        glDisableVertexAttribArray(0);        glDisableVertexAttribArray(1);        glDisableVertexAttribArray(2);    }    private void calcNormals(Vertex[] vertices, int[] indices)    {        for(int i = 0; i < indices.length; i += 3)        {            int i0 = indices[i];            int i1 = indices[i + 1];            int i2 = indices[i + 2];            Vector3f v1 = vertices[i1].getPos().sub(vertices[i0].getPos());            Vector3f v2 = vertices[i2].getPos().sub(vertices[i0].getPos());            Vector3f normal = v1.cross(v2).normalize();            vertices[i0].setNormal(vertices[i0].getNormal().add(normal));            vertices[i1].setNormal(vertices[i1].getNormal().add(normal));            vertices[i2].setNormal(vertices[i2].getNormal().add(normal));        }        for(int i = 0; i < vertices.length; i++)        {            vertices[i].setNormal(vertices[i].getNormal().normalize());        }    }    private Mesh loadMesh(String fileName)    {        String[] splitArray = fileName.split(\\.);        String ext = splitArray[splitArray.length -1];        if(!ext.equals(obj))        {            System.err.println(Error: File format not supported mesh supports Obj you loaded a + ext);            new Exception().printStackTrace();            System.exit(1);        }        ArrayList<Vertex> vertices = new ArrayList<Vertex>();        ArrayList<Integer> indices = new ArrayList<Integer>();        BufferedReader meshReader = null;        try        {            meshReader = new BufferedReader(new FileReader(./res/models/ + fileName));            String line;            while((line = meshReader.readLine()) != null)            {                String[] tokens = line.split( );                tokens = Util.removeEmptyStrings(tokens);                if(tokens.length == 0 || tokens[0].equals(#))                {                    continue;                }                else if(tokens[0].equals(v))                {                    vertices.add(new Vertex(new Vector3f(Float.valueOf(tokens[1]),                                                         Float.valueOf(tokens[2]),                                                         Float.valueOf(tokens[3]))));                }                else if(tokens[0].equals(f))                {                    indices.add(Integer.parseInt(tokens[1].split(/)[0]) - 1);                    indices.add(Integer.parseInt(tokens[2].split(/)[0]) - 1);                    indices.add(Integer.parseInt(tokens[3].split(/)[0]) - 1);                    if(tokens.length > 4)                    {                        indices.add(Integer.parseInt(tokens[1].split(/)[0]) - 1);                        indices.add(Integer.parseInt(tokens[3].split(/)[0]) - 1);                        indices.add(Integer.parseInt(tokens[4].split(/)[0]) - 1);                    }                }            }            meshReader.close();            Vertex[] vertexData = new Vertex[vertices.size()];            vertices.toArray(vertexData);            Integer[] indexData = new Integer[indices.size()];            indices.toArray(indexData);            addVertices(vertexData, null, true);        }        catch(Exception e)        {            e.printStackTrace();            System.exit(1);        }        return null;    }}ChunkManager class:public class ChunkManager {    private Chunk[][] currentChunks;    public int renderLimit;    private int maxChunks;    public static boolean chunkUpdateNeeded;    public static Vector2f whichChunkUpdate;    private boolean xBiggerTrue, zBiggerTrue, xSmallerTrue, zSmallerTrue;    private Entity player;    public ChunkManager(int renderLimit)    {        this(renderLimit, renderLimit / (Chunk.X_CHUNK_SIZE));    }       public ChunkManager(int renderLimit, int maxChunks)    {        player = new Player(Hero, 0);        player.setCurrentCoords(player.getCurrentCoords());        player.setOldCoords(player.getCurrentCoords());        player.setOldChunkCoords(player.getCurrentChunkCoords());        this.renderLimit = renderLimit;        this.maxChunks = maxChunks;        currentChunks = new Chunk[(maxChunks * 2) - 1] [(maxChunks * 2) - 1];        firstChunkGen();    }    public void chunkUpdates()    {        if(chunkUpdateNeeded == true)        {            currentChunks[(int) whichChunkUpdate.getX()][(int) whichChunkUpdate.getY()].setChunkUpdateNeeded(true);            chunkUpdateNeeded = false;        }    }    private void firstChunkGen()    {        for(int i = maxChunks - 1; i > -maxChunks; i--)        {            for(int j = maxChunks - 1; j > -maxChunks; j--)            {                if(currentChunks[i + maxChunks - 1][j + maxChunks - 1] == null)                {                    currentChunks[i + maxChunks - 1][j + maxChunks - 1] = new Chunk((int)player.getCurrentChunkCoords().getX() + (i), (int) player.getCurrentChunkCoords().getY() + (j));                }                else                {                    continue;                }            }        }    }    private boolean chunkChangeNeeded()    {        if((int)player.getCurrentChunkCoords().getX() != (int)player.getOldChunkCoords().getX() || (int)player.getCurrentChunkCoords().getY() != (int)player.getOldChunkCoords().getY())        {            System.out.println(player.getCurrentChunkCoords().getY());            System.out.println(player.getOldChunkCoords().getY());            player.setOldChunkCoords(player.getCurrentChunkCoords());            return true;        }        else        {            player.setOldChunkCoords(player.getCurrentChunkCoords());            return false;        }    }    private Chunk[][] getChunkChange(Chunk[][] currentChunksCopy, int whichUpdate)    {           if(whichUpdate == 0)        {            if(xBiggerTrue)            {                for(int a = 0; a < currentChunksCopy.length; a++)                {                    for(int b = 0; b < currentChunksCopy[0].length; b++)                    {                        if(a == currentChunksCopy.length - 1)                        {                            currentChunksCopy[a][b] = new Chunk((int)player.getCurrentChunkCoords().getX() + maxChunks - 1, (int)currentChunksCopy[a][b].getChunkValues().getY());                        }                        else                        {                            currentChunksCopy[a][b] = currentChunksCopy[a + 1][b];                        }                    }                }                return currentChunksCopy;            }        }        else if(whichUpdate == 1)        {            if(xSmallerTrue)            {                for(int a = currentChunksCopy.length - 1; a >= 0; a--)                {                    for(int b = currentChunksCopy[0].length - 1 ; b >= 0; b--)                    {                        if(a == 0)                        {                            currentChunksCopy[a][b] = new Chunk((int)player.getCurrentChunkCoords().getX() - maxChunks + 1, ((int)currentChunksCopy[a][b].getChunkValues().getY()));                        }                        else                        {                            currentChunksCopy[a][b] = currentChunksCopy[a - 1][b];                        }                    }                }                return currentChunksCopy;            }        }        else if(whichUpdate == 2)        {            if(zBiggerTrue)            {                for(int a = 0; a < currentChunksCopy.length; a++)                {                    for(int b = 0; b < currentChunksCopy[0].length; b++)                    {                        if(b == currentChunksCopy[0].length - 1)                        {                            currentChunksCopy[a][b] = new Chunk((int)currentChunksCopy[a][b].getChunkValues().getX(), (int)player.getCurrentChunkCoords().getY() + maxChunks - 1);                        }                        else                        {                            currentChunksCopy[a][b] = currentChunksCopy[a][b + 1];                        }                    }                }                return currentChunksCopy;            }        }        else if(whichUpdate == 3)        {            if(zSmallerTrue)            {                for(int a = currentChunksCopy.length - 1; a >= 0; a--)                {                    for(int b = currentChunksCopy.length - 1; b >= 0; b--)                    {                        if(b == 0)                        {                            currentChunksCopy[a][b] = new Chunk((int)currentChunksCopy[a][b].getChunkValues().getX(), (int)player.getCurrentChunkCoords().getY() - maxChunks + 1);                        }                        else                        {                            currentChunksCopy[a][b] = currentChunksCopy[a][b - 1];                        }                    }                }                return currentChunksCopy;            }        }        return currentChunksCopy;    }    public void update()    {           if(chunkChangeNeeded() == true)        {                   if((xBiggerTrue = (currentChunks[(maxChunks * 2) - 2][(maxChunks * 2) - 2].getChunkValues().getX()) < player.getCurrentChunkCoords().getX() + maxChunks - 1))            {                currentChunks = getChunkChange(currentChunks , 0);            }            if((xSmallerTrue = (currentChunks[0][0].getChunkValues().getX()) > player.getCurrentChunkCoords().getX() - maxChunks + 1))            {                currentChunks = getChunkChange(currentChunks, 1);            }            if((zBiggerTrue = (currentChunks[(maxChunks * 2) - 2][(maxChunks * 2) - 2].getChunkValues().getY()) < player.getCurrentChunkCoords().getY() + maxChunks - 1))            {                currentChunks = getChunkChange(currentChunks , 2);                System.out.println(ZBIG);            }            if((zSmallerTrue = (currentChunks[0][0].getChunkValues().getY()) > player.getCurrentChunkCoords().getY() - maxChunks + 1))            {                currentChunks = getChunkChange(currentChunks, 3);                System.out.println(ZSMALL);            }                   }        chunkUpdates();    }    public void input()    {        if(Input.getKeyDown(Input.KEY_3))        {        for(int a = 0; a < currentChunks.length; a++)        {            for(int b = 0; b < currentChunks[0].length; b++)            {                System.out.print( X =  + currentChunks[a][b].getChunkValues().getX() +  Z =  + currentChunks[a][b].getChunkValues().getY());            }            System.out.println();        }        }    }    public void render()    {        for(int i = -maxChunks;i < maxChunks - 1; i++)        {            for(int j = -maxChunks;j < maxChunks - 1; j++)            {                float currentChunkX = currentChunks[i + maxChunks][j + maxChunks ].getTransform().getTranslation().getX();                float currentChunkZ = currentChunks[i + maxChunks][j + maxChunks ].getTransform().getTranslation().getZ();                float camX = Game.camera.getPos().getX();                float camZ = Game.camera.getPos().getZ();                if(currentChunkX < camX + renderLimit)                {                    if(currentChunkZ < camZ + renderLimit)                    {                        if(currentChunkX > camX - renderLimit)                        {                            if(currentChunkZ > camZ - renderLimit)                            {                                currentChunks[i + maxChunks][j + maxChunks].render();                            }                        }                    }                }                else continue;            }        }    }    public int getRenderLimit()     {        return renderLimit;    }    public void setRenderLimit(int renderLimit)     {        this.renderLimit = renderLimit;    }    public Chunk[][] getCurrentChunks()    {        return currentChunks;    }    public void setCurrentChunks(Chunk[][] currentChunks)    {        this.currentChunks = currentChunks;    }    public int getMaxChunks()    {        return maxChunks;    }    public void setMaxChunks(int maxChunks)    {        this.maxChunks = maxChunks;    }    public static boolean isChunkUpdateNeeded()    {        return chunkUpdateNeeded;    }    public static void setChunkUpdateNeeded(boolean chunkUpdateNeeded)    {        ChunkManager.chunkUpdateNeeded = chunkUpdateNeeded;    }    public static Vector2f getWhichChunkUpdate()    {        return whichChunkUpdate;    }    public static void setWhichChunkUpdate(Vector2f whichChunkUpdate)    {        ChunkManager.whichChunkUpdate = whichChunkUpdate;    }}
Vertex Buffer Object (VBO) multi-class implementation
java;optimization;opengl