Finished Keyboard Device, Started Joystick Support
This commit is contained in:
parent
ab9d11f165
commit
0caf508535
|
@ -1,9 +1,10 @@
|
||||||
package speiger.src.coreengine.rendering.input.divices;
|
package speiger.src.coreengine.rendering.input.devices;
|
||||||
|
|
||||||
import java.util.Deque;
|
import java.util.Deque;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.ConcurrentLinkedDeque;
|
import java.util.concurrent.ConcurrentLinkedDeque;
|
||||||
|
|
||||||
|
import speiger.src.collections.longs.collections.LongIterable;
|
||||||
import speiger.src.collections.longs.maps.impl.concurrent.Long2ObjectConcurrentOpenHashMap;
|
import speiger.src.collections.longs.maps.impl.concurrent.Long2ObjectConcurrentOpenHashMap;
|
||||||
import speiger.src.collections.longs.maps.interfaces.Long2ObjectMap;
|
import speiger.src.collections.longs.maps.interfaces.Long2ObjectMap;
|
||||||
import speiger.src.coreengine.rendering.input.window.IWindowListener.Reason;
|
import speiger.src.coreengine.rendering.input.window.IWindowListener.Reason;
|
||||||
|
@ -20,6 +21,10 @@ public abstract class AbstractDevice<T, E> implements InputDevice {
|
||||||
this.bus = bus;
|
this.bus = bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected LongIterable knownWindows() {
|
||||||
|
return queues.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
public void register(Window window) {
|
public void register(Window window) {
|
||||||
registerCallbacks(window);
|
registerCallbacks(window);
|
||||||
long id = window.id();
|
long id = window.id();
|
|
@ -1,4 +1,4 @@
|
||||||
package speiger.src.coreengine.rendering.input.divices;
|
package speiger.src.coreengine.rendering.input.devices;
|
||||||
|
|
||||||
import speiger.src.coreengine.rendering.input.window.Window;
|
import speiger.src.coreengine.rendering.input.window.Window;
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
package speiger.src.coreengine.rendering.input.devices;
|
||||||
|
|
||||||
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
import org.lwjgl.glfw.GLFWGamepadState;
|
||||||
|
|
||||||
|
import speiger.src.coreengine.rendering.input.devices.Joystick.JoyStickData;
|
||||||
|
import speiger.src.coreengine.rendering.input.devices.Joystick.JoyStickTask;
|
||||||
|
import speiger.src.coreengine.rendering.input.window.Window;
|
||||||
|
|
||||||
|
public class Joystick extends AbstractDevice<JoyStickData, JoyStickTask> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void registerCallbacks(Window window) {
|
||||||
|
super.registerCallbacks(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset(long windowId) {
|
||||||
|
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected JoyStickData createData(long windowId) {
|
||||||
|
return new JoyStickData();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected void process(JoyStickTask task) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class JoyStickData {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface JoyStickTask {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
package speiger.src.coreengine.rendering.input.devices;
|
||||||
|
|
||||||
|
import java.util.function.BiPredicate;
|
||||||
|
|
||||||
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
|
import speiger.src.coreengine.rendering.input.devices.Keyboard.KeyData;
|
||||||
|
import speiger.src.coreengine.rendering.input.devices.Keyboard.KeyTask;
|
||||||
|
import speiger.src.coreengine.rendering.input.events.KeyEvent;
|
||||||
|
import speiger.src.coreengine.rendering.input.events.KeyEvent.Key;
|
||||||
|
import speiger.src.coreengine.rendering.input.window.Window;
|
||||||
|
|
||||||
|
public class Keyboard extends AbstractDevice<KeyData, KeyTask> {
|
||||||
|
@Override
|
||||||
|
public void reset(long windowId) { get(windowId).reset(); }
|
||||||
|
@Override
|
||||||
|
protected KeyData createData(long windowId) { return new KeyData(); }
|
||||||
|
@Override
|
||||||
|
protected void process(KeyTask task) { task.process(this); }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void registerCallbacks(Window window) {
|
||||||
|
super.registerCallbacks(window);
|
||||||
|
window.addCallback(this::keyPress, GLFW::glfwSetKeyCallback);
|
||||||
|
window.addCallback(this::charTyped, GLFW::glfwSetCharCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void keyPress(long window, int key, int scancode, int action, int mods) { push(window, new KeyPressed(window, key, scancode, action, mods)); }
|
||||||
|
private void charTyped(long window, int codepoint) { push(window, new CharTyped(window, codepoint)); }
|
||||||
|
|
||||||
|
public static class KeyData {
|
||||||
|
BiPredicate<Integer, Keyboard> filter;
|
||||||
|
boolean[] pressedKeys = new boolean[350];
|
||||||
|
boolean[] nonConsumedKeys = new boolean[350];
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
filter = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface KeyTask {
|
||||||
|
public void process(Keyboard board);
|
||||||
|
}
|
||||||
|
|
||||||
|
public record KeyPressed(long window, int key, int scancode, int action, int mods) implements KeyTask {
|
||||||
|
@Override
|
||||||
|
public void process(Keyboard board) {
|
||||||
|
if(key < 0 || key >= 350) return;
|
||||||
|
KeyData data = board.get(window);
|
||||||
|
if(action >= 1) {
|
||||||
|
data.pressedKeys[key] = true;
|
||||||
|
onKeyPressed(board, data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
data.pressedKeys[key] = false;
|
||||||
|
data.nonConsumedKeys[key] = false;
|
||||||
|
board.pushEvent(new Key(window, key, scancode, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onKeyPressed(Keyboard board, KeyData data) {
|
||||||
|
if(data.filter == null || data.filter.test(key, board)) {
|
||||||
|
if(board.pushEvent(new Key(window, key, scancode, true))) return;
|
||||||
|
data.nonConsumedKeys[key] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public record CharTyped(long window, int codepoint) implements KeyTask {
|
||||||
|
@Override
|
||||||
|
public void process(Keyboard board) {
|
||||||
|
board.pushEvent(new KeyEvent.Char(window, codepoint));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,12 @@
|
||||||
package speiger.src.coreengine.rendering.input.divices;
|
package speiger.src.coreengine.rendering.input.devices;
|
||||||
|
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
import speiger.src.collections.ints.sets.IntOpenHashSet;
|
import speiger.src.collections.ints.sets.IntOpenHashSet;
|
||||||
import speiger.src.collections.ints.sets.IntSet;
|
import speiger.src.collections.ints.sets.IntSet;
|
||||||
import speiger.src.coreengine.math.vector.ints.Vec2i;
|
import speiger.src.coreengine.math.vector.ints.Vec2i;
|
||||||
import speiger.src.coreengine.rendering.input.divices.Mouse.MouseData;
|
import speiger.src.coreengine.rendering.input.devices.Mouse.MouseData;
|
||||||
import speiger.src.coreengine.rendering.input.divices.Mouse.MouseTask;
|
import speiger.src.coreengine.rendering.input.devices.Mouse.MouseTask;
|
||||||
import speiger.src.coreengine.rendering.input.events.MouseEvent;
|
import speiger.src.coreengine.rendering.input.events.MouseEvent;
|
||||||
import speiger.src.coreengine.rendering.input.window.Window;
|
import speiger.src.coreengine.rendering.input.window.Window;
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
package speiger.src.coreengine.rendering.input.divices;
|
|
||||||
|
|
||||||
import java.util.function.BiPredicate;
|
|
||||||
|
|
||||||
import org.lwjgl.glfw.GLFW;
|
|
||||||
|
|
||||||
import speiger.src.coreengine.rendering.input.divices.Keyboard.KeyTask;
|
|
||||||
import speiger.src.coreengine.rendering.input.divices.Keyboard.KeyboardData;
|
|
||||||
import speiger.src.coreengine.rendering.input.window.Window;
|
|
||||||
|
|
||||||
|
|
||||||
public class Keyboard extends AbstractDevice<KeyboardData, KeyTask> {
|
|
||||||
@Override
|
|
||||||
public void reset(long windowId) {}
|
|
||||||
@Override
|
|
||||||
protected KeyboardData createData(long windowId) { return new KeyboardData(); }
|
|
||||||
@Override
|
|
||||||
protected void process(KeyTask task) {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void registerCallbacks(Window window) {
|
|
||||||
super.registerCallbacks(window);
|
|
||||||
window.addCallback(this::keyPress, GLFW::glfwSetKeyCallback);
|
|
||||||
window.addCallback(this::charTyped, GLFW::glfwSetCharCallback);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void keyPress(long window, int key, int scancode, int action, int mods) { push(window, new KeyPressed(window, key, scancode, action, mods)); }
|
|
||||||
|
|
||||||
private void charTyped(long window, int codepoint) { push(window, new CharTyped(window, codepoint)); }
|
|
||||||
|
|
||||||
public static class KeyboardData {
|
|
||||||
BiPredicate<Integer, Keyboard> filter;
|
|
||||||
boolean[] pressedKeys = new boolean[350];
|
|
||||||
boolean[] nonConsumedKeys = new boolean[350];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static interface KeyTask {
|
|
||||||
public void process(Keyboard board);
|
|
||||||
}
|
|
||||||
|
|
||||||
public record KeyPressed(long window, int key, int scancode, int action, int mods) implements KeyTask {
|
|
||||||
@Override
|
|
||||||
public void process(Keyboard board) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
public record CharTyped(long window, int codepoint) implements KeyTask {
|
|
||||||
@Override
|
|
||||||
public void process(Keyboard board) {}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
package speiger.src.coreengine.rendering.input.events;
|
||||||
|
|
||||||
|
import speiger.src.coreengine.utils.eventbus.Event;
|
||||||
|
|
||||||
|
public abstract class KeyEvent extends Event {
|
||||||
|
final long window;
|
||||||
|
|
||||||
|
public KeyEvent(long window) {
|
||||||
|
this.window = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelable() { return true; }
|
||||||
|
public long window() { return window; }
|
||||||
|
|
||||||
|
public static class Key extends KeyEvent {
|
||||||
|
final int key;
|
||||||
|
final int scancode;
|
||||||
|
final boolean press;
|
||||||
|
|
||||||
|
public Key(long window, int key, int scancode, boolean press) {
|
||||||
|
super(window);
|
||||||
|
this.key = key;
|
||||||
|
this.scancode = scancode;
|
||||||
|
this.press = press;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int key() { return key; }
|
||||||
|
public int scancode() { return scancode; }
|
||||||
|
public boolean press() { return press; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Char extends KeyEvent {
|
||||||
|
final int codepoint;
|
||||||
|
|
||||||
|
public Char(long window, int codepoint) {
|
||||||
|
super(window);
|
||||||
|
this.codepoint = codepoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int codepoint() { return codepoint; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,7 +10,7 @@ import org.lwjgl.system.Callback;
|
||||||
import speiger.src.collections.longs.maps.impl.concurrent.Long2ObjectConcurrentOpenHashMap;
|
import speiger.src.collections.longs.maps.impl.concurrent.Long2ObjectConcurrentOpenHashMap;
|
||||||
import speiger.src.collections.longs.maps.interfaces.Long2ObjectMap;
|
import speiger.src.collections.longs.maps.interfaces.Long2ObjectMap;
|
||||||
import speiger.src.collections.objects.lists.ObjectArrayList;
|
import speiger.src.collections.objects.lists.ObjectArrayList;
|
||||||
import speiger.src.coreengine.rendering.input.divices.InputDevice;
|
import speiger.src.coreengine.rendering.input.devices.InputDevice;
|
||||||
|
|
||||||
public class WindowManager {
|
public class WindowManager {
|
||||||
Long2ObjectMap<Monitor> monitors;
|
Long2ObjectMap<Monitor> monitors;
|
||||||
|
|
Loading…
Reference in New Issue