diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/DummyRender.java b/src/main/java/de/bixilon/minosoft/gui/rendering/DummyRender.java new file mode 100644 index 000000000..553ec9da6 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/DummyRender.java @@ -0,0 +1,16 @@ +package de.bixilon.minosoft.gui.rendering; + +import org.lwjgl.Version; + +public class DummyRender { + public static void main(String[] args) { + + System.out.println("Hello LWJGL " + Version.getVersion() + "!"); + + RenderWindow renderWindow = new RenderWindow(); + renderWindow.init(); + renderWindow.startLoop(); + renderWindow.exit(); + + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.java b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.java new file mode 100644 index 000000000..e3751de4e --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.java @@ -0,0 +1,128 @@ +package de.bixilon.minosoft.gui.rendering; + +import org.lwjgl.glfw.GLFWErrorCallback; +import org.lwjgl.glfw.GLFWVidMode; +import org.lwjgl.glfw.GLFWWindowSizeCallback; +import org.lwjgl.opengl.GL; +import org.lwjgl.system.MemoryStack; + +import java.nio.IntBuffer; + +import static org.lwjgl.glfw.Callbacks.glfwFreeCallbacks; +import static org.lwjgl.glfw.GLFW.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.system.MemoryStack.stackPush; +import static org.lwjgl.system.MemoryUtil.NULL; + + +public class RenderWindow { + private long window; + + public void init() { + // Setup an error callback. The default implementation + // will print the error message in System.err. + GLFWErrorCallback.createPrint(System.err).set(); + + // Initialize GLFW. Most GLFW functions will not work before doing this. + if (!glfwInit()) { + throw new IllegalStateException("Unable to initialize GLFW"); + } + + // Configure GLFW + glfwDefaultWindowHints(); // optional, the current window hints are already the default + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // the window will stay hidden after creation + glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // the window will be resizable + + // Create the window + this.window = glfwCreateWindow(800, 600, "Hello World!", NULL, NULL); + if (this.window == NULL) { + glfwTerminate(); + throw new RuntimeException("Failed to create the GLFW window"); + } + + + glfwSetWindowSizeCallback(this.window, new GLFWWindowSizeCallback() { + @Override + public void invoke(long window, int width, int height) { + glViewport(0, 0, width, height); + } + }); + + + // Setup a key callback. It will be called every time a key is pressed, repeated or released. + glfwSetKeyCallback(this.window, (window, key, scancode, action, mods) -> { + if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) { + glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop + } + }); + + + // Get the thread stack and push a new frame + try (MemoryStack stack = stackPush()) { + IntBuffer pWidth = stack.mallocInt(1); // int* + IntBuffer pHeight = stack.mallocInt(1); // int* + + // Get the window size passed to glfwCreateWindow + glfwGetWindowSize(this.window, pWidth, pHeight); + + // Get the resolution of the primary monitor + GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); + + // Center the window + glfwSetWindowPos( + this.window, + (vidmode.width() - pWidth.get(0)) / 2, + (vidmode.height() - pHeight.get(0)) / 2 + ); + } // the stack frame is popped automatically + + // Make the OpenGL context current + glfwMakeContextCurrent(this.window); + // Enable v-sync + glfwSwapInterval(1); + + + // Make the window visible + glfwShowWindow(this.window); + + GL.createCapabilities(); + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); + } + + + public void startLoop() { + // This line is critical for LWJGL's interoperation with GLFW's + // OpenGL context, or any context that is managed externally. + // LWJGL detects the context that is current in the current thread, + // creates the GLCapabilities instance and makes the OpenGL + // bindings available for use. + // Run the rendering loop until the user has attempted to close + // the window or has pressed the ESCAPE key. + while (!glfwWindowShouldClose(this.window)) { + loop(); + } + } + + private void loop() { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer + + glfwSwapBuffers(this.window); // swap the color buffers + + // Poll for window events. The key callback above will only be + // invoked during this call. + glfwPollEvents(); + } + + public void exit() { + // Free the window callbacks and destroy the window + glfwFreeCallbacks(this.window); + glfwDestroyWindow(this.window); + + // Terminate GLFW and free the error callback + glfwTerminate(); + glfwSetErrorCallback(null).free(); + } +}