From bc706369d0f3f1555df4387f28913b049fd746f4 Mon Sep 17 00:00:00 2001 From: DaniTheSkunk <> Date: Sat, 5 Nov 2022 23:54:24 +0000 Subject: [PATCH] added aspect stretch and dumb stretch mode to window --- com/danitheskunk/skunkworks/BaseWindow.java | 8 +++ com/danitheskunk/skunkworks/IWindow.java | 2 + .../skunkworks/WindowStretchMode.java | 5 ++ .../skunkworks/backends/gl/Window.java | 50 +++++++++++++++---- 4 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 com/danitheskunk/skunkworks/WindowStretchMode.java diff --git a/com/danitheskunk/skunkworks/BaseWindow.java b/com/danitheskunk/skunkworks/BaseWindow.java index 55ec9f6..4a6cf63 100644 --- a/com/danitheskunk/skunkworks/BaseWindow.java +++ b/com/danitheskunk/skunkworks/BaseWindow.java @@ -8,9 +8,11 @@ import com.danitheskunk.skunkworks.gfx.font.IFont; abstract public class BaseWindow implements IWindow { protected final Engine engine; + protected WindowStretchMode stretchMode; public BaseWindow(Engine engine) { this.engine = engine; + this.stretchMode = WindowStretchMode.ASPECT; } @Override @@ -121,4 +123,10 @@ abstract public class BaseWindow implements IWindow { return loadNineSlice(engine.loadImage(path)); } + @Override + public void setStretchMode(WindowStretchMode mode) { + this.stretchMode = mode; + } + + } diff --git a/com/danitheskunk/skunkworks/IWindow.java b/com/danitheskunk/skunkworks/IWindow.java index 5c2a5db..ef301aa 100644 --- a/com/danitheskunk/skunkworks/IWindow.java +++ b/com/danitheskunk/skunkworks/IWindow.java @@ -35,5 +35,7 @@ public interface IWindow { boolean shouldClose(); + void setStretchMode(WindowStretchMode mode); + void tick(); } diff --git a/com/danitheskunk/skunkworks/WindowStretchMode.java b/com/danitheskunk/skunkworks/WindowStretchMode.java new file mode 100644 index 0000000..6ecf270 --- /dev/null +++ b/com/danitheskunk/skunkworks/WindowStretchMode.java @@ -0,0 +1,5 @@ +package com.danitheskunk.skunkworks; + +public enum WindowStretchMode { + STRETCH, ASPECT, INTEGER +} diff --git a/com/danitheskunk/skunkworks/backends/gl/Window.java b/com/danitheskunk/skunkworks/backends/gl/Window.java index e7132f6..a5ae013 100644 --- a/com/danitheskunk/skunkworks/backends/gl/Window.java +++ b/com/danitheskunk/skunkworks/backends/gl/Window.java @@ -8,7 +8,6 @@ import com.danitheskunk.skunkworks.gfx.IRenderContext; import com.danitheskunk.skunkworks.gfx.ITexture; import com.danitheskunk.skunkworks.gfx.Image; import org.lwjgl.glfw.GLFWErrorCallback; -import org.lwjgl.glfw.GLFWWindowCloseCallbackI; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GL11; @@ -225,17 +224,48 @@ public class Window extends BaseWindow { windowSize.getY() ); - int scalex = windowSize.getX() / size.getX(); - int scaley = windowSize.getY() / size.getY(); - int scale = Math.max(1, Math.min(scalex, scaley)); + int tlx1 = 0; + int tly1 = 0; + int tlx2 = 0; + int tly2 = 0; - int xoff = (windowSize.getX() - size.getX() * scale) / 2; - int yoff = (windowSize.getY() - size.getY() * scale) / 2; + switch(this.stretchMode) { + case STRETCH: { + tlx1 = 0; + tly1 = 0; + tlx2 = windowSize.getX(); + tly2 = windowSize.getY(); + break; + } + case ASPECT: { + float scalex = (float) windowSize.getX() / (float) size.getX(); + float scaley = (float) windowSize.getY() / (float) size.getY(); + float scale = Math.min(scalex, scaley); - int tlx1 = xoff; - int tly1 = yoff; - int tlx2 = xoff + size.getX() * scale; - int tly2 = yoff + size.getY() * scale; + int xoff = (int)((windowSize.getX() - size.getX() * scale) / 2); + int yoff = (int)((windowSize.getY() - size.getY() * scale) / 2); + + tlx1 = xoff; + tly1 = yoff; + tlx2 = (int)(xoff + size.getX() * scale); + tly2 = (int)(yoff + size.getY() * scale); + break; + } + case INTEGER: { + int scalex = windowSize.getX() / size.getX(); + int scaley = windowSize.getY() / size.getY(); + int scale = Math.max(1, Math.min(scalex, scaley)); + + int xoff = (windowSize.getX() - size.getX() * scale) / 2; + int yoff = (windowSize.getY() - size.getY() * scale) / 2; + + tlx1 = xoff; + tly1 = yoff; + tlx2 = xoff + size.getX() * scale; + tly2 = yoff + size.getY() * scale; + break; + } + } var texCoordIndex = programScaler.getAttribLocation("texCoord");