package de.greenOwlProduction.gopGL;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.FloatBuffer;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public class GopDisplay {
public static final int WIDTH = 400;
public static final int HEIGHT = 320;
public static final String VERSION = "0.01.1t";
private boolean running;
private int vertexHandle, colorHandle, vertShader, fragShader, program;
private long last, delta, fps;
private float[] vertexData, colorData;
private FloatBuffer vertexBuffer, colorBuffer;
public GopDisplay() {
running = true;
vertexHandle = -1;
colorHandle = -1;
vertShader = -1;
fragShader = -1;
program = -1;
last = System.nanoTime();
delta = 0;
fps = 0;
vertexBuffer = null;
vertexData = null;
initContext();
initExample();
run();
}
private void initExample() {
vertexData = new float[] {
0.0f, 0.5f, 0.0f, 1.0f,
0.5f, -0.366f, 0.0f, 1.0f,
-0.5f, -0.366f, 0.0f, 1.0f,
};
vertexBuffer = BufferUtils.createFloatBuffer(vertexData.length);
vertexBuffer.put(vertexData);
vertexBuffer.flip();
vertexHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vertexHandle);
glBufferData(GL_ARRAY_BUFFER, vertexBuffer, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
colorData = new float[] {
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
};
colorBuffer = BufferUtils.createFloatBuffer(colorData.length);
colorBuffer.put(colorData);
colorBuffer.flip();
colorHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, colorHandle);
glBufferData(GL_ARRAY_BUFFER, colorBuffer, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vertShader = glCreateShader(GL_VERTEX_SHADER);
fragShader = glCreateShader(GL_FRAGMENT_SHADER);
program = glCreateProgram();
glShaderSource(vertShader, loadShader("res/shader/shader.vert"));
glCompileShader(vertShader);
glShaderSource(fragShader, loadShader("res/shader/shader.frag"));
glCompileShader(fragShader);
if (glGetShader(vertShader, GL_COMPILE_STATUS) == GL_FALSE) {
System.err.println("Compilation Error: vertShader");
final int length = glGetShader(vertShader, GL_INFO_LOG_LENGTH);
System.err.println(glGetShaderInfoLog(vertShader, length));
System.exit(1);
}
if (glGetShader(fragShader, GL_COMPILE_STATUS) == GL_FALSE) {
System.err.println("Compilation Error: fragShader");
final int length = glGetShader(fragShader, GL_INFO_LOG_LENGTH);
System.err.println(glGetShaderInfoLog(fragShader, length));
System.exit(1);
}
glAttachShader(program, vertShader);
glAttachShader(program, fragShader);
glLinkProgram(program);
glDetachShader(program, vertShader);
glDetachShader(program, fragShader);
if (glGetProgram(program, GL_LINK_STATUS) == GL_FALSE) {
System.err.println("Linking Error: program");
final int length = glGetProgram(program, GL_INFO_LOG_LENGTH);
System.err.println(glGetProgramInfoLog(program, length));
System.exit(1);
}
glValidateProgram(program);
}
private void initContext() {
try {
Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
Display.setTitle(VERSION);
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
}
private void computeDelta() {
delta = System.nanoTime() - last;
last = System.nanoTime();
fps = (long) (1e9 / delta);
}
private void run() {
while (running) {
if (Display.isCloseRequested()) running = false;
computeDelta();
draw();
Display.update();
System.out.println(fps + " fps");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
glDeleteShader(vertShader);
glDeleteShader(fragShader);
glDeleteProgram(program);
Display.destroy();
}
private void draw() {
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(program);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vertexHandle);
glVertexPointer(4, GL_FLOAT, 0, 0L);
glBindBuffer(GL_ARRAY_BUFFER, colorHandle);
glColorPointer(4, GL_FLOAT, 0, 0L);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glUseProgram(0);
}
public static void main(String[] args) {
new GopDisplay();
}
public static StringBuilder loadShader(String path) {
StringBuilder result = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new FileReader(path));
String line = null;
while ((line = reader.readLine()) != null) {
result.append(line + '\n');
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}