Witam. Stworzyłem voxel engine do generowania bloków w 3d używając LWJGL. Coś jak minecraft.
Problem z nim jest taki, że nic nie wyświetla. Okno pozostaje cały czas czarne.
Klasa main:
Tworzenie okna:
Display.setFullscreen(false);
DisplayMode d[] = Display.getAvailableDisplayModes();
Display.setDisplayMode(displayMode);
Display.setTitle("EPQ Voxel engine");
Display.setVSyncEnabled(true);
Display.create();
Inicializacja GL:
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GL11.glClearDepth(1.0);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(45.0f, (float) displayMode.getWidth() / (float) displayMode.getHeight(), 0.1f, 100.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);
Pętla renderowania:
Chunk ch = new Chunk(0,0,0);
while (!Display.isCloseRequested()) {
try {
ch.render();
Display.update();
Display.sync(60);
} catch (Exception e) {
}
}
Display.destroy();
Mouse.destroy();
Keyboard.destroy();
Klasa Chunk:
import me.przemovi.ngine3.map.Block.BlockType;
public class Chunk
{
public static final int CHUNK_WIDTH = 16;
public static final int CHUNK_HEIGHT = 16;
public static final int CHUNK_LENGTH = 16;
private Block[][][] blocks;
private int vboVertexHandle;
private int vboColorHandle;
private int startX, startY, startZ;
public Chunk(int x, int y, int z)
{
startX = x;
startY = y;
startZ = z;
blocks = new Block[CHUNK_WIDTH][CHUNK_HEIGHT][CHUNK_LENGTH];
for(int xx = 0; xx < CHUNK_WIDTH; xx++)
{
for(int yy = 0; yy < CHUNK_HEIGHT; yy++)
{
for(int zz = 0; zz < CHUNK_WIDTH; zz++)
{
//blocks[xx][yy][zz] = Block.stone;
blocks[xx][yy][zz] = new Block(BlockType.BlockType_Stone);
}
}
}
vboColorHandle = GL15.glGenBuffers();
vboVertexHandle = GL15.glGenBuffers();
this.rebuildMesh(startX, startY, startZ);
}
private void rebuildMesh(int startX2, int startY2, int startZ2)
{
vboColorHandle = GL15.glGenBuffers();
vboVertexHandle = GL15.glGenBuffers();
FloatBuffer vertexPositionData = BufferUtils.createFloatBuffer((CHUNK_WIDTH * CHUNK_LENGTH * CHUNK_HEIGHT) * 6 * 12);
FloatBuffer vertexColorData = BufferUtils.createFloatBuffer((CHUNK_WIDTH * CHUNK_LENGTH * CHUNK_HEIGHT) * 6 * 12);
for(int xx = 0; xx < CHUNK_WIDTH; xx++)
{
for(int yy = 0; yy < CHUNK_WIDTH; yy++)
{
for(int zz = 0; zz < CHUNK_WIDTH; zz++)
{
if(blocks[xx][yy][zz] != null)
{
vertexPositionData.put(makeCube((float) startX + xx, (float) startY + yy, (float) startZ + zz));
vertexColorData.put(makeCubeVertexCol(getCubeColor(blocks[xx][yy][zz])));
}
}
}
}
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, vboColorHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertexColorData, GL15.GL_STATIC_DRAW);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
private float[] makeCubeVertexCol(float[] cubeColorData)
{
float[] cubeColors = new float[cubeColorData.length * 4 * 6];
for(int i = 0; i < cubeColors.length; i++)
{
cubeColors[i] = cubeColorData[i % cubeColorData.length];
}
return cubeColors;
}
private float[] getCubeColor(Block block)
{
return new float[]
{ 1, 0.5f, 1 };
}
private float[] makeCube(float x, float y, float z)
{
int offset = Block.SIZE / 2;
return new float[]
{ x + offset, y + offset, z, x - offset, y + offset, z, x - offset, y + offset, z - Block.SIZE, x + offset, y + offset, z - Block.SIZE, x + offset, y - offset, z - Block.SIZE, x - offset, y - offset, z - Block.SIZE, x - offset, y - offset, z, x + offset, y - offset, z, x + offset, y + offset, z - Block.SIZE, x - offset, y + offset, z - Block.SIZE, x - offset, y - offset, z - Block.SIZE, x + offset, y - offset, z - Block.SIZE, 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 - Block.SIZE, x - offset, y + offset, z, x - offset, y - offset, z, x - offset, y - offset, z - Block.SIZE, x + offset, y + offset, z, x + offset, y + offset, z - Block.SIZE, x + offset, y - offset, z - Block.SIZE, x + offset, y - offset, z };
}
private float[] getNormalVector()
{
return new float[]
{ 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, };
}
public void tick()
{
}
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_WIDTH * CHUNK_HEIGHT * CHUNK_LENGTH * 24);
GL11.glPopMatrix();
}
}
Klasa block:
public class Block {
private BlockType Type;
private boolean Visible=true;
public static int SIZE = 1;
public enum BlockType {
BlockType_Default(0),
BlockType_Grass(1),
BlockType_Dirt(2),
BlockType_Water(3),
BlockType_Stone(4),
BlockType_Wood(5),
BlockType_Sand(6),
BlockType_NumTypes(7);
private int BlockID;
BlockType(int i) {
BlockID=i;
}
public int GetID(){
return BlockID;
}
}
public Block(BlockType type){
Type= type;
}
public int GetID(){
return Type.GetID();
}
public boolean isVisible() {
return Visible;
}
public void setVisible(boolean visible) {
Visible = visible;
}
}