package com.voxel.engine.core;
import com.voxel.engine.core.Block.Block;
import com.voxel.engine.core.Camera.FPCameraController;
import com.voxel.engine.core.Chunk.ChunkManager;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.*;
import org.lwjgl.util.glu.GLU;
import java.util.Random;
import static org.lwjgl.opengl.GL11.*;
/**
* Created with IntelliJ IDEA.
* User: Toby's PC
* Date: 06/01/14
* Time: 15:47
*/
public class Core {
public static final int WORLD_WIDTH = 8;
public static final int WORLD_HEIGHT = 1;
public static final int BLOCK_WIDTH = 16;
public static final int BLOCK_HEIGHT = 16;
private Cube cube = new Cube();
private Block.BlockType blockType = Block.BlockType.BLOCK_TYPE_STONE;
FPCameraController camera = FPCameraController.getInstance();
public static final int SCREEN_WIDTH = 640;
public static final int SCREEN_HEIGHT = 480;
public static final String TITLE = "Voxel Engine V0.01";
private float playerX, playerY, playerZ;
/**
* Method that is run at the start
*/
public void start(){
try{
createWindow(SCREEN_WIDTH, SCREEN_HEIGHT, TITLE);
PixelFormat pixelFormat = new PixelFormat();
ContextAttribs contextAttribs = new ContextAttribs(3, 0);
Display.create(pixelFormat, contextAttribs);
glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight());
if(GLContext.getCapabilities().OpenGL21){
System.out.println("OpenGL21 Supported");
}
Random random = new Random();
for(int x = 0;x < 16;x++){
for (int z = 0;z < 16;z++){
ChunkManager.getInstance().addChunk(ChunkManager.ChunkType.CHUNK_TYPE_RANDOM, x, 0, z);
}
}
initGL();
run();
}catch(Exception e){
e.printStackTrace();
}
}
/**
* Creates our window based on values given
*
* @param width, Width of our screen
* @param height, Height of our screen
* @param title, The title of the game
*/
public void createWindow(int width, int height, String title){
try {
Display.setFullscreen(false);
Display.setDisplayMode(new DisplayMode(width, height));
Display.setTitle(title);
Display.setVSyncEnabled(true);
} catch (LWJGLException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
/**
* Init all the graphics components
*/
public void initGL(){
GL11.glMatrixMode(GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(45.0f, (float) Display.getDisplayMode().getWidth() / (float) Display.getDisplayMode().getHeight(), 0.1f, 300.0f);
GL11.glEnable(GL11.GL_FOG);
GL11.glTranslatef(0, -1f, 0f);
GL11.glRotatef(180.0f, 0, 1.0f, 0);
GL11.glMatrixMode(GL_MODELVIEW);
GL11.glLoadIdentity();
GL11.glShadeModel(GL_LINE_SMOOTH);
GL11.glClearColor(0.1f, 0.5f, 0.7f, 0.0f);
GL11.glClearDepth(1.0);
GL11.glEnable(GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
GL11.glCullFace(GL11.GL_BACK);
GL11.glEnable(GL11.GL_CULL_FACE);
}
public void run(){
float rotateYaw = 1;
while(!Display.isCloseRequested()){
try{
inputManager();
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL11.glLoadIdentity();
GL11.glTranslatef(-30f + playerX, -40f + playerY, -160f + playerZ);
GL11.glRotatef(45f, 0.4f, 1.0f, 0.1f);
GL11.glRotatef(45f, 0f, 1.0f, 0f);
rotateYaw += 1;
render();
Display.update();
Display.sync(60);
}catch(Exception e){
e.printStackTrace();
}
}
Display.destroy();
}
public void inputManager() {
if(Keyboard.isKeyDown(Keyboard.KEY_W)){
playerY--;
}
if(Keyboard.isKeyDown(Keyboard.KEY_S)){
playerY++;
}
if(Keyboard.isKeyDown(Keyboard.KEY_A)){
playerX++;
}
if(Keyboard.isKeyDown(Keyboard.KEY_D)){
playerX--;
}
if(Keyboard.isKeyDown(Keyboard.KEY_E)){
playerZ--;
}
if(Keyboard.isKeyDown(Keyboard.KEY_Q)){
playerZ++;
}
}
public void render(){
ChunkManager.getInstance().render();
}
public static void main(String[] args){
Core core = new Core();
core.start();
}
}