diff --git a/src/junk/BaseApp.java b/src/junk/BaseApp.java
index d64c01d..5993226 100644
--- a/src/junk/BaseApp.java
+++ b/src/junk/BaseApp.java
@@ -3,6 +3,7 @@ package junk;
import java.lang.Thread.UncaughtExceptionHandler;
+import mightypork.gamecore.backends.lwjgl.LwjglInputModule;
import mightypork.gamecore.core.App;
import mightypork.gamecore.core.AppBackend;
import mightypork.gamecore.core.MainLoop;
@@ -10,7 +11,6 @@ import mightypork.gamecore.core.WorkDir;
import mightypork.gamecore.core.config.Config;
import mightypork.gamecore.gui.screens.ScreenRegistry;
import mightypork.gamecore.gui.screens.impl.CrossfadeOverlay;
-import mightypork.gamecore.input.InputSystem;
import mightypork.gamecore.resources.Res;
import mightypork.gamecore.resources.ResourceSetup;
import mightypork.utils.logging.Log;
@@ -117,7 +117,7 @@ public abstract class BaseApp extends App implements UncaughtExceptionHandler {
* Input
*/
Log.f2("Initializing Input System...");
- inputSystem = new InputSystem(this);
+ inputSystem = new LwjglInputModule(this);
initInputSystem(inputSystem);
/*
diff --git a/src/mightypork/gamecore/backends/lwjgl/LwjglBackend.java b/src/mightypork/gamecore/backends/lwjgl/LwjglBackend.java
index 00d59d7..d11b58b 100644
--- a/src/mightypork/gamecore/backends/lwjgl/LwjglBackend.java
+++ b/src/mightypork/gamecore/backends/lwjgl/LwjglBackend.java
@@ -6,6 +6,7 @@ import mightypork.gamecore.backends.lwjgl.audio.SlickAudioModule;
import mightypork.gamecore.backends.lwjgl.graphics.LwjglGraphicsModule;
import mightypork.gamecore.core.AppBackend;
import mightypork.gamecore.graphics.GraphicsModule;
+import mightypork.gamecore.input.InputModule;
/**
@@ -17,6 +18,7 @@ public class LwjglBackend extends AppBackend {
private LwjglGraphicsModule graphics;
private SlickAudioModule audio;
+ private LwjglInputModule input;
@Override
@@ -24,6 +26,11 @@ public class LwjglBackend extends AppBackend {
{
addChildClient(graphics = new LwjglGraphicsModule());
addChildClient(audio = new SlickAudioModule());
+ addChildClient(input = new LwjglInputModule());
+
+ graphics.init();
+ audio.init();
+ input.init();
app.addInitTask(new InitTaskRedirectSlickLog());
}
@@ -41,4 +48,11 @@ public class LwjglBackend extends AppBackend {
{
return audio;
}
+
+
+ @Override
+ public InputModule getInput()
+ {
+ return input;
+ }
}
diff --git a/src/mightypork/gamecore/input/InputSystem.java b/src/mightypork/gamecore/backends/lwjgl/LwjglInputModule.java
similarity index 60%
rename from src/mightypork/gamecore/input/InputSystem.java
rename to src/mightypork/gamecore/backends/lwjgl/LwjglInputModule.java
index af27fa8..71b3b1d 100644
--- a/src/mightypork/gamecore/input/InputSystem.java
+++ b/src/mightypork/gamecore/backends/lwjgl/LwjglInputModule.java
@@ -1,14 +1,13 @@
-package mightypork.gamecore.input;
+package mightypork.gamecore.backends.lwjgl;
import mightypork.gamecore.core.App;
import mightypork.gamecore.core.events.UserQuitRequest;
-import mightypork.gamecore.input.events.InputReadyEvent;
+import mightypork.gamecore.input.InputModule;
+import mightypork.gamecore.input.Keys;
import mightypork.gamecore.input.events.KeyEvent;
import mightypork.gamecore.input.events.MouseButtonEvent;
import mightypork.gamecore.input.events.MouseMotionEvent;
-import mightypork.utils.eventbus.clients.BusNode;
-import mightypork.utils.interfaces.Destroyable;
import mightypork.utils.interfaces.Updateable;
import mightypork.utils.math.constraints.vect.Vect;
import mightypork.utils.math.constraints.vect.var.VectVar;
@@ -24,9 +23,7 @@ import org.lwjgl.opengl.Display;
*
* @author Ondřej Hruška (MightyPork)
*/
-public class InputSystem extends BusNode implements Updateable, KeyBinder, Destroyable {
-
- private static boolean inited = false;
+public class LwjglInputModule extends InputModule implements Updateable {
/** Current mouse position */
private static final Vect mousePos = new Vect() {
@@ -49,40 +46,18 @@ public class InputSystem extends BusNode implements Updateable, KeyBinder, Destr
}
};
- private final KeyBindingPool keybindings;
-
- private final VectVar mouseMove = Vect.makeVar();
- private final VectVar mouseLastPos = Vect.makeVar();
-
-
- /**
- * @param app app access
- */
- public InputSystem() {
-
- initDevices();
-
- // global keybindings
- keybindings = new KeyBindingPool();
- addChildClient(keybindings);
-
- App.bus().send(new InputReadyEvent());
- }
-
@Override
- public final void destroy()
+ public void destroy()
{
Mouse.destroy();
Keyboard.destroy();
}
- private void initDevices()
+ @Override
+ protected void initDevices()
{
- if (inited) return;
- inited = true;
-
try {
Mouse.create();
Keyboard.create();
@@ -92,19 +67,8 @@ public class InputSystem extends BusNode implements Updateable, KeyBinder, Destr
}
}
-
- @Override
- public final void bindKey(KeyStroke stroke, Edge edge, Runnable task)
- {
- keybindings.bindKey(stroke, edge, task);
- }
-
-
- @Override
- public void unbindKey(KeyStroke stroke)
- {
- keybindings.unbindKey(stroke);
- }
+ private final VectVar mouseMove = Vect.makeVar();
+ private final VectVar mouseLastPos = Vect.makeVar();
@Override
@@ -172,94 +136,62 @@ public class InputSystem extends BusNode implements Updateable, KeyBinder, Destr
}
- /**
- * Get absolute mouse position. This vect is final and views at it can
- * safely be made.
- *
- * @return mouse position
- */
- public static Vect getMousePos()
+ @Override
+ public Vect getMousePos()
{
return mousePos;
}
- /**
- * @return true if mouse is inside window.
- */
- public static boolean isMouseInside()
+ @Override
+ public boolean isMouseInside()
{
return Mouse.isInsideWindow();
}
- /**
- * Trap mouse cursor in the window
- *
- * @param grab true to grab
- */
- public static void grabMouse(boolean grab)
+ @Override
+ public void grabMouse(boolean grab)
{
Mouse.setGrabbed(grab);
}
- /**
- * Check if key is down
- *
- * @param key key to check (constant from the {@link Keys} class)
- * @return is down
- */
- public static boolean isKeyDown(int key)
+ @Override
+ public boolean isKeyDown(int key)
{
return Keyboard.isKeyDown(key);
}
- /**
- * Check mouse button state
- *
- * @param button button to test (0 left, 1 right, 2 middle)
- * @return button is down
- */
- public static boolean isMouseButtonDown(int button)
+ @Override
+ public boolean isMouseButtonDown(int button)
{
return Mouse.isButtonDown(button);
}
- /**
- * @return bit mask of active mod keys
- */
- public static int getActiveModKeys()
+ @Override
+ public int getActiveModKeys()
{
int mods = 0;
- if (Keyboard.isKeyDown(Keys.L_ALT) || Keyboard.isKeyDown(Keys.R_ALT)) {
+ if (isKeyDown(Keys.L_ALT) || isKeyDown(Keys.R_ALT)) {
mods |= Keys.MOD_ALT;
}
- if (Keyboard.isKeyDown(Keys.L_SHIFT) || Keyboard.isKeyDown(Keys.R_SHIFT)) {
+ if (isKeyDown(Keys.L_SHIFT) || isKeyDown(Keys.R_SHIFT)) {
mods |= Keys.MOD_SHIFT;
}
- if (Keyboard.isKeyDown(Keys.L_CONTROL) || Keyboard.isKeyDown(Keys.R_CONTROL)) {
+ if (isKeyDown(Keys.L_CONTROL) || isKeyDown(Keys.R_CONTROL)) {
mods |= Keys.MOD_CONTROL;
}
- if (Keyboard.isKeyDown(Keys.L_META) || Keyboard.isKeyDown(Keys.R_META)) {
+ if (isKeyDown(Keys.L_META) || isKeyDown(Keys.R_META)) {
mods |= Keys.MOD_META;
}
return mods;
}
-
-
- /**
- * @return true if the system is initialized
- */
- public static boolean isReady()
- {
- return inited;
- }
}
diff --git a/src/mightypork/gamecore/backends/lwjgl/audio/SlickAudioModule.java b/src/mightypork/gamecore/backends/lwjgl/audio/SlickAudioModule.java
index 30d379d..729b556 100644
--- a/src/mightypork/gamecore/backends/lwjgl/audio/SlickAudioModule.java
+++ b/src/mightypork/gamecore/backends/lwjgl/audio/SlickAudioModule.java
@@ -22,33 +22,22 @@ import org.newdawn.slick.openal.SoundStore;
*/
public class SlickAudioModule extends AudioModule {
- private static final Vect INITIAL_LISTENER_POS = Vect.ZERO;
- private static final int MAX_SOURCES = 256;
+ private final VectVar listenerPos = Vect.makeVar();
- private VectVar listener = Vect.makeVar();
- private static boolean soundSystemInited = false;
-
- public SlickAudioModule() {
-
- if (!soundSystemInited) {
- soundSystemInited = true;
-
- try {
- SoundStore.get().setMaxSources(MAX_SOURCES);
- SoundStore.get().init();
- setListenerPos(INITIAL_LISTENER_POS);
- } catch (final Throwable t) {
- Log.e("Error initializing sound system.", t);
- }
- }
+ @Override
+ public void init()
+ {
+ SoundStore.get().setMaxSources(256);
+ SoundStore.get().init();
+ setListenerPos(Vect.ZERO);
}
@Override
public void setListenerPos(Vect pos)
{
- listener.setTo(pos);
+ listenerPos.setTo(pos);
final FloatBuffer buf3 = BufferHelper.alloc(3);
final FloatBuffer buf6 = BufferHelper.alloc(6);
buf3.clear();
@@ -66,7 +55,7 @@ public class SlickAudioModule extends AudioModule {
@Override
public Vect getListenerPos()
{
- return listener;
+ return listenerPos;
}
diff --git a/src/mightypork/gamecore/backends/lwjgl/graphics/LwjglGraphicsModule.java b/src/mightypork/gamecore/backends/lwjgl/graphics/LwjglGraphicsModule.java
index dccc72e..1ce147f 100644
--- a/src/mightypork/gamecore/backends/lwjgl/graphics/LwjglGraphicsModule.java
+++ b/src/mightypork/gamecore/backends/lwjgl/graphics/LwjglGraphicsModule.java
@@ -49,7 +49,7 @@ public class LwjglGraphicsModule extends GraphicsModule {
/** FPS the user wants */
private int targetFps;
/** FPS meter used for measuring actual FPS */
- private FpsMeter fpsMeter;
+ private FpsMeter fpsMeter = new FpsMeter();
/** Flag that at the end of frame, fullscreen should be toggled. */
private boolean fullscreenToggleRequested;
@@ -79,6 +79,17 @@ public class LwjglGraphicsModule extends GraphicsModule {
private static final Rect rect = Rect.make(screenSize);
+ @Override
+ public void init()
+ {
+ try {
+ Display.create();
+ } catch (final Exception e) {
+ throw new RuntimeException("Could not initialize display.", e);
+ }
+ }
+
+
@Override
public void setColor(Color color)
{
@@ -423,27 +434,6 @@ public class LwjglGraphicsModule extends GraphicsModule {
}
- @Override
- public void createDisplay()
- {
- if (Display.isCreated()) throw new IllegalStateException("Display already created.");
- try {
- Display.create();
-
- fpsMeter = new FpsMeter();
-
- if (fullscreenSetRequested && fullscreenSetState) {
- doToggleFullscreen();
- Display.update();
- fullscreenSetRequested = false;
- }
-
- } catch (final Exception e) {
- throw new RuntimeException("Could not initialize display.", e);
- }
- }
-
-
@Override
public void setFullscreen(boolean fs)
{
diff --git a/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFont.java b/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFont.java
index af9e25d..127b203 100644
--- a/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFont.java
+++ b/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFont.java
@@ -27,7 +27,6 @@ public class DeferredLwjglFont extends DeferredFont {
private IFont font = null;
-
/**
* A font from resource
*
diff --git a/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFontFromSystem.java b/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFontFromSystem.java
index 6899e19..841b15b 100644
--- a/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFontFromSystem.java
+++ b/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFontFromSystem.java
@@ -4,7 +4,6 @@ package mightypork.gamecore.backends.lwjgl.graphics.font;
import java.awt.Font;
import java.io.IOException;
-import mightypork.gamecore.graphics.textures.FilterMode;
import mightypork.utils.annotations.Alias;
diff --git a/src/mightypork/gamecore/core/App.java b/src/mightypork/gamecore/core/App.java
index bdd3a3a..62834e4 100644
--- a/src/mightypork/gamecore/core/App.java
+++ b/src/mightypork/gamecore/core/App.java
@@ -2,17 +2,12 @@ package mightypork.gamecore.core;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import mightypork.gamecore.audio.AudioModule;
import mightypork.gamecore.core.config.Config;
-import mightypork.gamecore.core.init.InitTaskCrashHandler;
-import mightypork.gamecore.core.init.InitTaskIonizables;
-import mightypork.gamecore.core.init.InitTaskLog;
-import mightypork.gamecore.core.init.InitTaskLogHeader;
import mightypork.gamecore.graphics.GraphicsModule;
+import mightypork.gamecore.input.InputModule;
import mightypork.utils.annotations.Stub;
import mightypork.utils.eventbus.EventBus;
import mightypork.utils.eventbus.clients.BusNode;
@@ -164,6 +159,10 @@ public class App extends BusNode {
}
+ /**
+ * Shut down the running instance.
+ * Deinitialize backend modules and terminate the JVM.
+ */
public static void shutdown()
{
if (instance == null) throw new IllegalStateException("App is not running.");
@@ -199,9 +198,9 @@ public class App extends BusNode {
/**
- * Get graphics module from the backend
+ * Get graphics module from the running app's backend
*
- * @return backend
+ * @return graphics module
*/
public static GraphicsModule gfx()
{
@@ -210,9 +209,9 @@ public class App extends BusNode {
/**
- * Get audio module from the backend
+ * Get audio module from the running app's backend
*
- * @return backend
+ * @return audio module
*/
public static AudioModule audio()
{
@@ -220,6 +219,17 @@ public class App extends BusNode {
}
+ /**
+ * Get input module from the running app's backend
+ *
+ * @return input module
+ */
+ public static InputModule input()
+ {
+ return instance.backend.getInput();
+ }
+
+
/**
* Get event bus instance.
*
diff --git a/src/mightypork/gamecore/core/AppBackend.java b/src/mightypork/gamecore/core/AppBackend.java
index 814f872..f2f03ed 100644
--- a/src/mightypork/gamecore/core/AppBackend.java
+++ b/src/mightypork/gamecore/core/AppBackend.java
@@ -3,6 +3,7 @@ package mightypork.gamecore.core;
import mightypork.gamecore.audio.AudioModule;
import mightypork.gamecore.graphics.GraphicsModule;
+import mightypork.gamecore.input.InputModule;
import mightypork.utils.eventbus.clients.BusNode;
@@ -53,4 +54,12 @@ public abstract class AppBackend extends BusNode {
* @return audio module
*/
public abstract AudioModule getAudio();
+
+
+ /**
+ * Get input module
+ *
+ * @return input module
+ */
+ public abstract InputModule getInput();
}
diff --git a/src/mightypork/gamecore/core/BackendModule.java b/src/mightypork/gamecore/core/BackendModule.java
index c70e1f5..a4dd870 100644
--- a/src/mightypork/gamecore/core/BackendModule.java
+++ b/src/mightypork/gamecore/core/BackendModule.java
@@ -13,6 +13,9 @@ import mightypork.utils.interfaces.Destroyable;
*/
public abstract class BackendModule extends BusNode implements Destroyable {
+ public abstract void init();
+
+
@Override
@Stub
public void destroy()
diff --git a/src/mightypork/gamecore/core/InitTask.java b/src/mightypork/gamecore/core/InitTask.java
index 69c2552..7be6c86 100644
--- a/src/mightypork/gamecore/core/InitTask.java
+++ b/src/mightypork/gamecore/core/InitTask.java
@@ -28,8 +28,9 @@ public abstract class InitTask {
* Assign the initialized app instance to a protected "app" field.
*
* @param app app
- */
- void bind(App app) {
+ */
+ void bind(App app)
+ {
this.app = app;
}
diff --git a/src/mightypork/gamecore/core/config/InitTaskConfig.java b/src/mightypork/gamecore/core/config/InitTaskConfig.java
index 87bf139..0ced5e9 100644
--- a/src/mightypork/gamecore/core/config/InitTaskConfig.java
+++ b/src/mightypork/gamecore/core/config/InitTaskConfig.java
@@ -3,7 +3,6 @@ package mightypork.gamecore.core.config;
import mightypork.gamecore.core.InitTask;
import mightypork.utils.annotations.Stub;
-import mightypork.utils.exceptions.IllegalValueException;
/**
diff --git a/src/mightypork/gamecore/core/init/InitTaskDisplay.java b/src/mightypork/gamecore/core/init/InitTaskDisplay.java
index f84526c..20cf522 100644
--- a/src/mightypork/gamecore/core/init/InitTaskDisplay.java
+++ b/src/mightypork/gamecore/core/init/InitTaskDisplay.java
@@ -85,8 +85,6 @@ public class InitTaskDisplay extends InitTask {
gfx.setTargetFps(fps);
if (fullscreen) gfx.setFullscreen(true);
-
- gfx.createDisplay();
}
diff --git a/src/mightypork/gamecore/graphics/GraphicsModule.java b/src/mightypork/gamecore/graphics/GraphicsModule.java
index 5209c40..6e09e4d 100644
--- a/src/mightypork/gamecore/graphics/GraphicsModule.java
+++ b/src/mightypork/gamecore/graphics/GraphicsModule.java
@@ -4,6 +4,7 @@ package mightypork.gamecore.graphics;
import mightypork.gamecore.core.BackendModule;
import mightypork.gamecore.graphics.textures.DeferredTexture;
import mightypork.gamecore.graphics.textures.TxQuad;
+import mightypork.gamecore.gui.events.ViewportChangeEvent;
import mightypork.utils.math.color.Color;
import mightypork.utils.math.color.Grad;
import mightypork.utils.math.constraints.rect.Rect;
@@ -280,13 +281,9 @@ public abstract class GraphicsModule extends BackendModule {
/**
- * Create a main window, if needed
- */
- public abstract void createDisplay();
-
-
- /**
- * Set fullscreen
+ * Set fullscreen. The fullscreen state will be changed when possible (eg.
+ * at the end of the current frame) and a {@link ViewportChangeEvent} will
+ * be fired.
*
* @param fs true for fullscreen
*/
@@ -294,13 +291,15 @@ public abstract class GraphicsModule extends BackendModule {
/**
- * Request fullscreen toggle (eg. at the end of render frame)
+ * Request fullscreen toggle. See setFullscreen() for more info)
*/
public abstract void switchFullscreen();
/**
- * Get fullscreen state
+ * Get fullscreen state (note that methods changing fullscreen may not have
+ * immediate effect, so this method may report the old state if the
+ * fullscreen state has not yet been changed).
*
* @return is fullscreen
*/
diff --git a/src/mightypork/gamecore/gui/components/BaseComponent.java b/src/mightypork/gamecore/gui/components/BaseComponent.java
index a863efb..8dd1d1d 100644
--- a/src/mightypork/gamecore/gui/components/BaseComponent.java
+++ b/src/mightypork/gamecore/gui/components/BaseComponent.java
@@ -1,10 +1,11 @@
package mightypork.gamecore.gui.components;
+import mightypork.gamecore.backends.lwjgl.LwjglInputModule;
+import mightypork.gamecore.core.App;
import mightypork.gamecore.graphics.Renderable;
import mightypork.gamecore.gui.events.LayoutChangeEvent;
import mightypork.gamecore.gui.events.LayoutChangeListener;
-import mightypork.gamecore.input.InputSystem;
import mightypork.utils.Support;
import mightypork.utils.annotations.Stub;
import mightypork.utils.interfaces.Enableable;
@@ -98,7 +99,7 @@ public abstract class BaseComponent extends AbstractRectCache implements Compone
@Override
public final boolean isMouseOver()
{
- return InputSystem.getMousePos().isInside(this);
+ return App.input().getMousePos().isInside(this);
}
diff --git a/src/mightypork/gamecore/gui/components/input/TextButton.java b/src/mightypork/gamecore/gui/components/input/TextButton.java
index f9d64c6..9a2ca7c 100644
--- a/src/mightypork/gamecore/gui/components/input/TextButton.java
+++ b/src/mightypork/gamecore/gui/components/input/TextButton.java
@@ -1,10 +1,11 @@
package mightypork.gamecore.gui.components.input;
+import mightypork.gamecore.backends.lwjgl.LwjglInputModule;
+import mightypork.gamecore.core.App;
import mightypork.gamecore.graphics.fonts.IFont;
import mightypork.gamecore.gui.components.DynamicWidthComponent;
import mightypork.gamecore.gui.components.painters.TextPainter;
-import mightypork.gamecore.input.InputSystem;
import mightypork.utils.math.AlignX;
import mightypork.utils.math.color.Color;
import mightypork.utils.math.color.pal.RGB;
@@ -46,7 +47,7 @@ public class TextButton extends ClickableComponent implements DynamicWidthCompon
protected void renderComponent()
{
if (isMouseOver()) {
- if (InputSystem.isMouseButtonDown(0)) {
+ if (App.input().isMouseButtonDown(0)) {
offset.setTo(offsetUnder);
} else {
offset.setTo(hoverMove ? offsetOver : offsetPassive);
diff --git a/src/mightypork/gamecore/gui/screens/Overlay.java b/src/mightypork/gamecore/gui/screens/Overlay.java
index 5f28f2f..f326614 100644
--- a/src/mightypork/gamecore/gui/screens/Overlay.java
+++ b/src/mightypork/gamecore/gui/screens/Overlay.java
@@ -4,12 +4,12 @@ package mightypork.gamecore.gui.screens;
import java.util.ArrayList;
import java.util.Collection;
+import mightypork.gamecore.backends.lwjgl.LwjglInputModule;
import mightypork.gamecore.core.App;
import mightypork.gamecore.graphics.Renderable;
import mightypork.gamecore.gui.components.layout.ConstraintLayout;
import mightypork.gamecore.gui.events.LayoutChangeListener;
import mightypork.gamecore.input.Edge;
-import mightypork.gamecore.input.InputSystem;
import mightypork.gamecore.input.KeyBinder;
import mightypork.gamecore.input.KeyBindingPool;
import mightypork.gamecore.input.KeyStroke;
@@ -52,7 +52,7 @@ public abstract class Overlay extends BusNode implements Comparable, Up
public Overlay() {
- this.mouse = InputSystem.getMousePos();
+ this.mouse = App.input().getMousePos();
this.root = new ConstraintLayout(App.gfx().getRect());
addChildClient(root);
diff --git a/src/mightypork/gamecore/input/InputModule.java b/src/mightypork/gamecore/input/InputModule.java
new file mode 100644
index 0000000..505e355
--- /dev/null
+++ b/src/mightypork/gamecore/input/InputModule.java
@@ -0,0 +1,91 @@
+package mightypork.gamecore.input;
+
+
+import mightypork.gamecore.core.BackendModule;
+import mightypork.utils.math.constraints.vect.Vect;
+
+
+/**
+ * Abstract input module
+ *
+ * @author Ondřej Hruška (MightyPork)
+ */
+public abstract class InputModule extends BackendModule implements KeyBinder {
+
+ protected KeyBindingPool keybindings;
+
+
+ @Override
+ public final void init()
+ {
+ keybindings = new KeyBindingPool();
+ addChildClient(keybindings);
+ initDevices();
+ }
+
+
+ protected abstract void initDevices();
+
+
+ @Override
+ public void bindKey(KeyStroke stroke, Edge edge, Runnable task)
+ {
+ keybindings.bindKey(stroke, edge, task);
+ }
+
+
+ @Override
+ public void unbindKey(KeyStroke stroke)
+ {
+ keybindings.unbindKey(stroke);
+ }
+
+
+ /**
+ * Get absolute mouse position. Should always return the same Vect instance
+ * (use a VectVar or similar).
+ *
+ * @return mouse position
+ */
+ public abstract Vect getMousePos();
+
+
+ /**
+ * Check if mouse is inside window
+ *
+ * @return true if mouse is inside window.
+ */
+ public abstract boolean isMouseInside();
+
+
+ /**
+ * Trap mouse cursor in the window / release it
+ *
+ * @param grab true to grab, false to release
+ */
+ public abstract void grabMouse(boolean grab);
+
+
+ /**
+ * Check if key is down (constant from the {@link Keys} class)
+ *
+ * @param key key to check
+ * @return is down
+ */
+ public abstract boolean isKeyDown(int key);
+
+
+ /**
+ * Check mouse button state
+ *
+ * @param button button to test (0 left, 1 right, 2 middle)
+ * @return button is down
+ */
+ public abstract boolean isMouseButtonDown(int button);
+
+
+ /**
+ * @return bit mask of active mod keys
+ */
+ public abstract int getActiveModKeys();
+}
diff --git a/src/mightypork/gamecore/input/KeyBinding.java b/src/mightypork/gamecore/input/KeyBinding.java
index 3790e24..cbf6618 100644
--- a/src/mightypork/gamecore/input/KeyBinding.java
+++ b/src/mightypork/gamecore/input/KeyBinding.java
@@ -1,7 +1,6 @@
package mightypork.gamecore.input;
-import mightypork.gamecore.input.events.InputReadyListener;
import mightypork.gamecore.input.events.KeyEvent;
import mightypork.gamecore.input.events.KeyEventHandler;
@@ -11,7 +10,7 @@ import mightypork.gamecore.input.events.KeyEventHandler;
*
* @author Ondřej Hruška (MightyPork)
*/
-public class KeyBinding implements KeyEventHandler, InputReadyListener {
+public class KeyBinding implements KeyEventHandler {
private final KeyStroke keystroke;
private Runnable handler;
@@ -28,8 +27,7 @@ public class KeyBinding implements KeyEventHandler, InputReadyListener {
this.keystroke = stroke;
this.handler = handler;
this.edge = edge;
-
- if (InputSystem.isReady()) wasDown = stroke.isDown();
+ wasDown = stroke.isDown();
}
@@ -69,12 +67,4 @@ public class KeyBinding implements KeyEventHandler, InputReadyListener {
handler.run();
}
}
-
-
- @Override
- public void onInputReady()
- {
- wasDown = keystroke.isDown();
- }
-
}
diff --git a/src/mightypork/gamecore/input/KeyStroke.java b/src/mightypork/gamecore/input/KeyStroke.java
index 62715d3..b815b23 100644
--- a/src/mightypork/gamecore/input/KeyStroke.java
+++ b/src/mightypork/gamecore/input/KeyStroke.java
@@ -1,6 +1,7 @@
package mightypork.gamecore.input;
+import mightypork.gamecore.core.App;
import mightypork.utils.string.StringUtil;
import org.lwjgl.input.Keyboard;
@@ -28,9 +29,10 @@ public class KeyStroke {
}
- // FIXME TODO can probably be immutable!
/**
- * Change to...
+ * Change to...
+ * (KeyStroke is mutable, so that upon changing it in Config, all existing
+ * key bindings are updated automatically.)
*
* @param key key code
* @param modmask modifiers
@@ -58,7 +60,7 @@ public class KeyStroke {
public boolean isDown()
{
boolean st = Keyboard.isKeyDown(key);
- st &= (InputSystem.getActiveModKeys() == mod);
+ st &= (App.input().getActiveModKeys() == mod);
return st;
}
diff --git a/src/mightypork/gamecore/input/events/InputReadyEvent.java b/src/mightypork/gamecore/input/events/InputReadyEvent.java
deleted file mode 100644
index 0e4b469..0000000
--- a/src/mightypork/gamecore/input/events/InputReadyEvent.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package mightypork.gamecore.input.events;
-
-
-import mightypork.utils.eventbus.BusEvent;
-
-
-public class InputReadyEvent extends BusEvent {
-
- @Override
- protected void handleBy(InputReadyListener handler)
- {
- handler.onInputReady();
- }
-
-}
diff --git a/src/mightypork/gamecore/input/events/InputReadyListener.java b/src/mightypork/gamecore/input/events/InputReadyListener.java
deleted file mode 100644
index f48b22a..0000000
--- a/src/mightypork/gamecore/input/events/InputReadyListener.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package mightypork.gamecore.input.events;
-
-
-public interface InputReadyListener {
-
- void onInputReady();
-}
diff --git a/src/mightypork/gamecore/resources/loading/ResourceLoader.java b/src/mightypork/gamecore/resources/loading/ResourceLoader.java
index 24047a2..b06a669 100644
--- a/src/mightypork/gamecore/resources/loading/ResourceLoader.java
+++ b/src/mightypork/gamecore/resources/loading/ResourceLoader.java
@@ -1,5 +1,6 @@
package mightypork.gamecore.resources.loading;
+
import mightypork.gamecore.resources.DeferredResource;
diff --git a/src/mightypork/rogue/RogueApp.java b/src/mightypork/rogue/RogueApp.java
index bc8dcf0..4a65621 100644
--- a/src/mightypork/rogue/RogueApp.java
+++ b/src/mightypork/rogue/RogueApp.java
@@ -4,6 +4,7 @@ package mightypork.rogue;
import junk.AppInitOptions;
import junk.BaseApp;
import mightypork.gamecore.backends.lwjgl.LwjglBackend;
+import mightypork.gamecore.backends.lwjgl.LwjglInputModule;
import mightypork.gamecore.core.config.Config;
import mightypork.gamecore.core.events.MainLoopRequest;
import mightypork.gamecore.core.events.ShudownRequest;
@@ -15,7 +16,6 @@ import mightypork.gamecore.gui.events.ViewportChangeEvent;
import mightypork.gamecore.gui.events.ViewportChangeListener;
import mightypork.gamecore.gui.screens.ScreenRegistry;
import mightypork.gamecore.input.Edge;
-import mightypork.gamecore.input.InputSystem;
import mightypork.gamecore.resources.Res;
import mightypork.rogue.RogueStateManager.RogueState;
import mightypork.rogue.events.RogueStateRequest;
@@ -104,7 +104,7 @@ public final class RogueApp extends BaseApp implements ViewportChangeListener, S
@Override
- protected void initInputSystem(InputSystem input)
+ protected void initInputSystem(LwjglInputModule input)
{
// this will work only with reusable events (such as requests)
bindEventToKey(new FullscreenToggleRequest(), "global.fullscreen");
diff --git a/src/mightypork/rogue/RogueKeys.java b/src/mightypork/rogue/RogueKeys.java
index 66911f2..bb895fe 100644
--- a/src/mightypork/rogue/RogueKeys.java
+++ b/src/mightypork/rogue/RogueKeys.java
@@ -1,8 +1,6 @@
package mightypork.rogue;
-
-
public class RogueKeys implements KeySetup {
@Override
diff --git a/src/mightypork/rogue/RogueRoutes.java b/src/mightypork/rogue/RogueRoutes.java
index ac679db..5c62a05 100644
--- a/src/mightypork/rogue/RogueRoutes.java
+++ b/src/mightypork/rogue/RogueRoutes.java
@@ -1,8 +1,6 @@
package mightypork.rogue;
-
-
public class RogueRoutes implements RouteSetup {
@Override
diff --git a/src/mightypork/rogue/world/gui/interaction/MIPKeyboard.java b/src/mightypork/rogue/world/gui/interaction/MIPKeyboard.java
index 8936d3d..672dcad 100644
--- a/src/mightypork/rogue/world/gui/interaction/MIPKeyboard.java
+++ b/src/mightypork/rogue/world/gui/interaction/MIPKeyboard.java
@@ -5,9 +5,9 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import mightypork.gamecore.backends.lwjgl.LwjglInputModule;
import mightypork.gamecore.core.config.Config;
import mightypork.gamecore.input.Edge;
-import mightypork.gamecore.input.InputSystem;
import mightypork.gamecore.input.KeyBindingPool;
import mightypork.gamecore.input.KeyStroke;
import mightypork.gamecore.input.Keys;
@@ -103,7 +103,7 @@ public class MIPKeyboard extends MapInteractionPlugin implements DelegatingClien
if (mapView.plc.getPlayer().getMoveProgress() < 0.8) return false;
- if (InputSystem.getActiveModKeys() != Keys.MOD_NONE) return false;
+ if (LwjglInputModule.getActiveModKeys() != Keys.MOD_NONE) return false;
for (int i = 0; i < 4; i++) {
if (keys[i].isDown()) {
diff --git a/src/mightypork/rogue/world/gui/interaction/MIPMouse.java b/src/mightypork/rogue/world/gui/interaction/MIPMouse.java
index d59a93f..56b202d 100644
--- a/src/mightypork/rogue/world/gui/interaction/MIPMouse.java
+++ b/src/mightypork/rogue/world/gui/interaction/MIPMouse.java
@@ -1,7 +1,7 @@
package mightypork.rogue.world.gui.interaction;
-import mightypork.gamecore.input.InputSystem;
+import mightypork.gamecore.backends.lwjgl.LwjglInputModule;
import mightypork.rogue.world.entity.impl.EntityPlayer;
import mightypork.rogue.world.events.PlayerStepEndListener;
import mightypork.rogue.world.gui.MapView;
@@ -30,10 +30,10 @@ public class MIPMouse extends MapInteractionPlugin implements PlayerStepEndListe
{
if (isImmobile()) return;
- final Vect pos = InputSystem.getMousePos();
+ final Vect pos = LwjglInputModule.getMousePos();
if (!pos.isInside(mapView)) return;
- if (InputSystem.isMouseButtonDown(LEFT)) {
+ if (LwjglInputModule.isMouseButtonDown(LEFT)) {
if (mouseWalk(pos)) return;
if (mapView.plc.getPlayer().isMoving() && troToNav(pos)) return;
}
@@ -117,10 +117,10 @@ public class MIPMouse extends MapInteractionPlugin implements PlayerStepEndListe
{
if (isImmobile()) return;
- final Vect pos = InputSystem.getMousePos();
+ final Vect pos = LwjglInputModule.getMousePos();
if (!pos.isInside(mapView)) return;
- if (InputSystem.isMouseButtonDown(LEFT)) {
+ if (LwjglInputModule.isMouseButtonDown(LEFT)) {
if (mouseWalk(pos)) return;
if (mapView.plc.getPlayer().isMoving() && troToNav(pos)) return;
}