From 34c388b1a3037dd879890e0c2c583053b3a69172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sat, 3 Apr 2021 18:55:54 +0200 Subject: [PATCH] Enable changing Screen resizable parameter and add support for fullscreen mode --- .../base/api/screen/Screen.java | 19 +++++ .../base/engine/ui/model/GLFWScreen.java | 74 ++++++++++++++++++- 2 files changed, 89 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/screen/Screen.java b/api/src/main/java/com/bartlomiejpluta/base/api/screen/Screen.java index f96b257d..604fde36 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/screen/Screen.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/screen/Screen.java @@ -1,6 +1,7 @@ package com.bartlomiejpluta.base.api.screen; import org.joml.Vector2fc; +import org.joml.Vector2ic; public interface Screen { int getWidth(); @@ -11,8 +12,26 @@ public interface Screen { boolean isResized(); + Vector2ic getCurrentResolution(); + void setResized(boolean resized); + void setFullscreenMode(); + + void setFullscreenMode(int width, int height); + + void setWindowMode(int xPos, int yPos, int width, int height); + + void setPosition(int x, int y); + + void setSize(int width, int height); + + void setResizable(boolean resizable); + + void show(); + + void hide(); + boolean shouldClose(); void update(); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/model/GLFWScreen.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/model/GLFWScreen.java index c3cad10a..731c1d60 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/model/GLFWScreen.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/model/GLFWScreen.java @@ -7,6 +7,8 @@ import lombok.NonNull; import lombok.Setter; import org.joml.Vector2f; import org.joml.Vector2fc; +import org.joml.Vector2i; +import org.joml.Vector2ic; import org.lwjgl.glfw.GLFWErrorCallback; import org.lwjgl.glfw.GLFWVidMode; import org.lwjgl.opengl.GL; @@ -16,6 +18,7 @@ import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.system.MemoryUtil.NULL; public class GLFWScreen implements Screen { + private static final int REFRESH_RATE = 60; private final String title; private long windowHandle = -1; @@ -59,7 +62,7 @@ public class GLFWScreen implements Screen { glfwDefaultWindowHints(); // optional, the current window hints are already the default glfwWindowHint(GLFW_VISIBLE, GL_FALSE); // the window will stay hidden after creation - glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); // the window will be resizable + glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); @@ -95,9 +98,6 @@ public class GLFWScreen implements Screen { // Enable V-Sync // glfwSwapInterval(1); - // Make the window visible - glfwShowWindow(windowHandle); - GL.createCapabilities(); // Support for transparencies @@ -108,6 +108,72 @@ public class GLFWScreen implements Screen { clear(0.0f, 0.0f, 0.0f, 0.0f); } + @Override + public Vector2ic getCurrentResolution() { + var monitor = glfwGetPrimaryMonitor(); + var video = glfwGetVideoMode(monitor); + + if (video == null) { + throw new AppException("Failed to obtain GLFW video mode"); + } + + return new Vector2i(video.width(), video.height()); + } + + @Override + public void setFullscreenMode() { + var monitor = glfwGetPrimaryMonitor(); + var video = glfwGetVideoMode(monitor); + + if (video == null) { + throw new AppException("Failed to obtain GLFW video mode"); + } + + glfwSetWindowMonitor(windowHandle, monitor, 0, 0, video.width(), video.height(), video.refreshRate()); + } + + @Override + public void setFullscreenMode(int width, int height) { + var monitor = glfwGetPrimaryMonitor(); + var video = glfwGetVideoMode(monitor); + + if (video == null) { + throw new AppException("Failed to obtain GLFW video mode"); + } + + glfwSetWindowMonitor(windowHandle, monitor, 0, 0, width, height, video.refreshRate()); + } + + @Override + public void setWindowMode(int xPos, int yPos, int width, int height) { + glfwSetWindowMonitor(windowHandle, NULL, xPos, yPos, width, height, REFRESH_RATE); + } + + @Override + public void setPosition(int x, int y) { + glfwSetWindowPos(windowHandle, x, y); + } + + @Override + public void setSize(int width, int height) { + glfwSetWindowSize(windowHandle, width, height); + } + + @Override + public void setResizable(boolean resizable) { + glfwSetWindowAttrib(windowHandle, GLFW_RESIZABLE, resizable ? GLFW_TRUE : GLFW_FALSE); + } + + @Override + public void show() { + glfwShowWindow(windowHandle); + } + + @Override + public void hide() { + glfwHideWindow(windowHandle); + } + @Override public long getID() { return windowHandle;