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