package mrdev023.opengl; import static org.lwjgl.glfw.GLFW.*; import java.util.*; import java.util.Map.*; import org.lwjgl.glfw.*; import mrdev023.math.*; import mrdev023.opengl.*; import mrdev023.rendering.*; public class Input{ public static GLFWScrollCallback scroll; public static GLFWCursorPosCallback mousePos; private static Vector2f mousePosition = new Vector2f(); private static Vector2f dMouse = new Vector2f(); private static Vector2f previousDMouse = new Vector2f(); public static final int NONE = 0,PRESSED = 1,RELEASED = 2,REPEATED = 3,UP = 4,DOWN = 5, NBRE_KEY = 0x15D,NBRE_BUTTON = 10, MOUSE_OFFSET = NBRE_KEY + 1,MOUSE_WHEEL_OFFSET = MOUSE_OFFSET + 1; private static HashMap state = new HashMap(); private static double ywheel = 0; public static void init(){ glfwSetScrollCallback(Display.getWindow(), scroll = new GLFWScrollCallback() { public void invoke(long window, double xoffset, double yoffset) { scroll(window, xoffset, yoffset); } }); glfwSetCursorPosCallback(Display.getWindow(), mousePos = new GLFWCursorPosCallback() { public void invoke(long window, double xpos, double ypos) { mousepos(window, xpos, ypos); } }); for(int i = 0;i < NBRE_KEY;i++){ state.put(i, NONE); } for(int i = 0;i < NBRE_BUTTON;i++){ state.put(i + MOUSE_OFFSET, NONE); } state.put(MOUSE_WHEEL_OFFSET, NONE); } public static void update(){ for(Entry set : state.entrySet()){ int i = set.getKey(); int st = set.getValue(); if(i > -1 && i < NBRE_KEY){ if(glfwGetKey(Display.getWindow(), i) == 0 && st == NONE)continue; if(glfwGetKey(Display.getWindow(), i) == 1 && st == NONE){ state.replace(i, PRESSED); }else if(glfwGetKey(Display.getWindow(), i) == 1 && st == PRESSED){ state.replace(i, REPEATED); }else if(glfwGetKey(Display.getWindow(), i) == 0 && (st == PRESSED || st == REPEATED)){ state.replace(i, RELEASED); }else if(glfwGetKey(Display.getWindow(), i) == 0 && st == RELEASED){ state.replace(i, NONE); } }else if(i >= MOUSE_OFFSET && i < MOUSE_OFFSET + NBRE_BUTTON){ if(glfwGetMouseButton(Display.getWindow(), i - MOUSE_OFFSET) == 0 && st == NONE)continue; if(glfwGetMouseButton(Display.getWindow(), i - MOUSE_OFFSET) == 1 && st == NONE){ state.replace(i, PRESSED); }else if(glfwGetMouseButton(Display.getWindow(), i - MOUSE_OFFSET) == 1 && st == PRESSED){ state.replace(i, REPEATED); }else if(glfwGetMouseButton(Display.getWindow(), i - MOUSE_OFFSET) == 0 && (st == PRESSED || st == REPEATED)){ state.replace(i, RELEASED); }else if(glfwGetMouseButton(Display.getWindow(), i - MOUSE_OFFSET) == 0 && st == RELEASED){ state.replace(i, NONE); } } } int st = state.get(MOUSE_WHEEL_OFFSET); if(ywheel > 0 && (st == NONE || st == UP)){ state.replace(MOUSE_WHEEL_OFFSET, UP); }else if(ywheel < 0 && (st == NONE || st == DOWN)){ state.replace(MOUSE_WHEEL_OFFSET, DOWN); }else if(ywheel == 0 && (st == DOWN || st == UP)){ state.replace(MOUSE_WHEEL_OFFSET, NONE); } ywheel = 0; if(dMouse.equals(previousDMouse)){ dMouse = new Vector2f(); }else{ previousDMouse = dMouse; } } public static void destroy(){ mousePos.free(); scroll.free(); } public static void scroll(long window, double xoffset, double yoffset) { ywheel = yoffset; } public static void mousepos(long window, double xpos, double ypos) { dMouse.x = (float) (xpos - mousePosition.x); dMouse.y = (float) (ypos - mousePosition.y); mousePosition.x = (float) xpos; mousePosition.y = (float) ypos; } public static boolean isButtonDown(int button){ return state.get(button + MOUSE_OFFSET) == PRESSED; } public static boolean isButtonUp(int button){ return state.get(button + MOUSE_OFFSET) == RELEASED; } public static boolean isButton(int button){ return state.get(button + MOUSE_OFFSET) == PRESSED || state.get(button + MOUSE_OFFSET) == REPEATED; } public static int isButtonState(int button){ return state.get(button + MOUSE_OFFSET); } public static boolean isKeyDown(int key){ return state.get(key) == PRESSED; } public static boolean isKeyUp(int key){ return state.get(key) == RELEASED; } public static boolean isKey(int key){ return state.get(key) == PRESSED || state.get(key) == REPEATED; } public static int isKeyState(int key){ return state.get(key); } public static int isMouseWheelState(){ return state.get(MOUSE_WHEEL_OFFSET); } public static boolean isMouseWheelUp(){ return state.get(MOUSE_WHEEL_OFFSET) == UP; } public static boolean isMouseWheelDown(){ return state.get(MOUSE_WHEEL_OFFSET) == DOWN; } public static GLFWScrollCallback getScroll() { return scroll; } public static void setScroll(GLFWScrollCallback scroll) { Input.scroll = scroll; } public static GLFWCursorPosCallback getMousePos() { return mousePos; } public static void setMousePos(GLFWCursorPosCallback mousePos) { Input.mousePos = mousePos; } public static Vector2f getMousePosition() { return mousePosition; } public static void setMousePosition(Vector2f mousePosition) { Input.mousePosition = mousePosition; } public static Vector2f getDMouse() { return dMouse; } public static void setDMouse(Vector2f dMouse) { Input.dMouse = dMouse; } public static HashMap getState() { return state; } public static void setState(HashMap state) { Input.state = state; } public static double getYwheel() { return ywheel; } public static void setYwheel(double ywheel) { Input.ywheel = ywheel; } public static int getNone() { return NONE; } public static int getPressed() { return PRESSED; } public static int getReleased() { return RELEASED; } public static int getRepeated() { return REPEATED; } public static int getUp() { return UP; } public static int getDown() { return DOWN; } public static int getNbreKey() { return NBRE_KEY; } public static int getNbreButton() { return NBRE_BUTTON; } public static int getMouseOffset() { return MOUSE_OFFSET; } public static int getMouseWheelOffset() { return MOUSE_WHEEL_OFFSET; } }