diff --git a/.classpath b/.classpath index 88401bd..81dc7c7 100644 --- a/.classpath +++ b/.classpath @@ -2,36 +2,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/OpenAL32.dll b/lib/OpenAL32.dll deleted file mode 100644 index 6dd2600..0000000 Binary files a/lib/OpenAL32.dll and /dev/null differ diff --git a/lib/OpenAL64.dll b/lib/OpenAL64.dll deleted file mode 100644 index 00c98c0..0000000 Binary files a/lib/OpenAL64.dll and /dev/null differ diff --git a/lib/jinput-dx8.dll b/lib/jinput-dx8.dll deleted file mode 100644 index 6d27ad5..0000000 Binary files a/lib/jinput-dx8.dll and /dev/null differ diff --git a/lib/jinput-dx8_64.dll b/lib/jinput-dx8_64.dll deleted file mode 100644 index 6730589..0000000 Binary files a/lib/jinput-dx8_64.dll and /dev/null differ diff --git a/lib/jinput-raw.dll b/lib/jinput-raw.dll deleted file mode 100644 index ce1d162..0000000 Binary files a/lib/jinput-raw.dll and /dev/null differ diff --git a/lib/jinput-raw_64.dll b/lib/jinput-raw_64.dll deleted file mode 100644 index 3d2b3ad..0000000 Binary files a/lib/jinput-raw_64.dll and /dev/null differ diff --git a/lib/jinput.jar b/lib/jinput.jar deleted file mode 100644 index 7c2b6b0..0000000 Binary files a/lib/jinput.jar and /dev/null differ diff --git a/lib/jogg-0.0.7.jar b/lib/jogg-0.0.7.jar deleted file mode 100644 index ecb0260..0000000 Binary files a/lib/jogg-0.0.7.jar and /dev/null differ diff --git a/lib/jorbis-0.0.15.jar b/lib/jorbis-0.0.15.jar deleted file mode 100644 index 4cf51f9..0000000 Binary files a/lib/jorbis-0.0.15.jar and /dev/null differ diff --git a/lib/libjinput-linux.so b/lib/libjinput-linux.so deleted file mode 100644 index 3cdc439..0000000 Binary files a/lib/libjinput-linux.so and /dev/null differ diff --git a/lib/libjinput-linux64.so b/lib/libjinput-linux64.so deleted file mode 100644 index de1ee5f..0000000 Binary files a/lib/libjinput-linux64.so and /dev/null differ diff --git a/lib/libjinput-osx.jnilib b/lib/libjinput-osx.jnilib deleted file mode 100644 index 59a3eab..0000000 Binary files a/lib/libjinput-osx.jnilib and /dev/null differ diff --git a/lib/liblwjgl.jnilib b/lib/liblwjgl.jnilib deleted file mode 100644 index cbb5b4c..0000000 Binary files a/lib/liblwjgl.jnilib and /dev/null differ diff --git a/lib/liblwjgl.so b/lib/liblwjgl.so deleted file mode 100644 index 5a02874..0000000 Binary files a/lib/liblwjgl.so and /dev/null differ diff --git a/lib/liblwjgl64.so b/lib/liblwjgl64.so deleted file mode 100644 index 4572589..0000000 Binary files a/lib/liblwjgl64.so and /dev/null differ diff --git a/lib/libopenal.so b/lib/libopenal.so deleted file mode 100644 index 7742faf..0000000 Binary files a/lib/libopenal.so and /dev/null differ diff --git a/lib/libopenal64.so b/lib/libopenal64.so deleted file mode 100644 index d1e45e5..0000000 Binary files a/lib/libopenal64.so and /dev/null differ diff --git a/lib/lwjgl-source-2.8.4.zip b/lib/lwjgl-source-2.8.4.zip deleted file mode 100644 index f48fd31..0000000 Binary files a/lib/lwjgl-source-2.8.4.zip and /dev/null differ diff --git a/lib/lwjgl.dll b/lib/lwjgl.dll deleted file mode 100644 index 6819404..0000000 Binary files a/lib/lwjgl.dll and /dev/null differ diff --git a/lib/lwjgl.jar b/lib/lwjgl.jar deleted file mode 100644 index a0fb56d..0000000 Binary files a/lib/lwjgl.jar and /dev/null differ diff --git a/lib/lwjgl64.dll b/lib/lwjgl64.dll deleted file mode 100644 index e66ab2a..0000000 Binary files a/lib/lwjgl64.dll and /dev/null differ diff --git a/lib/lwjgl_util.jar b/lib/lwjgl_util.jar deleted file mode 100644 index 9973b24..0000000 Binary files a/lib/lwjgl_util.jar and /dev/null differ diff --git a/lib/slick-util-src.zip b/lib/slick-util-src.zip deleted file mode 100644 index 7ca6790..0000000 Binary files a/lib/slick-util-src.zip and /dev/null differ diff --git a/lib/slick-util.jar b/lib/slick-util.jar deleted file mode 100644 index 86a64a7..0000000 Binary files a/lib/slick-util.jar and /dev/null differ diff --git a/src/mightypork/gamecore/backends/lwjgl/BufferHelper.java b/src/mightypork/gamecore/backends/lwjgl/BufferHelper.java deleted file mode 100644 index 3e38b3b..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/BufferHelper.java +++ /dev/null @@ -1,52 +0,0 @@ -package mightypork.gamecore.backends.lwjgl; - - -import java.nio.FloatBuffer; - -import org.lwjgl.BufferUtils; - - -/** - * Calc subclass with buffer utils. - * - * @author Ondřej Hruška (MightyPork) - */ -public class BufferHelper { - - /** - * Create java.nio.FloatBuffer of given floats, and flip it. - * - * @param obj floats or float array - * @return float buffer - */ - public static FloatBuffer mkFillBuff(float... obj) - { - return (FloatBuffer) BufferUtils.createFloatBuffer(obj.length).put(obj).flip(); - } - - - /** - * Fill java.nio.FloatBuffer with floats or float array - * - * @param buff - * @param obj - */ - public static void fill(FloatBuffer buff, float... obj) - { - buff.put(obj); - buff.flip(); - } - - - /** - * Create new java.nio.FloatBuffer of given length - * - * @param count elements - * @return the new java.nio.FloatBuffer - */ - public static FloatBuffer alloc(int count) - { - return BufferUtils.createFloatBuffer(count); - } - -} diff --git a/src/mightypork/gamecore/backends/lwjgl/InitTaskRedirectSlickLog.java b/src/mightypork/gamecore/backends/lwjgl/InitTaskRedirectSlickLog.java deleted file mode 100644 index a951141..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/InitTaskRedirectSlickLog.java +++ /dev/null @@ -1,38 +0,0 @@ -package mightypork.gamecore.backends.lwjgl; - - -import mightypork.gamecore.core.InitTask; -import mightypork.gamecore.core.OptionalInitTask; -import mightypork.utils.logging.writers.LogWriter; - - -/** - * Initializer that redirects slick logging to main logger. - * - * @author Ondřej Hruška (MightyPork) - */ -@OptionalInitTask -public class InitTaskRedirectSlickLog extends InitTask { - - @Override - public void run() - { - LogWriter ml = mightypork.utils.logging.Log.getMainLogger(); - SlickLogRedirector slr = new SlickLogRedirector(ml); - org.newdawn.slick.util.Log.setLogSystem(slr); - } - - - @Override - public String getName() - { - return "slick_log"; - } - - - @Override - public String[] getDependencies() - { - return new String[] { "log" }; - } -} diff --git a/src/mightypork/gamecore/backends/lwjgl/LwjglBackend.java b/src/mightypork/gamecore/backends/lwjgl/LwjglBackend.java deleted file mode 100644 index d11b58b..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/LwjglBackend.java +++ /dev/null @@ -1,58 +0,0 @@ -package mightypork.gamecore.backends.lwjgl; - - -import mightypork.gamecore.audio.AudioModule; -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; - - -/** - * Game backend using LWJGL and SlickUtil - * - * @author MightyPork - */ -public class LwjglBackend extends AppBackend { - - private LwjglGraphicsModule graphics; - private SlickAudioModule audio; - private LwjglInputModule input; - - - @Override - public void initialize() - { - addChildClient(graphics = new LwjglGraphicsModule()); - addChildClient(audio = new SlickAudioModule()); - addChildClient(input = new LwjglInputModule()); - - graphics.init(); - audio.init(); - input.init(); - - app.addInitTask(new InitTaskRedirectSlickLog()); - } - - - @Override - public GraphicsModule getGraphics() - { - return graphics; - } - - - @Override - public AudioModule getAudio() - { - return audio; - } - - - @Override - public InputModule getInput() - { - return input; - } -} diff --git a/src/mightypork/gamecore/backends/lwjgl/LwjglInputModule.java b/src/mightypork/gamecore/backends/lwjgl/LwjglInputModule.java deleted file mode 100644 index 698a676..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/LwjglInputModule.java +++ /dev/null @@ -1,302 +0,0 @@ -package mightypork.gamecore.backends.lwjgl; - - -import mightypork.gamecore.core.App; -import mightypork.gamecore.input.InputModule; -import mightypork.gamecore.input.Key; -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.interfaces.Updateable; -import mightypork.utils.math.constraints.vect.Vect; -import mightypork.utils.math.constraints.vect.var.VectVar; - -import org.lwjgl.LWJGLException; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.Display; - - -/** - * Lwjgl Input Module. - * - * @author Ondřej Hruška (MightyPork) - */ -public class LwjglInputModule extends InputModule implements Updateable { - - /** Current mouse position */ - private static final Vect mousePos = new Vect() { - - @Override - public double x() - { - if (!Mouse.isInsideWindow()) return Integer.MIN_VALUE; - - return Mouse.getX(); - } - - - @Override - public double y() - { - if (!Mouse.isInsideWindow()) return Integer.MIN_VALUE; - // flip Y axis - return Display.getHeight() - Mouse.getY(); - } - }; - - - @Override - protected void initDevices() - { - try { - Mouse.create(); - Keyboard.create(); - Keyboard.enableRepeatEvents(false); - } catch (final LWJGLException e) { - throw new RuntimeException("Failed to initialize input devices.", e); - } - } - - - @Override - protected void initKeyCodes() - { - Keys.NONE.setCode(Keyboard.KEY_NONE); - - Keys.NUM_1.setCode(Keyboard.KEY_1); - Keys.NUM_2.setCode(Keyboard.KEY_2); - Keys.NUM_3.setCode(Keyboard.KEY_3); - Keys.NUM_4.setCode(Keyboard.KEY_4); - Keys.NUM_5.setCode(Keyboard.KEY_5); - Keys.NUM_6.setCode(Keyboard.KEY_6); - Keys.NUM_7.setCode(Keyboard.KEY_7); - Keys.NUM_8.setCode(Keyboard.KEY_8); - Keys.NUM_9.setCode(Keyboard.KEY_9); - Keys.NUM_0.setCode(Keyboard.KEY_0); - - Keys.Q.setCode(Keyboard.KEY_Q); - Keys.W.setCode(Keyboard.KEY_W); - Keys.E.setCode(Keyboard.KEY_E); - Keys.R.setCode(Keyboard.KEY_R); - Keys.T.setCode(Keyboard.KEY_T); - Keys.Y.setCode(Keyboard.KEY_Y); - Keys.U.setCode(Keyboard.KEY_U); - Keys.I.setCode(Keyboard.KEY_I); - Keys.O.setCode(Keyboard.KEY_O); - Keys.P.setCode(Keyboard.KEY_P); - Keys.A.setCode(Keyboard.KEY_A); - Keys.S.setCode(Keyboard.KEY_S); - Keys.D.setCode(Keyboard.KEY_D); - Keys.F.setCode(Keyboard.KEY_F); - Keys.G.setCode(Keyboard.KEY_G); - Keys.H.setCode(Keyboard.KEY_H); - Keys.J.setCode(Keyboard.KEY_J); - Keys.K.setCode(Keyboard.KEY_K); - Keys.L.setCode(Keyboard.KEY_L); - Keys.Z.setCode(Keyboard.KEY_Z); - Keys.X.setCode(Keyboard.KEY_X); - Keys.C.setCode(Keyboard.KEY_C); - Keys.V.setCode(Keyboard.KEY_V); - Keys.B.setCode(Keyboard.KEY_B); - Keys.N.setCode(Keyboard.KEY_N); - Keys.M.setCode(Keyboard.KEY_M); - - Keys.MINUS.setCode(Keyboard.KEY_MINUS); - Keys.EQUALS.setCode(Keyboard.KEY_EQUALS); - Keys.SLASH.setCode(Keyboard.KEY_SLASH); - Keys.BACKSLASH.setCode(Keyboard.KEY_BACKSLASH); - Keys.BRACKET_LEFT.setCode(Keyboard.KEY_LBRACKET); - Keys.BRACKET_RIGHT.setCode(Keyboard.KEY_RBRACKET); - Keys.SEMICOLON.setCode(Keyboard.KEY_SEMICOLON); - Keys.APOSTROPHE.setCode(Keyboard.KEY_APOSTROPHE); - Keys.GRAVE.setCode(Keyboard.KEY_GRAVE); - Keys.COMMA.setCode(Keyboard.KEY_COMMA); - Keys.PERIOD.setCode(Keyboard.KEY_PERIOD); - - Keys.SPACE.setCode(Keyboard.KEY_SPACE); - Keys.BACKSPACE.setCode(Keyboard.KEY_BACK); - Keys.TAB.setCode(Keyboard.KEY_TAB); - Keys.ESCAPE.setCode(Keyboard.KEY_ESCAPE); - - Keys.APPS.setCode(Keyboard.KEY_APPS); - Keys.POWER.setCode(Keyboard.KEY_POWER); - Keys.SLEEP.setCode(Keyboard.KEY_SLEEP); - //Keys.MENU.setCode(Keyboard.KEY_MENU); // not defined - - Keys.F1.setCode(Keyboard.KEY_F1); - Keys.F2.setCode(Keyboard.KEY_F2); - Keys.F3.setCode(Keyboard.KEY_F3); - Keys.F4.setCode(Keyboard.KEY_F4); - Keys.F5.setCode(Keyboard.KEY_F5); - Keys.F6.setCode(Keyboard.KEY_F6); - Keys.F7.setCode(Keyboard.KEY_F7); - Keys.F8.setCode(Keyboard.KEY_F8); - Keys.F9.setCode(Keyboard.KEY_F9); - Keys.F10.setCode(Keyboard.KEY_F10); - Keys.F11.setCode(Keyboard.KEY_F11); - Keys.F12.setCode(Keyboard.KEY_F12); - Keys.F13.setCode(Keyboard.KEY_F13); - Keys.F14.setCode(Keyboard.KEY_F14); - Keys.F15.setCode(Keyboard.KEY_F15); - - Keys.CAPS_LOCK.setCode(Keyboard.KEY_CAPITAL); - Keys.SCROLL_LOCK.setCode(Keyboard.KEY_SCROLL); - Keys.NUM_LOCK.setCode(Keyboard.KEY_NUMLOCK); - - Keys.NUMPAD_MINUS.setCode(Keyboard.KEY_SUBTRACT); - Keys.NUMPAD_PLUSS.setCode(Keyboard.KEY_ADD); - Keys.NUMPAD_0.setCode(Keyboard.KEY_NUMPAD0); - Keys.NUMPAD_1.setCode(Keyboard.KEY_NUMPAD1); - Keys.NUMPAD_2.setCode(Keyboard.KEY_NUMPAD2); - Keys.NUMPAD_3.setCode(Keyboard.KEY_NUMPAD3); - Keys.NUMPAD_4.setCode(Keyboard.KEY_NUMPAD4); - Keys.NUMPAD_5.setCode(Keyboard.KEY_NUMPAD5); - Keys.NUMPAD_6.setCode(Keyboard.KEY_NUMPAD6); - Keys.NUMPAD_7.setCode(Keyboard.KEY_NUMPAD7); - Keys.NUMPAD_8.setCode(Keyboard.KEY_NUMPAD8); - Keys.NUMPAD_9.setCode(Keyboard.KEY_NUMPAD9); - Keys.NUMPAD_DECIMAL.setCode(Keyboard.KEY_DECIMAL); - Keys.NUMPAD_ENTER.setCode(Keyboard.KEY_NUMPADENTER); - Keys.NUMPAD_DIVIDE.setCode(Keyboard.KEY_DIVIDE); - Keys.NUMPAD_MULTIPLY.setCode(Keyboard.KEY_MULTIPLY); - - Keys.CONTROL_LEFT.setCode(Keyboard.KEY_LCONTROL); - Keys.CONTROL_RIGHT.setCode(Keyboard.KEY_RCONTROL); - Keys.ALT_LEFT.setCode(Keyboard.KEY_LMENU); - Keys.ALT_RIGHT.setCode(Keyboard.KEY_RMENU); - Keys.SHIFT_LEFT.setCode(Keyboard.KEY_LSHIFT); - Keys.SHIFT_RIGHT.setCode(Keyboard.KEY_RSHIFT); - Keys.META_LEFT.setCode(Keyboard.KEY_LMETA); - Keys.META_RIGHT.setCode(Keyboard.KEY_RMETA); - - Keys.UP.setCode(Keyboard.KEY_UP); - Keys.DOWN.setCode(Keyboard.KEY_DOWN); - Keys.LEFT.setCode(Keyboard.KEY_LEFT); - Keys.RIGHT.setCode(Keyboard.KEY_RIGHT); - - Keys.HOME.setCode(Keyboard.KEY_HOME); - Keys.END.setCode(Keyboard.KEY_END); - - Keys.PAGE_UP.setCode(Keyboard.KEY_PRIOR); - Keys.PAGE_DOWN.setCode(Keyboard.KEY_NEXT); - - Keys.RETURN.setCode(Keyboard.KEY_RETURN); - Keys.PAUSE.setCode(Keyboard.KEY_PAUSE); - Keys.INSERT.setCode(Keyboard.KEY_INSERT); - Keys.DELETE.setCode(Keyboard.KEY_DELETE); - Keys.SYSRQ.setCode(Keyboard.KEY_SYSRQ); - } - - - @Override - public void destroy() - { - Mouse.destroy(); - Keyboard.destroy(); - } - - private final VectVar mouseMove = Vect.makeVar(); - private final VectVar mouseLastPos = Vect.makeVar(); - - - @Override - public synchronized void update(double delta) - { - // was destroyed or not initialized - if (!Display.isCreated()) return; - if (!Mouse.isCreated()) return; - if (!Keyboard.isCreated()) return; - - Display.processMessages(); - - // sum the moves - mouseMove.reset(); - mouseLastPos.reset(); - boolean wasMouse = false; - while (Mouse.next()) { - onMouseEvent(mouseMove, mouseLastPos); - wasMouse = true; - } - - if (wasMouse && !mouseMove.isZero()) { - App.bus().send(new MouseMotionEvent(mouseLastPos, mouseMove)); - } - - while (Keyboard.next()) { - onKeyEvent(); - } - - if (Display.isCloseRequested()) { - App.shutdown(); - } - } - - - private void onMouseEvent(VectVar moveSum, VectVar lastPos) - { - final int button = Mouse.getEventButton(); - final boolean down = Mouse.getEventButtonState(); - - final VectVar pos = Vect.makeVar(Mouse.getEventX(), Mouse.getEventY()); - final VectVar move = Vect.makeVar(Mouse.getEventDX(), Mouse.getEventDY()); - - final int wheeld = Mouse.getEventDWheel(); - - // flip Y axis - pos.setY(Display.getHeight() - pos.y()); - - if (button != -1 || wheeld != 0) { - App.bus().send(new MouseButtonEvent(pos.freeze(), button, down, wheeld)); - } - - moveSum.setTo(moveSum.add(move)); - lastPos.setTo(pos); - } - - - private void onKeyEvent() - { - final int key = Keyboard.getEventKey(); - final boolean down = Keyboard.getEventKeyState(); - final char c = Keyboard.getEventCharacter(); - - App.bus().send(new KeyEvent(key, c, down)); - } - - - @Override - public Vect getMousePos() - { - return mousePos; - } - - - @Override - public boolean isMouseInside() - { - return Mouse.isInsideWindow(); - } - - - @Override - public void grabMouse(boolean grab) - { - Mouse.setGrabbed(grab); - } - - - @Override - public boolean isKeyDown(Key key) - { - return key.isDefined() && Keyboard.isKeyDown(key.getCode()); - } - - - @Override - public boolean isMouseButtonDown(int button) - { - return Mouse.isButtonDown(button); - } -} diff --git a/src/mightypork/gamecore/backends/lwjgl/SlickLogRedirector.java b/src/mightypork/gamecore/backends/lwjgl/SlickLogRedirector.java deleted file mode 100644 index 3aec98f..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/SlickLogRedirector.java +++ /dev/null @@ -1,75 +0,0 @@ -package mightypork.gamecore.backends.lwjgl; - - -import java.util.logging.Level; - -import mightypork.utils.logging.writers.LogWriter; - - -/** - * Used to redirect slick log into main logger. - * - * @author Ondřej Hruška (MightyPork) - */ -class SlickLogRedirector implements org.newdawn.slick.util.LogSystem { - - LogWriter writer; - - - /** - * @param log log to redirect into - */ - public SlickLogRedirector(LogWriter log) { - this.writer = log; - } - - - @Override - public void error(String msg, Throwable e) - { - writer.log(Level.SEVERE, msg, e); - } - - - @Override - public void error(Throwable e) - { - writer.log(Level.SEVERE, null, e); - } - - - @Override - public void error(String msg) - { - writer.log(Level.SEVERE, msg); - } - - - @Override - public void warn(String msg) - { - writer.log(Level.WARNING, msg); - } - - - @Override - public void warn(String msg, Throwable e) - { - writer.log(Level.WARNING, msg, e); - } - - - @Override - public void info(String msg) - { - writer.log(Level.INFO, msg); - } - - - @Override - public void debug(String msg) - { - writer.log(Level.FINEST, msg); - } - -} diff --git a/src/mightypork/gamecore/backends/lwjgl/audio/SlickAudio.java b/src/mightypork/gamecore/backends/lwjgl/audio/SlickAudio.java deleted file mode 100644 index 2928712..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/audio/SlickAudio.java +++ /dev/null @@ -1,146 +0,0 @@ -package mightypork.gamecore.backends.lwjgl.audio; - - -import java.io.IOException; -import java.io.InputStream; - -import mightypork.gamecore.audio.DeferredAudio; -import mightypork.utils.files.FileUtil; - -import org.lwjgl.openal.AL10; -import org.newdawn.slick.openal.Audio; -import org.newdawn.slick.openal.SoundStore; - - -/** - * SlickUtil-based deferred audio resource. - * - * @author Ondřej Hruška (MightyPork) - */ -public class SlickAudio extends DeferredAudio { - - private double pauseLoopPosition = 0; - private boolean looping = false; - private boolean paused = false; - private double lastPlayPitch = 1; - private double lastPlayGain = 1; - - /** Audio resource */ - private Audio backingAudio = null; - private int sourceID; - - - public SlickAudio(String resourceName) { - super(resourceName); - } - - - @Override - protected void loadResource(String resource) throws IOException - { - final String ext = FileUtil.getExtension(resource); - - try (final InputStream stream = FileUtil.getResource(resource)) { - - if (ext.equalsIgnoreCase("ogg")) { - backingAudio = SoundStore.get().getOgg(resource, stream); - - } else if (ext.equalsIgnoreCase("wav")) { - backingAudio = SoundStore.get().getWAV(resource, stream); - - } else if (ext.equalsIgnoreCase("aif")) { - backingAudio = SoundStore.get().getAIF(resource, stream); - - } else if (ext.equalsIgnoreCase("mod")) { - backingAudio = SoundStore.get().getMOD(resource, stream); - - } else { - throw new RuntimeException("Invalid audio file extension."); - } - } - } - - - @Override - public void pauseLoop() - { - if (!ensureLoaded()) return; - - if (isPlaying() && looping) { - pauseLoopPosition = backingAudio.getPosition(); - stop(); - paused = true; - } - } - - - @Override - public void resumeLoop() - { - if (!ensureLoaded()) return; - - if (looping && paused) { - sourceID = backingAudio.playAsSoundEffect((float) lastPlayPitch, (float) lastPlayGain, true); - backingAudio.setPosition((float) pauseLoopPosition); - paused = false; - } - } - - - @Override - public void adjustGain(double gain) - { - AL10.alSourcef(sourceID, AL10.AL_GAIN, (float) gain); - } - - - @Override - public void stop() - { - if (!isLoaded()) return; - - backingAudio.stop(); - paused = false; - } - - - @Override - public boolean isPlaying() - { - if (!isLoaded()) return false; - - return backingAudio.isPlaying(); - } - - - @Override - public boolean isPaused() - { - if (!isLoaded()) return false; - - return backingAudio.isPaused(); - } - - - @Override - public void play(double pitch, double gain, boolean loop, double x, double y, double z) - { - if (!ensureLoaded()) return; - - this.lastPlayPitch = pitch; - this.lastPlayGain = gain; - looping = loop; - - sourceID = backingAudio.playAsSoundEffect((float) pitch, (float) gain, loop, (float) x, (float) y, (float) z); - } - - - @Override - public void destroy() - { - if (!isLoaded() || backingAudio == null) return; - - backingAudio.release(); - backingAudio = null; - } -} diff --git a/src/mightypork/gamecore/backends/lwjgl/audio/SlickAudioModule.java b/src/mightypork/gamecore/backends/lwjgl/audio/SlickAudioModule.java deleted file mode 100644 index 87384ca..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/audio/SlickAudioModule.java +++ /dev/null @@ -1,75 +0,0 @@ -package mightypork.gamecore.backends.lwjgl.audio; - - -import java.nio.FloatBuffer; - -import mightypork.gamecore.audio.AudioModule; -import mightypork.gamecore.audio.DeferredAudio; -import mightypork.gamecore.backends.lwjgl.BufferHelper; -import mightypork.utils.math.constraints.vect.Vect; -import mightypork.utils.math.constraints.vect.var.VectVar; - -import org.lwjgl.openal.AL; -import org.lwjgl.openal.AL10; -import org.newdawn.slick.openal.SoundStore; - - -/** - * SlickUtil-based audio module - * - * @author Ondřej Hruška (MightyPork) - */ -public class SlickAudioModule extends AudioModule { - - private final VectVar listenerPos = Vect.makeVar(); - - - @Override - public void init() - { - SoundStore.get().setMaxSources(256); - SoundStore.get().init(); - setListenerPos(Vect.ZERO); - } - - - @Override - public void setListenerPos(Vect pos) - { - listenerPos.setTo(pos); - final FloatBuffer buf3 = BufferHelper.alloc(3); - final FloatBuffer buf6 = BufferHelper.alloc(6); - buf3.clear(); - BufferHelper.fill(buf3, (float) pos.x(), (float) pos.y(), (float) pos.z()); - AL10.alListener(AL10.AL_POSITION, buf3); - buf3.clear(); - BufferHelper.fill(buf3, 0, 0, 0); - AL10.alListener(AL10.AL_VELOCITY, buf3); - buf6.clear(); - BufferHelper.fill(buf6, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f); - AL10.alListener(AL10.AL_ORIENTATION, buf6); - } - - - @Override - public Vect getListenerPos() - { - return listenerPos; - } - - - @Override - protected void deinitSoundSystem() - { - SoundStore.get().clear(); - AL.destroy(); - } - - - @Override - protected DeferredAudio doCreateResource(String res) - { - return new SlickAudio(res); - } - -} diff --git a/src/mightypork/gamecore/backends/lwjgl/graphics/AwtScreenshot.java b/src/mightypork/gamecore/backends/lwjgl/graphics/AwtScreenshot.java deleted file mode 100644 index fa11ce7..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/graphics/AwtScreenshot.java +++ /dev/null @@ -1,84 +0,0 @@ -package mightypork.gamecore.backends.lwjgl.graphics; - - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.nio.ByteBuffer; - -import javax.imageio.ImageIO; - -import mightypork.gamecore.graphics.Screenshot; - - -/** - * Screenshot object, can be used to extract image or write to file.
- * Screenshot, once taken, can be safely processed in separate thread.
- * Based on {@link BufferedImage} and {@link ImageIO}. - * - * @author Ondřej Hruška (MightyPork) - */ -public class AwtScreenshot implements Screenshot { - - private final int width; - private final int height; - private final int bpp; - private final ByteBuffer bytes; - private BufferedImage image; - - - /** - * @param width image width - * @param height image height - * @param bpp bits per pixel (typically 4) - * @param buffer - */ - public AwtScreenshot(int width, int height, int bpp, ByteBuffer buffer) { - this.width = width; - this.height = height; - this.bpp = bpp; - this.bytes = buffer; - } - - - /** - * Extract to an image.
- * Subsequent calls will use a cached value. - * - * @return image - */ - public BufferedImage getImage() - { - if (image != null) return image; - - image = new BufferedImage(this.width, this.height, BufferedImage.TYPE_INT_RGB); - - // convert to a buffered image - for (int x = 0; x < this.width; x++) { - for (int y = 0; y < this.height; y++) { - final int i = (x + (this.width * y)) * this.bpp; - final int r = this.bytes.get(i) & 0xFF; - final int g = this.bytes.get(i + 1) & 0xFF; - final int b = this.bytes.get(i + 2) & 0xFF; - image.setRGB(x, this.height - (y + 1), (0xFF << 24) | (r << 16) | (g << 8) | b); - } - } - - return image; - } - - - /** - * Save to a file.
- * Cached value is used if any. - * - * @param file target file - * @throws IOException on error writing to file - */ - @Override - public void save(File file) throws IOException - { - file.getParentFile().mkdirs(); - ImageIO.write(getImage(), "PNG", file); - } -} diff --git a/src/mightypork/gamecore/backends/lwjgl/graphics/LwjglGraphicsModule.java b/src/mightypork/gamecore/backends/lwjgl/graphics/LwjglGraphicsModule.java deleted file mode 100644 index 59ff484..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/graphics/LwjglGraphicsModule.java +++ /dev/null @@ -1,620 +0,0 @@ -package mightypork.gamecore.backends.lwjgl.graphics; - - -import static org.lwjgl.opengl.GL11.*; - -import java.nio.ByteBuffer; -import java.util.Stack; - -import mightypork.gamecore.core.App; -import mightypork.gamecore.graphics.GraphicsModule; -import mightypork.gamecore.graphics.Screenshot; -import mightypork.gamecore.graphics.textures.DeferredTexture; -import mightypork.gamecore.graphics.textures.TxQuad; -import mightypork.gamecore.gui.events.ViewportChangeEvent; -import mightypork.utils.logging.Log; -import mightypork.utils.math.color.Color; -import mightypork.utils.math.color.Grad; -import mightypork.utils.math.color.pal.RGB; -import mightypork.utils.math.constraints.rect.Rect; -import mightypork.utils.math.constraints.rect.caching.RectDigest; -import mightypork.utils.math.constraints.vect.Vect; -import mightypork.utils.math.timing.FpsMeter; - -import org.lwjgl.BufferUtils; -import org.lwjgl.LWJGLException; -import org.lwjgl.opengl.Display; -import org.lwjgl.opengl.DisplayMode; -import org.lwjgl.opengl.GL11; - - -/** - * LWJGL rendering module - * - * @author MightyPork - */ -public class LwjglGraphicsModule extends GraphicsModule { - - /** Currently binded color */ - private Color activeColor = null; - /** Currently binded color's alpha multiplier */ - private double activeColorAlpha = 1; - /** Stack of pushed colors */ - private Stack colorPushStack = new Stack<>(); - /** Currently binded texture */ - private SlickTexture activeTexture; - - /** Display mode used currently for the window */ - private DisplayMode windowDisplayMode; - /** FPS the user wants */ - private int targetFps; - /** FPS meter used for measuring actual FPS */ - private FpsMeter fpsMeter = new FpsMeter(); - - /** Flag that at the end of frame, fullscreen should be toggled. */ - private boolean fullscreenToggleRequested; - /** Flag that at the end of frame, fullscreen should be set. */ - private boolean fullscreenSetRequested; - /** State to which fullscreen should be set. */ - private boolean fullscreenSetState; - - /** Current screen size */ - private static final Vect screenSize = new Vect() { - - @Override - public double y() - { - return Display.getHeight(); - } - - - @Override - public double x() - { - return Display.getWidth(); - } - }; - - /** Current screen rectangle */ - 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) - { - setColor(color, 1); - } - - - @Override - public void setColor(Color color, double alpha) - { - if (color == null) color = RGB.WHITE; - - // color components can change over time - must use equals() - if (activeColorAlpha == alpha && color.equals(activeColor)) return; - - activeColor = color; - activeColorAlpha = alpha; - GL11.glColor4d(color.r(), color.g(), color.b(), alpha * color.a()); - } - - - @Override - public void translate(double x, double y) - { - glTranslated(x, y, 0); - } - - - @Override - public void translate(double x, double y, double z) - { - glTranslated(x, y, z); - } - - - @Override - public void translate(Vect offset) - { - glTranslated(offset.x(), offset.y(), offset.z()); - } - - - @Override - public void translateXY(Vect offset) - { - glTranslated(offset.x(), offset.y(), 0); - } - - - @Override - public void scale(double x, double y) - { - glScaled(x, y, 0); - } - - - @Override - public void scale(double x, double y, double z) - { - glScaled(x, y, z); - } - - - @Override - public void scale(Vect scale) - { - glScaled(scale.x(), scale.y(), scale.z()); - } - - - @Override - public void scaleXY(double scale) - { - glScaled(scale, scale, 1); - } - - - @Override - public void scaleX(double scale) - { - glScaled(scale, 1, 1); - } - - - @Override - public void scaleY(double scale) - { - glScaled(1, scale, 1); - } - - - @Override - public void scaleZ(double scale) - { - glScaled(1, 1, scale); - } - - - @Override - public void rotateX(double angle) - { - rotate(angle, AXIS_X); - } - - - @Override - public void rotateY(double angle) - { - rotate(angle, AXIS_Y); - } - - - @Override - public void rotateZ(double angle) - { - rotate(angle, AXIS_Z); - } - - - @Override - public void rotate(double angle, Vect axis) - { - final Vect vec = axis.norm(1); - glRotated(angle, vec.x(), vec.y(), vec.z()); - } - - - @Override - public void pushState() - { - GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GL11.glPushClientAttrib(GL11.GL_ALL_CLIENT_ATTRIB_BITS); - GL11.glPushMatrix(); - } - - - @Override - public void popState() - { - GL11.glPopMatrix(); - GL11.glPopClientAttrib(); - GL11.glPopAttrib(); - } - - - @Override - public void pushGeometry() - { - GL11.glPushMatrix(); - } - - - @Override - public void popGeometry() - { - GL11.glPopMatrix(); - } - - - @Override - public void pushColor() - { - colorPushStack.push(activeColor); - } - - - @Override - public void popColor() - { - setColor(colorPushStack.pop()); - } - - - @Override - public void quad(Rect rect) - { - final RectDigest q = rect.digest(); - - // disable texture - if (activeTexture != null) { - activeTexture = null; - glDisable(GL_TEXTURE_2D); - } - - // quad - glBegin(GL_QUADS); - glVertex2d(q.left, q.bottom); - glVertex2d(q.right, q.bottom); - glVertex2d(q.right, q.top); - glVertex2d(q.left, q.top); - glEnd(); - } - - - @Override - public void quad(Rect rect, Color color) - { - setColor(color); - quad(rect); - } - - - @Override - public void quad(Rect rect, Grad grad) - { - final RectDigest r = rect.digest(); - - // disable texture - if (activeTexture != null) { - activeTexture = null; - glDisable(GL_TEXTURE_2D); - } - - // quad - glBegin(GL_QUADS); - setColor(grad.leftBottom); - glVertex2d(r.left, r.bottom); - - setColor(grad.rightBottom); - glVertex2d(r.right, r.bottom); - - setColor(grad.rightTop); - glVertex2d(r.right, r.top); - - setColor(grad.leftTop); - glVertex2d(r.left, r.top); - glEnd(); - } - - - @Override - public void quad(Rect rect, TxQuad txquad) - { - quad(rect, txquad, RGB.WHITE); - } - - - @Override - public void quad(Rect rect, TxQuad txquad, Color color) - { - // texture is loaded uniquely -> can compare with == - if (activeTexture != txquad.tx) { - glEnable(GL_TEXTURE_2D); - activeTexture = (SlickTexture) txquad.tx; - activeTexture.bind(); - } - - glBegin(GL_QUADS); - setColor(color); - - final RectDigest q = rect.digest(); - final RectDigest u = txquad.uvs.digest(); - - final double offs = 0.0001;// hack to avoid white stitching - - double tL = u.left + offs, tR = u.right - offs, tT = u.top + offs, tB = u.bottom - offs; - - // handle flip - if (txquad.isFlippedY()) { - final double swap = tT; - tT = tB; - tB = swap; - } - - if (txquad.isFlippedX()) { - final double swap = tL; - tL = tR; - tR = swap; - } - - final double w = activeTexture.getWidth01(); - final double h = activeTexture.getHeight01(); - - // quad with texture - glTexCoord2d(tL * w, tB * h); - glVertex2d(q.left, q.bottom); - - glTexCoord2d(tR * w, tB * h); - glVertex2d(q.right, q.bottom); - - glTexCoord2d(tR * w, tT * h); - glVertex2d(q.right, q.top); - - glTexCoord2d(tL * w, tT * h); - glVertex2d(q.left, q.top); - - glEnd(); - } - - - @Override - public void setupProjection() - { - // fix projection for changed size - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - int w = Display.getWidth(); - int h = Display.getHeight(); - - glViewport(0, 0, w, h); - glOrtho(0, w, h, 0, -1000, 1000); - - // back to modelview - glMatrixMode(GL_MODELVIEW); - - glLoadIdentity(); - - glDisable(GL_LIGHTING); - - glClearDepth(1f); - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LEQUAL); - - glEnable(GL_NORMALIZE); - - glShadeModel(GL_SMOOTH); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - - - @Override - public DeferredTexture getLazyTexture(String path) - { - return new SlickTexture(path); - } - - - @Override - public void destroy() - { - Display.destroy(); - } - - - @Override - public void setTargetFps(int fps) - { - this.targetFps = fps; - } - - - @Override - public void setFullscreen(boolean fs) - { - fullscreenSetRequested = true; - fullscreenSetState = fs; - } - - - @Override - public void switchFullscreen() - { - fullscreenToggleRequested = true; - } - - - @Override - public boolean isFullscreen() - { - return Display.isFullscreen(); - } - - - private void doToggleFullscreen() - { - doSetFullscreen(!Display.isFullscreen()); - } - - - private void doSetFullscreen(boolean fs) - { - try { - - if (Display.isFullscreen() == fs) return; // no work - - if (fs) { - Log.f3("Entering fullscreen."); - // save window resize - windowDisplayMode = new DisplayMode(Display.getWidth(), Display.getHeight()); - - Display.setDisplayMode(Display.getDesktopDisplayMode()); - Display.setFullscreen(true); - Display.update(); - } else { - Log.f3("Leaving fullscreen."); - Display.setDisplayMode(windowDisplayMode); - Display.update(); - } - - App.bus().send(new ViewportChangeEvent(getSize())); - - } catch (final Throwable t) { - Log.e("Failed to change fullscreen mode.", t); - try { - Display.setDisplayMode(windowDisplayMode); - Display.update(); - } catch (final Throwable t1) { - throw new RuntimeException("Failed to revert failed fullscreen toggle.", t1); - } - } - } - - - @Override - public Screenshot takeScreenshot() - { - glReadBuffer(GL_FRONT); - final int width = Display.getWidth(); - final int height = Display.getHeight(); - final int bpp = 4; - final ByteBuffer buffer = BufferUtils.createByteBuffer(width * height * bpp); - glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); - - final AwtScreenshot sc = new AwtScreenshot(width, height, bpp, buffer); - - return sc; - } - - - @Override - public void beginFrame() - { - // handle resize - if (Display.wasResized()) { - App.bus().send(new ViewportChangeEvent(getSize())); - } - - if (fullscreenToggleRequested) { - fullscreenToggleRequested = false; - doToggleFullscreen(); - } - - if (fullscreenSetRequested) { - fullscreenSetRequested = false; - doSetFullscreen(fullscreenSetState); - } - - glLoadIdentity(); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - fpsMeter.frame(); - } - - - @Override - public void endFrame() - { - Display.update(false); // don't poll input devices - Display.sync(targetFps); - } - - - @Override - public void setSize(int width, int height) - { - try { - Display.setDisplayMode(windowDisplayMode = new DisplayMode(width, height)); - } catch (LWJGLException e) { - throw new RuntimeException(e); - } - } - - - @Override - public void setTitle(String title) - { - Display.setTitle(title); - } - - - @Override - public void setVSync(boolean vsync) - { - Display.setVSyncEnabled(vsync); - } - - - @Override - public void setResizable(boolean resizable) - { - Display.setResizable(resizable); - } - - - @Override - public Rect getRect() - { - return rect; - } - - - @Override - public long getFps() - { - return fpsMeter.getFPS(); - } - - - @Override - public Vect getCenter() - { - return rect.center(); - } - - - @Override - public int getWidth() - { - return Display.getWidth(); - } - - - @Override - public int getHeight() - { - return Display.getHeight(); - } - - - @Override - public Vect getSize() - { - return screenSize; - } - -} diff --git a/src/mightypork/gamecore/backends/lwjgl/graphics/SlickTexture.java b/src/mightypork/gamecore/backends/lwjgl/graphics/SlickTexture.java deleted file mode 100644 index 2498c4b..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/graphics/SlickTexture.java +++ /dev/null @@ -1,194 +0,0 @@ -package mightypork.gamecore.backends.lwjgl.graphics; - - -import java.io.IOException; - -import mightypork.gamecore.graphics.textures.DeferredTexture; -import mightypork.gamecore.resources.loading.MustLoadInRenderingContext; -import mightypork.utils.annotations.Alias; -import mightypork.utils.exceptions.IllegalValueException; -import mightypork.utils.files.FileUtil; -import mightypork.utils.logging.Log; - -import org.lwjgl.opengl.GL11; -import org.newdawn.slick.opengl.Texture; -import org.newdawn.slick.opengl.TextureLoader; - - -/** - * Deferred texture - * - * @author Ondřej Hruška (MightyPork) - */ -@Alias(name = "Texture") -@MustLoadInRenderingContext -public class SlickTexture extends DeferredTexture { - - private org.newdawn.slick.opengl.Texture backingTexture; - private boolean alpha; - private boolean alphal; - - - /** - * @param resourcePath resource path - */ - public SlickTexture(String resourcePath) { - super(resourcePath); - } - - - @Override - protected synchronized void loadResource(String path) - { - try { - final String ext = FileUtil.getExtension(path).toUpperCase(); - - final int filtering; - switch (filter) { - case NEAREST: - filtering = GL11.GL_NEAREST; - break; - case LINEAR: - filtering = GL11.GL_LINEAR; - break; - default: - throw new IllegalValueException("Unsupported filtering mode."); - } - - final Texture texture = TextureLoader.getTexture(ext, FileUtil.getResource(path), false, filtering); - - if (texture == null) { - Log.w("Texture " + path + " could not be loaded."); - } - - backingTexture = texture; - - } catch (final IOException e) { - Log.e("Loading of texture " + path + " failed.", e); - throw new RuntimeException("Could not load texture " + path + ".", e); - } - } - - - @Override - public boolean hasAlpha() - { - if (!ensureLoaded()) return false; - - if (!alphal) { - alphal = true; - alpha = backingTexture.hasAlpha(); - } - - return alpha; - } - - - /** - * Bind to GL context, applying the filters prescribed. - */ - public void bind() - { - if (!ensureLoaded()) return; - - //GL11.glEnable(GL11.GL_TEXTURE_2D); - - GL11.glBindTexture(GL11.GL_TEXTURE_2D, getTextureID()); - - GL11.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); - - final int wrapping; - switch (wrap) { - case CLAMP: - wrapping = GL11.GL_CLAMP; - break; - case REPEAT: - wrapping = GL11.GL_REPEAT; - break; - default: - throw new IllegalValueException("Unsupported wrapping mode."); - } - - GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, wrapping); - GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, wrapping); - - final int filtering; - switch (filter) { - case NEAREST: - filtering = GL11.GL_NEAREST; - break; - case LINEAR: - filtering = GL11.GL_LINEAR; - break; - default: - throw new IllegalValueException("Unsupported filtering mode."); - } - - GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filtering); - GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filtering); - } - - - @Override - public int getImageHeight() - { - if (!ensureLoaded()) return 0; - - return backingTexture.getImageHeight(); - } - - - @Override - public int getImageWidth() - { - if (!ensureLoaded()) return 0; - - return backingTexture.getImageWidth(); - } - - - @Override - public void destroy() - { - if (!isLoaded()) return; - - backingTexture.release(); - } - - - /** - * Get the height of the texture, 0..1.
- * - * @return height 0..1 - */ - public float getHeight01() - { - if (!ensureLoaded()) return 0; - - return backingTexture.getHeight(); - } - - - /** - * Get the width of the texture, 0..1.
- * - * @return width 0..1 - */ - public float getWidth01() - { - if (!ensureLoaded()) return 0; - - return backingTexture.getWidth(); - } - - - /** - * @return OpenGL texture ID - */ - public int getTextureID() - { - if (!ensureLoaded()) return -1; - - return backingTexture.getTextureID(); - } -} diff --git a/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFont.java b/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFont.java deleted file mode 100644 index 127b203..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFont.java +++ /dev/null @@ -1,143 +0,0 @@ -package mightypork.gamecore.backends.lwjgl.graphics.font; - - -import java.awt.Font; -import java.awt.FontFormatException; -import java.io.IOException; -import java.io.InputStream; - -import mightypork.gamecore.graphics.fonts.DeferredFont; -import mightypork.gamecore.graphics.fonts.IFont; -import mightypork.gamecore.resources.loading.MustLoadInRenderingContext; -import mightypork.utils.annotations.Alias; -import mightypork.utils.files.FileUtil; -import mightypork.utils.math.color.Color; -import mightypork.utils.math.constraints.vect.Vect; - - -/** - * Font obtained from a resource file (TTF). - * - * @author Ondřej Hruška (MightyPork) - */ -@MustLoadInRenderingContext -@Alias(name = "Font") -public class DeferredLwjglFont extends DeferredFont { - - private IFont font = null; - - - /** - * A font from resource - * - * @param resourcePath resource to load - * @param chars chars to load; null to load basic chars only - * @param size size (px) - */ - public DeferredLwjglFont(String resourcePath, String chars, double size) { - super(resourcePath); - this.size = size; - this.chars = chars; - } - - - @Override - protected synchronized final void loadResource(String path) throws IOException - { - final Font awtFont = getAwtFont(path, (float) size, style.numval); - - font = new LwjglTextureBackedFont(awtFont, antialias, filter, chars); - font.setDiscardRatio(discardTop, discardBottom); - } - - - /** - * Get a font for a resource path / name - * - * @param resource resource to load - * @param size font size (pt) - * @param style font style - * @return the {@link Font} - * @throws IOException - */ - protected Font getAwtFont(String resource, float size, int style) throws IOException - { - try (InputStream in = FileUtil.getResource(resource)) { - - Font awtFont = Font.createFont(Font.TRUETYPE_FONT, in); - - awtFont = awtFont.deriveFont(size); - awtFont = awtFont.deriveFont(style); - - return awtFont; - } catch (final FontFormatException e) { - throw new IOException("Could not load font, bad format.", e); - } - } - - - /** - * Draw string - * - * @param str string to draw - * @param color draw color - */ - @Override - public void draw(String str, Color color) - { - if (!ensureLoaded()) return; - - font.draw(str, color); - } - - - /** - * Get size needed to render give string - * - * @param text string to check - * @return coord (width, height) - */ - @Override - public Vect getNeededSpace(String text) - { - if (!ensureLoaded()) return Vect.ZERO; - - return font.getNeededSpace(text); - } - - - /** - * @return font height - */ - @Override - public int getLineHeight() - { - if (!ensureLoaded()) return 0; - - return font.getLineHeight(); - } - - - @Override - public int getFontSize() - { - if (!ensureLoaded()) return 0; - - return font.getFontSize(); - } - - - @Override - public int getWidth(String text) - { - return font.getWidth(text); - } - - - @Override - public void destroy() - { - // this will have to suffice - font = null; - } -} diff --git a/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFontFromSystem.java b/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFontFromSystem.java deleted file mode 100644 index 841b15b..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/graphics/font/DeferredLwjglFontFromSystem.java +++ /dev/null @@ -1,36 +0,0 @@ -package mightypork.gamecore.backends.lwjgl.graphics.font; - - -import java.awt.Font; -import java.io.IOException; - -import mightypork.utils.annotations.Alias; - - -/** - * Font obtained from the OS - * - * @author Ondřej Hruška (MightyPork) - */ -@Alias(name = "FontNative") -public class DeferredLwjglFontFromSystem extends DeferredLwjglFont { - - /** - * A font from OS, found by name - * - * @param fontName font family name - * @param chars chars to load; null to load basic chars only - * @param size size (pt) - */ - public DeferredLwjglFontFromSystem(String fontName, String chars, double size) { - super(fontName, chars, size); - } - - - @Override - protected Font getAwtFont(String resource, float size, int style) throws IOException - { - return new Font(resource, style, (int) size); - } - -} diff --git a/src/mightypork/gamecore/backends/lwjgl/graphics/font/LwjglTextureBackedFont.java b/src/mightypork/gamecore/backends/lwjgl/graphics/font/LwjglTextureBackedFont.java deleted file mode 100644 index 6042349..0000000 --- a/src/mightypork/gamecore/backends/lwjgl/graphics/font/LwjglTextureBackedFont.java +++ /dev/null @@ -1,494 +0,0 @@ -package mightypork.gamecore.backends.lwjgl.graphics.font; - - -import static org.lwjgl.opengl.GL11.*; - -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.DataBufferInt; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.IntBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import mightypork.gamecore.graphics.fonts.IFont; -import mightypork.gamecore.graphics.textures.FilterMode; -import mightypork.utils.exceptions.IllegalValueException; -import mightypork.utils.logging.Log; -import mightypork.utils.math.color.Color; -import mightypork.utils.math.constraints.vect.Vect; -import mightypork.utils.math.constraints.vect.VectConst; - -import org.lwjgl.BufferUtils; -import org.lwjgl.util.glu.GLU; -import org.newdawn.slick.opengl.GLUtils; - - -/** - * A TrueType font renderer with backing texture. - * - * @author James Chambers (Jimmy) - * @author Jeremy Adams (elias4444) - * @author Kevin Glass (kevglass) - * @author Peter Korzuszek (genail) - * @author David Aaron Muhar (bobjob) - * @author Ondřej Hruška (MightyPork) - */ -public class LwjglTextureBackedFont implements IFont { - - private class CharTile { - - public int width; - public int height; - public int texPosX; - public int texPosY; - } - - /* char bank */ - private final Map chars = new HashMap<>(255); - - /* use antialiasing for rendering */ - private final boolean antiAlias; - - /* loaded font size (requested) */ - private final int fontSize; - - /* actual height of drawn glyphs */ - private int fontHeight; - - /* texture id */ - private int textureID; - - /* texture width */ - private int textureWidth; - - /* texture height */ - private int textureHeight; - - /* AWT font source */ - private final java.awt.Font font; - - private final FilterMode filter; - - private double discardTop; - - private double discardBottom; - - - /** - * Make a font - * - * @param font original awt font to load - * @param antialias use antialiasing when rendering to cache texture - * @param filter used Gl filter - * @param chars chars to load - */ - public LwjglTextureBackedFont(java.awt.Font font, boolean antialias, FilterMode filter, String chars) { - this(font, antialias, filter, (" " + chars).toCharArray()); - } - - - /** - * Make a font - * - * @param font original awt font to load - * @param antialias use antialiasing when rendering to cache texture - * @param filter used Gl filter - * @param chars chars to load - */ - public LwjglTextureBackedFont(java.awt.Font font, boolean antialias, FilterMode filter, char[] chars) { - GLUtils.checkGLContext(); - - this.font = font; - this.filter = filter; - this.fontSize = font.getSize(); - this.antiAlias = antialias; - - createSet(chars); - } - - - /** - * Create a BufferedImage of the given character - * - * @param ch the character - * @return BufferedImage containing the drawn character - */ - private BufferedImage getFontImage(char ch) - { - FontMetrics metrics; - BufferedImage img; - Graphics2D g; - - // Create a temporary image to extract the character's size - img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); - - g = (Graphics2D) img.getGraphics(); - if (antiAlias == true) g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setFont(font); - - metrics = g.getFontMetrics(); - - final int charwidth = Math.max(1, metrics.charWidth(ch)); - final int charheight = Math.max(fontSize, metrics.getHeight()); - - // Create another image holding the character we are creating - final BufferedImage fontImage = new BufferedImage(charwidth, charheight, BufferedImage.TYPE_INT_ARGB); - - g = (Graphics2D) fontImage.getGraphics(); - if (antiAlias == true) g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setFont(font); - g.setColor(java.awt.Color.WHITE); - g.drawString(String.valueOf(ch), 0, metrics.getAscent()); - - return fontImage; - } - - - private void createSet(char[] charsToLoad) - { - try { - class LoadedGlyph { - - public char c; - public BufferedImage image; - public int width; - public int height; - - - public LoadedGlyph(char c, BufferedImage image) { - this.image = image; - this.c = c; - this.width = image.getWidth(); - this.height = image.getHeight(); - } - } - - final List glyphs = new ArrayList<>(); - final List loaded = new ArrayList<>(); - for (final char ch : charsToLoad) { - if (!loaded.contains(ch)) { - glyphs.add(new LoadedGlyph(ch, getFontImage(ch))); - loaded.add(ch); - } - } - - int lineHeight = 0; - - int beginX = 0, beginY = 0; - int canvasW = 128, canvasH = 128; - - boolean needsLarger = false; - - // find smallest 2^x size for texture - while (true) { - needsLarger = false; - - for (final LoadedGlyph glyph : glyphs) { - if (beginX + glyph.width > canvasW) { - beginY += lineHeight; - lineHeight = 0; - beginX = 0; - } - - if (lineHeight < glyph.height) { - lineHeight = glyph.height; - } - - if (beginY + lineHeight > canvasH) { - needsLarger = true; - break; - } - - // draw. - beginX += glyph.width; - } - - if (needsLarger) { - canvasW *= 2; - canvasH *= 2; - beginX = 0; - beginY = 0; - lineHeight = 0; - } else { - Log.f3(String.format("Generating font texture: %d×%d", canvasW, canvasH)); - break; - } - } - - textureWidth = canvasW; - textureHeight = canvasH; - - BufferedImage imag = new BufferedImage(textureWidth, textureHeight, BufferedImage.TYPE_INT_ARGB); - final Graphics2D g = (Graphics2D) imag.getGraphics(); - - g.setColor(new java.awt.Color(0, 0, 0, 1)); - g.fillRect(0, 0, textureWidth, textureHeight); - - int rowHeight = 0, posX = 0, posY = 0; - - for (final LoadedGlyph glyph : glyphs) { - final CharTile cht = new CharTile(); - - cht.width = glyph.width; - cht.height = glyph.height; - - if (posX + cht.width >= textureWidth) { - posX = 0; - posY += rowHeight; - rowHeight = 0; - } - - cht.texPosX = posX; - cht.texPosY = posY; - - if (cht.height > fontHeight) { - fontHeight = cht.height; - } - - if (cht.height > rowHeight) { - rowHeight = cht.height; - } - - // Draw it here - g.drawImage(glyph.image, posX, posY, null); - - posX += cht.width; - - chars.put(glyph.c, cht); - } - - textureID = loadImage(imag); - - imag = null; - - } catch (final Throwable t) { - Log.e("Failed to load font.", t); - } - } - - - private int loadImage(BufferedImage bufferedImage) - { - try { - final short width = (short) bufferedImage.getWidth(); - final short height = (short) bufferedImage.getHeight(); - final int bpp = (byte) bufferedImage.getColorModel().getPixelSize(); - - ByteBuffer byteBuffer; - final DataBuffer db = bufferedImage.getData().getDataBuffer(); - if (db instanceof DataBufferInt) { - final int intI[] = ((DataBufferInt) (bufferedImage.getData().getDataBuffer())).getData(); - final byte newI[] = new byte[intI.length * 4]; - for (int i = 0; i < intI.length; i++) { - final byte b[] = intToByteArray(intI[i]); - final int newIndex = i * 4; - - newI[newIndex] = b[1]; - newI[newIndex + 1] = b[2]; - newI[newIndex + 2] = b[3]; - newI[newIndex + 3] = b[0]; - } - - byteBuffer = ByteBuffer.allocateDirect(width * height * (bpp / 8)).order(ByteOrder.nativeOrder()).put(newI); - } else { - byteBuffer = ByteBuffer.allocateDirect(width * height * (bpp / 8)).order(ByteOrder.nativeOrder()).put(((DataBufferByte) (bufferedImage.getData().getDataBuffer())).getData()); - } - - byteBuffer.flip(); - - final int internalFormat = GL_RGBA8, format = GL_RGBA; - final IntBuffer textureId = BufferUtils.createIntBuffer(1); - - glGenTextures(textureId); - glBindTexture(GL_TEXTURE_2D, textureId.get(0)); - - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - - final int filtering; - switch (filter) { - case NEAREST: - filtering = GL_NEAREST; - break; - case LINEAR: - filtering = GL_LINEAR; - break; - default: - throw new IllegalValueException("Unsupported filtering mode."); - } - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering); - - GLU.gluBuild2DMipmaps(GL_TEXTURE_2D, internalFormat, width, height, format, GL_UNSIGNED_BYTE, byteBuffer); - return textureId.get(0); - - } catch (final Throwable t) { - Log.e("Failed to load font.", t); - } - - return -1; - } - - - private static byte[] intToByteArray(int value) - { - return new byte[] { (byte) (value >>> 24), (byte) (value >>> 16), (byte) (value >>> 8), (byte) value }; - } - - - /** - * Get size needed to draw given string - * - * @param text drawn text - * @return needed width - */ - @Override - public int getWidth(String text) - { - int totalwidth = 0; - CharTile ch = null; - for (int i = 0; i < text.length(); i++) { - - ch = chars.get(text.charAt(i)); - - if (ch != null) totalwidth += ch.width; - } - return totalwidth; - } - - - @Override - public int getLineHeight() - { - return (int) Math.round(fontHeight * ((1 - discardTop) - discardBottom)); - } - - - @Override - public int getFontSize() - { - return fontSize; - } - - - @Override - public void draw(String text, Color color) - { - GLUtils.checkGLContext(); - - // PUSH - glPushAttrib(GL_ENABLE_BIT); - - glEnable(GL_TEXTURE_2D); - - glBindTexture(GL_TEXTURE_2D, textureID); - - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - - final int filtering; - switch (filter) { - case NEAREST: - filtering = GL_NEAREST; - break; - case LINEAR: - filtering = GL_LINEAR; - break; - default: - throw new IllegalValueException("Unsupported filtering mode."); - } - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering); - - glColor4d(color.r(), color.g(), color.b(), color.a()); - - glBegin(GL_QUADS); - - CharTile chtx = null; - char charCurrent; - int minx = 0; - - for (int i = 0; i < text.length(); i++) { - charCurrent = text.charAt(i); - - chtx = chars.get(charCurrent); - - if (chtx != null) { - - // draw quad - - final float txmin = chtx.texPosX; - final float tymin = chtx.texPosY; - final float draw_width = minx + chtx.width - minx; - final float draw_height = chtx.height; - final float drawy0 = (float) (0f - draw_height * discardTop); - - final float txmin01 = txmin / textureWidth; - final float tymin01 = tymin / textureHeight; - final float twidth01 = ((chtx.texPosX + chtx.width - txmin) / textureWidth); - final float theight01 = ((chtx.texPosY + chtx.height - tymin) / textureHeight); - - glTexCoord2f(txmin01, tymin01); - glVertex2f(minx, drawy0); - - glTexCoord2f(txmin01, tymin01 + theight01); - glVertex2f(minx, drawy0 + draw_height); - - glTexCoord2f(txmin01 + twidth01, tymin01 + theight01); - glVertex2f(minx + draw_width, drawy0 + draw_height); - - glTexCoord2f(txmin01 + twidth01, tymin01); - glVertex2f(minx + draw_width, drawy0); - minx += chtx.width; - } - } - - glEnd(); - - // POP - glPopAttrib(); - } - - - @Override - public VectConst getNeededSpace(String text) - { - return Vect.make(getWidth(text), getLineHeight()); - } - - - @Override - public void setDiscardRatio(double top, double bottom) - { - discardTop = top; - discardBottom = bottom; - } - - - @Override - public double getTopDiscardRatio() - { - return discardTop; - } - - - @Override - public double getBottomDiscardRatio() - { - return discardBottom; - } -}