From a9b20c51a909e6e5e43ec1357959022aaf2cd19d Mon Sep 17 00:00:00 2001 From: Ticho Hidding Date: Wed, 10 Sep 2025 14:34:48 +0200 Subject: [PATCH] LWJGL installed. Example window added. --- .idea/dictionaries/project.xml | 7 + .idea/inspectionProfiles/Project_Default.xml | 11 ++ img/icon.png | Bin 0 -> 956 bytes pom.xml | 68 ++++++++ src/main/java/org/toop/Main.java | 1 + src/main/java/org/toop/Window.java | 155 +++++++++++++++++++ 6 files changed, 242 insertions(+) create mode 100644 .idea/dictionaries/project.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 img/icon.png create mode 100644 src/main/java/org/toop/Window.java diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml new file mode 100644 index 0000000..2cbbd44 --- /dev/null +++ b/.idea/dictionaries/project.xml @@ -0,0 +1,7 @@ + + + + vidmode + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..4c0d94f --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/img/icon.png b/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d627e6afbc474098c160e627028eacd584f55ea5 GIT binary patch literal 956 zcmV;t14I0YP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L15rstK~#8N<(12g z95D<9HxM74hp!IasW=83JZR8U&95Y?2iO95*^#JMZ+~C^zBym~!gu4XfM37=yrzr4 zKYoVOh35Av;QApCtw6ciS%q%H&n;l41P1SzDs(CpP$_{yJ0}ZW=w<#5;CL|H$?>3r z=5zZmz=PVQ0mEb_1Mg&pFuUb(D?s1{?J@&cvjgt5X28r^{()M6z>C-6!`gJfH?(0^ zPhKz!5V#;y!U_21ti0eBAaIdY!V|2@3t<5Q7qWyWS&sESP84a9W(prLZ7V#2n;$CTHxK;J#?YdTLC;&l^-y0H9YTB?-M$;7a%Zr zR)S}<_dMuyqyT{ekqpm7=d;l1SOEe>EGd3wotuST!|hc7KinZdpb+KwHGaMWx*aV* zpjc*hLbu}u2o&^YH*|ZX0D+>~bU?Sq3J@sVEicgRu>vTpO$T&)qyUO~vm3e{FMxuX z*$Lf_7ClJXS4S_ z=+s^SgI6VZr+S~zsZ>C<1O}cB&%3jG=t8Hr0t6nc6u_Xfp$FVCvyU$HNfp3L8VooS zR)f1Ld+DILY$<@jDj_p)XLdgwG?!Ze0xxJ62Mm-ASB1NycbMIBPzw-vQM=3_QK(h; zhW8$`TMnfHt_v8z3$qixrM=6{%znizK;VKgd{_(73E#X9vwHGExd1+RT7JN{qY^CK z0)$VLA25Sef=5_@@QLyRW?=~tsRFpT`ba0M-<+@jE~I?s$E=GTzn*RZTx7|gE`o2a zlwcOX1sVD7BKU?j%o>%T7Ql24 24 UTF-8 + 3.3.6 + natives-windows + + + + org.lwjgl + lwjgl-bom + ${lwjgl.version} + import + pom + + + junit @@ -26,6 +39,61 @@ guava 33.4.8-jre + + + org.lwjgl + lwjgl + + + org.lwjgl + lwjgl-assimp + + + org.lwjgl + lwjgl-glfw + + + org.lwjgl + lwjgl-openal + + + org.lwjgl + lwjgl-opengl + + + org.lwjgl + lwjgl-stb + + + org.lwjgl + lwjgl + ${lwjgl.natives} + + + org.lwjgl + lwjgl-assimp + ${lwjgl.natives} + + + org.lwjgl + lwjgl-glfw + ${lwjgl.natives} + + + org.lwjgl + lwjgl-openal + ${lwjgl.natives} + + + org.lwjgl + lwjgl-opengl + ${lwjgl.natives} + + + org.lwjgl + lwjgl-stb + ${lwjgl.natives} + \ No newline at end of file diff --git a/src/main/java/org/toop/Main.java b/src/main/java/org/toop/Main.java index 94d32b9..d9cebd0 100644 --- a/src/main/java/org/toop/Main.java +++ b/src/main/java/org/toop/Main.java @@ -16,5 +16,6 @@ public class Main { System.out.println(msg); System.out.println(server); + Window.start(); } } \ No newline at end of file diff --git a/src/main/java/org/toop/Window.java b/src/main/java/org/toop/Window.java new file mode 100644 index 0000000..f56e818 --- /dev/null +++ b/src/main/java/org/toop/Window.java @@ -0,0 +1,155 @@ +package org.toop; + +import org.lwjgl.*; +import org.lwjgl.glfw.*; +import org.lwjgl.opengl.*; +import org.lwjgl.system.*; + +import java.nio.*; + +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 static org.lwjgl.stb.STBImage.*; + +public class Window { + + // The window handle + private long window; + + public void run() { + + init(); + loop(); + + // Free the window callbacks and destroy the window + glfwFreeCallbacks(window); + glfwDestroyWindow(window); + + // Terminate GLFW and free the error callback + glfwTerminate(); + glfwSetErrorCallback(null).free(); + } + + private void init() { + // Set up 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_VISIBLE, GLFW_FALSE); // the window will stay hidden after creation + glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // the window will be resizable + + // Create the window + window = glfwCreateWindow(1920, 1080, "ISY Game Selector", NULL, NULL); + if ( window == NULL ) + throw new RuntimeException("Failed to create the GLFW window"); + + // Set up a key callback. It will be called every time a key is pressed, repeated or released. + glfwSetKeyCallback(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(window, pWidth, pHeight); + + // Get the resolution of the primary monitor + GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); + + // Center the window + assert vidmode != null; + glfwSetWindowPos( + window, + (vidmode.width() - pWidth.get(0)) / 2, + (vidmode.height() - pHeight.get(0)) / 2 + ); + + + + // Prepare buffers to receive image data + IntBuffer width = stack.mallocInt(1); + IntBuffer height = stack.mallocInt(1); + IntBuffer channels = stack.mallocInt(1); + + // Load the image + String imagePath = "img/icon.png"; + ByteBuffer image = stbi_load(imagePath, width, height, channels, 4); // Force RGBA (4 channels) + + if (image == null) { + throw new RuntimeException("Failed to load image: " + stbi_failure_reason()); + } + + // Create GLFWImage + GLFWImage icon = GLFWImage.malloc(stack); + icon.set(width.get(0), height.get(0), image); + + // Create a buffer with the icon(s) — can be multiple icons for different sizes + GLFWImage.Buffer icons = GLFWImage.malloc(1, stack); + icons.put(0, icon); + + // Set the window icon + glfwSetWindowIcon(window, icons); + + // Free the image data + stbi_image_free(image); + + + } // the stack frame is popped automatically + + // Make the OpenGL context current + glfwMakeContextCurrent(window); + // Enable v-sync + glfwSwapInterval(1); + + // Make the window visible + glfwShowWindow(window); + } + + private void loop() { + // 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. + GL.createCapabilities(); + + // Set the clear color + glClearColor(0.5f, 0.5f, 0.5f, 0.0f); + + // Run the rendering loop until the user has attempted to close + // the window or has pressed the ESCAPE key. + while ( !glfwWindowShouldClose(window) ) { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer + + glfwSwapBuffers(window); // swap the color buffers + + // Poll for window events. The key callback above will only be + // invoked during this call. + glfwPollEvents(); + } + } + + //public static void main(String[] args) { + //new Window().run(); + //} + public static void start(){ + new Window().run(); + } + +}