LWJGL installed. Example window added.

This commit is contained in:
Ticho Hidding
2025-09-10 14:34:48 +02:00
parent 76ddb0d6b8
commit a9b20c51a9
6 changed files with 242 additions and 0 deletions

View File

@@ -16,5 +16,6 @@ public class Main {
System.out.println(msg);
System.out.println(server);
Window.start();
}
}

View File

@@ -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();
}
}