mouse pos implemented, with scaling for stretchmodes
This commit is contained in:
parent
bc706369d0
commit
4a54b21136
|
@ -37,5 +37,9 @@ public interface IWindow {
|
|||
|
||||
void setStretchMode(WindowStretchMode mode);
|
||||
|
||||
Vec2i getMousePos();
|
||||
|
||||
boolean isMouseClicked(int button);
|
||||
|
||||
void tick();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue