From 4a54b2113610d1af6fd9d927ba53adbffcfddcc4 Mon Sep 17 00:00:00 2001 From: DaniTheSkunk <> Date: Mon, 7 Nov 2022 22:53:14 +0000 Subject: [PATCH] mouse pos implemented, with scaling for stretchmodes --- com/danitheskunk/skunkworks/IWindow.java | 4 ++ com/danitheskunk/skunkworks/Test.java | 12 +++- com/danitheskunk/skunkworks/Vec2f.java | 7 +++ com/danitheskunk/skunkworks/Vec2i.java | 18 ++++++ .../skunkworks/backends/gl/Window.java | 61 ++++++++++++++++--- 5 files changed, 92 insertions(+), 10 deletions(-) diff --git a/com/danitheskunk/skunkworks/IWindow.java b/com/danitheskunk/skunkworks/IWindow.java index ef301aa..7d28643 100644 --- a/com/danitheskunk/skunkworks/IWindow.java +++ b/com/danitheskunk/skunkworks/IWindow.java @@ -37,5 +37,9 @@ public interface IWindow { void setStretchMode(WindowStretchMode mode); + Vec2i getMousePos(); + + boolean isMouseClicked(int button); + void tick(); } diff --git a/com/danitheskunk/skunkworks/Test.java b/com/danitheskunk/skunkworks/Test.java index 0b68b26..95f0b8f 100644 --- a/com/danitheskunk/skunkworks/Test.java +++ b/com/danitheskunk/skunkworks/Test.java @@ -8,7 +8,7 @@ public class Test extends BaseGame { private Terminal term; public Test() { - super(new Vec2i(1280/2, 720/2), "Skunkworks"); + super(new Vec2i(40*12, 22*12), "Skunkworks"); } public static void main(String[] args) { @@ -19,8 +19,9 @@ public class Test extends BaseGame { protected void init() { var fontThin = window.loadFontTileset("fonts\\thin-6x12.png"); var fontThin2 = window.loadFontTileset("fonts\\thin-12x12.png"); - term = new Terminal(new Vec2i(80/2, 45/2), fontThin2, fontThin); + term = new Terminal(new Vec2i(40, 22), fontThin2, fontThin); + window.setStretchMode(WindowStretchMode.INTEGER); var c1 = Color.GREEN; var c2 = new Color(0, 128, 0); @@ -57,4 +58,11 @@ public class Test extends BaseGame { protected void render(IRenderContext rc) { rc.drawTerminal(term); } + + @Override + protected void update(double delta) { + var mouse = window.getMousePos(); + term.clear(Color.BLACK); + term.setBackgroundColor(Vec2i.div(mouse, term.getFullCharSize()), Color.GREEN); + } } diff --git a/com/danitheskunk/skunkworks/Vec2f.java b/com/danitheskunk/skunkworks/Vec2f.java index 4337ae4..40f525b 100644 --- a/com/danitheskunk/skunkworks/Vec2f.java +++ b/com/danitheskunk/skunkworks/Vec2f.java @@ -34,6 +34,13 @@ public final class Vec2f { ); } + public static Vec2f div(Vec2i a, Vec2i b) { + return new Vec2f( + (double) a.getX() / (double) b.getX(), + (double) a.getY() / (double) b.getY() + ); + } + //getters and setters public double getX() { return x; diff --git a/com/danitheskunk/skunkworks/Vec2i.java b/com/danitheskunk/skunkworks/Vec2i.java index 293a3dc..f055121 100644 --- a/com/danitheskunk/skunkworks/Vec2i.java +++ b/com/danitheskunk/skunkworks/Vec2i.java @@ -65,12 +65,30 @@ public final class Vec2i { return new Vec2f(a.x / (double) b.x, a.y / (double) b.y); } + public static Vec2i min(Vec2i a, Vec2i b) { + return new Vec2i(Math.min(a.x, b.x), Math.min(a.y, b.y)); + } + + public static Vec2i max(Vec2i a, Vec2i b) { + return new Vec2i(Math.max(a.x, b.x), Math.max(a.y, b.y)); + } + public static Vec2i tween(Vec2i a, Vec2i b, double amount) { return new Vec2i(Util.tweenInt(a.x, b.x, amount), Util.tweenInt(a.y, b.y, amount) ); } + public static Vec2i mul(Vec2f a, Vec2i b) { + return new Vec2i((int) (a.getX() * b.getX()), + (int) (a.getY() * b.getY()) + ); + } + + public static Vec2i mul(Vec2i a, double b) { + return new Vec2i((int)(a.x / b), (int)(a.y / b)); + } + public int getX() { return x; diff --git a/com/danitheskunk/skunkworks/backends/gl/Window.java b/com/danitheskunk/skunkworks/backends/gl/Window.java index a5ae013..372ce95 100644 --- a/com/danitheskunk/skunkworks/backends/gl/Window.java +++ b/com/danitheskunk/skunkworks/backends/gl/Window.java @@ -1,9 +1,6 @@ package com.danitheskunk.skunkworks.backends.gl; -import com.danitheskunk.skunkworks.BaseWindow; -import com.danitheskunk.skunkworks.Engine; -import com.danitheskunk.skunkworks.Recti; -import com.danitheskunk.skunkworks.Vec2i; +import com.danitheskunk.skunkworks.*; import com.danitheskunk.skunkworks.gfx.IRenderContext; import com.danitheskunk.skunkworks.gfx.ITexture; import com.danitheskunk.skunkworks.gfx.Image; @@ -242,13 +239,17 @@ public class Window extends BaseWindow { float scaley = (float) windowSize.getY() / (float) size.getY(); float scale = Math.min(scalex, scaley); - int xoff = (int)((windowSize.getX() - size.getX() * scale) / 2); - int yoff = (int)((windowSize.getY() - size.getY() * scale) / 2); + 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); + tlx2 = (int) (xoff + size.getX() * scale); + tly2 = (int) (yoff + size.getY() * scale); break; } case INTEGER: { @@ -314,6 +315,50 @@ public class Window extends BaseWindow { return shouldClose; } + @Override + public Vec2i getMousePos() { + //todo: scale mouse to stretchMode + double[] x = {0.0}; + double[] y = {0.0}; + glfwGetCursorPos(window, x, y); + var mousePos = new Vec2i((int) x[0], (int) y[0]); + + var scaledMousePos = switch(this.stretchMode) { + case STRETCH -> { + var stretch = Vec2f.div(this.size, this.windowSize); + yield Vec2i.mul(stretch, mousePos); + } + case ASPECT -> { + var scale = Vec2f.div(this.size, this.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(this.windowSize, this.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); + } + }; + return Vec2i.max(Vec2i.ZERO, + Vec2i.min(Vec2i.sub(size, new Vec2i(1, 1)), scaledMousePos) + ); + } + + @Override + public boolean isMouseClicked(int button) { + return false; + } + @Override public void tick() { glfwMakeContextCurrent(window);