refactored mouse

This commit is contained in:
DaniTheSkunk 2022-12-13 03:09:21 +00:00
parent 5aa96f2b7f
commit 4ee489c1e6
5 changed files with 103 additions and 53 deletions

View File

@ -0,0 +1,9 @@
package com.danitheskunk.skunkworks;
public interface IMouse {
Vec2i getPos();
boolean isClicked(int button);
boolean isDown(int button);
}

View File

@ -13,16 +13,12 @@ public interface IWindow {
BaseGamepad getGamepad(int id); BaseGamepad getGamepad(int id);
Vec2i getMousePos(); IMouse getMouse();
IPipeline<IRenderContext> getPipeline2D(); IPipeline<IRenderContext> getPipeline2D();
IPipeline<IRenderContext3D> getPipeline3D(); IPipeline<IRenderContext3D> getPipeline3D();
boolean isMouseClicked(int button);
boolean isMouseDown(int button);
IFont loadFontTTF(String path, float size); IFont loadFontTTF(String path, float size);
IFont loadFontTileset(String path); IFont loadFontTileset(String path);

View File

@ -63,11 +63,12 @@ public class Test extends BaseGame {
@Override @Override
protected void update(double delta) { protected void update(double delta) {
var mouse = window.getMousePos(); var mouse = window.getMouse();
var mousePos = mouse.getPos();
term.clear(Color.TRANS_BLACK); term.clear(Color.TRANS_BLACK);
var col = window.isMouseDown(0) ? Color.RED : Color.GREEN; var col = mouse.isDown(0) ? Color.RED : Color.GREEN;
term.setBackgroundColor(Vec2i.div(mouse, term.getFullCharSize()), col); term.setBackgroundColor(Vec2i.div(mousePos, term.getFullCharSize()), col);
if(window.isMouseClicked(1)) { if(mouse.isClicked(1)) {
System.out.println("right click"); System.out.println("right click");
} }
} }

View File

@ -0,0 +1,68 @@
package com.danitheskunk.skunkworks.backends.gl;
import com.danitheskunk.skunkworks.IMouse;
import com.danitheskunk.skunkworks.Vec2i;
import java.util.Arrays;
import static org.lwjgl.glfw.GLFW.*;
public class Mouse implements IMouse {
private final boolean[] stateMouseClicked;
private final boolean[] stateMouseDown;
private final long window;
private Filter scaler;
public Mouse(long window, Filter scaler) {
this.window = window;
stateMouseClicked = new boolean[8];
stateMouseDown = new boolean[8];
glfwSetMouseButtonCallback(window, this::mouseButtonCallback);
this.scaler = scaler;
}
public Vec2i getPos() {
double[] x = {0.0};
double[] y = {0.0};
glfwGetCursorPos(window, x, y);
var mousePos = new Vec2i((int) x[0], (int) y[0]);
var scaledMousePos = scaler.translateScreenCoordinate(mousePos);
return Vec2i.max(
Vec2i.ZERO,
Vec2i.min(
Vec2i.sub(scaler.input.getSize(), new Vec2i(1, 1)),
scaledMousePos
)
);
}
private void mouseButtonCallback(
@SuppressWarnings("unused") long window, int button, int action, @SuppressWarnings(
"unused") int mods
) {
switch(action) {
case GLFW_PRESS -> {
stateMouseClicked[button] = true;
stateMouseDown[button] = true;
}
case GLFW_RELEASE -> stateMouseDown[button] = false;
}
}
public void setScaler(Filter scaler) {
this.scaler = scaler;
}
public void tick() {
Arrays.fill(stateMouseClicked, false);
}
public boolean isClicked(int button) {
return stateMouseClicked[button];
}
public boolean isDown(int button) {
return stateMouseDown[button];
}
}

View File

@ -8,7 +8,10 @@ import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL46.*; import static org.lwjgl.opengl.GL46.*;
@ -17,16 +20,15 @@ import static org.lwjgl.system.MemoryUtil.NULL;
public class Window extends BaseWindow { public class Window extends BaseWindow {
private final Framebuffer framebuffer; private final Framebuffer framebuffer;
private final Mouse mouse;
private final Pipeline2D pipeline2D;
private final Pipeline3D pipeline3D;
private final Map<String, Filter> scalers;
private final Vec2i size; private final Vec2i size;
private final boolean[] stateMouseClicked;
private final boolean[] stateMouseDown;
private final TextureAtlas textureAtlas; private final TextureAtlas textureAtlas;
private final long window; private final long window;
private boolean shouldClose; private boolean shouldClose;
private Vec2i windowSize; private Vec2i windowSize;
private final Pipeline2D pipeline2D;
private final Pipeline3D pipeline3D;
private final Map<String, Filter> scalers;
//private final FilterFXAA fxaa; //private final FilterFXAA fxaa;
@ -40,8 +42,6 @@ public class Window extends BaseWindow {
this.size = size; this.size = size;
windowSize = size; windowSize = size;
stateMouseClicked = new boolean[8];
stateMouseDown = new boolean[8];
window = glfwCreateWindow(size.getX(), size.getY(), title, NULL, NULL); window = glfwCreateWindow(size.getX(), size.getY(), title, NULL, NULL);
if(window == NULL) throw new RuntimeException( if(window == NULL) throw new RuntimeException(
@ -61,7 +61,6 @@ public class Window extends BaseWindow {
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glfwSetWindowSizeCallback(window, this::windowSizeCallback); glfwSetWindowSizeCallback(window, this::windowSizeCallback);
glfwSetMouseButtonCallback(window, this::mouseButtonCallback);
framebuffer = new Framebuffer(size); framebuffer = new Framebuffer(size);
textureAtlas = new TextureAtlas(); textureAtlas = new TextureAtlas();
@ -75,6 +74,7 @@ public class Window extends BaseWindow {
scalers.put("aspect", new ScalerAspect(framebuffer)); scalers.put("aspect", new ScalerAspect(framebuffer));
scalers.put("integer", new ScalerInteger(framebuffer)); scalers.put("integer", new ScalerInteger(framebuffer));
scaler = "aspect"; scaler = "aspect";
mouse = new Mouse(window, scalers.get(scaler));
// = new ScalerInteger(framebuffer); // = new ScalerInteger(framebuffer);
@ -97,17 +97,11 @@ public class Window extends BaseWindow {
} }
@Override @Override
public Vec2i getMousePos() { public IMouse getMouse() {
double[] x = {0.0}; return mouse;
double[] y = {0.0};
glfwGetCursorPos(window, x, y);
var mousePos = new Vec2i((int) x[0], (int) y[0]);
var scaledMousePos = scalers.get(scaler).translateScreenCoordinate(mousePos);
return Vec2i.max(Vec2i.ZERO,
Vec2i.min(Vec2i.sub(size, new Vec2i(1, 1)), scaledMousePos)
);
} }
@Override @Override
public IPipeline getPipeline2D() { public IPipeline getPipeline2D() {
return pipeline2D; return pipeline2D;
@ -118,16 +112,6 @@ public class Window extends BaseWindow {
return pipeline3D; return pipeline3D;
} }
@Override
public boolean isMouseClicked(int button) {
return stateMouseClicked[button];
}
@Override
public boolean isMouseDown(int button) {
return stateMouseDown[button];
}
@Override @Override
public ITexture loadTexture(Image image) { public ITexture loadTexture(Image image) {
return textureAtlas.addTexture(image); return textureAtlas.addTexture(image);
@ -164,20 +148,6 @@ public class Window extends BaseWindow {
} }
private void mouseButtonCallback(
@SuppressWarnings("unused") long window, int button, int action, @SuppressWarnings(
"unused") int mods
) {
switch(action) {
case GLFW_PRESS -> {
stateMouseClicked[button] = true;
stateMouseDown[button] = true;
}
case GLFW_RELEASE -> stateMouseDown[button] = false;
}
}
@Override @Override
public void runScaler() { public void runScaler() {
//fxaa.apply(); //fxaa.apply();
@ -191,6 +161,12 @@ public class Window extends BaseWindow {
pipeline2D.setDebug(on); pipeline2D.setDebug(on);
} }
@Override
public void setScaler(String scaler) {
super.setScaler(scaler);
mouse.setScaler(scalers.get(scaler));
}
@Override @Override
public boolean shouldClose() { public boolean shouldClose() {
return shouldClose; return shouldClose;
@ -211,7 +187,7 @@ public class Window extends BaseWindow {
return; return;
} }
Arrays.fill(stateMouseClicked, false); mouse.tick();
glfwPollEvents(); glfwPollEvents();
} }