package com.starshock; import java.io.File; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer; import org.lwjgl.LWJGLException; import org.lwjgl.LWJGLUtil; import org.lwjgl.Sys; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL30.*; import static org.lwjgl.util.glu.GLU.*; public class Main { static { System.setProperty("org.lwjgl.librarypath", new File(new File(System.getProperty("user.dir"), "native"), LWJGLUtil.getPlatformName()).getAbsolutePath()); } public static final int S_WIDTH = 320, S_HEIGHT = 200, S_SCALE = 2; public long lastFrame, lastFPS; public int fps; public int defaultFBO = 0, drawFBO, drawFBOTexture; public void start() { try { Display.setDisplayMode(new DisplayMode(S_WIDTH * S_SCALE, S_HEIGHT * S_SCALE)); Display.setTitle("Starhack - FPS: " + fps); Display.create(); } catch (LWJGLException e) { e.printStackTrace(); System.exit(0); } initFBO(); getDelta(); lastFPS = getTime(); while (!Display.isCloseRequested()) { int delta = getDelta(); update(delta); renderGL(); Display.update(); Display.sync(60); } Display.destroy(); } public void update(int delta) { updateFPS(); } public int getDelta() { long time = getTime(); int delta = (int) (time - lastFrame); lastFrame = time; return delta; } public long getTime() { return (Sys.getTime() * 1000) / Sys.getTimerResolution(); } public void updateFPS() { if (getTime() - lastFPS > 1000) { Display.setTitle("Starhack - FPS: " + fps); fps = 0; lastFPS += 1000; } fps++; } public void initFBO() { IntBuffer buffer = ByteBuffer.allocateDirect(4) .order(ByteOrder.nativeOrder()).asIntBuffer(); glGenFramebuffers(buffer); drawFBO = buffer.get(); buffer = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()) .asIntBuffer(); glGenTextures(buffer); drawFBOTexture = buffer.get(); glBindFramebuffer(GL_FRAMEBUFFER, drawFBO); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, drawFBOTexture, 0); } public void renderGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindFramebuffer(GL_FRAMEBUFFER, drawFBO); ready3D(); render3D(); ready2D(); render2D(); renderScaledFBO(); } public void ready3D() { glViewport(0, 0, S_WIDTH, S_HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45f, (float) S_WIDTH / S_HEIGHT, 0.0f, 5000.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); } public void render3D() { glTranslatef(0, 0, -6f); glBegin(GL_QUADS); glVertex3f(0, 0, 0); glVertex3f(2, 0, 0); glVertex3f(2, 2, 0); glVertex3f(0, 2, 0); glEnd(); } public void ready2D() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0f, S_WIDTH, S_HEIGHT, 0.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.375f, 0.375f, 0.0f); glDisable(GL_DEPTH_TEST); } public void render2D() { } public void renderScaledFBO() { glViewport(0, 0, S_WIDTH * S_SCALE, S_HEIGHT * S_SCALE); glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO); glBlitFramebuffer(0, 0, S_WIDTH, S_HEIGHT, 0, 0, S_WIDTH * S_SCALE, S_HEIGHT * S_SCALE, GL_COLOR_BUFFER_BIT, GL_NEAREST); } public static void main(String[] argv) { Main main = new Main(); main.start(); } }