ace-of-shades-2/client/src/main/java/nl/andrewl/aos2_client/Aos2Client.java

130 lines
4.6 KiB
Java

package nl.andrewl.aos2_client;
import nl.andrewl.aos_core.FileUtils;
import nl.andrewl.aos_core.model.Chunk;
import org.joml.Matrix3f;
import org.joml.Matrix4f;
import org.joml.Vector3f;
import org.lwjgl.BufferUtils;
import org.lwjgl.Version;
import org.lwjgl.glfw.Callbacks;
import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GLUtil;
import org.lwjgl.system.MemoryUtil;
import java.io.IOException;
import java.util.Random;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL46.*;
public class Aos2Client {
public static void main(String[] args) throws IOException, InterruptedException {
System.out.println("LWJGL Version: " + Version.getVersion());
GLFWErrorCallback.createPrint(System.err).set();
if (!glfwInit()) throw new IllegalStateException("Could not initialize GLFW");
glfwDefaultWindowHints();
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
long windowHandle = glfwCreateWindow(800, 600, "Ace of Shades 2", MemoryUtil.NULL, MemoryUtil.NULL);
if (windowHandle == MemoryUtil.NULL) throw new RuntimeException("Failed to create GLFW window.");
glfwSetKeyCallback(windowHandle, (window, key, scancode, action, mods) -> {
if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) {
glfwSetWindowShouldClose(windowHandle, true);
}
});
glfwSetInputMode(windowHandle, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
glfwSetInputMode(windowHandle, GLFW_RAW_MOUSE_MOTION, GLFW_TRUE);
glfwSetWindowPos(windowHandle, 50, 50);
glfwSetCursorPos(windowHandle, 0, 0);
glfwMakeContextCurrent(windowHandle);
glfwSwapInterval(1);
glfwShowWindow(windowHandle);
GL.createCapabilities();
GLUtil.setupDebugMessageCallback(System.out);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glCullFace(GL_BACK);
Chunk chunk = Chunk.random(new Random(1));
Camera cam = new Camera();
glfwSetCursorPosCallback(windowHandle, cam);
for (int i = 0; i < 16; i++) {
chunk.setBlockAt(i, 0, 0, (byte) 8);
chunk.setBlockAt(0, i, 0, (byte) 40);
chunk.setBlockAt(0, 0, i, (byte) 120);
}
chunk.setBlockAt(0, 15, 0, (byte) 0);
chunk.setBlockAt(1, 15, 0, (byte) 0);
chunk.setBlockAt(2, 15, 0, (byte) 0);
chunk.setBlockAt(2, 15, 1, (byte) 0);
chunk.setBlockAt(0, 0, 0, (byte) 0);
Matrix4f projectionTransform = new Matrix4f().perspective(70, 800 / 600.0f, 0.01f, 100.0f);
ChunkMesh mesh = new ChunkMesh(chunk);
int shaderProgram = createShaderProgram();
int projectionTransformUniform = glGetUniformLocation(shaderProgram, "projectionTransform");
int viewTransformUniform = glGetUniformLocation(shaderProgram, "viewTransform");
int normalTransformUniform = glGetUniformLocation(shaderProgram, "normalTransform");
glUniformMatrix4fv(projectionTransformUniform, false, projectionTransform.get(new float[16]));
long t = 0;
while (!glfwWindowShouldClose(windowHandle)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUniformMatrix4fv(viewTransformUniform, false, cam.getViewTransformData());
Matrix3f normalTransform = new Matrix3f();
glUniformMatrix3fv(normalTransformUniform, false, normalTransform.get(new float[9]));
mesh.draw();
glfwSwapBuffers(windowHandle);
glfwPollEvents();
// float n = (float) (8 * Math.sin(Math.toRadians(t)) + 8);
// cam.setPosition(n, -1, n);
// cam.setOrientationDegrees(0, 0);
// Thread.sleep(20);
// t++;
// if (t >= 360) t = 0;
if (glfwGetKey(windowHandle, GLFW_KEY_W) == GLFW_PRESS) cam.move(Camera.FORWARD);
if (glfwGetKey(windowHandle, GLFW_KEY_S) == GLFW_PRESS) cam.move(Camera.BACKWARD);
if (glfwGetKey(windowHandle, GLFW_KEY_A) == GLFW_PRESS) cam.move(Camera.LEFT);
if (glfwGetKey(windowHandle, GLFW_KEY_D) == GLFW_PRESS) cam.move(Camera.RIGHT);
if (glfwGetKey(windowHandle, GLFW_KEY_SPACE) == GLFW_PRESS) cam.move(Camera.UP);
if (glfwGetKey(windowHandle, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) cam.move(Camera.DOWN);
}
Callbacks.glfwFreeCallbacks(windowHandle);
glfwDestroyWindow(windowHandle);
glfwTerminate();
glfwSetErrorCallback(null).free();
}
private static int createShaderProgram() throws IOException {
int prog = glCreateProgram();
int fragShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragShader, FileUtils.readClasspathFile("shader/fragment.glsl"));
glCompileShader(fragShader);
glAttachShader(prog, fragShader);
int vertShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertShader, FileUtils.readClasspathFile("shader/vertex.glsl"));
glCompileShader(vertShader);
glAttachShader(prog, vertShader);
glValidateProgram(prog);
glLinkProgram(prog);
glUseProgram(prog);
return prog;
}
}