package com.voxel.engine.core.Chunk; import com.voxel.engine.core.Block.Block; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import java.nio.FloatBuffer; import java.util.Random; /** * Created with IntelliJ IDEA. * User: Toby's PC * Date: 07/01/14 * Time: 19:25 */ public class Chunk { public static final int CHUNK_SIZE = 16; public static final int CHUNK_DEPTH = 2; public Block[][][] blocks; public static final int CUBE_LENGTH = 2; private int StartX, StartY, StartZ; private Random random; int xx, yy, zz; private int VBOColorHandle; private int VBOVertexHandle; public void render(){ GL11.glPushMatrix(); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOVertexHandle); GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOColorHandle); GL11.glColorPointer(3, GL11.GL_FLOAT, 0, 0L); GL11.glDrawArrays(GL11.GL_QUADS, 0, CHUNK_SIZE * CHUNK_SIZE * CHUNK_SIZE * 24); GL11.glPopMatrix(); } public void update(){ } public static void EnableLighting(boolean enabled){ GL11.glEnableClientState(GL11.GL_NORMAL_ARRAY); GL11.glEnable(GL11.GL_COLOR_MATERIAL); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_LIGHT0); } public Chunk(int startX, int startY, int startZ){ random = new Random(); int l = 10; int h = 30; for(int i = 0;i < 10;i++){ xx = random.nextInt(h-l)+l; } // xx = random.nextInt(h-l)+l; zz = random.nextInt(h-l)+l; blocks = new Block[CHUNK_SIZE][CHUNK_SIZE][CHUNK_SIZE]; for (int x = 0; x < CHUNK_SIZE; x++) { for (int y = 0; y < CHUNK_DEPTH; y++) { for (int z = 0; z < CHUNK_SIZE; z++) { if(random.nextFloat()>0.7f){ blocks[x][y][z] = new Block(Block.BlockType.BLOCK_TYPE_GRASS); }else if(random.nextFloat() > 0.4f){ blocks[x][y][z] = new Block(Block.BlockType.BLOCK_TYPE_DIRT); }else if(random.nextFloat()>0.2f){ blocks[x][y][z] = new Block(Block.BlockType.BLOCK_TYPE_WATER); }else{ blocks[x][y][z] = new Block(Block.BlockType.BLOCK_TYPE_DEFAULT); } } } } VBOColorHandle = GL15.glGenBuffers(); VBOVertexHandle = GL15.glGenBuffers(); // StartX = startX; // StartY = startY; // StartZ = startZ; rebuildMesh(startX, startY, startZ); } public void rebuildMesh(float startX, float startY, float startZ){ VBOColorHandle = GL15.glGenBuffers(); VBOVertexHandle = GL15.glGenBuffers(); FloatBuffer VertexPositionData = BufferUtils.createFloatBuffer((CHUNK_SIZE * CHUNK_SIZE * CHUNK_SIZE) * 6 * 12); FloatBuffer VertexColorData = BufferUtils.createFloatBuffer((CHUNK_SIZE* CHUNK_SIZE * CHUNK_SIZE) * 6 * 12); //Note that for above CHUNK_SIZE^3 was not working for me. for (float x = 0; x < CHUNK_SIZE; x += 1) { for (float y = 0; y < CHUNK_DEPTH; y += 1) { for (float z = 0; z < CHUNK_SIZE; z += 1) { VertexPositionData.put(CreateCube((float) startX + x * CUBE_LENGTH, (float) startY + y * CUBE_LENGTH,(float) startZ + z * CUBE_LENGTH)); VertexColorData.put(CreateCubeVertexCol(GetCubeColor(blocks[(int)x][(int) y][(int) z]))); VertexPositionData.put(CreateCube((float) startX, (float)xx,(float) zz)); VertexColorData.put(CreateCubeVertexCol(GetCubeColor(blocks[(int)x][(int) y][(int) z]))); } } } VertexColorData.flip(); VertexPositionData.flip(); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOVertexHandle); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, VertexPositionData,GL15.GL_STATIC_DRAW); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOColorHandle); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, VertexColorData,GL15.GL_STATIC_DRAW); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } public static float[] CreateCube(float x, float y, float z) { int offset = CUBE_LENGTH / 2; return new float[] { x + offset, y + offset,z, x - offset,y + offset,z, x - offset,y + offset,z - CUBE_LENGTH, x + offset,y + offset,z - CUBE_LENGTH, x + offset, y - offset, z - CUBE_LENGTH, x - offset,y - offset,z - CUBE_LENGTH, x - offset,y - offset,z, x + offset,y - offset,z, x + offset, y + offset, z - CUBE_LENGTH, x - offset,y + offset, z - CUBE_LENGTH, x - offset,y - offset,z - CUBE_LENGTH, x + offset,y - offset,z - CUBE_LENGTH, x + offset, y - offset, z, x - offset, y - offset, z, x - offset, y + offset, z, x + offset,y + offset, z, x - offset, y + offset, z - CUBE_LENGTH, x - offset,y + offset, z, x - offset, y - offset, z, x - offset,y - offset,z - CUBE_LENGTH, x + offset, y + offset, z, x + offset, y + offset,z - CUBE_LENGTH, x + offset, y - offset, z - CUBE_LENGTH, x + offset, y - offset, z }; } private float[] GetCubeColor(Block block) { switch (block.getID()) { case 1: return new float[] { 0, 1, 0 }; case 2: return new float[] { 1, 0.5f, 0 }; case 3: return new float[] { 0, 0f, 1f }; } return new float[] { 1, 1, 1 }; } private float[] CreateCubeVertexCol(float[] CubeColorArray) { float[] cubeColors = new float[CubeColorArray.length * 4 * 6]; for (int i = 0; i < cubeColors.length; i++) { cubeColors[i] = CubeColorArray[i % CubeColorArray.length]; } return cubeColors; } }