diff --git a/src/mightypork/rogue/App.java b/src/mightypork/rogue/App.java index b81ab37..17caa49 100644 --- a/src/mightypork/rogue/App.java +++ b/src/mightypork/rogue/App.java @@ -14,12 +14,12 @@ import mightypork.rogue.input.InputSystem; import mightypork.rogue.input.KeyStroke; import mightypork.rogue.sounds.SoundSystem; import mightypork.rogue.tasks.TaskTakeScreenshot; +import mightypork.rogue.textures.TextureRegistry; import mightypork.rogue.util.Utils; -import mightypork.utils.control.Destroyable; import mightypork.utils.control.bus.EventBus; +import mightypork.utils.control.bus.events.DestroyEvent; +import mightypork.utils.control.bus.events.UpdateEvent; import mightypork.utils.control.timing.TimerDelta; -import mightypork.utils.control.timing.UpdateEvent; -import mightypork.utils.control.timing.Updateable; import mightypork.utils.logging.Log; import mightypork.utils.logging.LogInstance; @@ -31,15 +31,17 @@ import org.lwjgl.input.Keyboard; * * @author MightyPork */ -public class App implements Destroyable, AppAccess { +public class App implements AppAccess { /** instance pointer */ private static App inst; - private InputSystem input; - private SoundSystem sounds; - private DisplaySystem display; - private EventBus events; + // modules + private InputSystem inputSystem; + private SoundSystem soundSystem; + private DisplaySystem displaySystem; + private EventBus eventBus; + private TextureRegistry textureRegistry; /** current screen */ private Screen screen; @@ -50,6 +52,9 @@ public class App implements Destroyable, AppAccess { /** Log instance; accessible as static via Log. */ private LogInstance log; + /** timer */ + private TimerDelta timerRender; + /** * @param args @@ -71,6 +76,43 @@ public class App implements Destroyable, AppAccess { } + /** + * Start the application + */ + private void start() + { + initialize(); + mainLoop(); + shutdown(); + } + + + /** + * App main loop + */ + private void mainLoop() + { + screen = new TestLayeredScreen(this); + + screen.setActive(true); + + timerRender = new TimerDelta(); + + while (!displaySystem.isCloseRequested()) { + displaySystem.beginFrame(); + + eventBus.broadcast(new UpdateEvent(timerRender.getDelta())); + + if (scheduledScreenshot) { + takeScreenshot(); + scheduledScreenshot = false; + } + + displaySystem.endFrame(); + } + } + + /** * Handle a crash * @@ -87,7 +129,8 @@ public class App implements Destroyable, AppAccess { @Override public void shutdown() { - destroy(); + bus().broadcast(new DestroyEvent()); + System.exit(0); } @@ -95,21 +138,33 @@ public class App implements Destroyable, AppAccess { public void initialize() { Log.i("Initializing subsystems"); + + // lock working directory initLock(); - initBus(); - initLogger(); - initDisplay(); - initSound(); - initInput(); - } - - - @Override - public void destroy() - { - if (sounds != null) sounds.destroy(); - if (input != null) input.destroy(); - if (display != null) display.destroy(); + + // setup logging + log = Log.create("runtime", Paths.LOGS, 10); + log.enable(Config.LOGGING_ENABLED); + log.enableSysout(Config.LOG_TO_STDOUT); + + // event bus + eventBus = new EventBus(); + + // Subsystems + textureRegistry = new TextureRegistry(this); + + displaySystem = new DisplaySystem(this); + displaySystem.createMainWindow(Const.WINDOW_W, Const.WINDOW_H, true, Config.START_IN_FS, Const.TITLEBAR); + displaySystem.setTargetFps(Const.FPS_RENDER); + + soundSystem = new SoundSystem(this); + soundSystem.setMasterVolume(1); + + inputSystem = new InputSystem(this); + setupGlobalKeystrokes(); + + // load resources + Resources.load(this); } @@ -170,34 +225,9 @@ public class App implements Destroyable, AppAccess { /** * initialize inputs */ - private void initBus() - { - events = new EventBus(); - events.subscribe(this); - - events.createChannel(UpdateEvent.class, Updateable.class); - } - - - /** - * initialize sound system - */ - private void initSound() - { - sounds = new SoundSystem(this); - - sounds.setMasterVolume(1); - } - - - /** - * initialize inputs - */ - private void initInput() + private void setupGlobalKeystrokes() { - input = new InputSystem(this); - - input.bindKeyStroke(new KeyStroke(Keyboard.KEY_F2), new Runnable() { + inputSystem.bindKeyStroke(new KeyStroke(Keyboard.KEY_F2), new Runnable() { @Override public void run() @@ -207,17 +237,17 @@ public class App implements Destroyable, AppAccess { } }); - input.bindKeyStroke(new KeyStroke(false, Keyboard.KEY_F11), new Runnable() { + inputSystem.bindKeyStroke(new KeyStroke(false, Keyboard.KEY_F11), new Runnable() { @Override public void run() { Log.f3("F11, toggling fullscreen."); - display.switchFullscreen(); + displaySystem.switchFullscreen(); } }); - input.bindKeyStroke(new KeyStroke(Keyboard.KEY_LCONTROL, Keyboard.KEY_Q), new Runnable() { + inputSystem.bindKeyStroke(new KeyStroke(Keyboard.KEY_LCONTROL, Keyboard.KEY_Q), new Runnable() { @Override public void run() @@ -229,75 +259,13 @@ public class App implements Destroyable, AppAccess { } - /** - * initialize display - */ - private void initDisplay() - { - display = new DisplaySystem(this); - - display.createMainWindow(Const.WINDOW_W, Const.WINDOW_H, true, Config.START_IN_FS, Const.TITLEBAR); - display.setTargetFps(Const.FPS_RENDER); - } - - - /** - * initialize main logger - */ - private void initLogger() - { - log = Log.create("runtime", Paths.LOGS, 10); - log.enable(Config.LOGGING_ENABLED); - log.enableSysout(Config.LOG_TO_STDOUT); - } - - - private void start() - { - initialize(); - - mainLoop(); - - shutdown(); - } - - /** timer */ - private TimerDelta timerRender; - - - /** - * App main loop - */ - private void mainLoop() - { - screen = new TestLayeredScreen(this); - - screen.setActive(true); - - timerRender = new TimerDelta(); - - while (!display.isCloseRequested()) { - display.beginFrame(); - - events.broadcast(new UpdateEvent(timerRender.getDelta())); - - if (scheduledScreenshot) { - takeScreenshot(); - scheduledScreenshot = false; - } - - display.endFrame(); - } - } - - /** * Do take a screenshot */ private void takeScreenshot() { - sounds.getEffect("gui.shutter").play(1); - Utils.runAsThread(new TaskTakeScreenshot(display)); + soundSystem.getEffect("gui.shutter").play(1); + Utils.runAsThread(new TaskTakeScreenshot(displaySystem)); } @@ -307,7 +275,7 @@ public class App implements Destroyable, AppAccess { @Override public SoundSystem snd() { - return sounds; + return soundSystem; } @@ -317,7 +285,7 @@ public class App implements Destroyable, AppAccess { @Override public InputSystem input() { - return input; + return inputSystem; } @@ -327,7 +295,7 @@ public class App implements Destroyable, AppAccess { @Override public DisplaySystem disp() { - return display; + return displaySystem; } @@ -337,7 +305,14 @@ public class App implements Destroyable, AppAccess { @Override public EventBus bus() { - return events; + return eventBus; + } + + + @Override + public TextureRegistry tx() + { + return textureRegistry; } } diff --git a/src/mightypork/rogue/AppAccess.java b/src/mightypork/rogue/AppAccess.java index d39294d..c7b06a9 100644 --- a/src/mightypork/rogue/AppAccess.java +++ b/src/mightypork/rogue/AppAccess.java @@ -4,6 +4,7 @@ package mightypork.rogue; import mightypork.rogue.display.DisplaySystem; import mightypork.rogue.input.InputSystem; import mightypork.rogue.sounds.SoundSystem; +import mightypork.rogue.textures.TextureRegistry; import mightypork.utils.control.bus.EventBus; @@ -38,6 +39,12 @@ public interface AppAccess { abstract EventBus bus(); + /** + * @return texture registry + */ + abstract TextureRegistry tx(); + + /** * Quit to OS
* Destroy app & exit VM diff --git a/src/mightypork/rogue/AppAdapter.java b/src/mightypork/rogue/AppAdapter.java index 6b74612..2fcb046 100644 --- a/src/mightypork/rogue/AppAdapter.java +++ b/src/mightypork/rogue/AppAdapter.java @@ -4,6 +4,7 @@ package mightypork.rogue; import mightypork.rogue.display.DisplaySystem; import mightypork.rogue.input.InputSystem; import mightypork.rogue.sounds.SoundSystem; +import mightypork.rogue.textures.TextureRegistry; import mightypork.utils.control.bus.EventBus; @@ -58,4 +59,11 @@ public class AppAdapter implements AppAccess { app.shutdown(); } + + @Override + public TextureRegistry tx() + { + return app.tx(); + } + } diff --git a/src/mightypork/rogue/Resources.java b/src/mightypork/rogue/Resources.java new file mode 100644 index 0000000..2114a2e --- /dev/null +++ b/src/mightypork/rogue/Resources.java @@ -0,0 +1,33 @@ +package mightypork.rogue; + + +public class Resources { + + public static void load(AppAccess app) + { + + loadSounds(app); + + loadTextures(app); + + loadFonts(app); + } + + + private static void loadFonts(AppAccess app) + { + + } + + + private static void loadTextures(AppAccess app) + { + + } + + + private static void loadSounds(AppAccess app) + { + + } +} diff --git a/src/mightypork/rogue/bus/Subsystem.java b/src/mightypork/rogue/bus/Subsystem.java index 330ea4f..4c01200 100644 --- a/src/mightypork/rogue/bus/Subsystem.java +++ b/src/mightypork/rogue/bus/Subsystem.java @@ -2,9 +2,9 @@ package mightypork.rogue.bus; import mightypork.rogue.AppAccess; -import mightypork.utils.control.Destroyable; import mightypork.utils.control.bus.clients.DelegatingClient; import mightypork.utils.control.bus.clients.ToggleableClient; +import mightypork.utils.control.interf.Destroyable; /** @@ -27,8 +27,6 @@ public abstract class Subsystem extends ChildClient implements DelegatingClient, { deinit(); - setListening(false); - bus().unsubscribe(this); } diff --git a/src/mightypork/rogue/display/DisplaySystem.java b/src/mightypork/rogue/display/DisplaySystem.java index a6bca2d..26299f5 100644 --- a/src/mightypork/rogue/display/DisplaySystem.java +++ b/src/mightypork/rogue/display/DisplaySystem.java @@ -3,7 +3,6 @@ package mightypork.rogue.display; import static org.lwjgl.opengl.GL11.*; -import java.awt.image.BufferedImage; import java.nio.ByteBuffer; import mightypork.rogue.AppAccess; diff --git a/src/mightypork/rogue/display/LayeredScreen.java b/src/mightypork/rogue/display/LayeredScreen.java index 20af9e8..efcae16 100644 --- a/src/mightypork/rogue/display/LayeredScreen.java +++ b/src/mightypork/rogue/display/LayeredScreen.java @@ -4,7 +4,7 @@ package mightypork.rogue.display; import java.util.LinkedList; import mightypork.rogue.AppAccess; -import mightypork.utils.control.timing.Updateable; +import mightypork.utils.control.interf.Updateable; public abstract class LayeredScreen extends Screen { diff --git a/src/mightypork/rogue/display/Screen.java b/src/mightypork/rogue/display/Screen.java index e354339..4b469c2 100644 --- a/src/mightypork/rogue/display/Screen.java +++ b/src/mightypork/rogue/display/Screen.java @@ -8,7 +8,7 @@ import mightypork.rogue.bus.events.ScreenChangeEvent; import mightypork.rogue.input.KeyBinder; import mightypork.rogue.input.KeyBindingPool; import mightypork.rogue.input.KeyStroke; -import mightypork.utils.control.timing.Updateable; +import mightypork.utils.control.interf.Updateable; import mightypork.utils.math.constraints.ConstraintContext; import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Rect; diff --git a/src/mightypork/rogue/display/ScreenLayer.java b/src/mightypork/rogue/display/ScreenLayer.java index 59b26d1..bcc310e 100644 --- a/src/mightypork/rogue/display/ScreenLayer.java +++ b/src/mightypork/rogue/display/ScreenLayer.java @@ -3,7 +3,7 @@ package mightypork.rogue.display; import mightypork.rogue.bus.ChildClient; import mightypork.rogue.display.constraints.Renderable; -import mightypork.utils.control.timing.Updateable; +import mightypork.utils.control.interf.Updateable; import mightypork.utils.math.constraints.ConstraintContext; import mightypork.utils.math.coord.Rect; diff --git a/src/mightypork/rogue/display/constraints/ElementHolder.java b/src/mightypork/rogue/display/constraints/ElementHolder.java index c602c40..846e9d2 100644 --- a/src/mightypork/rogue/display/constraints/ElementHolder.java +++ b/src/mightypork/rogue/display/constraints/ElementHolder.java @@ -5,11 +5,18 @@ import java.util.LinkedList; import mightypork.rogue.AppAccess; import mightypork.rogue.bus.ChildClient; +import mightypork.utils.control.bus.EventBus; import mightypork.utils.math.constraints.ConstraintContext; import mightypork.utils.math.constraints.RectConstraint; import mightypork.utils.math.coord.Rect; +/** + * Bag for {@link RenderableWithContext} elements with constraints.
+ * Elements are exposed to {@link EventBus}. + * + * @author MightyPork + */ public class ElementHolder extends ChildClient implements ConstraintContext, RenderableWithContext { private LinkedList elements = new LinkedList(); @@ -67,8 +74,9 @@ public class ElementHolder extends ChildClient implements ConstraintContext, Ren /** * Add element to the holder. * - * @param elem - * @param constraint + * @param elem element; it's context will be set to the constraint. + * @param constraint Constraint to be used for the element. It's context + * will be set to this {@link ElementHolder} */ public void add(RenderableWithContext elem, RectConstraint constraint) { diff --git a/src/mightypork/rogue/display/screens/ScreenRegistry.java b/src/mightypork/rogue/display/screens/ScreenRegistry.java new file mode 100644 index 0000000..d37d7dd --- /dev/null +++ b/src/mightypork/rogue/display/screens/ScreenRegistry.java @@ -0,0 +1,22 @@ +package mightypork.rogue.display.screens; + + +import mightypork.rogue.AppAccess; +import mightypork.rogue.bus.Subsystem; + + +public class ScreenRegistry extends Subsystem { + + public ScreenRegistry(AppAccess app) { + super(app); + } + + + @Override + protected void deinit() + { + // TODO Auto-generated method stub + + } + +} diff --git a/src/mightypork/rogue/display/screens/ScreenTestAnimations.java b/src/mightypork/rogue/display/screens/ScreenTestAnimations.java deleted file mode 100644 index 664c382..0000000 --- a/src/mightypork/rogue/display/screens/ScreenTestAnimations.java +++ /dev/null @@ -1,186 +0,0 @@ -package mightypork.rogue.display.screens; - - -import java.util.Random; - -import mightypork.rogue.AppAccess; -import mightypork.rogue.bus.events.MouseButtonEvent; -import mightypork.rogue.display.Screen; -import mightypork.rogue.input.KeyStroke; -import mightypork.rogue.textures.Render; -import mightypork.utils.control.timing.animation.AnimDouble; -import mightypork.utils.control.timing.animation.AnimDoubleDeg; -import mightypork.utils.math.Polar; -import mightypork.utils.math.color.RGB; -import mightypork.utils.math.coord.Coord; -import mightypork.utils.math.easing.Easing; - -import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.Display; - - -public class ScreenTestAnimations extends Screen implements MouseButtonEvent.Listener { - - public ScreenTestAnimations(AppAccess app) { - super(app); - - bindKeyStroke(new KeyStroke(Keyboard.KEY_RIGHT), new Runnable() { - - @Override - public void run() - { - for (AnimDouble a : anims) { - a.animate(0, 1, 1 + rand.nextDouble() * 1); - } - } - }); - - bindKeyStroke(new KeyStroke(Keyboard.KEY_LEFT), new Runnable() { - - @Override - public void run() - { - for (AnimDouble a : anims) { - a.animate(1, 0, 1 + rand.nextDouble() * 1); - } - } - }); - } - - private Random rand = new Random(); - - private AnimDoubleDeg degAnim = new AnimDoubleDeg(0, Easing.ELASTIC_OUT); - - //@formatter:off - private AnimDouble[] anims = new AnimDouble[] { - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - new AnimDouble(0, Easing.BOUNCE_OUT), - -// new AnimDouble(0, Easing.NONE), -// new AnimDouble(0, Easing.LINEAR), -// -// new AnimDouble(0, Easing.QUADRATIC_IN), -// new AnimDouble(0, Easing.QUADRATIC_OUT), -// new AnimDouble(0, Easing.QUADRATIC_IN_OUT), -// -// new AnimDouble(0, Easing.CUBIC_IN), -// new AnimDouble(0, Easing.CUBIC_OUT), -// new AnimDouble(0, Easing.CUBIC_IN_OUT), -// -// new AnimDouble(0, Easing.QUADRATIC_IN), -// new AnimDouble(0, Easing.QUADRATIC_OUT), -// new AnimDouble(0, Easing.QUADRATIC_IN_OUT), -// -// new AnimDouble(0, Easing.QUINTIC_IN), -// new AnimDouble(0, Easing.QUINTIC_OUT), -// new AnimDouble(0, Easing.QUINTIC_IN_OUT), -// -// new AnimDouble(0, Easing.EXPO_IN), -// new AnimDouble(0, Easing.EXPO_OUT), -// new AnimDouble(0, Easing.EXPO_IN_OUT), -// -// new AnimDouble(0, Easing.SINE_IN), -// new AnimDouble(0, Easing.SINE_OUT), -// new AnimDouble(0, Easing.SINE_IN_OUT), -// -// new AnimDouble(0, Easing.CIRC_IN), -// new AnimDouble(0, Easing.CIRC_OUT), -// new AnimDouble(0, Easing.CIRC_IN_OUT), -// -// new AnimDouble(0, Easing.BOUNCE_IN), -// new AnimDouble(0, Easing.BOUNCE_OUT), -// new AnimDouble(0, Easing.BOUNCE_IN_OUT), -// -// new AnimDouble(0, Easing.BACK_IN), -// new AnimDouble(0, Easing.BACK_OUT), -// new AnimDouble(0, Easing.BACK_IN_OUT), -// -// new AnimDouble(0, Easing.ELASTIC_IN), -// new AnimDouble(0, Easing.ELASTIC_OUT), -// new AnimDouble(0, Easing.ELASTIC_IN_OUT), - }; - //@formatter:on - - @Override - protected void deinitScreen() - { - // no impl - } - - - @Override - protected void onScreenEnter() - { - // no impl - } - - - @Override - protected void onScreenLeave() - { - // no impl - } - - - @Override - protected void updateScreen(double delta) - { - degAnim.update(delta); - - for (AnimDouble a : anims) { - a.update(delta); - } - } - - - @Override - protected void renderScreen() - { - double screenH = Display.getHeight(); - double screenW = Display.getWidth(); - double perBoxH = screenH / anims.length; - double padding = perBoxH * 0.1; - double boxSide = perBoxH - padding * 2; - - for (int i = 0; i < anims.length; i++) { - AnimDouble a = anims[i]; - - Render.setColor(RGB.GREEN); - Render.quadSize(padding + a.getCurrentValue() * (screenW - perBoxH), screenH - perBoxH * i - perBoxH + padding, boxSide, boxSide); - } - - Render.setColor(RGB.YELLOW); - Render.translate(new Coord(Display.getWidth() / 2, Display.getHeight() / 2)); - Render.rotateZ(degAnim.getCurrentValue()); - Render.quadSize(-10, -10, 20, 200); - } - - - @Override - public void receive(MouseButtonEvent event) - { - if (event.isDown()) { - Coord vec = disp().getSize().half().vecTo(event.getPos()); - - Polar p = Polar.fromCoord(vec); - - degAnim.fadeTo(p.getAngleDeg() - 90, 1.5); - } - } - -} diff --git a/src/mightypork/rogue/display/screens/screenBouncy/BouncyBox.java b/src/mightypork/rogue/display/screens/screenBouncy/BouncyBox.java index 1dc83de..5fc40ac 100644 --- a/src/mightypork/rogue/display/screens/screenBouncy/BouncyBox.java +++ b/src/mightypork/rogue/display/screens/screenBouncy/BouncyBox.java @@ -7,14 +7,14 @@ import java.util.Random; import mightypork.rogue.display.constraints.RenderableWithContext; import mightypork.rogue.textures.Render; -import mightypork.utils.control.timing.Updateable; -import mightypork.utils.control.timing.animation.AnimDouble; +import mightypork.utils.control.interf.Updateable; +import mightypork.utils.math.animation.AnimDouble; +import mightypork.utils.math.animation.Easing; import mightypork.utils.math.color.RGB; import mightypork.utils.math.constraints.ConstraintContext; import mightypork.utils.math.constraints.NumConstraint; import mightypork.utils.math.constraints.RectConstraint; import mightypork.utils.math.coord.Rect; -import mightypork.utils.math.easing.Easing; public class BouncyBox implements RenderableWithContext, Updateable, ConstraintContext { @@ -29,13 +29,19 @@ public class BouncyBox implements RenderableWithContext, Updateable, ConstraintC public BouncyBox() { + // create box NumConstraint side = c_height(this); + RectConstraint abox = c_box_sized(this, side, side); + + // move NumConstraint move_length = c_sub(c_width(this), side); NumConstraint offset = c_mul(move_length, c_n(pos)); - RectConstraint abox = c_sizedBox(this, offset, c_n(0), side, side); - NumConstraint margin = c_percent(side, c_n(10)); - RectConstraint with_margin = c_shrink(abox, margin); - box = with_margin; + abox = c_move(abox, offset, c_n(0)); + + // add padding + abox = c_shrink(abox, c_percent(side, c_n(10))); + + box = abox; } diff --git a/src/mightypork/rogue/display/screens/screenBouncy/LayerBouncyBoxes.java b/src/mightypork/rogue/display/screens/screenBouncy/LayerBouncyBoxes.java index 79b2c7f..bd977c3 100644 --- a/src/mightypork/rogue/display/screens/screenBouncy/LayerBouncyBoxes.java +++ b/src/mightypork/rogue/display/screens/screenBouncy/LayerBouncyBoxes.java @@ -9,6 +9,7 @@ import java.util.List; import mightypork.rogue.display.Screen; import mightypork.rogue.display.ScreenLayer; import mightypork.rogue.display.constraints.ElementHolder; +import mightypork.utils.math.constraints.RectConstraint; public class LayerBouncyBoxes extends ScreenLayer { @@ -20,7 +21,9 @@ public class LayerBouncyBoxes extends ScreenLayer { public LayerBouncyBoxes(Screen screen) { super(screen); - layout = new ElementHolder(screen, c_shrink(this, c_percent(c_height(this), c_n(8)))); + RectConstraint holder_rect = c_shrink(this, c_percent(c_height(this), c_n(8))); + + layout = new ElementHolder(screen, holder_rect); addChildClient(layout); for (int i = 0; i < 32; i++) { diff --git a/src/mightypork/rogue/display/screens/screenTextures/ScreenTextureTest.java b/src/mightypork/rogue/display/screens/screenTextures/ScreenTextureTest.java new file mode 100644 index 0000000..c39e340 --- /dev/null +++ b/src/mightypork/rogue/display/screens/screenTextures/ScreenTextureTest.java @@ -0,0 +1,6 @@ +package mightypork.rogue.display.screens.screenTextures; + + +public class ScreenTextureTest { + +} diff --git a/src/mightypork/rogue/input/InputSystem.java b/src/mightypork/rogue/input/InputSystem.java index 946c44f..6a8445d 100644 --- a/src/mightypork/rogue/input/InputSystem.java +++ b/src/mightypork/rogue/input/InputSystem.java @@ -6,7 +6,7 @@ import mightypork.rogue.bus.Subsystem; import mightypork.rogue.bus.events.KeyboardEvent; import mightypork.rogue.bus.events.MouseButtonEvent; import mightypork.rogue.bus.events.MouseMotionEvent; -import mightypork.utils.control.timing.Updateable; +import mightypork.utils.control.interf.Updateable; import mightypork.utils.math.coord.Coord; import org.lwjgl.LWJGLException; diff --git a/src/mightypork/rogue/sounds/AudioX.java b/src/mightypork/rogue/sounds/AudioX.java index e309b38..aa9b887 100644 --- a/src/mightypork/rogue/sounds/AudioX.java +++ b/src/mightypork/rogue/sounds/AudioX.java @@ -1,7 +1,7 @@ package mightypork.rogue.sounds; -import mightypork.utils.control.Destroyable; +import mightypork.utils.control.interf.Destroyable; import mightypork.utils.files.FileUtils; import mightypork.utils.logging.Log; import mightypork.utils.math.coord.Coord; diff --git a/src/mightypork/rogue/sounds/LoopPlayer.java b/src/mightypork/rogue/sounds/LoopPlayer.java index 447f444..860850a 100644 --- a/src/mightypork/rogue/sounds/LoopPlayer.java +++ b/src/mightypork/rogue/sounds/LoopPlayer.java @@ -1,9 +1,9 @@ package mightypork.rogue.sounds; +import mightypork.utils.control.interf.Updateable; import mightypork.utils.control.timing.Pauseable; -import mightypork.utils.control.timing.Updateable; -import mightypork.utils.control.timing.animation.AnimDouble; +import mightypork.utils.math.animation.AnimDouble; import mightypork.utils.objects.Mutable; import org.lwjgl.openal.AL10; diff --git a/src/mightypork/rogue/sounds/SoundSystem.java b/src/mightypork/rogue/sounds/SoundSystem.java index b56dba7..f572d0b 100644 --- a/src/mightypork/rogue/sounds/SoundSystem.java +++ b/src/mightypork/rogue/sounds/SoundSystem.java @@ -9,7 +9,7 @@ import java.util.Set; import mightypork.rogue.AppAccess; import mightypork.rogue.bus.Subsystem; -import mightypork.utils.control.timing.Updateable; +import mightypork.utils.control.interf.Updateable; import mightypork.utils.logging.Log; import mightypork.utils.math.Calc.Buffers; import mightypork.utils.math.coord.Coord; diff --git a/src/mightypork/rogue/textures/MultiTexture.java b/src/mightypork/rogue/textures/MultiTexture.java new file mode 100644 index 0000000..fa268bf --- /dev/null +++ b/src/mightypork/rogue/textures/MultiTexture.java @@ -0,0 +1,140 @@ +package mightypork.rogue.textures; + + +import mightypork.utils.math.coord.Rect; + +import org.newdawn.slick.opengl.Texture; + + +public class MultiTexture implements Texture { + + private Texture backingTexture; + private String resourcePath; + + + public MultiTexture(String resourcePath) { + this.resourcePath = resourcePath; + } + + + public TxQuad getQuad(Rect rect) + { + return new TxQuad(this, rect); + } + + + /** + * Attempt to load the texture. + */ + private void load() + { + if (backingTexture == null) { + backingTexture = Render.loadTexture(resourcePath); + } + } + + + @Override + public boolean hasAlpha() + { + load(); + return backingTexture.hasAlpha(); + } + + + @Override + public String getTextureRef() + { + load(); + return backingTexture.getTextureRef(); + } + + + @Override + public void bind() + { + load(); + backingTexture.bind(); + } + + + @Override + public int getImageHeight() + { + load(); + return backingTexture.getImageHeight(); + } + + + @Override + public int getImageWidth() + { + load(); + return backingTexture.getImageWidth(); + } + + + @Override + public float getHeight() + { + load(); + return backingTexture.getHeight(); + } + + + @Override + public float getWidth() + { + load(); + return backingTexture.getWidth(); + } + + + @Override + public int getTextureHeight() + { + load(); + return backingTexture.getTextureHeight(); + } + + + @Override + public int getTextureWidth() + { + load(); + return backingTexture.getTextureWidth(); + } + + + @Override + public void release() + { + if (backingTexture == null) return; + backingTexture.release(); + } + + + @Override + public int getTextureID() + { + load(); + return backingTexture.getTextureID(); + } + + + @Override + public byte[] getTextureData() + { + load(); + return backingTexture.getTextureData(); + } + + + @Override + public void setTextureFilter(int textureFilter) + { + load(); + backingTexture.setTextureFilter(textureFilter); + } + +} diff --git a/src/mightypork/rogue/textures/Render.java b/src/mightypork/rogue/textures/Render.java index 0340b0f..3f6dac6 100644 --- a/src/mightypork/rogue/textures/Render.java +++ b/src/mightypork/rogue/textures/Render.java @@ -13,6 +13,7 @@ import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Rect; import org.newdawn.slick.opengl.Texture; +import org.newdawn.slick.opengl.TextureImpl; import org.newdawn.slick.opengl.TextureLoader; import org.newdawn.slick.util.ResourceLoader; @@ -28,7 +29,6 @@ public class Render { private static final Coord AXIS_Y = new Coord(0, 1, 0); private static final Coord AXIS_Z = new Coord(0, 0, 1); - public static Texture lastBinded = null; private static boolean inited = false; @@ -998,7 +998,7 @@ public class Render { } catch (IOException e) { Log.e("Loading of texture " + resourcePath + " failed.", e); - throw new RuntimeException(e); + throw new RuntimeException("Could not load texture " + resourcePath + ".", e); } } @@ -1012,11 +1012,12 @@ public class Render { */ public static void bindTexture(Texture texture) throws RuntimeException { - if (texture != lastBinded) { - glBindTexture(GL_TEXTURE_2D, 0); - glBindTexture(GL_TEXTURE_2D, texture.getTextureID()); - lastBinded = texture; - } + texture.bind(); +// if (texture != lastBinded) { +// glBindTexture(GL_TEXTURE_2D, 0); +// glBindTexture(GL_TEXTURE_2D, texture.getTextureID()); +// lastBinded = texture; +// } } @@ -1025,7 +1026,7 @@ public class Render { */ public static void unbindTexture() { - glBindTexture(GL_TEXTURE_2D, 0); - lastBinded = null; + TextureImpl.bindNone(); +// glBindTexture(GL_TEXTURE_2D, 0); } } diff --git a/src/mightypork/rogue/textures/TextureRegistry.java b/src/mightypork/rogue/textures/TextureRegistry.java new file mode 100644 index 0000000..d8980d5 --- /dev/null +++ b/src/mightypork/rogue/textures/TextureRegistry.java @@ -0,0 +1,124 @@ +package mightypork.rogue.textures; + + +import java.util.HashMap; + +import mightypork.rogue.AppAccess; +import mightypork.rogue.bus.Subsystem; +import mightypork.utils.control.interf.Destroyable; +import mightypork.utils.math.coord.Rect; + +import org.newdawn.slick.opengl.Texture; + + +/** + * Texture loader and quad registry + * + * @author MightyPork + */ +public class TextureRegistry extends Subsystem implements Destroyable { + + public TextureRegistry(AppAccess app) { + super(app); + } + + private HashMap textures = new HashMap(); + + private HashMap quads = new HashMap(); + + private MultiTexture lastTx; + + + /** + * Load a {@link Texture} from resource + * + * @param key texture key + * @param resourcePath texture resource path + */ + public void loadTexture(String key, String resourcePath) + { + MultiTexture tx = new MultiTexture(resourcePath); + textures.put(key, tx); + lastTx = tx; + } + + + /** + * Create a {@link TxQuad} in a texture + * + * @param quadKey quad key + * @param textureKey texture key + * @param quad quad rectangle (absolute pixel coordinates) * + */ + public void makeQuad(String quadKey, String textureKey, Rect quad) + { + MultiTexture tx = textures.get(textureKey); + if (tx == null) throw new RuntimeException("Texture with key " + textureKey + " not defined!"); + + TxQuad txquad = tx.getQuad(quad); + + quads.put(quadKey, txquad); + } + + + /** + * Create a {@link TxQuad} in the last loaded texture + * + * @param quadKey quad key + * @param quad quad rectangle (absolute pixel coordinates) + */ + public void makeQuad(String quadKey, Rect quad) + { + MultiTexture tx = lastTx; + if (tx == null) throw new RuntimeException("There's no texture loaded yet, can't define quads!"); + + TxQuad txquad = tx.getQuad(quad); + + quads.put(quadKey, txquad); + } + + + /** + * Get a {@link TxQuad} for key + * + * @param key quad key + * @return the quad + */ + public TxQuad getQuad(String key) + { + TxQuad q = quads.get(key); + + if (q == null) throw new RuntimeException("There's no quad called " + key + "!"); + + return q; + } + + + /** + * Get a loaded {@link Texture} + * + * @param key texture key + * @return the texture + */ + public Texture getTexture(String key) + { + Texture t = textures.get(key); + + if (t == null) throw new RuntimeException("There's no texture called " + key + "!"); + + return t; + } + + + @Override + protected void deinit() + { + for (Texture tx : textures.values()) { + tx.release(); + } + + textures.clear(); + quads.clear(); + } + +} diff --git a/src/mightypork/rogue/textures/TxQuad.java b/src/mightypork/rogue/textures/TxQuad.java index c32f509..710c446 100644 --- a/src/mightypork/rogue/textures/TxQuad.java +++ b/src/mightypork/rogue/textures/TxQuad.java @@ -38,17 +38,6 @@ public class TxQuad { } - /** - * @param tx Texture - * @param uvs Rect of texturwe UVs (pixels - from left top) - */ - public TxQuad(Texture tx, Rect uvs) { - this.tx = tx; - this.uvs = uvs.copy(); - this.size = uvs.getSize(); - } - - /** * Make of coords * @@ -59,8 +48,17 @@ public class TxQuad { * @param y2 y2 */ public TxQuad(Texture tx, int x1, int y1, int x2, int y2) { + this(tx, new Rect(x1, y1, x2, y2)); + } + + + /** + * @param tx Texture + * @param uvs Rect of texturwe UVs (pixels - from left top) + */ + public TxQuad(Texture tx, Rect uvs) { this.tx = tx; - this.uvs = new Rect(x1, y1, x2, y2); + this.uvs = uvs.copy(); this.size = uvs.getSize(); } diff --git a/src/mightypork/utils/control/bus/EventBus.java b/src/mightypork/utils/control/bus/EventBus.java index 3cfa0bc..07655ad 100644 --- a/src/mightypork/utils/control/bus/EventBus.java +++ b/src/mightypork/utils/control/bus/EventBus.java @@ -2,8 +2,12 @@ package mightypork.utils.control.bus; import java.util.Collection; -import java.util.LinkedHashSet; +import java.util.concurrent.CopyOnWriteArraySet; +import mightypork.utils.control.bus.events.DestroyEvent; +import mightypork.utils.control.bus.events.UpdateEvent; +import mightypork.utils.control.interf.Destroyable; +import mightypork.utils.control.interf.Updateable; import mightypork.utils.logging.Log; @@ -14,11 +18,24 @@ import mightypork.utils.logging.Log; */ final public class EventBus { - private Collection> channels = new LinkedHashSet>(); + private Collection> channels = new CopyOnWriteArraySet>(); - private Collection clients = new LinkedHashSet(); + private Collection clients = new CopyOnWriteArraySet(); - private boolean warn_unsent = true; + private boolean logging = false; + + + public EventBus() { + // default channels + createChannel(DestroyEvent.class, Destroyable.class); + createChannel(UpdateEvent.class, Updateable.class); + } + + + public void enableLogging(boolean enable) + { + logging = enable; + } /** @@ -33,7 +50,7 @@ final public class EventBus { // if the channel already exists, return this instance instead. for (EventChannel ch : channels) { if (ch.equals(channel)) { - Log.w("Channel of type " + channel + " already registered."); + if (logging) Log.w("Channel of type " + channel + " already registered."); return ch; } } @@ -63,13 +80,15 @@ final public class EventBus { */ public boolean broadcast(Object message) { + if (logging) Log.f3(" Broadcasting: " + message); + boolean sent = false; for (EventChannel b : channels) { sent |= b.broadcast(message, clients); } - if (!sent && warn_unsent) Log.w("Message not accepted by any channel: " + message); + if (!sent && logging) Log.w("Message not accepted by any channel: " + message); return sent; } @@ -103,17 +122,6 @@ final public class EventBus { } - /** - * Enable logging of unsent messages - * - * @param enable - */ - public void enableLoggingUnsent(boolean enable) - { - this.warn_unsent = enable; - } - - /** * Add a channel for given message and client type. * @@ -123,8 +131,9 @@ final public class EventBus { */ public , F_CLIENT> EventChannel createChannel(Class messageClass, Class clientClass) { - EventChannel bc = new EventChannel(messageClass, clientClass); - return addChannel(bc); + EventChannel channel = EventChannel.create(messageClass, clientClass); + channel.enableLogging(logging); + return addChannel(channel); } } diff --git a/src/mightypork/utils/control/bus/EventChannel.java b/src/mightypork/utils/control/bus/EventChannel.java index 10132d8..19fe8a6 100644 --- a/src/mightypork/utils/control/bus/EventChannel.java +++ b/src/mightypork/utils/control/bus/EventChannel.java @@ -20,6 +20,7 @@ final public class EventChannel, CLIENT> { private Class clientClass; private Class messageClass; + private boolean logging = false; public EventChannel(Class messageClass, Class clientClass) { @@ -31,6 +32,12 @@ final public class EventChannel, CLIENT> { } + public void enableLogging(boolean enable) + { + logging = enable; + } + + /** * Try to broadcast a message.
* If message is of wrong type, false is returned. @@ -57,7 +64,7 @@ final public class EventChannel, CLIENT> { // circular reference check if (processed.contains(client)) { - Log.w("Client already served (subscribing twice?)"); + if (logging) Log.w("Client already served (subscribing twice?)"); continue; } processed.add(client); @@ -91,6 +98,7 @@ final public class EventChannel, CLIENT> { { if (clientClass.isInstance(client)) { ((Handleable) message).handleBy((CLIENT) client); + if (logging) Log.f3(" Received by: " + client); } } diff --git a/src/mightypork/utils/control/bus/events/DestroyEvent.java b/src/mightypork/utils/control/bus/events/DestroyEvent.java new file mode 100644 index 0000000..67374c3 --- /dev/null +++ b/src/mightypork/utils/control/bus/events/DestroyEvent.java @@ -0,0 +1,16 @@ +package mightypork.utils.control.bus.events; + + +import mightypork.utils.control.bus.Handleable; +import mightypork.utils.control.interf.Destroyable; + + +public class DestroyEvent implements Handleable { + + @Override + public void handleBy(Destroyable handler) + { + handler.destroy(); + } + +} diff --git a/src/mightypork/utils/control/timing/UpdateEvent.java b/src/mightypork/utils/control/bus/events/UpdateEvent.java similarity index 82% rename from src/mightypork/utils/control/timing/UpdateEvent.java rename to src/mightypork/utils/control/bus/events/UpdateEvent.java index cb9a816..7052d6f 100644 --- a/src/mightypork/utils/control/timing/UpdateEvent.java +++ b/src/mightypork/utils/control/bus/events/UpdateEvent.java @@ -1,7 +1,8 @@ -package mightypork.utils.control.timing; +package mightypork.utils.control.bus.events; import mightypork.utils.control.bus.Handleable; +import mightypork.utils.control.interf.Updateable; /** diff --git a/src/mightypork/utils/control/Destroyable.java b/src/mightypork/utils/control/interf/Destroyable.java similarity index 81% rename from src/mightypork/utils/control/Destroyable.java rename to src/mightypork/utils/control/interf/Destroyable.java index fa52630..33bc127 100644 --- a/src/mightypork/utils/control/Destroyable.java +++ b/src/mightypork/utils/control/interf/Destroyable.java @@ -1,4 +1,4 @@ -package mightypork.utils.control; +package mightypork.utils.control.interf; /** diff --git a/src/mightypork/utils/control/timing/Updateable.java b/src/mightypork/utils/control/interf/Updateable.java similarity index 85% rename from src/mightypork/utils/control/timing/Updateable.java rename to src/mightypork/utils/control/interf/Updateable.java index e3e396f..afa1e88 100644 --- a/src/mightypork/utils/control/timing/Updateable.java +++ b/src/mightypork/utils/control/interf/Updateable.java @@ -1,4 +1,4 @@ -package mightypork.utils.control.timing; +package mightypork.utils.control.interf; /** diff --git a/src/mightypork/utils/math/Calc.java b/src/mightypork/utils/math/Calc.java index 88ebe82..92393c3 100644 --- a/src/mightypork/utils/math/Calc.java +++ b/src/mightypork/utils/math/Calc.java @@ -6,8 +6,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import mightypork.utils.math.animation.Easing; import mightypork.utils.math.coord.Coord; -import mightypork.utils.math.easing.Easing; import org.lwjgl.BufferUtils; diff --git a/src/mightypork/utils/control/timing/animation/AnimDouble.java b/src/mightypork/utils/math/animation/AnimDouble.java similarity index 97% rename from src/mightypork/utils/control/timing/animation/AnimDouble.java rename to src/mightypork/utils/math/animation/AnimDouble.java index 7785f05..795a4ad 100644 --- a/src/mightypork/utils/control/timing/animation/AnimDouble.java +++ b/src/mightypork/utils/math/animation/AnimDouble.java @@ -1,10 +1,9 @@ -package mightypork.utils.control.timing.animation; +package mightypork.utils.math.animation; +import mightypork.utils.control.interf.Updateable; import mightypork.utils.control.timing.Pauseable; -import mightypork.utils.control.timing.Updateable; import mightypork.utils.math.Calc; -import mightypork.utils.math.easing.Easing; /** diff --git a/src/mightypork/utils/control/timing/animation/AnimDoubleDeg.java b/src/mightypork/utils/math/animation/AnimDoubleDeg.java similarity index 89% rename from src/mightypork/utils/control/timing/animation/AnimDoubleDeg.java rename to src/mightypork/utils/math/animation/AnimDoubleDeg.java index 860a2a7..3879bbd 100644 --- a/src/mightypork/utils/control/timing/animation/AnimDoubleDeg.java +++ b/src/mightypork/utils/math/animation/AnimDoubleDeg.java @@ -1,9 +1,8 @@ -package mightypork.utils.control.timing.animation; +package mightypork.utils.math.animation; import mightypork.utils.math.Calc; import mightypork.utils.math.Calc.Deg; -import mightypork.utils.math.easing.Easing; /** diff --git a/src/mightypork/utils/control/timing/animation/AnimDoubleRad.java b/src/mightypork/utils/math/animation/AnimDoubleRad.java similarity index 89% rename from src/mightypork/utils/control/timing/animation/AnimDoubleRad.java rename to src/mightypork/utils/math/animation/AnimDoubleRad.java index a3cf042..7fe878b 100644 --- a/src/mightypork/utils/control/timing/animation/AnimDoubleRad.java +++ b/src/mightypork/utils/math/animation/AnimDoubleRad.java @@ -1,9 +1,8 @@ -package mightypork.utils.control.timing.animation; +package mightypork.utils.math.animation; import mightypork.utils.math.Calc; import mightypork.utils.math.Calc.Rad; -import mightypork.utils.math.easing.Easing; /** diff --git a/src/mightypork/utils/math/easing/Easing.java b/src/mightypork/utils/math/animation/Easing.java similarity index 99% rename from src/mightypork/utils/math/easing/Easing.java rename to src/mightypork/utils/math/animation/Easing.java index 1bbdd64..5f1e4a9 100644 --- a/src/mightypork/utils/math/easing/Easing.java +++ b/src/mightypork/utils/math/animation/Easing.java @@ -1,4 +1,4 @@ -package mightypork.utils.math.easing; +package mightypork.utils.math.animation; /** diff --git a/src/mightypork/utils/math/constraints/BaseConstraint.java b/src/mightypork/utils/math/constraints/Constraint.java similarity index 84% rename from src/mightypork/utils/math/constraints/BaseConstraint.java rename to src/mightypork/utils/math/constraints/Constraint.java index 234c357..da1f652 100644 --- a/src/mightypork/utils/math/constraints/BaseConstraint.java +++ b/src/mightypork/utils/math/constraints/Constraint.java @@ -9,12 +9,12 @@ import mightypork.utils.math.coord.Coord; * * @author MightyPork */ -public abstract class BaseConstraint implements SettableContext { +public abstract class Constraint implements SettableContext { private ConstraintContext context = null; - public BaseConstraint(ConstraintContext context) { + public Constraint(ConstraintContext context) { this.context = context; } @@ -26,6 +26,9 @@ public abstract class BaseConstraint implements SettableContext { } + /** + * @return the context + */ public ConstraintContext getContext() { return context; diff --git a/src/mightypork/utils/math/constraints/ConstraintFactory.java b/src/mightypork/utils/math/constraints/ConstraintFactory.java index 3992e18..0b41284 100644 --- a/src/mightypork/utils/math/constraints/ConstraintFactory.java +++ b/src/mightypork/utils/math/constraints/ConstraintFactory.java @@ -1,7 +1,7 @@ package mightypork.utils.math.constraints; -import mightypork.utils.control.timing.animation.AnimDouble; +import mightypork.utils.math.animation.AnimDouble; import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Rect; @@ -335,7 +335,35 @@ public class ConstraintFactory { } - public static RectConstraint c_sizedBox(ConstraintContext context, final NumConstraint left, final NumConstraint bottom, final NumConstraint width, final NumConstraint height) + /** + * @param context + * @param width + * @param height + * @return + */ + public static RectConstraint c_box_sized(ConstraintContext context, final NumConstraint width, final NumConstraint height) + { + return new RectConstraint(context) { + + @Override + public Rect getRect() + { + Coord origin = getOrigin(); + + //@formatter:off + return Rect.fromSize( + origin.x, + origin.y, + width.getValue(), + height.getValue() + ); + //@formatter:on + } + }; + } + + + public static RectConstraint c_box_sized(ConstraintContext context, final NumConstraint left, final NumConstraint bottom, final NumConstraint width, final NumConstraint height) { return new RectConstraint(context) { @@ -357,7 +385,7 @@ public class ConstraintFactory { } - public static RectConstraint c_posBox(ConstraintContext context, final NumConstraint left, final NumConstraint bottom, final NumConstraint right, final NumConstraint top) + public static RectConstraint c_box_abs(ConstraintContext context, final NumConstraint left, final NumConstraint bottom, final NumConstraint right, final NumConstraint top) { return new RectConstraint(context) { diff --git a/src/mightypork/utils/math/constraints/NumConstraint.java b/src/mightypork/utils/math/constraints/NumConstraint.java index f737b30..cc95390 100644 --- a/src/mightypork/utils/math/constraints/NumConstraint.java +++ b/src/mightypork/utils/math/constraints/NumConstraint.java @@ -6,7 +6,7 @@ package mightypork.utils.math.constraints; * * @author MightyPork */ -public abstract class NumConstraint extends BaseConstraint { +public abstract class NumConstraint extends Constraint { public NumConstraint(ConstraintContext context) { super(context); diff --git a/src/mightypork/utils/math/constraints/RectConstraint.java b/src/mightypork/utils/math/constraints/RectConstraint.java index ee0993f..c091d17 100644 --- a/src/mightypork/utils/math/constraints/RectConstraint.java +++ b/src/mightypork/utils/math/constraints/RectConstraint.java @@ -9,7 +9,7 @@ import mightypork.utils.math.coord.Rect; * * @author MightyPork */ -public abstract class RectConstraint extends BaseConstraint implements ConstraintContext { +public abstract class RectConstraint extends Constraint implements ConstraintContext { public RectConstraint(ConstraintContext context) { super(context); diff --git a/src/mightypork/utils/math/coord/CoordAnimated.java b/src/mightypork/utils/math/coord/CoordAnimated.java index af66b23..487ec05 100644 --- a/src/mightypork/utils/math/coord/CoordAnimated.java +++ b/src/mightypork/utils/math/coord/CoordAnimated.java @@ -1,7 +1,7 @@ package mightypork.utils.math.coord; -import mightypork.utils.control.timing.Updateable; +import mightypork.utils.control.interf.Updateable; import mightypork.utils.math.Calc;