package com.starhack;
import org.lwjgl.LWJGLException;
import org.lwjgl.LWJGLUtil;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL14;
import org.lwjgl.opengl.GLContext;
import static org.lwjgl.opengl.EXTFramebufferObject.GL_COLOR_ATTACHMENT0_EXT;
import static org.lwjgl.opengl.EXTFramebufferObject.GL_DEPTH_ATTACHMENT_EXT;
import static org.lwjgl.opengl.EXTFramebufferObject.GL_FRAMEBUFFER_EXT;
import static org.lwjgl.opengl.EXTFramebufferObject.GL_RENDERBUFFER_EXT;
import static org.lwjgl.opengl.EXTFramebufferObject.glBindFramebufferEXT;
import static org.lwjgl.opengl.EXTFramebufferObject.glBindRenderbufferEXT;
import static org.lwjgl.opengl.EXTFramebufferObject.glFramebufferRenderbufferEXT;
import static org.lwjgl.opengl.EXTFramebufferObject.glFramebufferTexture2DEXT;
import static org.lwjgl.opengl.EXTFramebufferObject.glGenFramebuffersEXT;
import static org.lwjgl.opengl.EXTFramebufferObject.glGenRenderbuffersEXT;
import static org.lwjgl.opengl.EXTFramebufferObject.glRenderbufferStorageEXT;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
import java.io.File;
public class Main {
private static boolean gameRunning = true;
private static int fps;
private static int colorTextureID;
private static int framebufferID;
private static int depthRenderBufferID;
static {
System.setProperty("org.lwjgl.librarypath",
new File(new File(System.getProperty("user.dir"), "native"),
LWJGLUtil.getPlatformName()).getAbsolutePath());
}
public static void main(String[] args) {
try {
Display.setDisplayMode(new DisplayMode(640, 400));
Display.setTitle("Starhack");
Display.setVSyncEnabled(true);
Display.create();
} catch (LWJGLException ex) {
Display.destroy();
System.exit(1);
}
if (!GLContext.getCapabilities().OpenGL11) {
System.err
.println("Your OpenGL version doesn't support the required functionality.");
Display.destroy();
System.exit(1);
}
// check if GL_EXT_framebuffer_object can be use on this system
if (!GLContext.getCapabilities().GL_EXT_framebuffer_object) {
System.out.println("Your OpenGL version doesn't support the required functionality.");
System.exit(0);
} else {
framebufferID = glGenFramebuffersEXT();
colorTextureID = glGenTextures();
depthRenderBufferID = glGenRenderbuffersEXT();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID);
glBindTexture(GL_TEXTURE_2D, colorTextureID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, Display.getWidth() / 2, Display.getHeight() / 2, 0, GL_RGBA,
GL_INT, (java.nio.ByteBuffer) null);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTextureID, 0);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthRenderBufferID);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT,
GL14.GL_DEPTH_COMPONENT24, Display.getWidth() / 2, Display.getHeight() / 2);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT,
depthRenderBufferID);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
long lastLoopTime = System.nanoTime();
final int TARGET_FPS = 60;
final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;
while (gameRunning) {
long now = System.nanoTime();
long updateLength = now - lastLoopTime;
lastLoopTime = now;
double delta = updateLength / ((double) OPTIMAL_TIME);
long lastFpsTime = updateLength;
fps++;
if (lastFpsTime >= 1000000000) {
System.out.println("(FPS: " + fps + ")");
lastFpsTime = 0;
fps = 0;
}
render();
Display.update();
try {
Thread.sleep((lastLoopTime - System.nanoTime() + OPTIMAL_TIME) / 1000000);
} catch (Exception e) {
}
if (Display.isCloseRequested()) {
gameRunning = false;
}
}
Display.destroy();
System.exit(0);
}
public static void render() {
render3D();
render2D();
glFlush();
}
public static void ready3D() {
glViewport(0, 0, Display.getWidth(), Display.getHeight());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, (float) Display.getWidth() / Display.getHeight(),
0.1f, 5000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
}
public static void ready2D() {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, Display.getWidth(), Display.getHeight(), 0.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.375f, 0.375f, 0.0f);
glDisable(GL_DEPTH_TEST);
}
public static void render3D() {
ready3D();
glViewport (0, 0, Display.getWidth() / 2, Display.getHeight() / 2);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID);
glClearColor (0.0f, 0.0f, 0.0f, 1.0f);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);
glTranslatef(0f, 0f, -5f);
glRotatef(30f, 1f, 1f, 1f);
Cube.wireCube(1);
}
public static void render2D() {
ready2D();
glViewport (0, 0, Display.getWidth(), Display.getHeight());
glEnable(GL_TEXTURE_2D);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glClearColor (0.0f, 1.0f, 1.0f, 1.0f);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, colorTextureID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0, Display.getHeight());
glTexCoord2f(1.0f, 0.0f); glVertex2f(Display.getWidth(), Display.getHeight());
glTexCoord2f(1.0f, 1.0f); glVertex2f(Display.getWidth(), 0);
glTexCoord2f(0.0f, 1.0f); glVertex2f(0, 0);
glEnd();
glDisable(GL_TEXTURE_2D);
}
}