From 8e8e15355ea8cbe140dd259fed3dcc4ee6e77127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Tue, 8 Apr 2014 10:25:16 +0200 Subject: [PATCH] Remade constraint system, improved rendering & font. --- src/mightypork/rogue/App.java | 11 +- src/mightypork/rogue/Res.java | 2 +- src/mightypork/rogue/bus/ChildClient.java | 3 - .../rogue/bus/events/ActionRequest.java | 7 + src/mightypork/rogue/fonts/DeferredFont.java | 33 +-- .../rogue/fonts/DeferredFontNative.java | 2 +- src/mightypork/rogue/fonts/FontRenderer.java | 58 +++++ src/mightypork/rogue/fonts/GLFont.java | 19 -- src/mightypork/rogue/fonts/NullFont.java | 14 -- src/mightypork/rogue/fonts/SlickFont.java | 36 +-- .../rogue/gui/constraints/ElementHolder.java | 92 ------- .../gui/constraints/PluggableRenderable.java | 15 -- .../ColumnHolder.java | 21 +- .../rogue/gui/renderers/ElementHolder.java | 82 +++++++ .../rogue/gui/renderers/ImageRenderer.java | 30 +++ .../gui/renderers/PluggableRenderable.java | 23 ++ .../gui/renderers/PluggableRenderer.java | 33 +++ .../{constraints => renderers}/RowHolder.java | 21 +- .../rogue/gui/renderers/TextRenderer.java | 82 +++++++ src/mightypork/rogue/gui/screens/Screen.java | 6 +- .../rogue/gui/screens/ScreenLayer.java | 4 +- .../screens/test_bouncyboxes/BouncyBox.java | 40 +--- .../test_bouncyboxes/LayerBouncyBoxes.java | 38 ++- .../test_bouncyboxes/ScreenTestBouncy.java | 23 +- .../test_cat_sound/LayerFlyingCat.java | 62 +++-- .../screens/test_cat_sound/ScreenTestCat.java | 7 +- .../gui/screens/test_font/ScreenTestFont.java | 34 ++- src/mightypork/rogue/input/InputSystem.java | 50 ++++ src/mightypork/rogue/input/Keys.java | 140 +++++++++++ .../rogue/loading/AsyncResourceLoader.java | 4 +- .../rogue/render/DisplaySystem.java | 4 +- src/mightypork/rogue/render/Render.java | 86 +++++-- .../rogue/sounds/DeferredAudio.java | 2 +- src/mightypork/rogue/sounds/NullAudio.java | 2 +- .../rogue/textures/DeferredTexture.java | 2 +- .../rogue/textures/TextureBank.java | 2 + src/mightypork/rogue/textures/TxQuad.java | 2 +- .../rogue/util/SlickLogRedirector.java | 27 ++- .../utils/control/bus/EventBus.java | 14 +- .../utils/control/bus/EventChannel.java | 5 +- src/mightypork/utils/logging/Log.java | 16 +- src/mightypork/utils/logging/LogInstance.java | 18 +- .../utils/math/constraints/Constraint.java | 58 ----- .../math/constraints/ConstraintContext.java | 20 -- .../math/constraints/ConstraintFactory.java | 190 ++++++++------- .../math/constraints/ContextAdapter.java | 25 ++ .../utils/math/constraints/NumConstraint.java | 18 -- .../utils/math/constraints/NumEvaluable.java | 8 + .../math/constraints/PluggableContext.java | 15 ++ .../math/constraints/RectConstraint.java | 22 -- .../utils/math/constraints/RectEvaluable.java | 10 + .../math/constraints/SettableContext.java | 17 -- src/mightypork/utils/math/coord/Coord.java | 2 +- src/mightypork/utils/math/coord/Rect.java | 224 +++++++----------- 54 files changed, 1031 insertions(+), 750 deletions(-) create mode 100644 src/mightypork/rogue/fonts/FontRenderer.java delete mode 100644 src/mightypork/rogue/gui/constraints/ElementHolder.java delete mode 100644 src/mightypork/rogue/gui/constraints/PluggableRenderable.java rename src/mightypork/rogue/gui/{constraints => renderers}/ColumnHolder.java (53%) create mode 100644 src/mightypork/rogue/gui/renderers/ElementHolder.java create mode 100644 src/mightypork/rogue/gui/renderers/ImageRenderer.java create mode 100644 src/mightypork/rogue/gui/renderers/PluggableRenderable.java create mode 100644 src/mightypork/rogue/gui/renderers/PluggableRenderer.java rename src/mightypork/rogue/gui/{constraints => renderers}/RowHolder.java (53%) create mode 100644 src/mightypork/rogue/gui/renderers/TextRenderer.java create mode 100644 src/mightypork/rogue/input/Keys.java delete mode 100644 src/mightypork/utils/math/constraints/Constraint.java delete mode 100644 src/mightypork/utils/math/constraints/ConstraintContext.java create mode 100644 src/mightypork/utils/math/constraints/ContextAdapter.java delete mode 100644 src/mightypork/utils/math/constraints/NumConstraint.java create mode 100644 src/mightypork/utils/math/constraints/NumEvaluable.java create mode 100644 src/mightypork/utils/math/constraints/PluggableContext.java delete mode 100644 src/mightypork/utils/math/constraints/RectConstraint.java create mode 100644 src/mightypork/utils/math/constraints/RectEvaluable.java delete mode 100644 src/mightypork/utils/math/constraints/SettableContext.java diff --git a/src/mightypork/rogue/App.java b/src/mightypork/rogue/App.java index 1e22670..508ee3d 100644 --- a/src/mightypork/rogue/App.java +++ b/src/mightypork/rogue/App.java @@ -17,6 +17,7 @@ import mightypork.rogue.gui.screens.test_cat_sound.ScreenTestCat; import mightypork.rogue.gui.screens.test_font.ScreenTestFont; import mightypork.rogue.input.InputSystem; import mightypork.rogue.input.KeyStroke; +import mightypork.rogue.input.Keys; import mightypork.rogue.render.DisplaySystem; import mightypork.rogue.sounds.SoundSystem; import mightypork.rogue.util.SlickLogRedirector; @@ -26,8 +27,6 @@ import mightypork.utils.control.interf.Updateable; import mightypork.utils.logging.Log; import mightypork.utils.logging.LogInstance; -import org.lwjgl.input.Keyboard; - /** * Main class @@ -197,7 +196,7 @@ public class App implements AppAccess { screens.add(new ScreenTestCat(this)); screens.add(new ScreenTestFont(this)); - screens.showScreen("test.font"); + screens.showScreen("test.bouncy"); } @@ -228,7 +227,7 @@ public class App implements AppAccess { Log.f3("Setting up hot keys..."); // Go fullscreen - input().bindKeyStroke(new KeyStroke(Keyboard.KEY_F11), new Runnable() { + input().bindKeyStroke(new KeyStroke(Keys.KEY_F11), new Runnable() { @Override public void run() @@ -238,7 +237,7 @@ public class App implements AppAccess { }); // Take screenshot - input().bindKeyStroke(new KeyStroke(Keyboard.KEY_F2), new Runnable() { + input().bindKeyStroke(new KeyStroke(Keys.KEY_F2), new Runnable() { @Override public void run() @@ -248,7 +247,7 @@ public class App implements AppAccess { }); // Exit - input().bindKeyStroke(new KeyStroke(Keyboard.KEY_LCONTROL, Keyboard.KEY_Q), new Runnable() { + input().bindKeyStroke(new KeyStroke(Keys.KEY_LCONTROL, Keys.KEY_Q), new Runnable() { @Override public void run() diff --git a/src/mightypork/rogue/Res.java b/src/mightypork/rogue/Res.java index e9e407b..4284a9b 100644 --- a/src/mightypork/rogue/Res.java +++ b/src/mightypork/rogue/Res.java @@ -55,7 +55,7 @@ public class Res { private static void loadFonts() { - fonts.loadFont("PolygonPixel_16", new DeferredFont("/res/font/PolygonPixel5x7Standard.ttf", null, 32, FontStyle.PLAIN, true)); + fonts.loadFont("default", new DeferredFont("/res/font/PolygonPixel5x7Standard.ttf", null, 32, FontStyle.PLAIN, true)); } diff --git a/src/mightypork/rogue/bus/ChildClient.java b/src/mightypork/rogue/bus/ChildClient.java index df89645..59176ea 100644 --- a/src/mightypork/rogue/bus/ChildClient.java +++ b/src/mightypork/rogue/bus/ChildClient.java @@ -10,7 +10,6 @@ import mightypork.rogue.AppAdapter; import mightypork.utils.control.bus.EventBus; import mightypork.utils.control.bus.clients.DelegatingClient; import mightypork.utils.control.bus.clients.ToggleableClient; -import mightypork.utils.logging.Log; /** @@ -60,8 +59,6 @@ public class ChildClient extends AppAdapter implements DelegatingClient, Togglea { if (bus().isClientValid(client)) { clients.add(client); - } else { - Log.w("Client rejected by bus: " + client.getClass().getSimpleName()); } } diff --git a/src/mightypork/rogue/bus/events/ActionRequest.java b/src/mightypork/rogue/bus/events/ActionRequest.java index 3dcd53c..53c8893 100644 --- a/src/mightypork/rogue/bus/events/ActionRequest.java +++ b/src/mightypork/rogue/bus/events/ActionRequest.java @@ -37,6 +37,13 @@ public class ActionRequest implements Event { void requestAction(RequestType request); } + + @Override + public String toString() + { + return "ActionRequest(" + type + ")"; + } + public static enum RequestType { FULLSCREEN, SCREENSHOT, SHUTDOWN; diff --git a/src/mightypork/rogue/fonts/DeferredFont.java b/src/mightypork/rogue/fonts/DeferredFont.java index fc8b755..26b2153 100644 --- a/src/mightypork/rogue/fonts/DeferredFont.java +++ b/src/mightypork/rogue/fonts/DeferredFont.java @@ -20,7 +20,7 @@ import mightypork.utils.math.coord.Coord; * @author MightyPork */ @MustLoadInMainThread -@LoggedName(name="Font") +@LoggedName(name = "Font") public class DeferredFont extends BaseDeferredResource implements GLFont { public static enum FontStyle @@ -144,37 +144,6 @@ public class DeferredFont extends BaseDeferredResource implements GLFont { } - /** - * Draw string at 0,0 - * - * @param str string to draw - * @param color draw color - * @param startIndex first drawn character index - * @param endIndex last drawn character index - */ - @Override - public void draw(String str, RGB color, int startIndex, int endIndex) - { - if (!ensureLoaded()) return; - - font.draw(str, color, startIndex, endIndex); - } - - - /** - * Draw string 0,0 - * - * @param str string to draw - */ - @Override - public void draw(String str) - { - if (!ensureLoaded()) return; - - font.draw(str); - } - - /** * Get size needed to render give string * diff --git a/src/mightypork/rogue/fonts/DeferredFontNative.java b/src/mightypork/rogue/fonts/DeferredFontNative.java index e634e56..f44e212 100644 --- a/src/mightypork/rogue/fonts/DeferredFontNative.java +++ b/src/mightypork/rogue/fonts/DeferredFontNative.java @@ -13,7 +13,7 @@ import mightypork.utils.logging.LoggedName; * * @author MightyPork */ -@LoggedName(name="FontNative") +@LoggedName(name = "FontNative") public class DeferredFontNative extends DeferredFont { /** diff --git a/src/mightypork/rogue/fonts/FontRenderer.java b/src/mightypork/rogue/fonts/FontRenderer.java new file mode 100644 index 0000000..04874f3 --- /dev/null +++ b/src/mightypork/rogue/fonts/FontRenderer.java @@ -0,0 +1,58 @@ +package mightypork.rogue.fonts; + + +import mightypork.rogue.render.Render; +import mightypork.utils.math.color.RGB; +import mightypork.utils.math.coord.Coord; +import mightypork.utils.math.coord.Rect; + + +public class FontRenderer { + + private final GLFont font; + + + public FontRenderer(GLFont font) { + + if (font == null) throw new NullPointerException("Font cannot be null."); + + this.font = font; + } + + + public void draw(String text, Coord pos, double height, RGB color) + { + Render.pushState(); + + Render.translate(pos.round()); + Render.scaleXY(getScale(height)); + + font.draw(text, color); + + Render.popState(); + } + + + public Coord getNeededSpace(String text, double height) + { + return font.getNeededSpace(text).mul(getScale(height)); + } + + + public double getWidth(String text, double height) + { + return getNeededSpace(text, height).x; + } + + + public Rect getBounds(String text, Coord pos, double height) + { + return Rect.fromSize(getNeededSpace(text, height)).add(pos); + } + + + private double getScale(double height) + { + return height / font.getHeight(); + } +} diff --git a/src/mightypork/rogue/fonts/GLFont.java b/src/mightypork/rogue/fonts/GLFont.java index 89ed227..e93daf2 100644 --- a/src/mightypork/rogue/fonts/GLFont.java +++ b/src/mightypork/rogue/fonts/GLFont.java @@ -16,25 +16,6 @@ public interface GLFont { void draw(String text, RGB color); - /** - * Draw string at position - * - * @param text string to draw - * @param color draw color - * @param startIndex first drawn character index - * @param endIndex last drawn character index - */ - void draw(String text, RGB color, int startIndex, int endIndex); - - - /** - * Draw string at position - * - * @param str string to draw - */ - void draw(String str); - - /** * Get suize needed to render give string * diff --git a/src/mightypork/rogue/fonts/NullFont.java b/src/mightypork/rogue/fonts/NullFont.java index deeeb7a..c97e892 100644 --- a/src/mightypork/rogue/fonts/NullFont.java +++ b/src/mightypork/rogue/fonts/NullFont.java @@ -19,20 +19,6 @@ public class NullFont implements GLFont { } - @Override - public void draw(String str, RGB color, int startIndex, int endIndex) - { - // nope - } - - - @Override - public void draw(String str) - { - // nope - } - - @Override public Coord getNeededSpace(String str) { diff --git a/src/mightypork/rogue/fonts/SlickFont.java b/src/mightypork/rogue/fonts/SlickFont.java index 97de8a6..77ea5a3 100644 --- a/src/mightypork/rogue/fonts/SlickFont.java +++ b/src/mightypork/rogue/fonts/SlickFont.java @@ -5,6 +5,7 @@ import static org.lwjgl.opengl.GL11.*; import java.awt.Font; +import mightypork.rogue.render.Render; import mightypork.utils.math.color.RGB; import mightypork.utils.math.coord.Coord; @@ -53,7 +54,7 @@ public class SlickFont implements GLFont { { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); } @@ -67,37 +68,12 @@ public class SlickFont implements GLFont { @Override public void draw(String str, RGB color) { + Render.pushState(); + prepareForRender(); ttf.drawString(0, 0, str, rgbToSlickColor(color)); - } - - - /** - * Draw substring in color - * - * @param str string to draw - * @param color text color - * @param startIndex first char to draw - * @param endIndex last char to draw (INCLUDING!) - */ - @Override - public void draw(String str, RGB color, int startIndex, int endIndex) - { - prepareForRender(); - ttf.drawString(0, 0, str, rgbToSlickColor(color), startIndex, endIndex); - } - - - /** - * Draw in white - * - * @param str chars to draw - */ - @Override - public void draw(String str) - { - prepareForRender(); - ttf.drawString(0, 0, str); + + Render.popState(); } diff --git a/src/mightypork/rogue/gui/constraints/ElementHolder.java b/src/mightypork/rogue/gui/constraints/ElementHolder.java deleted file mode 100644 index 061f0fc..0000000 --- a/src/mightypork/rogue/gui/constraints/ElementHolder.java +++ /dev/null @@ -1,92 +0,0 @@ -package mightypork.rogue.gui.constraints; - - -import java.util.LinkedList; - -import mightypork.rogue.AppAccess; -import mightypork.rogue.bus.ChildClient; -import mightypork.rogue.render.Renderable; -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 PluggableRenderable} elements with constraints.
- * Elements are exposed to {@link EventBus}. - * - * @author MightyPork - */ -public class ElementHolder extends ChildClient implements ConstraintContext, PluggableRenderable { - - private final LinkedList elements = new LinkedList(); - private ConstraintContext context; - - - public ElementHolder(AppAccess app) { - super(app); - } - - - public ElementHolder(AppAccess app, ConstraintContext context) { - super(app); - this.context = context; - } - - - @Override - public void setContext(ConstraintContext context) - { - this.context = context; - } - - - @Override - public void render() - { - for (final Renderable element : elements) { - element.render(); - } - } - - - @Override - public Rect getRect() - { - return context.getRect(); - } - - - /** - * Add element to the holder. - * - * @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(PluggableRenderable elem, RectConstraint constraint) - { - if (elem == null) return; - - constraint.setContext(this); - elem.setContext(constraint); - - elements.add(elem); - addChildClient(elem); - } - - - /** - * Remove element from the holder - * - * @param elem - */ - public void remove(PluggableRenderable elem) - { - if (elem == null) return; - elements.remove(elem); - removeChildClient(elem); - } - -} diff --git a/src/mightypork/rogue/gui/constraints/PluggableRenderable.java b/src/mightypork/rogue/gui/constraints/PluggableRenderable.java deleted file mode 100644 index d2befc5..0000000 --- a/src/mightypork/rogue/gui/constraints/PluggableRenderable.java +++ /dev/null @@ -1,15 +0,0 @@ -package mightypork.rogue.gui.constraints; - - -import mightypork.rogue.render.Renderable; -import mightypork.utils.math.constraints.SettableContext; - - -/** - * {@link Renderable} with {@link SettableContext} - * - * @author MightyPork - */ -public interface PluggableRenderable extends Renderable, SettableContext { - // methods from both interfaces -} diff --git a/src/mightypork/rogue/gui/constraints/ColumnHolder.java b/src/mightypork/rogue/gui/renderers/ColumnHolder.java similarity index 53% rename from src/mightypork/rogue/gui/constraints/ColumnHolder.java rename to src/mightypork/rogue/gui/renderers/ColumnHolder.java index 371b94d..9a5e4a0 100644 --- a/src/mightypork/rogue/gui/constraints/ColumnHolder.java +++ b/src/mightypork/rogue/gui/renderers/ColumnHolder.java @@ -1,9 +1,9 @@ -package mightypork.rogue.gui.constraints; +package mightypork.rogue.gui.renderers; import static mightypork.utils.math.constraints.ConstraintFactory.*; import mightypork.rogue.AppAccess; -import mightypork.utils.math.constraints.ConstraintContext; +import mightypork.utils.math.constraints.RectEvaluable; public class ColumnHolder extends ElementHolder { @@ -12,7 +12,7 @@ public class ColumnHolder extends ElementHolder { private int col = 0; - public ColumnHolder(AppAccess app, ConstraintContext context, int rows) { + public ColumnHolder(AppAccess app, RectEvaluable context, int rows) { super(app, context); this.cols = rows; } @@ -29,17 +29,14 @@ public class ColumnHolder extends ElementHolder { * * @param elem */ - public void addRow(PluggableRenderable elem) - { - if (elem == null) return; - add(elem, c_column(null, cols, col++)); - } - - @Override - public void remove(PluggableRenderable elem) + public void add(final PluggableRenderable elem) { - throw new UnsupportedOperationException("Can't remove from ColumnHolder."); + if (elem == null) return; + + elem.setContext(c_column(this, cols, col++)); + + attach(elem); } } diff --git a/src/mightypork/rogue/gui/renderers/ElementHolder.java b/src/mightypork/rogue/gui/renderers/ElementHolder.java new file mode 100644 index 0000000..7a95763 --- /dev/null +++ b/src/mightypork/rogue/gui/renderers/ElementHolder.java @@ -0,0 +1,82 @@ +package mightypork.rogue.gui.renderers; + + +import java.util.LinkedList; + +import mightypork.rogue.AppAccess; +import mightypork.rogue.bus.ChildClient; +import mightypork.rogue.render.Renderable; +import mightypork.utils.control.bus.EventBus; +import mightypork.utils.math.constraints.RectEvaluable; +import mightypork.utils.math.coord.Rect; + + +/** + * Bag for {@link PluggableRenderer} elements with constraints.
+ * Elements are exposed to {@link EventBus}. + * + * @author MightyPork + */ +public abstract class ElementHolder extends ChildClient implements PluggableRenderable { + + private final LinkedList elements = new LinkedList(); + private RectEvaluable context; + + + public ElementHolder(AppAccess app) { + super(app); + } + + + public ElementHolder(AppAccess app, RectEvaluable context) { + super(app); + setContext(context); + } + + + @Override + public final void setContext(RectEvaluable context) + { + this.context = context; + } + + + @Override + public final void render() + { + for (final Renderable element : elements) { + element.render(); + } + } + + + @Override + public final Rect getRect() + { + return context.getRect(); + } + + + /** + * Add element to the holder, setting it's context.
+ * Element must then be attached using the attach method. + * + * @param elem element + */ + public abstract void add(PluggableRenderable elem); + + + /** + * Connect to bus and add to element list + * + * @param elem element; it's context will be set to the constraint. + */ + public final void attach(PluggableRenderable elem) + { + if (elem == null) return; + + elements.add(elem); + addChildClient(elem); + } + +} diff --git a/src/mightypork/rogue/gui/renderers/ImageRenderer.java b/src/mightypork/rogue/gui/renderers/ImageRenderer.java new file mode 100644 index 0000000..70382ea --- /dev/null +++ b/src/mightypork/rogue/gui/renderers/ImageRenderer.java @@ -0,0 +1,30 @@ +package mightypork.rogue.gui.renderers; + + +import mightypork.rogue.render.Render; +import mightypork.rogue.textures.TxQuad; + + +public class ImageRenderer extends PluggableRenderer { + + private TxQuad texture; + + + public ImageRenderer(TxQuad texture) { + this.texture = texture; + } + + + public void setTexture(TxQuad texture) + { + this.texture = texture; + } + + + @Override + public void render() + { + Render.quadTextured(getRect(), texture); + } + +} diff --git a/src/mightypork/rogue/gui/renderers/PluggableRenderable.java b/src/mightypork/rogue/gui/renderers/PluggableRenderable.java new file mode 100644 index 0000000..28c495c --- /dev/null +++ b/src/mightypork/rogue/gui/renderers/PluggableRenderable.java @@ -0,0 +1,23 @@ +package mightypork.rogue.gui.renderers; + + +import mightypork.rogue.render.Renderable; +import mightypork.utils.math.constraints.PluggableContext; +import mightypork.utils.math.constraints.RectEvaluable; +import mightypork.utils.math.coord.Rect; + + +public interface PluggableRenderable extends Renderable, PluggableContext { + + @Override + void render(); + + + @Override + Rect getRect(); + + + @Override + void setContext(RectEvaluable rect); + +} diff --git a/src/mightypork/rogue/gui/renderers/PluggableRenderer.java b/src/mightypork/rogue/gui/renderers/PluggableRenderer.java new file mode 100644 index 0000000..205ed06 --- /dev/null +++ b/src/mightypork/rogue/gui/renderers/PluggableRenderer.java @@ -0,0 +1,33 @@ +package mightypork.rogue.gui.renderers; + + +import mightypork.rogue.render.Renderable; +import mightypork.utils.math.constraints.ContextAdapter; +import mightypork.utils.math.constraints.RectEvaluable; +import mightypork.utils.math.coord.Rect; + + +/** + * {@link Renderable} with pluggable context + * + * @author MightyPork + */ +public abstract class PluggableRenderer extends ContextAdapter implements PluggableRenderable { + + @Override + public abstract void render(); + + + @Override + public Rect getRect() + { + return super.getRect(); + } + + + @Override + public void setContext(RectEvaluable rect) + { + super.setContext(rect); + } +} diff --git a/src/mightypork/rogue/gui/constraints/RowHolder.java b/src/mightypork/rogue/gui/renderers/RowHolder.java similarity index 53% rename from src/mightypork/rogue/gui/constraints/RowHolder.java rename to src/mightypork/rogue/gui/renderers/RowHolder.java index 3158e4f..edeb039 100644 --- a/src/mightypork/rogue/gui/constraints/RowHolder.java +++ b/src/mightypork/rogue/gui/renderers/RowHolder.java @@ -1,9 +1,9 @@ -package mightypork.rogue.gui.constraints; +package mightypork.rogue.gui.renderers; import static mightypork.utils.math.constraints.ConstraintFactory.*; import mightypork.rogue.AppAccess; -import mightypork.utils.math.constraints.ConstraintContext; +import mightypork.utils.math.constraints.RectEvaluable; public class RowHolder extends ElementHolder { @@ -12,7 +12,7 @@ public class RowHolder extends ElementHolder { private int row = 0; - public RowHolder(AppAccess app, ConstraintContext context, int rows) { + public RowHolder(AppAccess app, RectEvaluable context, int rows) { super(app, context); this.rows = rows; } @@ -29,17 +29,14 @@ public class RowHolder extends ElementHolder { * * @param elem */ - public void addRow(PluggableRenderable elem) - { - if (elem == null) return; - add(elem, c_row(null, rows, row++)); - } - - @Override - public void remove(PluggableRenderable elem) + public void add(final PluggableRenderable elem) { - throw new UnsupportedOperationException("Can't remove from RowHolder."); + if (elem == null) return; + + elem.setContext(c_row(this, rows, row++)); + + attach(elem); } } diff --git a/src/mightypork/rogue/gui/renderers/TextRenderer.java b/src/mightypork/rogue/gui/renderers/TextRenderer.java new file mode 100644 index 0000000..a83ed69 --- /dev/null +++ b/src/mightypork/rogue/gui/renderers/TextRenderer.java @@ -0,0 +1,82 @@ +package mightypork.rogue.gui.renderers; + + +import mightypork.rogue.fonts.FontRenderer; +import mightypork.rogue.fonts.GLFont; +import mightypork.utils.math.color.RGB; +import mightypork.utils.math.coord.Coord; + + +public class TextRenderer extends PluggableRenderer { + + public static enum Align + { + LEFT, CENTER, RIGHT; + } + + private FontRenderer font; + private String text; + private RGB color; + private Align align; + + + public TextRenderer(GLFont font, String text, RGB color, Align align) { + this.font = new FontRenderer(font); + this.text = text; + this.color = color; + this.align = align; + } + + + public void setFont(FontRenderer font) + { + this.font = font; + } + + + public void setText(String text) + { + this.text = text; + } + + + public void setColor(RGB color) + { + this.color = color; + } + + + public void setAlign(Align align) + { + this.align = align; + } + + + @Override + public void render() + { + final double h = getRect().getHeight(); + + final double w = font.getWidth(text, h); + + final Coord start; + + switch (align) { + case LEFT: + start = getRect().getMin(); + break; + + case CENTER: + start = getRect().getCenterV1().sub_ip(w / 2D, 0); + break; + + case RIGHT: + default: + start = getRect().getX2Y1().sub_ip(w, 0); + break; + } + + font.draw(text, start, h, color); + } + +} diff --git a/src/mightypork/rogue/gui/screens/Screen.java b/src/mightypork/rogue/gui/screens/Screen.java index 94b24e3..4c5ae06 100644 --- a/src/mightypork/rogue/gui/screens/Screen.java +++ b/src/mightypork/rogue/gui/screens/Screen.java @@ -10,7 +10,7 @@ import mightypork.rogue.input.KeyBindingPool; import mightypork.rogue.input.KeyStroke; import mightypork.rogue.render.Renderable; import mightypork.utils.control.interf.Destroyable; -import mightypork.utils.math.constraints.ConstraintContext; +import mightypork.utils.math.constraints.RectEvaluable; import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Rect; @@ -20,7 +20,7 @@ import mightypork.utils.math.coord.Rect; * * @author MightyPork */ -public abstract class Screen extends ChildClient implements Renderable, Destroyable, KeyBinder, ConstraintContext, ScreenChangeEvent.Listener { +public abstract class Screen extends ChildClient implements Renderable, Destroyable, KeyBinder, RectEvaluable, ScreenChangeEvent.Listener { private final KeyBindingPool keybindings = new KeyBindingPool(); @@ -70,7 +70,7 @@ public abstract class Screen extends ChildClient implements Renderable, Destroya active = true; needSetupViewport = true; - onSizeChanged(getRect().size()); + onSizeChanged(getRect().getSize()); onScreenEnter(); // enable events diff --git a/src/mightypork/rogue/gui/screens/ScreenLayer.java b/src/mightypork/rogue/gui/screens/ScreenLayer.java index 680886c..7a30957 100644 --- a/src/mightypork/rogue/gui/screens/ScreenLayer.java +++ b/src/mightypork/rogue/gui/screens/ScreenLayer.java @@ -6,7 +6,7 @@ import mightypork.rogue.input.KeyBinder; import mightypork.rogue.input.KeyBindingPool; import mightypork.rogue.input.KeyStroke; import mightypork.rogue.render.Renderable; -import mightypork.utils.math.constraints.ConstraintContext; +import mightypork.utils.math.constraints.RectEvaluable; import mightypork.utils.math.coord.Rect; @@ -15,7 +15,7 @@ import mightypork.utils.math.coord.Rect; * * @author MightyPork */ -public abstract class ScreenLayer extends ChildClient implements Renderable, ConstraintContext, KeyBinder { +public abstract class ScreenLayer extends ChildClient implements Renderable, RectEvaluable, KeyBinder { private final Screen screen; diff --git a/src/mightypork/rogue/gui/screens/test_bouncyboxes/BouncyBox.java b/src/mightypork/rogue/gui/screens/test_bouncyboxes/BouncyBox.java index 6ea47b6..afc87dc 100644 --- a/src/mightypork/rogue/gui/screens/test_bouncyboxes/BouncyBox.java +++ b/src/mightypork/rogue/gui/screens/test_bouncyboxes/BouncyBox.java @@ -5,37 +5,33 @@ import static mightypork.utils.math.constraints.ConstraintFactory.*; import java.util.Random; -import mightypork.rogue.gui.constraints.PluggableRenderable; +import mightypork.rogue.gui.renderers.PluggableRenderer; import mightypork.rogue.render.Render; 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.constraints.NumEvaluable; +import mightypork.utils.math.constraints.RectEvaluable; -public class BouncyBox implements PluggableRenderable, Updateable, ConstraintContext { +public class BouncyBox extends PluggableRenderer implements Updateable { private final Random rand = new Random(); - private ConstraintContext context; - - private final RectConstraint box; + private final RectEvaluable box; private final AnimDouble pos = new AnimDouble(0, Easing.BOUNCE_OUT); public BouncyBox() { // create box - final NumConstraint side = c_height(this); - RectConstraint abox = c_box_sized(this, side, side); + final NumEvaluable side = c_height(this); + RectEvaluable abox = c_box(this, side, side); // move - final NumConstraint move_length = c_sub(c_width(this), side); - final NumConstraint offset = c_mul(move_length, c_n(pos)); + final NumEvaluable move_length = c_sub(c_width(this), side); + final NumEvaluable offset = c_mul(move_length, c_n(pos)); abox = c_move(abox, offset, c_n(0)); // add padding @@ -45,13 +41,6 @@ public class BouncyBox implements PluggableRenderable, Updateable, ConstraintCon } - @Override - public Rect getRect() - { - return context.getRect(); - } - - @Override public void render() { @@ -59,22 +48,15 @@ public class BouncyBox implements PluggableRenderable, Updateable, ConstraintCon } - @Override - public void setContext(ConstraintContext context) - { - this.context = context; - } - - public void goLeft() { - pos.animate(1, 0, 2 + rand.nextDouble() * 1); + pos.animate(1, 0, 1 + rand.nextDouble() * 1); } public void goRight() { - pos.animate(0, 1, 2 + rand.nextDouble() * 1); + pos.animate(0, 1, 1 + rand.nextDouble() * 1); } diff --git a/src/mightypork/rogue/gui/screens/test_bouncyboxes/LayerBouncyBoxes.java b/src/mightypork/rogue/gui/screens/test_bouncyboxes/LayerBouncyBoxes.java index 4f5308c..801653c 100644 --- a/src/mightypork/rogue/gui/screens/test_bouncyboxes/LayerBouncyBoxes.java +++ b/src/mightypork/rogue/gui/screens/test_bouncyboxes/LayerBouncyBoxes.java @@ -6,10 +6,16 @@ import static mightypork.utils.math.constraints.ConstraintFactory.*; import java.util.ArrayList; import java.util.List; -import mightypork.rogue.gui.constraints.RowHolder; +import mightypork.rogue.Res; +import mightypork.rogue.gui.renderers.RowHolder; +import mightypork.rogue.gui.renderers.TextRenderer; +import mightypork.rogue.gui.renderers.TextRenderer.Align; import mightypork.rogue.gui.screens.Screen; import mightypork.rogue.gui.screens.ScreenLayer; -import mightypork.utils.math.constraints.RectConstraint; +import mightypork.rogue.input.KeyStroke; +import mightypork.rogue.input.Keys; +import mightypork.utils.math.color.RGB; +import mightypork.utils.math.constraints.RectEvaluable; public class LayerBouncyBoxes extends ScreenLayer { @@ -21,17 +27,37 @@ public class LayerBouncyBoxes extends ScreenLayer { public LayerBouncyBoxes(Screen screen) { super(screen); + bindKeyStroke(new KeyStroke(true, Keys.KEY_RIGHT), new Runnable() { + + @Override + public void run() + { + goRight(); + } + }); + + bindKeyStroke(new KeyStroke(true, Keys.KEY_LEFT), new Runnable() { + + @Override + public void run() + { + goLeft(); + } + }); + // shrink screen rect by 8% on all sides - final RectConstraint holder_rect = c_shrink(this, c_percent(c_height(this), c_n(8))); + final RectEvaluable holder_rect = c_shrink(this, c_percent(c_height(this), c_n(8))); - addChildClient(layout = new RowHolder(screen, holder_rect, 16)); + addChildClient(layout = new RowHolder(screen, holder_rect, 8)); - for (int i = 0; i < 16; i++) { + for (int i = 0; i < 7; i++) { final BouncyBox bbr = new BouncyBox(); - layout.addRow(bbr); + layout.add(bbr); boxes.add(bbr); } + layout.add(new TextRenderer(Res.getFont("default"), "This is a text, yo!", RGB.WHITE, Align.LEFT)); + } diff --git a/src/mightypork/rogue/gui/screens/test_bouncyboxes/ScreenTestBouncy.java b/src/mightypork/rogue/gui/screens/test_bouncyboxes/ScreenTestBouncy.java index 29ed812..8d57b3f 100644 --- a/src/mightypork/rogue/gui/screens/test_bouncyboxes/ScreenTestBouncy.java +++ b/src/mightypork/rogue/gui/screens/test_bouncyboxes/ScreenTestBouncy.java @@ -5,8 +5,7 @@ import mightypork.rogue.AppAccess; import mightypork.rogue.bus.events.ScreenRequestEvent; import mightypork.rogue.gui.screens.LayeredScreen; import mightypork.rogue.input.KeyStroke; - -import org.lwjgl.input.Keyboard; +import mightypork.rogue.input.Keys; public class ScreenTestBouncy extends LayeredScreen { @@ -21,25 +20,7 @@ public class ScreenTestBouncy extends LayeredScreen { addLayer(layer); - bindKeyStroke(new KeyStroke(true, Keyboard.KEY_RIGHT), new Runnable() { - - @Override - public void run() - { - layer.goRight(); - } - }); - - bindKeyStroke(new KeyStroke(true, Keyboard.KEY_LEFT), new Runnable() { - - @Override - public void run() - { - layer.goLeft(); - } - }); - - bindKeyStroke(new KeyStroke(Keyboard.KEY_C), new Runnable() { + bindKeyStroke(new KeyStroke(Keys.KEY_C), new Runnable() { @Override public void run() diff --git a/src/mightypork/rogue/gui/screens/test_cat_sound/LayerFlyingCat.java b/src/mightypork/rogue/gui/screens/test_cat_sound/LayerFlyingCat.java index 9c99cf6..9ebe2c5 100644 --- a/src/mightypork/rogue/gui/screens/test_cat_sound/LayerFlyingCat.java +++ b/src/mightypork/rogue/gui/screens/test_cat_sound/LayerFlyingCat.java @@ -7,45 +7,60 @@ import java.util.Random; import mightypork.rogue.Res; import mightypork.rogue.bus.events.MouseButtonEvent; +import mightypork.rogue.gui.renderers.ImageRenderer; +import mightypork.rogue.gui.renderers.TextRenderer; +import mightypork.rogue.gui.renderers.TextRenderer.Align; import mightypork.rogue.gui.screens.Screen; import mightypork.rogue.gui.screens.ScreenLayer; import mightypork.rogue.input.KeyStroke; -import mightypork.rogue.render.Render; +import mightypork.rogue.input.Keys; import mightypork.utils.control.interf.Updateable; import mightypork.utils.math.animation.AnimDouble; import mightypork.utils.math.animation.Easing; -import mightypork.utils.math.constraints.RectConstraint; +import mightypork.utils.math.color.RGB; +import mightypork.utils.math.constraints.RectEvaluable; import mightypork.utils.math.coord.Coord; -import org.lwjgl.input.Keyboard; -import org.newdawn.slick.opengl.Texture; - public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButtonEvent.Listener { - private final RectConstraint kittenbox; - - private final AnimDouble s = new AnimDouble(400, Easing.SINE_BOTH); - private final AnimDouble x = new AnimDouble(200, Easing.ELASTIC_OUT); - private final AnimDouble y = new AnimDouble(200, Easing.ELASTIC_OUT); + private final AnimDouble size = new AnimDouble(400, Easing.SINE_BOTH); + private final AnimDouble xPos = new AnimDouble(200, Easing.ELASTIC_OUT); + private final AnimDouble yPos = new AnimDouble(200, Easing.ELASTIC_OUT); private final Random rand = new Random(); - private final Texture cat_tx = Res.getTexture("test.kitten"); + private final ImageRenderer cat; + private final TextRenderer text; public LayerFlyingCat(Screen screen) { super(screen); - kittenbox = c_move(c_box_sized(this, c_n(s), c_n(s)), c_n(x), c_n(y)); + xPos.setTo(disp().getWidth() / 2); + yPos.setTo(disp().getHeight() / 2); + + cat = new ImageRenderer(Res.getTxQuad("test.kitten")); + cat.setContext(c_centered(c_box(this, c_n(size), c_n(size)), c_n(xPos), c_n(yPos))); - bindKeyStroke(new KeyStroke(Keyboard.KEY_RETURN), new Runnable() { + //@formatter:off + final RectEvaluable flyingFontBox = c_centered( + c_box(this, c_n(0), c_n(64)), + input().c_mouse_x(), + input().c_mouse_y() + ); + //@formatter:on + + text = new TextRenderer(Res.getFont("default"), "YO", RGB.YELLOW, Align.CENTER); + text.setContext(flyingFontBox); + + bindKeyStroke(new KeyStroke(Keys.KEY_RETURN), new Runnable() { @Override public void run() { - x.fadeTo(disp().getWidth() / 2 - s.getTo() / 2, 2); - y.fadeTo(disp().getHeight() / 2 - s.getTo() / 2, 2); + xPos.fadeTo(disp().getWidth() / 2, 2); + yPos.fadeTo(disp().getHeight() / 2, 2); } }); } @@ -54,9 +69,9 @@ public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButt @Override public void update(double delta) { - s.update(delta); - x.update(delta); - y.update(delta); + size.update(delta); + xPos.update(delta); + yPos.update(delta); } @@ -67,20 +82,19 @@ public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButt final Coord pos = event.getPos(); - final double newSize = 200 + rand.nextInt(600); - final double t = 2; - s.fadeTo(newSize, t / 2D); - x.fadeTo(pos.x - newSize / 2D, t); - y.fadeTo(pos.y - newSize / 2D, t); + size.fadeTo(100 + rand.nextInt(700), t / 2D); + xPos.fadeTo(pos.x, t); + yPos.fadeTo(pos.y, t); } @Override public void render() { - Render.quadTextured(kittenbox.getRect(), cat_tx); + cat.render(); + text.render(); } } diff --git a/src/mightypork/rogue/gui/screens/test_cat_sound/ScreenTestCat.java b/src/mightypork/rogue/gui/screens/test_cat_sound/ScreenTestCat.java index f1cb226..fb0a6a7 100644 --- a/src/mightypork/rogue/gui/screens/test_cat_sound/ScreenTestCat.java +++ b/src/mightypork/rogue/gui/screens/test_cat_sound/ScreenTestCat.java @@ -8,8 +8,7 @@ import mightypork.rogue.bus.events.ActionRequest.RequestType; import mightypork.rogue.bus.events.ScreenRequestEvent; import mightypork.rogue.gui.screens.LayeredScreen; import mightypork.rogue.input.KeyStroke; - -import org.lwjgl.input.Keyboard; +import mightypork.rogue.input.Keys; public class ScreenTestCat extends LayeredScreen { @@ -22,7 +21,7 @@ public class ScreenTestCat extends LayeredScreen { addLayer(layer = new LayerFlyingCat(this)); - bindKeyStroke(new KeyStroke(Keyboard.KEY_ESCAPE), new Runnable() { + bindKeyStroke(new KeyStroke(Keys.KEY_ESCAPE), new Runnable() { @Override public void run() @@ -32,7 +31,7 @@ public class ScreenTestCat extends LayeredScreen { } }); - bindKeyStroke(new KeyStroke(Keyboard.KEY_B), new Runnable() { + bindKeyStroke(new KeyStroke(Keys.KEY_B), new Runnable() { @Override public void run() diff --git a/src/mightypork/rogue/gui/screens/test_font/ScreenTestFont.java b/src/mightypork/rogue/gui/screens/test_font/ScreenTestFont.java index 1a81091..4d57bba 100644 --- a/src/mightypork/rogue/gui/screens/test_font/ScreenTestFont.java +++ b/src/mightypork/rogue/gui/screens/test_font/ScreenTestFont.java @@ -3,16 +3,21 @@ package mightypork.rogue.gui.screens.test_font; import mightypork.rogue.AppAccess; import mightypork.rogue.Res; -import mightypork.rogue.fonts.GLFont; +import mightypork.rogue.fonts.FontRenderer; import mightypork.rogue.gui.screens.Screen; -import mightypork.rogue.render.Render; +import mightypork.utils.math.color.RGB; import mightypork.utils.math.coord.Coord; public class ScreenTestFont extends Screen { + private final FontRenderer fr; + + public ScreenTestFont(AppAccess app) { super(app); + + fr = new FontRenderer(Res.getFont("default")); } @@ -40,15 +45,24 @@ public class ScreenTestFont extends Screen { @Override protected void renderScreen() { - final GLFont font = Res.getFont("PolygonPixel_16"); + final String str = "O hai"; + + final double height = getRect().getHeight() / 5D; + final Coord space = fr.getNeededSpace(str, height); + + final Coord origin = getRect().getCenter().sub(space.half()); + + fr.draw(str, origin, height, RGB.GREEN); - final String s = "It works!"; - final double scale = getRect().height() / 50D; - Render.pushState(); - Render.translate(getRect().getCenter().sub(font.getNeededSpace(s).mul(scale).half())); - Render.scale(new Coord(scale)); - font.draw("It works!"); - Render.popState(); +// final GLFont font = Res.getFont(""); +// +// final String s = "It works!"; +// final double scale = getRect().height() / 50D; +// Render.pushState(); +// Render.translate(getRect().getCenter().sub(font.getNeededSpace(s).mul(scale).half())); +// Render.scale(new Coord(scale)); +// font.draw("It works!"); +// Render.popState(); } diff --git a/src/mightypork/rogue/input/InputSystem.java b/src/mightypork/rogue/input/InputSystem.java index 9bc0717..5674f3e 100644 --- a/src/mightypork/rogue/input/InputSystem.java +++ b/src/mightypork/rogue/input/InputSystem.java @@ -9,6 +9,7 @@ import mightypork.rogue.bus.events.KeyboardEvent; import mightypork.rogue.bus.events.MouseButtonEvent; import mightypork.rogue.bus.events.MouseMotionEvent; import mightypork.utils.control.interf.Updateable; +import mightypork.utils.math.constraints.NumEvaluable; import mightypork.utils.math.coord.Coord; import org.lwjgl.LWJGLException; @@ -154,4 +155,53 @@ public class InputSystem extends Subsystem implements Updateable, KeyBinder { { this.yAxisDown = yAxisDown; } + + + /** + * Get absolute mouse position + * + * @return mouse position + */ + public Coord getMousePos() + { + final Coord pos = new Coord(Mouse.getX(), Mouse.getY()); + flipScrY(pos); + return pos; + } + + + public void grabMouse(boolean grab) + { + Mouse.setGrabbed(grab); + } + + private final NumEvaluable cmousex = new NumEvaluable() { + + @Override + public double getValue() + { + return getMousePos().x; + } + }; + + private final NumEvaluable cmousey = new NumEvaluable() { + + @Override + public double getValue() + { + return getMousePos().y; + } + }; + + + public NumEvaluable c_mouse_x() + { + return cmousex; + } + + + public NumEvaluable c_mouse_y() + { + return cmousey; + } } diff --git a/src/mightypork/rogue/input/Keys.java b/src/mightypork/rogue/input/Keys.java new file mode 100644 index 0000000..2c1db9f --- /dev/null +++ b/src/mightypork/rogue/input/Keys.java @@ -0,0 +1,140 @@ +package mightypork.rogue.input; + + +import org.lwjgl.input.Keyboard; + + +/** + * Key constants, from LWJGL {@link Keyboard} + * + * @author MightyPork + */ +public interface Keys { + + //@formatter:off + + public static final int CHAR_NONE = '\0'; + + public static final int KEY_NONE = 0x00; + + public static final int KEY_ESCAPE = 0x01; + + public static final int KEY_1 = 0x02; + public static final int KEY_2 = 0x03; + public static final int KEY_3 = 0x04; + public static final int KEY_4 = 0x05; + public static final int KEY_5 = 0x06; + public static final int KEY_6 = 0x07; + public static final int KEY_7 = 0x08; + public static final int KEY_8 = 0x09; + public static final int KEY_9 = 0x0A; + public static final int KEY_0 = 0x0B; + + public static final int KEY_Q = 0x10; + public static final int KEY_W = 0x11; + public static final int KEY_E = 0x12; + public static final int KEY_R = 0x13; + public static final int KEY_T = 0x14; + public static final int KEY_Y = 0x15; + public static final int KEY_U = 0x16; + public static final int KEY_I = 0x17; + public static final int KEY_O = 0x18; + public static final int KEY_P = 0x19; + public static final int KEY_A = 0x1E; + public static final int KEY_S = 0x1F; + public static final int KEY_D = 0x20; + public static final int KEY_F = 0x21; + public static final int KEY_G = 0x22; + public static final int KEY_H = 0x23; + public static final int KEY_J = 0x24; + public static final int KEY_K = 0x25; + public static final int KEY_L = 0x26; + public static final int KEY_Z = 0x2C; + public static final int KEY_X = 0x2D; + public static final int KEY_C = 0x2E; + public static final int KEY_V = 0x2F; + public static final int KEY_B = 0x30; + public static final int KEY_N = 0x31; + public static final int KEY_M = 0x32; + + public static final int KEY_MINUS = 0x0C; + public static final int KEY_EQUALS = 0x0D; + public static final int KEY_SLASH = 0x35; + public static final int KEY_BACKSLASH = 0x2B; + public static final int KEY_LBRACKET = 0x1A; + public static final int KEY_RBRACKET = 0x1B; + public static final int KEY_SEMICOLON = 0x27; + public static final int KEY_APOSTROPHE = 0x28; + public static final int KEY_GRAVE = 0x29; + public static final int KEY_COMMA = 0x33; + public static final int KEY_PERIOD = 0x34; + + public static final int KEY_SPACE = 0x39; + public static final int KEY_BACKSPACE = 0x0E; + public static final int KEY_TAB = 0x0F; + + public static final int KEY_F1 = 0x3B; + public static final int KEY_F2 = 0x3C; + public static final int KEY_F3 = 0x3D; + public static final int KEY_F4 = 0x3E; + public static final int KEY_F5 = 0x3F; + public static final int KEY_F6 = 0x40; + public static final int KEY_F7 = 0x41; + public static final int KEY_F8 = 0x42; + public static final int KEY_F9 = 0x43; + public static final int KEY_F10 = 0x44; + public static final int KEY_F11 = 0x57; + public static final int KEY_F12 = 0x58; + public static final int KEY_F13 = 0x64; + public static final int KEY_F14 = 0x65; + public static final int KEY_F15 = 0x66; + + public static final int KEY_CAPSLOCK = 0x3A; + public static final int KEY_SCROLLLOCK = 0x46; + public static final int KEY_NUMLOCK = 0x45; + + public static final int KEY_SUBTRACT = 0x4A; /* - on numeric keypad */ + public static final int KEY_ADD = 0x4E; /* + on numeric keypad */ + public static final int KEY_NUMPAD0 = 0x52; + public static final int KEY_NUMPAD1 = 0x4F; + public static final int KEY_NUMPAD2 = 0x50; + public static final int KEY_NUMPAD3 = 0x51; + public static final int KEY_NUMPAD4 = 0x4B; + public static final int KEY_NUMPAD5 = 0x4C; + public static final int KEY_NUMPAD6 = 0x4D; + public static final int KEY_NUMPAD7 = 0x47; + public static final int KEY_NUMPAD8 = 0x48; + public static final int KEY_NUMPAD9 = 0x49; + public static final int KEY_DECIMAL = 0x53; /* . on numeric keypad */ + public static final int KEY_NUMPADENTER = 0x9C; /* Enter on numeric keypad */ + public static final int KEY_DIVIDE = 0xB5; /* / on numeric keypad */ + public static final int KEY_MULTIPLY = 0x37; /* * on numeric keypad */ + + public static final int KEY_LCONTROL = 0x1D; + public static final int KEY_RCONTROL = 0x9D; + public static final int KEY_LALT = 0x38; + public static final int KEY_RALT = 0xB8; + public static final int KEY_LSHIFT = 0x2A; + public static final int KEY_RSHIFT = 0x36; + public static final int KEY_LMETA = 0xDB; + public static final int KEY_RMETA = 0xDC; + + + public static final int KEY_UP = 0xC8; /* UpArrow on arrow keypad */ + public static final int KEY_DOWN = 0xD0; /* DownArrow on arrow keypad */ + public static final int KEY_LEFT = 0xCB; /* LeftArrow on arrow keypad */ + public static final int KEY_RIGHT = 0xCD; /* RightArrow on arrow keypad */ + + public static final int KEY_HOME = 0xC7; /* Home on arrow keypad */ + public static final int KEY_END = 0xCF; /* End on arrow keypad */ + + public static final int KEY_PAGEUP = 0xC9; /* PgUp on arrow keypad */ + public static final int KEY_PAGEDOWN = 0xD1; /* PgDn on arrow keypad */ + + public static final int KEY_RETURN = 0x1C; + public static final int KEY_PAUSE = 0xC5; /* Pause */ + public static final int KEY_INSERT = 0xD2; /* Insert on arrow keypad */ + public static final int KEY_DELETE = 0xD3; /* Delete on arrow keypad */ + + //@formatter:on +} diff --git a/src/mightypork/rogue/loading/AsyncResourceLoader.java b/src/mightypork/rogue/loading/AsyncResourceLoader.java index efa62e4..1e5a6b6 100644 --- a/src/mightypork/rogue/loading/AsyncResourceLoader.java +++ b/src/mightypork/rogue/loading/AsyncResourceLoader.java @@ -64,7 +64,7 @@ public class AsyncResourceLoader extends Thread implements ResourceLoadRequest.L // textures & fonts needs to be loaded in main thread if (def.getClass().isAnnotationPresent(MustLoadInMainThread.class)) { - Log.f3(" Delegating to main thread:\n "+Log.str(def)); + Log.f3(" Delegating to main thread:\n " + Log.str(def)); app.bus().send(new MainLoopTaskRequest(new Runnable() { @@ -78,7 +78,7 @@ public class AsyncResourceLoader extends Thread implements ResourceLoadRequest.L continue; } - Log.f3(" Loading async:\n "+Log.str(def)); + Log.f3(" Loading async:\n " + Log.str(def)); exs.submit(new Runnable() { diff --git a/src/mightypork/rogue/render/DisplaySystem.java b/src/mightypork/rogue/render/DisplaySystem.java index c80959d..574e6ea 100644 --- a/src/mightypork/rogue/render/DisplaySystem.java +++ b/src/mightypork/rogue/render/DisplaySystem.java @@ -9,7 +9,7 @@ import mightypork.rogue.AppAccess; import mightypork.rogue.bus.Subsystem; import mightypork.rogue.bus.events.ScreenChangeEvent; import mightypork.utils.logging.Log; -import mightypork.utils.math.constraints.ConstraintContext; +import mightypork.utils.math.constraints.RectEvaluable; import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Rect; @@ -19,7 +19,7 @@ import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; -public class DisplaySystem extends Subsystem implements ConstraintContext { +public class DisplaySystem extends Subsystem implements RectEvaluable { private DisplayMode windowDisplayMode; private int targetFps; diff --git a/src/mightypork/rogue/render/Render.java b/src/mightypork/rogue/render/Render.java index d1afb5a..a986d91 100644 --- a/src/mightypork/rogue/render/Render.java +++ b/src/mightypork/rogue/render/Render.java @@ -12,7 +12,7 @@ import mightypork.utils.math.color.RGB; import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Rect; -import org.newdawn.slick.opengl.SlickCallable; +import org.lwjgl.opengl.GL11; import org.newdawn.slick.opengl.Texture; import org.newdawn.slick.opengl.TextureImpl; import org.newdawn.slick.opengl.TextureLoader; @@ -48,6 +48,11 @@ public class Render { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); } @@ -96,6 +101,17 @@ public class Render { } + /** + * Scale by X factor + * + * @param factor scaling factor + */ + public static void scaleXY(double factor) + { + glScaled(factor, factor, 1); + } + + /** * Scale by X factor * @@ -174,13 +190,25 @@ public class Render { glRotated(angle, vec.x, vec.y, vec.z); } + private static int pushed = 0; + /** * Store GL state */ public static void pushState() { - SlickCallable.enterSafeBlock(); + pushed++; + + if (pushed >= 3) { + Log.w("Suspicious amount of state pushes: " + pushed); + } + +// Log.f3("push : "+pushed); + + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GL11.glPushClientAttrib(GL11.GL_ALL_CLIENT_ATTRIB_BITS); + GL11.glPushMatrix(); } @@ -189,7 +217,17 @@ public class Render { */ public static void popState() { - SlickCallable.leaveSafeBlock(); + if (pushed == 0) { + Log.w("Pop without push."); + } + + pushed--; + +// Log.f3("pop : "+pushed); + + GL11.glPopMatrix(); + GL11.glPopClientAttrib(); + GL11.glPopAttrib(); } @@ -278,10 +316,10 @@ public class Render { */ public static void quad(Rect quad) { - final double left = quad.xMin(); - final double bottom = quad.yMin(); - final double right = quad.xMax(); - final double top = quad.yMax(); + final double left = quad.x1(); + final double bottom = quad.y1(); + final double right = quad.x2(); + final double top = quad.y2(); // draw with color unbindTexture(); @@ -318,15 +356,15 @@ public class Render { */ public static void quadUV_nobound(Rect quad, Rect uvs) { - final double left = quad.xMin(); - final double bottom = quad.yMin(); - final double right = quad.xMax(); - final double top = quad.yMax(); + final double left = quad.x1(); + final double bottom = quad.y1(); + final double right = quad.x2(); + final double top = quad.y2(); - final double tleft = uvs.xMin(); - final double tbottom = uvs.yMin(); - final double tright = uvs.xMax(); - final double ttop = uvs.yMax(); + final double tleft = uvs.x1(); + final double tbottom = uvs.y1(); + final double tright = uvs.x2(); + final double ttop = uvs.y2(); // quad with texture glTexCoord2d(tleft, ttop); @@ -342,10 +380,10 @@ public class Render { public static void quadGradH(Rect quad, RGB colorLeft, RGB colorRight) { - final double left = quad.xMin(); - final double bottom = quad.yMin(); - final double right = quad.yMax(); - final double top = quad.yMax(); + final double left = quad.x1(); + final double bottom = quad.y1(); + final double right = quad.y2(); + final double top = quad.y2(); // draw with color unbindTexture(); @@ -366,10 +404,10 @@ public class Render { public static void quadGradV(Rect quad, RGB colorTop, RGB colorBottom) { - final double left = quad.xMin(); - final double bottom = quad.yMin(); - final double right = quad.yMax(); - final double top = quad.yMax(); + final double left = quad.x1(); + final double bottom = quad.y1(); + final double right = quad.y2(); + final double top = quad.y2(); // draw with color unbindTexture(); @@ -396,9 +434,11 @@ public class Render { */ public static void quadTextured(Rect quad, Rect uvs, Texture texture, RGB tint) { + pushState(); bindTexture(texture); setColor(tint); quadUV(quad, uvs); + popState(); } diff --git a/src/mightypork/rogue/sounds/DeferredAudio.java b/src/mightypork/rogue/sounds/DeferredAudio.java index df98f79..ba3902b 100644 --- a/src/mightypork/rogue/sounds/DeferredAudio.java +++ b/src/mightypork/rogue/sounds/DeferredAudio.java @@ -17,7 +17,7 @@ import org.newdawn.slick.openal.SoundStore; * * @author MightyPork */ -@LoggedName(name="Audio") +@LoggedName(name = "Audio") public class DeferredAudio extends BaseDeferredResource { private enum PlayMode diff --git a/src/mightypork/rogue/sounds/NullAudio.java b/src/mightypork/rogue/sounds/NullAudio.java index 014b123..6b086fb 100644 --- a/src/mightypork/rogue/sounds/NullAudio.java +++ b/src/mightypork/rogue/sounds/NullAudio.java @@ -11,7 +11,7 @@ import mightypork.utils.logging.LoggedName; * * @author MightyPork */ -@LoggedName(name="NullAudio") +@LoggedName(name = "NullAudio") public class NullAudio extends DeferredAudio implements NullResource { public NullAudio() { diff --git a/src/mightypork/rogue/textures/DeferredTexture.java b/src/mightypork/rogue/textures/DeferredTexture.java index f8d1038..61cca06 100644 --- a/src/mightypork/rogue/textures/DeferredTexture.java +++ b/src/mightypork/rogue/textures/DeferredTexture.java @@ -17,7 +17,7 @@ import org.newdawn.slick.opengl.Texture; * @author MightyPork */ @MustLoadInMainThread -@LoggedName(name="Texture") +@LoggedName(name = "Texture") public class DeferredTexture extends BaseDeferredResource implements FilteredTexture { private Texture backingTexture; diff --git a/src/mightypork/rogue/textures/TextureBank.java b/src/mightypork/rogue/textures/TextureBank.java index b3851b0..c66733c 100644 --- a/src/mightypork/rogue/textures/TextureBank.java +++ b/src/mightypork/rogue/textures/TextureBank.java @@ -62,6 +62,8 @@ public class TextureBank extends AppAdapter { textures.put(key, tx); lastTx = tx; + + makeQuad(key, Rect.one()); } diff --git a/src/mightypork/rogue/textures/TxQuad.java b/src/mightypork/rogue/textures/TxQuad.java index 4e66a60..8a7ec0a 100644 --- a/src/mightypork/rogue/textures/TxQuad.java +++ b/src/mightypork/rogue/textures/TxQuad.java @@ -70,7 +70,7 @@ public class TxQuad { /** * @param tx Texture - * @param uvs Rect of texturwe UVs (pixels - from left top) + * @param uvs Rect of texture UVs (0-1) */ public TxQuad(Texture tx, Rect uvs) { this.tx = tx; diff --git a/src/mightypork/rogue/util/SlickLogRedirector.java b/src/mightypork/rogue/util/SlickLogRedirector.java index 38838c5..bfbd343 100644 --- a/src/mightypork/rogue/util/SlickLogRedirector.java +++ b/src/mightypork/rogue/util/SlickLogRedirector.java @@ -1,58 +1,67 @@ package mightypork.rogue.util; + import mightypork.utils.logging.LogInstance; import org.newdawn.slick.util.LogSystem; public class SlickLogRedirector implements LogSystem { + LogInstance l; - + + public SlickLogRedirector(LogInstance log) { this.l = log; } - + + @Override public void error(String msg, Throwable e) { l.e(msg, e); } - + + @Override public void error(Throwable e) { l.e(e); } - + + @Override public void error(String msg) { l.e(msg); } - + + @Override public void warn(String msg) { l.w(msg); } - + + @Override public void warn(String msg, Throwable e) { l.e(msg, e); } - + + @Override public void info(String msg) { l.i(msg); } - + + @Override public void debug(String msg) { l.f3(msg); } - } diff --git a/src/mightypork/utils/control/bus/EventBus.java b/src/mightypork/utils/control/bus/EventBus.java index 07f455a..fe995c8 100644 --- a/src/mightypork/utils/control/bus/EventBus.java +++ b/src/mightypork/utils/control/bus/EventBus.java @@ -47,9 +47,11 @@ final public class EventBus implements Destroyable { busThread.start(); } - private boolean shallLog(Event event) { - if(!logSending) return false; - if(event.getClass().isAnnotationPresent(UnloggedEvent.class)) return false; + + private boolean shallLog(Event event) + { + if (!logSending) return false; + if (event.getClass().isAnnotationPresent(UnloggedEvent.class)) return false; return true; } @@ -118,7 +120,7 @@ final public class EventBus implements Destroyable { { assertLive(); - DelayedEvent adelay = event.getClass().getAnnotation(DelayedEvent.class); + final DelayedEvent adelay = event.getClass().getAnnotation(DelayedEvent.class); if (adelay != null) { sendDelayed(event, adelay.delay()); return; @@ -158,7 +160,7 @@ final public class EventBus implements Destroyable { final DelayQueueEntry dm = new DelayQueueEntry(delay, event); - if (shallLog(event)) Log.f3(" Q " + Log.str(event) + ", t = +" + delay + "s"); + if (shallLog(event)) Log.f3(" Qu " + Log.str(event) + ", t = +" + delay + "s"); sendQueue.add(dm); } @@ -175,7 +177,7 @@ final public class EventBus implements Destroyable { { assertLive(); - if (shallLog(event)) Log.f3(" D " + Log.str(event)); + if (shallLog(event)) Log.f3(" Di " + Log.str(event)); dispatch(event); } diff --git a/src/mightypork/utils/control/bus/EventChannel.java b/src/mightypork/utils/control/bus/EventChannel.java index 987ab95..a5c2915 100644 --- a/src/mightypork/utils/control/bus/EventChannel.java +++ b/src/mightypork/utils/control/bus/EventChannel.java @@ -52,7 +52,7 @@ final public class EventChannel, CLIENT> { public boolean broadcast(Event event, Collection clients) { if (!canBroadcast(event)) return false; - + return doBroadcast(eventClass.cast(event), clients, new HashSet()); } @@ -131,8 +131,7 @@ final public class EventChannel, CLIENT> { /** - * Check if the given event can be broadcasted by this - * {@link EventChannel} + * Check if the given event can be broadcasted by this {@link EventChannel} * * @param event event object * @return can be broadcasted diff --git a/src/mightypork/utils/logging/Log.java b/src/mightypork/utils/logging/Log.java index c16c958..76976ee 100644 --- a/src/mightypork/utils/logging/Log.java +++ b/src/mightypork/utils/logging/Log.java @@ -199,14 +199,26 @@ public class Log { public static String str(Class cls) { - LoggedName ln = cls.getAnnotation(LoggedName.class); + final LoggedName ln = cls.getAnnotation(LoggedName.class); if (ln != null) { return ln.name(); } + String name = cls.getName(); + + String sep = ""; + + if (name.contains("$")) { + name = name.substring(name.lastIndexOf("$") + 1); + sep = "$"; + } else { + name = name.substring(name.lastIndexOf(".") + 1); + sep = "."; + } + final Class enclosing = cls.getEnclosingClass(); - return (enclosing == null ? "" : str(enclosing) + ".") + cls.getSimpleName(); + return (enclosing == null ? "" : str(enclosing) + sep) + name; } diff --git a/src/mightypork/utils/logging/LogInstance.java b/src/mightypork/utils/logging/LogInstance.java index bb77063..b665b80 100644 --- a/src/mightypork/utils/logging/LogInstance.java +++ b/src/mightypork/utils/logging/LogInstance.java @@ -54,7 +54,7 @@ public class LogInstance { private LogToSysoutMonitor sysoutMonitor; - private long started_ms; + private final long started_ms; /** @@ -103,8 +103,8 @@ public class LogInstance { logger.setUseParentHandlers(false); logger.setLevel(Level.ALL); - String stamp = (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date()); - i("= Logger \""+name+"\" initialized =\n"+stamp); + final String stamp = (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date()); + i("= Logger \"" + name + "\" initialized =\n" + stamp); } @@ -226,7 +226,7 @@ public class LogInstance { if (enabled) { logger.log(level, msg); - String fmt = formatMessage(level, msg, null); + final String fmt = formatMessage(level, msg, null); for (final LogMonitor mon : monitors.values()) { mon.onMessageLogged(level, fmt); @@ -240,7 +240,7 @@ public class LogInstance { if (enabled) { logger.log(level, msg, t); - String fmt = formatMessage(level, msg, t); + final String fmt = formatMessage(level, msg, t); for (final LogMonitor mon : monitors.values()) { mon.onMessageLogged(level, fmt); @@ -375,10 +375,10 @@ public class LogInstance { message = nl + message.substring(1); } - long time_ms = (System.currentTimeMillis()-started_ms); - double time_s = time_ms / 1000D; - String time = String.format("%6.2f ", time_s); - String time_blank = StringUtils.repeat(" ", time.length()); + final long time_ms = (System.currentTimeMillis() - started_ms); + final double time_s = time_ms / 1000D; + final String time = String.format("%6.2f ", time_s); + final String time_blank = StringUtils.repeat(" ", time.length()); String prefix = "[ ? ]"; diff --git a/src/mightypork/utils/math/constraints/Constraint.java b/src/mightypork/utils/math/constraints/Constraint.java deleted file mode 100644 index d0bc787..0000000 --- a/src/mightypork/utils/math/constraints/Constraint.java +++ /dev/null @@ -1,58 +0,0 @@ -package mightypork.utils.math.constraints; - - -import mightypork.utils.math.coord.Coord; - - -/** - * A constraint based on a given {@link ConstraintContext} - * - * @author MightyPork - */ -public abstract class Constraint implements SettableContext { - - private ConstraintContext context = null; - - - public Constraint(ConstraintContext context) { - this.context = context; - } - - - @Override - public void setContext(ConstraintContext context) - { - this.context = context; - } - - - /** - * @return the context - */ - public ConstraintContext getContext() - { - return context; - } - - - /** - * @return context rect origin - */ - protected Coord getOrigin() - { - if (context == null) return Coord.zero(); - - return context.getRect().getOrigin(); - } - - - /** - * @return context rect size - */ - protected Coord getSize() - { - if (context == null) return Coord.zero(); - - return context.getRect().size(); - } -} diff --git a/src/mightypork/utils/math/constraints/ConstraintContext.java b/src/mightypork/utils/math/constraints/ConstraintContext.java deleted file mode 100644 index 96f731f..0000000 --- a/src/mightypork/utils/math/constraints/ConstraintContext.java +++ /dev/null @@ -1,20 +0,0 @@ -package mightypork.utils.math.constraints; - - -import mightypork.utils.math.coord.Rect; - - -/** - * Context for constraints, with a bounding {@link Rect}. - * - * @author MightyPork - */ -public interface ConstraintContext { - - /** - * Get context boundary - * - * @return bounding rectangle - */ - public Rect getRect(); -} diff --git a/src/mightypork/utils/math/constraints/ConstraintFactory.java b/src/mightypork/utils/math/constraints/ConstraintFactory.java index 8f5701e..10c8da4 100644 --- a/src/mightypork/utils/math/constraints/ConstraintFactory.java +++ b/src/mightypork/utils/math/constraints/ConstraintFactory.java @@ -14,9 +14,9 @@ import mightypork.utils.math.coord.Rect; */ public class ConstraintFactory { - public static NumConstraint c_min(final NumConstraint a, final NumConstraint b) + public static NumEvaluable c_min(final NumEvaluable a, final NumEvaluable b) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -27,9 +27,9 @@ public class ConstraintFactory { } - public static NumConstraint c_max(final NumConstraint a, final NumConstraint b) + public static NumEvaluable c_max(final NumEvaluable a, final NumEvaluable b) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -40,9 +40,9 @@ public class ConstraintFactory { } - public static NumConstraint c_abs(final NumConstraint a) + public static NumEvaluable c_abs(final NumEvaluable a) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -53,9 +53,9 @@ public class ConstraintFactory { } - public static NumConstraint c_round(final NumConstraint a) + public static NumEvaluable c_round(final NumEvaluable a) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -66,22 +66,22 @@ public class ConstraintFactory { } - public static RectConstraint c_round(ConstraintContext context) + public static RectEvaluable c_round(final RectEvaluable r) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - return getContext().getRect().round(); + return r.getRect().round(); } }; } - public static NumConstraint c_ceil(final NumConstraint a) + public static NumEvaluable c_ceil(final NumEvaluable a) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -92,9 +92,9 @@ public class ConstraintFactory { } - public static NumConstraint c_floor(final NumConstraint a) + public static NumEvaluable c_floor(final NumEvaluable a) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -105,9 +105,9 @@ public class ConstraintFactory { } - public static NumConstraint c_neg(final NumConstraint a) + public static NumEvaluable c_neg(final NumEvaluable a) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -118,9 +118,9 @@ public class ConstraintFactory { } - public static NumConstraint c_add(final NumConstraint a, final NumConstraint b) + public static NumEvaluable c_add(final NumEvaluable a, final NumEvaluable b) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -131,9 +131,9 @@ public class ConstraintFactory { } - public static NumConstraint c_sub(final NumConstraint a, final NumConstraint b) + public static NumEvaluable c_sub(final NumEvaluable a, final NumEvaluable b) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -144,9 +144,9 @@ public class ConstraintFactory { } - public static NumConstraint c_mul(final NumConstraint a, final NumConstraint b) + public static NumEvaluable c_mul(final NumEvaluable a, final NumEvaluable b) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -157,9 +157,9 @@ public class ConstraintFactory { } - public static NumConstraint c_div(final NumConstraint a, final NumConstraint b) + public static NumEvaluable c_div(final NumEvaluable a, final NumEvaluable b) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -170,9 +170,9 @@ public class ConstraintFactory { } - public static NumConstraint c_percent(final NumConstraint whole, final NumConstraint percent) + public static NumEvaluable c_percent(final NumEvaluable whole, final NumEvaluable percent) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -183,9 +183,9 @@ public class ConstraintFactory { } - public static NumConstraint c_n(final double a) + public static NumEvaluable c_n(final double a) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -196,9 +196,9 @@ public class ConstraintFactory { } - public static NumConstraint c_n(final AnimDouble a) + public static NumEvaluable c_n(final AnimDouble a) { - return new NumConstraint(null) { + return new NumEvaluable() { @Override public double getValue() @@ -209,153 +209,161 @@ public class ConstraintFactory { } - public static NumConstraint c_width(final ConstraintContext context) + public static NumEvaluable c_width(final RectEvaluable r) { - return new NumConstraint(context) { + return new NumEvaluable() { @Override public double getValue() { - return getSize().x; + return r.getRect().getSize().x; } }; } - public static NumConstraint c_height(final ConstraintContext context) + public static NumEvaluable c_height(final RectEvaluable r) { - return new NumConstraint(context) { + return new NumEvaluable() { @Override public double getValue() { - return getSize().y; + return r.getRect().getSize().y; } }; } - public static RectConstraint c_row(ConstraintContext context, final int rows, final int index) + public static RectEvaluable c_row(final RectEvaluable r, final int rows, final int index) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - final double height = getContext().getRect().size().y; + final double height = r.getRect().getSize().y; final double perRow = height / rows; - return Rect.fromSize(getOrigin().add(0, perRow * index), getSize().setY(perRow)); + final Coord origin = r.getRect().getOrigin().add(0, perRow * index); + final Coord size = r.getRect().getSize().setY(perRow); + + return Rect.fromSize(origin, size); } }; } - public static RectConstraint c_column(ConstraintContext context, final int columns, final int index) + public static RectEvaluable c_column(final RectEvaluable r, final int columns, final int index) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - final double width = getContext().getRect().size().x; + final double width = r.getRect().getSize().x; final double perCol = width / columns; - return Rect.fromSize(getOrigin().add(perCol * index, 0), getSize().setX(perCol)); + final Coord origin = r.getRect().getOrigin().add(perCol * index, 0); + final Coord size = r.getRect().getSize().setX(perCol); + + return Rect.fromSize(origin, size); } }; } - public static RectConstraint c_shrink(ConstraintContext context, NumConstraint shrink) + public static RectEvaluable c_shrink(RectEvaluable r, NumEvaluable shrink) { - return c_shrink(context, shrink, shrink, shrink, shrink); + return c_shrink(r, shrink, shrink, shrink, shrink); } - public static RectConstraint c_shrink(ConstraintContext context, NumConstraint horiz, NumConstraint vert) + public static RectEvaluable c_shrink(RectEvaluable context, NumEvaluable horiz, NumEvaluable vert) { return c_shrink(context, horiz, vert, horiz, vert); } - public static RectConstraint c_shrink(ConstraintContext context, final NumConstraint left, final NumConstraint top, final NumConstraint right, final NumConstraint bottom) + public static RectEvaluable c_shrink(final RectEvaluable r, final NumEvaluable x1, final NumEvaluable y1, final NumEvaluable x2, final NumEvaluable y2) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - return getContext().getRect().shrink(left.getValue(), top.getValue(), right.getValue(), bottom.getValue()); + return r.getRect().shrink(x1.getValue(), y1.getValue(), x2.getValue(), y2.getValue()); } }; } - public static RectConstraint c_center(ConstraintContext context) + public static RectEvaluable c_center(final RectEvaluable r) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - return Rect.fromSize(getContext().getRect().getCenter(), 0, 0); + return Rect.fromSize(r.getRect().getCenter(), 0, 0); } }; } - public static RectConstraint c_grow(ConstraintContext context, NumConstraint grow) + public static RectEvaluable c_grow(RectEvaluable r, NumEvaluable grow) { - return c_grow(context, grow, grow, grow, grow); + return c_grow(r, grow, grow, grow, grow); } - public static RectConstraint c_grow(ConstraintContext context, NumConstraint horiz, NumConstraint vert) + public static RectEvaluable c_grow(RectEvaluable r, NumEvaluable horiz, NumEvaluable vert) { - return c_grow(context, horiz, vert, horiz, vert); + return c_grow(r, horiz, vert, horiz, vert); } - public static RectConstraint c_grow(ConstraintContext context, final NumConstraint left, final NumConstraint top, final NumConstraint right, final NumConstraint bottom) + public static RectEvaluable c_grow(final RectEvaluable r, final NumEvaluable x1, final NumEvaluable y1, final NumEvaluable x2, final NumEvaluable y2) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - return getContext().getRect().grow(left.getValue(), top.getValue(), right.getValue(), bottom.getValue()); + return r.getRect().grow(x1.getValue(), y1.getValue(), x2.getValue(), y2.getValue()); } }; } - public static RectConstraint c_tile(ConstraintContext context, final int rows, final int cols, final int left, final int top) + public static RectEvaluable c_tile(final RectEvaluable r, final int rows, final int cols, final int left, final int top) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - final double height = getSize().y; - final double width = getSize().y; + final double height = r.getRect().getSize().y; + final double width = r.getRect().getSize().y; final double perRow = height / rows; final double perCol = width / cols; - return Rect.fromSize(getOrigin().add(perCol * left, perRow * (rows - top - 1)), perCol, perRow); + final Coord origin = r.getRect().getOrigin().add(perCol * left, perRow * (rows - top - 1)); + + return Rect.fromSize(origin, perCol, perRow); } }; } - public static RectConstraint c_box_sized(ConstraintContext context, final NumConstraint width, final NumConstraint height) + public static RectEvaluable c_box(final RectEvaluable r, final NumEvaluable width, final NumEvaluable height) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - final Coord origin = getOrigin(); + final Coord origin = r.getRect().getOrigin(); //@formatter:off return Rect.fromSize( @@ -370,19 +378,19 @@ public class ConstraintFactory { } - public static RectConstraint c_box_sized(ConstraintContext context, final NumConstraint left, final NumConstraint bottom, final NumConstraint width, final NumConstraint height) + public static RectEvaluable c_box(final RectEvaluable r, final NumEvaluable x, final NumEvaluable y, final NumEvaluable width, final NumEvaluable height) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - final Coord origin = getOrigin(); + final Coord origin = r.getRect().getOrigin(); //@formatter:off return Rect.fromSize( - origin.x + left.getValue(), - origin.y + bottom.getValue(), + origin.x + x.getValue(), + origin.y + y.getValue(), width.getValue(), height.getValue() ); @@ -392,36 +400,46 @@ public class ConstraintFactory { } - public static RectConstraint c_box_abs(ConstraintContext context, final NumConstraint left, final NumConstraint bottom, final NumConstraint right, final NumConstraint top) + public static RectEvaluable c_centered(final RectEvaluable r, final NumEvaluable x, final NumEvaluable y) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - final Coord origin = getOrigin(); + final Coord size = r.getRect().getSize(); + + return Rect.fromSize(x.getValue() - size.x / 2D, y.getValue() - size.y / 2D, size.x, size.y); + } + }; + } + + + public static RectEvaluable c_box_abs(final RectEvaluable r, final NumEvaluable x1, final NumEvaluable y1, final NumEvaluable x2, final NumEvaluable y2) + { + return new RectEvaluable() { + + @Override + public Rect getRect() + { + final Coord origin = r.getRect().getOrigin(); //@formatter:off - return new Rect( - origin.x + left.getValue(), - origin.y + bottom.getValue(), - origin.x + right.getValue(), - origin.y + top.getValue() - ); + return new Rect(origin.add(x1.getValue(), y1.getValue()), origin.add(x2.getValue(), y2.getValue())); //@formatter:on } }; } - public static RectConstraint c_move(ConstraintContext context, final NumConstraint x, final NumConstraint y) + public static RectEvaluable c_move(final RectEvaluable r, final NumEvaluable x, final NumEvaluable y) { - return new RectConstraint(context) { + return new RectEvaluable() { @Override public Rect getRect() { - return getContext().getRect().add(x.getValue(), y.getValue()); + return r.getRect().add(x.getValue(), y.getValue()); } }; } diff --git a/src/mightypork/utils/math/constraints/ContextAdapter.java b/src/mightypork/utils/math/constraints/ContextAdapter.java new file mode 100644 index 0000000..ca6d9e2 --- /dev/null +++ b/src/mightypork/utils/math/constraints/ContextAdapter.java @@ -0,0 +1,25 @@ +package mightypork.utils.math.constraints; + + +import mightypork.utils.math.coord.Rect; + + +public class ContextAdapter implements PluggableContext { + + private RectEvaluable backing = null; + + + @Override + public void setContext(RectEvaluable rect) + { + this.backing = rect; + } + + + @Override + public Rect getRect() + { + return backing.getRect(); + } + +} diff --git a/src/mightypork/utils/math/constraints/NumConstraint.java b/src/mightypork/utils/math/constraints/NumConstraint.java deleted file mode 100644 index cc95390..0000000 --- a/src/mightypork/utils/math/constraints/NumConstraint.java +++ /dev/null @@ -1,18 +0,0 @@ -package mightypork.utils.math.constraints; - - -/** - * Constraint that provides size - * - * @author MightyPork - */ -public abstract class NumConstraint extends Constraint { - - public NumConstraint(ConstraintContext context) { - super(context); - } - - - public abstract double getValue(); - -} diff --git a/src/mightypork/utils/math/constraints/NumEvaluable.java b/src/mightypork/utils/math/constraints/NumEvaluable.java new file mode 100644 index 0000000..b31a236 --- /dev/null +++ b/src/mightypork/utils/math/constraints/NumEvaluable.java @@ -0,0 +1,8 @@ +package mightypork.utils.math.constraints; + + +public interface NumEvaluable { + + double getValue(); + +} diff --git a/src/mightypork/utils/math/constraints/PluggableContext.java b/src/mightypork/utils/math/constraints/PluggableContext.java new file mode 100644 index 0000000..f3b512b --- /dev/null +++ b/src/mightypork/utils/math/constraints/PluggableContext.java @@ -0,0 +1,15 @@ +package mightypork.utils.math.constraints; + + +import mightypork.utils.math.coord.Rect; + + +public interface PluggableContext extends RectEvaluable { + + abstract void setContext(RectEvaluable rect); + + + @Override + abstract Rect getRect(); + +} diff --git a/src/mightypork/utils/math/constraints/RectConstraint.java b/src/mightypork/utils/math/constraints/RectConstraint.java deleted file mode 100644 index c091d17..0000000 --- a/src/mightypork/utils/math/constraints/RectConstraint.java +++ /dev/null @@ -1,22 +0,0 @@ -package mightypork.utils.math.constraints; - - -import mightypork.utils.math.coord.Rect; - - -/** - * Constraint that provides a rect ({@link ConstraintContext}) - * - * @author MightyPork - */ -public abstract class RectConstraint extends Constraint implements ConstraintContext { - - public RectConstraint(ConstraintContext context) { - super(context); - } - - - @Override - public abstract Rect getRect(); - -} diff --git a/src/mightypork/utils/math/constraints/RectEvaluable.java b/src/mightypork/utils/math/constraints/RectEvaluable.java new file mode 100644 index 0000000..ec7e475 --- /dev/null +++ b/src/mightypork/utils/math/constraints/RectEvaluable.java @@ -0,0 +1,10 @@ +package mightypork.utils.math.constraints; + + +import mightypork.utils.math.coord.Rect; + + +public interface RectEvaluable { + + Rect getRect(); +} diff --git a/src/mightypork/utils/math/constraints/SettableContext.java b/src/mightypork/utils/math/constraints/SettableContext.java deleted file mode 100644 index 23be703..0000000 --- a/src/mightypork/utils/math/constraints/SettableContext.java +++ /dev/null @@ -1,17 +0,0 @@ -package mightypork.utils.math.constraints; - - -/** - * Can be assigned a context / changed context - * - * @author MightyPork - */ -public interface SettableContext { - - /** - * Assign a context - * - * @param context context - */ - void setContext(ConstraintContext context); -} diff --git a/src/mightypork/utils/math/coord/Coord.java b/src/mightypork/utils/math/coord/Coord.java index b2b984c..e53600b 100644 --- a/src/mightypork/utils/math/coord/Coord.java +++ b/src/mightypork/utils/math/coord/Coord.java @@ -202,7 +202,7 @@ public class Coord { */ public boolean isInRect(Rect rect) { - return isInRect(rect.min, rect.max); + return isInRect(rect.getMin(), rect.getMax()); } diff --git a/src/mightypork/utils/math/coord/Rect.java b/src/mightypork/utils/math/coord/Rect.java index 185e67a..86f0abe 100644 --- a/src/mightypork/utils/math/coord/Rect.java +++ b/src/mightypork/utils/math/coord/Rect.java @@ -41,14 +41,25 @@ public class Rect { /** * Rectangle from size * - * @param x min X - * @param y min Y - * @param size rect size - * @return the rect + * @param sizeX size x + * @param sizeY size y + * @return rect */ - public static Rect fromSize(double x, double y, Coord size) + public static Rect fromSize(double sizeX, double sizeY) { - return fromSize(x, y, size.x, size.y); + return fromSize(0, 0, sizeX, sizeY); + } + + + /** + * Get rect from size + * + * @param size size + * @return rect + */ + public static Rect fromSize(Coord size) + { + return fromSize(0, 0, size.x, size.y); } @@ -67,10 +78,10 @@ public class Rect { } /** Lowest coordinates xy */ - protected Coord min = new Coord(); + private final Coord min = new Coord(); /** Highest coordinates xy */ - protected Coord max = new Coord(); + private final Coord max = new Coord(); /** @@ -199,28 +210,6 @@ public class Rect { } - /** - * Get copy with the same center and height=0 - * - * @return line - */ - public Rect getAxisH() - { - return new Rect(getCenterLeft(), getCenterRight()); - } - - - /** - * Get copy with the same center and width=0 - * - * @return line - */ - public Rect getAxisV() - { - return new Rect(getCenterBottom(), getCenterTop()); - } - - /** * Get rect center * @@ -237,7 +226,7 @@ public class Rect { * * @return center */ - public Coord getCenterBottom() + public Coord getCenterV1() { return new Coord((max.x + min.x) / 2D, min.y); } @@ -248,7 +237,7 @@ public class Rect { * * @return center */ - public Coord getCenterLeft() + public Coord getCenterH1() { return new Coord(min.x, (max.y + min.y) / 2D); } @@ -259,7 +248,7 @@ public class Rect { * * @return center */ - public Coord getCenterRight() + public Coord getCenterH2() { return new Coord(max.x, (max.y + min.y) / 2D); } @@ -270,62 +259,18 @@ public class Rect { * * @return center */ - public Coord getCenterTop() + public Coord getCenterV2() { return new Coord((max.x + min.x) / 2D, max.y); } - /** - * Get bottom edge rect - * - * @return line - */ - public Rect getEdgeBottom() - { - return new Rect(getLeftBottom(), getRightBottom()); - } - - - /** - * Get left edge rect - * - * @return line - */ - public Rect getEdgeLeft() - { - return new Rect(getLeftBottom(), getLeftTop()); - } - - - /** - * Get right edge rect - * - * @return line - */ - public Rect getEdgeRight() - { - return new Rect(getRightBottom(), getRightTop()); - } - - - /** - * Get top edge rect - * - * @return line - */ - public Rect getEdgeTop() - { - return new Rect(getLeftTop(), getRightTop()); - } - - /** * Get left bottom * * @return center */ - public Coord getLeftBottom() + public Coord getX1Y1() { return new Coord(min.x, min.y); } @@ -336,60 +281,64 @@ public class Rect { * * @return center */ - public Coord getLeftTop() + public Coord getX1Y2() { return new Coord(min.x, max.y); } /** + * Alias for getX2Y2 + * * @return highest coordinates xy */ public Coord getMax() { - return getRightTop(); + return getX2Y2(); } /** + * Alias for getX1Y1 + * * @return lowest coordinates xy */ - public Coord getOrigin() + public Coord getMin() { - return getLeftBottom(); + return getX1Y1(); } /** - * Get right bottom + * Alias for getX1Y1 * - * @return center + * @return lowest coordinates xy */ - public Coord getRightBottom() + public Coord getOrigin() { - return new Coord(max.x, min.y); + return getMin(); } /** - * Get right top + * Get right bottom * * @return center */ - public Coord getRightTop() + public Coord getX2Y1() { - return new Coord(max.x, max.y); + return new Coord(max.x, min.y); } /** - * Get size (width, height) as (x,y) + * Get right top * - * @return coord of width,height + * @return center */ - public Coord size() + public Coord getX2Y2() { - return new Coord(max.x - min.x, max.y - min.y); + return new Coord(max.x, max.y); } @@ -434,8 +383,8 @@ public class Rect { /** * Shrink to sides in place * - * @param x x to add - * @param y y to add + * @param x horizontal shrink + * @param y vertical shrink * @return this */ public Rect shrink_ip(double x, double y) @@ -449,31 +398,31 @@ public class Rect { /** * Shrink the rect * - * @param left left shrink - * @param top top shrink - * @param right right shrink - * @param bottom bottom shrink + * @param x1 shrink + * @param y1 shrink + * @param x2 shrink + * @param y2 shrink * @return changed copy */ - public Rect shrink(double left, double top, double right, double bottom) + public Rect shrink(double x1, double y1, double x2, double y2) { - return copy().shrink_ip(left, top, right, bottom); + return copy().shrink_ip(x1, y1, x2, y2); } /** * Shrink the rect in place * - * @param left left shrink - * @param top top shrink - * @param right right shrink - * @param bottom bottom shrink + * @param x1 shrink + * @param y1 shrink + * @param x2 shrink + * @param y2 shrink * @return this */ - public Rect shrink_ip(double left, double top, double right, double bottom) + public Rect shrink_ip(double x1, double y1, double x2, double y2) { - min.add_ip(left, bottom); - max.add_ip(-right, -top); + min.add_ip(x1, y2); + max.add_ip(-x2, -y1); return this; } @@ -493,8 +442,8 @@ public class Rect { /** * Grow to sides in copy * - * @param x x to add - * @param y y to add + * @param x horizontal grow + * @param y vertical grow * @return changed copy */ public Rect grow(double x, double y) @@ -519,8 +468,8 @@ public class Rect { /** * Grow to sides in place * - * @param x x to add - * @param y y to add + * @param x horizontal grow + * @param y vertical grow * @return this */ public Rect grow_ip(double x, double y) @@ -534,31 +483,31 @@ public class Rect { /** * Grow the rect * - * @param left left growth - * @param top top growth - * @param right right growth - * @param bottom bottom growth + * @param x1 growth + * @param y1 growth + * @param x2 growth + * @param y2 growth * @return changed copy */ - public Rect grow(double left, double top, double right, double bottom) + public Rect grow(double x1, double y1, double x2, double y2) { - return copy().grow_ip(left, top, right, bottom); + return copy().grow_ip(x1, y1, x2, y2); } /** * Grow the rect in place * - * @param left left growth - * @param top top growth - * @param right right growth - * @param bottom bottom growth + * @param x1 growth + * @param y1 growth + * @param x2 growth + * @param y2 growth * @return this */ - public Rect grow_ip(double left, double top, double right, double bottom) + public Rect grow_ip(double x1, double y1, double x2, double y2) { - min.add_ip(-left, -bottom); - max.add_ip(right, top); + min.add_ip(-x1, -y2); + max.add_ip(x2, y1); return this; } @@ -773,7 +722,7 @@ public class Rect { /** * @return lower x */ - public double xMin() + public double x1() { return min.x; } @@ -782,7 +731,7 @@ public class Rect { /** * @return upper x */ - public double xMax() + public double x2() { return max.x; } @@ -791,7 +740,7 @@ public class Rect { /** * @return lower y */ - public double yMin() + public double y1() { return min.y; } @@ -800,20 +749,31 @@ public class Rect { /** * @return upper y */ - public double yMax() + public double y2() { return max.y; } - public double height() + public double getHeight() { return max.y - min.y; } - public double width() + public double getWidth() { return max.x - min.x; } + + + /** + * Get size (width, height) as (x,y) + * + * @return coord of width,height + */ + public Coord getSize() + { + return new Coord(max.x - min.x, max.y - min.y); + } }