package de.gamezock.metacraft.ui; import java.awt.Frame; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.media.opengl.GL; import javax.media.opengl.GL2; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLEventListener; import javax.media.opengl.GLProfile; import javax.media.opengl.awt.GLCanvas; import javax.media.opengl.glu.GLU; import de.gamezock.metacraft.data.Map; import de.gamezock.metacraft.data.TestMap; public class Main implements GLEventListener { private Renderer renderer = new Renderer(this); private Frame frame = new Frame("metacraft"); private GLCanvas canvas; private GLU glu = new GLU(); private Map currentMap = new TestMap(); public Main() { GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL2)); caps.setHardwareAccelerated(true); caps.setDoubleBuffered(true); canvas = new GLCanvas(caps); canvas.addGLEventListener(this); canvas.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_ESCAPE) { quit(); } } }); frame.add(canvas); frame.setSize(800, 600); frame.setResizable(false); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { quit(); } }); frame.setVisible(true); canvas.requestFocusInWindow(); } Map getCurrentMap() { return currentMap; } @Override public void display(GLAutoDrawable drawable) { renderer.render(drawable.getGL().getGL2()); } @Override public void dispose(GLAutoDrawable drawable) { } @Override public void init(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); gl.glShadeModel(GL2.GL_SMOOTH); gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); gl.glClearDepth(1.0f); gl.glEnable(GL.GL_DEPTH_TEST); gl.glDepthFunc(GL.GL_LEQUAL); gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); gl.glEnable(GL2.GL_LIGHTING); gl.glColorMaterial(GL.GL_FRONT, GL2.GL_AMBIENT_AND_DIFFUSE); gl.glMatrixMode(GL2.GL_MODELVIEW); glu.gluLookAt(0, -25, -10, 0, 0, 0, 0, 1, 0); gl.glEnable(GL2.GL_LIGHT0); gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, new float[] {0, 0, 0, 1}, 0); gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, new float[] {0.5f, 0.5f, 0.5f, 1}, 0); gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, new float[] {0, 0, 0, 0}, 0); gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, new float[] {10, 10, 10, 1}, 0); gl.glLightf(GL2.GL_LIGHT0, GL2.GL_QUADRATIC_ATTENUATION, 0.01f); gl.glMaterialfv(GL.GL_FRONT, GL2.GL_SPECULAR, new float[] {0, 0, 0, 0}, 0); ShaderLoader.load(gl, "default.vert", "default.frag"); new Thread(new Runnable() { @Override public void run() { long time = System.currentTimeMillis(); int frames = 0; while(true) { canvas.display(); ++frames; if(System.currentTimeMillis() - time >= 1000) { System.err.println(frames + " fps"); frames = 0; time += 1000; } try { Thread.sleep(5); } catch (InterruptedException e) { } } } }).start(); } @Override public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { GL2 gl = drawable.getGL().getGL2(); if(height <= 0) { height = 1; } float aspect = (float)width / (float)height; gl.glMatrixMode(GL2.GL_PROJECTION); gl.glLoadIdentity(); glu.gluPerspective(50.0f, aspect, 0.1, 1000.0); gl.glMatrixMode(GL2.GL_MODELVIEW); } public void quit() { frame.dispose(); System.exit(0); } /** * @param args */ public static void main(String[] args) { new Main(); } }