From dcd822d165b1004124ddb0c6604dc9e8f349ee25 Mon Sep 17 00:00:00 2001 From: Ross W Date: Thu, 14 Aug 2025 22:58:13 +0100 Subject: [PATCH] Separate GLFW Window init/loop logic into Window class --- src/main/java/org/hirw/game/App.java | 69 +----------------- src/main/java/org/hirw/game/Window.java | 95 +++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 68 deletions(-) create mode 100644 src/main/java/org/hirw/game/Window.java diff --git a/src/main/java/org/hirw/game/App.java b/src/main/java/org/hirw/game/App.java index f9a8b44..6ef964c 100644 --- a/src/main/java/org/hirw/game/App.java +++ b/src/main/java/org/hirw/game/App.java @@ -1,74 +1,7 @@ package org.hirw.game; -import static org.lwjgl.glfw.Callbacks.*; -import static org.lwjgl.glfw.GLFW.*; -import static org.lwjgl.opengl.GL11.*; -import static org.lwjgl.system.MemoryStack.*; -import static org.lwjgl.system.MemoryUtil.*; - -import java.nio.*; -import org.lwjgl.*; -import org.lwjgl.glfw.*; -import org.lwjgl.opengl.*; -import org.lwjgl.system.*; - public class App { - private long window; - - public void run() { - System.out.println("Hello LWJGL " + Version.getVersion() + "!"); - init(); - loop(); - glfwFreeCallbacks(window); - glfwDestroyWindow(window); - glfwTerminate(); - glfwSetErrorCallback(null).free(); - } - - private void init() { - GLFWErrorCallback.createPrint(System.err).set(); - if (!glfwInit()) throw new IllegalStateException("Unable to initialize GLFW"); - - glfwDefaultWindowHints(); - glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); - glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); - - window = glfwCreateWindow(300, 300, "Hello World!", NULL, NULL); - if (window == NULL) throw new RuntimeException("Failed to create the GLFW window"); - - glfwSetKeyCallback( - window, - (window, key, scancode, action, mods) -> { - if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) - glfwSetWindowShouldClose(window, true); - }); - - try (MemoryStack stack = stackPush()) { - IntBuffer pWidth = stack.mallocInt(1); - IntBuffer pHeight = stack.mallocInt(1); - glfwGetWindowSize(window, pWidth, pHeight); - GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); - glfwSetWindowPos( - window, (vidmode.width() - pWidth.get(0)) / 2, (vidmode.height() - pHeight.get(0)) / 2); - } - - glfwMakeContextCurrent(window); - glfwSwapInterval(1); - glfwShowWindow(window); - } - - private void loop() { - GL.createCapabilities(); - glClearColor(1.0f, 0.0f, 0.0f, 0.0f); - - while (!glfwWindowShouldClose(window)) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glfwSwapBuffers(window); - glfwPollEvents(); - } - } - public static void main(String[] args) { - new App().run(); + Window.get().blastOff(); } } diff --git a/src/main/java/org/hirw/game/Window.java b/src/main/java/org/hirw/game/Window.java new file mode 100644 index 0000000..9aa00c8 --- /dev/null +++ b/src/main/java/org/hirw/game/Window.java @@ -0,0 +1,95 @@ +package org.hirw.game; + +import static org.lwjgl.glfw.Callbacks.*; +import static org.lwjgl.glfw.GLFW.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +import java.nio.*; +import org.lwjgl.Version; +import org.lwjgl.glfw.*; +import org.lwjgl.opengl.*; +import org.lwjgl.system.*; + +public class Window { + private final int width, height; + private final String title; + private long glfwWindow; + + private static Window window = null; + + private Window() { + this.width = 1280; + this.height = 720; + this.title = "game"; + } + + public static Window get() { + if (Window.window == null) { + Window.window = new Window(); + } + + return Window.window; + } + + public void blastOff() { + logVersion(); + setup(); + loop(); + cleanUp(); + } + + private void logVersion() { + System.out.println("LWJGL Version: " + Version.getVersion()); + } + + private void setup() { + GLFWErrorCallback.createPrint(System.err).set(); + if (!glfwInit()) throw new IllegalStateException("Unable to initialize GLFW"); + + glfwDefaultWindowHints(); + glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); + glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); + + glfwWindow = glfwCreateWindow(this.width, this.height, "Hello World!", NULL, NULL); + if (glfwWindow == NULL) throw new RuntimeException("Failed to create the GLFW window"); + + // glfwSetKeyCallback( + // glfwWindow, + // (glfwWindow, key, scancode, action, mods) -> { + // if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) + // glfwSetWindowShouldClose(glfwWindow, true); + // }); + // + // try (MemoryStack stack = stackPush()) { + // IntBuffer pWidth = stack.mallocInt(1); + // IntBuffer pHeight = stack.mallocInt(1); + // glfwGetWindowSize(glfwWindow, pWidth, pHeight); + // GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); + // } + + glfwMakeContextCurrent(glfwWindow); + glfwSwapInterval(1); + glfwShowWindow(glfwWindow); + GL.createCapabilities(); + } + + private void loop() { + // GL.createCapabilities(); // Does this maybe go in here? + glClearColor(1.0f, 0.0f, 0.0f, 0.0f); + + while (!glfwWindowShouldClose(glfwWindow)) { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glfwSwapBuffers(glfwWindow); + glfwPollEvents(); + } + } + + private void cleanUp() { + glfwFreeCallbacks(glfwWindow); + glfwDestroyWindow(glfwWindow); + glfwTerminate(); + glfwSetErrorCallback(null).free(); + } +}