diff --git a/com/danitheskunk/skunkworks/BaseWindow.java b/com/danitheskunk/skunkworks/BaseWindow.java index 072afa9..71855dc 100644 --- a/com/danitheskunk/skunkworks/BaseWindow.java +++ b/com/danitheskunk/skunkworks/BaseWindow.java @@ -8,11 +8,15 @@ import com.danitheskunk.skunkworks.gfx.font.IFont; abstract public class BaseWindow implements IWindow { protected final Engine engine; - protected WindowStretchMode stretchMode; + protected String scaler; + + public void setScaler(String scaler) { + this.scaler = scaler; + } public BaseWindow(Engine engine) { this.engine = engine; - stretchMode = WindowStretchMode.ASPECT; + scaler = "aspect"; } @Override @@ -116,11 +120,4 @@ abstract public class BaseWindow implements IWindow { public NineSlice loadNineSlice(String path) { return loadNineSlice(engine.loadImage(path)); } - - @Override - public void setStretchMode(WindowStretchMode mode) { - stretchMode = mode; } - - -} diff --git a/com/danitheskunk/skunkworks/IWindow.java b/com/danitheskunk/skunkworks/IWindow.java index 142193b..aa4cb17 100644 --- a/com/danitheskunk/skunkworks/IWindow.java +++ b/com/danitheskunk/skunkworks/IWindow.java @@ -44,7 +44,7 @@ public interface IWindow { void setDebug(boolean on); - void setStretchMode(WindowStretchMode mode); + void setScaler(String scaler); boolean shouldClose(); diff --git a/com/danitheskunk/skunkworks/Test.java b/com/danitheskunk/skunkworks/Test.java index a49158a..4e4bdc5 100644 --- a/com/danitheskunk/skunkworks/Test.java +++ b/com/danitheskunk/skunkworks/Test.java @@ -19,7 +19,6 @@ public class Test extends BaseGame { var fontThin2 = window.loadFontTileset("fonts\\thin-12x12.png"); term = new Terminal(new Vec2i(40, 22), fontThin2, fontThin); - window.setStretchMode(WindowStretchMode.INTEGER); var c1 = Color.GREEN; var c2 = new Color(0, 128, 0); @@ -58,6 +57,7 @@ public class Test extends BaseGame { @Override protected void render(IRenderContext rc) { + rc.clear(Color.DARK_GRAY); rc.drawTerminal(term); } diff --git a/com/danitheskunk/skunkworks/WindowStretchMode.java b/com/danitheskunk/skunkworks/WindowStretchMode.java deleted file mode 100644 index 6ecf270..0000000 --- a/com/danitheskunk/skunkworks/WindowStretchMode.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.danitheskunk.skunkworks; - -public enum WindowStretchMode { - STRETCH, ASPECT, INTEGER -} diff --git a/com/danitheskunk/skunkworks/backends/gl/Filter.java b/com/danitheskunk/skunkworks/backends/gl/Filter.java index 5087f11..52ce1b5 100644 --- a/com/danitheskunk/skunkworks/backends/gl/Filter.java +++ b/com/danitheskunk/skunkworks/backends/gl/Filter.java @@ -67,4 +67,8 @@ public abstract class Filter { private void calcSizeRatio() { sizeRatio = Vec2f.div(output.getSize(), input.getSize()); } + + public Vec2i translateScreenCoordinate(Vec2i coord) { + return coord; + } } diff --git a/com/danitheskunk/skunkworks/backends/gl/Scaler.java b/com/danitheskunk/skunkworks/backends/gl/Scaler.java index e93c08e..d365210 100644 --- a/com/danitheskunk/skunkworks/backends/gl/Scaler.java +++ b/com/danitheskunk/skunkworks/backends/gl/Scaler.java @@ -1,11 +1,5 @@ package com.danitheskunk.skunkworks.backends.gl; -import com.danitheskunk.skunkworks.WindowStretchMode; - -import static org.lwjgl.opengl.GL11.*; -import static org.lwjgl.opengl.GL20.glVertexAttrib2f; -import static org.lwjgl.opengl.GL41.glProgramUniform2f; - //todo: remove public class Scaler { /* diff --git a/com/danitheskunk/skunkworks/backends/gl/ScalerAspect.java b/com/danitheskunk/skunkworks/backends/gl/ScalerAspect.java index 6374b5d..e154a53 100644 --- a/com/danitheskunk/skunkworks/backends/gl/ScalerAspect.java +++ b/com/danitheskunk/skunkworks/backends/gl/ScalerAspect.java @@ -1,5 +1,8 @@ package com.danitheskunk.skunkworks.backends.gl; +import com.danitheskunk.skunkworks.Vec2f; +import com.danitheskunk.skunkworks.Vec2i; + import static org.lwjgl.opengl.GL46.glUniform1f; import static org.lwjgl.opengl.GL46.glUniform2f; @@ -59,4 +62,16 @@ public class ScalerAspect extends Filter { (float)sizeRatio.getY() ); } + + @Override + public Vec2i translateScreenCoordinate(Vec2i coord) { + var scale = Vec2f.div(input.getSize(), output.getSize()); + var scalef = Math.max(scale.getX(), scale.getY()); + + var off = Vec2f.div(Vec2i.sub(output.getSize(), + Vec2f.mul(input.getSize().toVec2f(), 1.0 / scalef).toVec2i() + ).toVec2f(), 2).toVec2i(); + + return Vec2i.mul(Vec2i.sub(coord, off), 1.0 / scalef); + } } diff --git a/com/danitheskunk/skunkworks/backends/gl/ScalerInteger.java b/com/danitheskunk/skunkworks/backends/gl/ScalerInteger.java index b67a0ae..d2c25fd 100644 --- a/com/danitheskunk/skunkworks/backends/gl/ScalerInteger.java +++ b/com/danitheskunk/skunkworks/backends/gl/ScalerInteger.java @@ -1,5 +1,7 @@ package com.danitheskunk.skunkworks.backends.gl; +import com.danitheskunk.skunkworks.Vec2i; + import static org.lwjgl.opengl.GL46.glUniform1f; import static org.lwjgl.opengl.GL46.glUniform2f; @@ -61,4 +63,16 @@ public class ScalerInteger extends Filter { (float)sizeRatio.getY() ); } + + @Override + public Vec2i translateScreenCoordinate(Vec2i coord) { + var scale = Vec2i.div(output.getSize(), input.getSize()); + var scalei = Math.max(1, Math.min(scale.getX(), scale.getY())); + + var off = Vec2i.div(Vec2i.sub(output.getSize(), + Vec2i.mul(input.getSize(), scalei) + ), 2); + + return Vec2i.div(Vec2i.sub(coord, off), scalei); + } } diff --git a/com/danitheskunk/skunkworks/backends/gl/Window.java b/com/danitheskunk/skunkworks/backends/gl/Window.java index 4c2411c..76b13dc 100644 --- a/com/danitheskunk/skunkworks/backends/gl/Window.java +++ b/com/danitheskunk/skunkworks/backends/gl/Window.java @@ -8,9 +8,7 @@ import org.lwjgl.glfw.GLFWErrorCallback; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GL11; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.opengl.GL46.*; @@ -28,7 +26,8 @@ public class Window extends BaseWindow { private Vec2i windowSize; private final Pipeline2D pipeline2D; private final Pipeline3D pipeline3D; - private final Filter scaler; + private final Map scalers; + //private final FilterFXAA fxaa; public Window(Vec2i size, String title, Engine engine) { @@ -71,7 +70,13 @@ public class Window extends BaseWindow { pipeline3D = new Pipeline3D(framebuffer, textureAtlas); //fxaa = new FilterFXAA(framebuffer); //scaler = new Scaler(framebuffer); - scaler = new ScalerInteger(framebuffer); + scalers = new HashMap<>(); + scalers.put("stretch", new ScalerStretch(framebuffer)); + scalers.put("aspect", new ScalerAspect(framebuffer)); + scalers.put("integer", new ScalerInteger(framebuffer)); + scaler = "aspect"; + + // = new ScalerInteger(framebuffer); shouldClose = false; @@ -97,33 +102,7 @@ public class Window extends BaseWindow { double[] y = {0.0}; glfwGetCursorPos(window, x, y); var mousePos = new Vec2i((int) x[0], (int) y[0]); - - var scaledMousePos = switch(stretchMode) { - case STRETCH -> { - var stretch = Vec2f.div(size, windowSize); - yield Vec2i.mul(stretch, mousePos); - } - case ASPECT -> { - var scale = Vec2f.div(size, windowSize); - var scalef = Math.max(scale.getX(), scale.getY()); - - var off = Vec2f.div(Vec2i.sub(windowSize, - Vec2f.mul(size.toVec2f(), 1.0 / scalef).toVec2i() - ).toVec2f(), 2).toVec2i(); - - yield Vec2i.mul(Vec2i.sub(mousePos, off), 1.0 / scalef); - } - case INTEGER -> { - var scale = Vec2i.div(windowSize, size); - var scalei = Math.max(1, Math.min(scale.getX(), scale.getY())); - - var off = Vec2i.div(Vec2i.sub(windowSize, - Vec2i.mul(size, scalei) - ), 2); - - yield Vec2i.div(Vec2i.sub(mousePos, off), scalei); - } - }; + var scaledMousePos = scalers.get(scaler).translateScreenCoordinate(mousePos); return Vec2i.max(Vec2i.ZERO, Vec2i.min(Vec2i.sub(size, new Vec2i(1, 1)), scaledMousePos) ); @@ -203,8 +182,8 @@ public class Window extends BaseWindow { public void runScaler() { //fxaa.apply(); //scaler.setStretchMode(stretchMode); - scaler.apply(); - scaler.getOutput().copyToScreen(); + scalers.get(scaler).apply(); + scalers.get(scaler).getOutput().copyToScreen(); } @Override @@ -242,6 +221,10 @@ public class Window extends BaseWindow { System.out.printf("new window size %d x %d\n", width, height); windowSize = new Vec2i(width, height); glViewport(0, 0, width, height); - scaler.setOutputSize(windowSize); + + //todo: do we really wanna do it like this? + for(var entry : scalers.entrySet()) { + entry.getValue().setOutputSize(windowSize); + } } }