Removed trash, improved constraint system (nicer names)

This commit is contained in:
Ondřej Hruška
2014-04-12 07:02:03 +02:00
parent a1e35bc696
commit 65bfbbd16a
35 changed files with 661 additions and 1999 deletions
@@ -52,7 +52,7 @@ public class ColumnHolder extends ElementHolder {
{
if (elem == null) return;
elem.setContext(_column(this, cols, col++));
elem.setContext(cColumn(this, cols, col++));
attach(elem);
}
@@ -52,7 +52,7 @@ public class RowHolder extends ElementHolder {
{
if (elem == null) return;
elem.setContext(_row(this, rows, row++));
elem.setContext(cRow(this, rows, row++));
attach(elem);
}
@@ -20,7 +20,20 @@ public class QuadPainter extends PluggableRenderer {
/**
* Painter with cokloured vertices.
* Painter with solid color
*
* @param color
*/
public QuadPainter(RGB color) {
this.colorHMinVMin = color;
this.colorHMaxVMin = color;
this.colorHMaxVMax = color;
this.colorHMinVMax = color;
}
/**
* Painter with coloured vertices.
*
* @param colorHMinVMin
* @param colorHMaxVMin
@@ -30,7 +30,7 @@ public abstract class LayeredScreen extends Screen {
protected void renderScreen()
{
for (final ScreenLayer layer : layers) {
layer.render();
if (layer.isVisible()) layer.render();
}
}
@@ -116,7 +116,7 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind
if (!isActive()) return;
if (needSetupViewport) {
Render.setupOrtho();
Render.setupOrtho(getDisplay().getSize());
}
Render.pushState();
@@ -9,6 +9,7 @@ import mightypork.gamecore.input.KeyBindingPool;
import mightypork.gamecore.input.KeyStroke;
import mightypork.utils.math.constraints.RectConstraint;
import mightypork.utils.math.coord.Vec;
import mightypork.utils.math.coord.VecView;
import mightypork.utils.math.rect.RectView;
@@ -21,8 +22,13 @@ public abstract class ScreenLayer extends AppSubModule implements Comparable<Scr
private final Screen screen;
private boolean visible = true;
private final KeyBindingPool keybindings = new KeyBindingPool();
protected final VecView cMousePos = getInput().getMousePos();
protected final VecView cScreenSize = getDisplay().getSize();
/**
* @param screen parent screen
@@ -65,6 +71,18 @@ public abstract class ScreenLayer extends AppSubModule implements Comparable<Scr
}
public boolean isVisible()
{
return visible;
}
public void setVisible(boolean visible)
{
this.visible = visible;
}
@Override
public final int compareTo(ScreenLayer o)
{
+35 -15
View File
@@ -7,10 +7,10 @@ import mightypork.gamecore.control.bus.events.KeyEvent;
import mightypork.gamecore.control.bus.events.MouseButtonEvent;
import mightypork.gamecore.control.bus.events.MouseMotionEvent;
import mightypork.gamecore.control.timing.Updateable;
import mightypork.gamecore.render.DisplaySystem;
import mightypork.rogue.events.ActionRequest;
import mightypork.rogue.events.ActionRequest.RequestType;
import mightypork.utils.math.coord.MutableCoord;
import mightypork.utils.math.coord.SynthCoord2D;
import mightypork.utils.math.coord.VecMutable;
import mightypork.utils.math.coord.VecView;
@@ -30,6 +30,26 @@ public class InputSystem extends RootBusNode implements Updateable, KeyBinder {
// listeners
private final KeyBindingPool keybindings;
private final VecView mousePos = new SynthCoord2D() {
@Override
public double x()
{
if (!Mouse.isInsideWindow()) return Integer.MIN_VALUE;
return Mouse.getX();
}
@Override
public double y()
{
if (!Mouse.isInsideWindow()) return Integer.MIN_VALUE;
// flip Y axis
return Display.getHeight() - Mouse.getY();
}
};
private static boolean inited = false;
@@ -127,10 +147,9 @@ public class InputSystem extends RootBusNode implements Updateable, KeyBinder {
final int wheeld = Mouse.getEventDWheel();
if (DisplaySystem.yAxisDown) {
flipScrY(pos);
move.mul(1, -1, 1);
}
// flip Y axis
pos.setY(Display.getHeight() - pos.y());
move.mul(1, -1, 1);
if (button != -1 || wheeld != 0) {
getEventBus().send(new MouseButtonEvent(pos.copy(), button, down, wheeld));
@@ -151,22 +170,23 @@ public class InputSystem extends RootBusNode implements Updateable, KeyBinder {
}
private static void flipScrY(VecMutable c)
{
if (DisplaySystem.yAxisDown) c.setY(DisplaySystem.getHeight() - c.y());
}
/**
* Get absolute mouse position
*
* @return mouse position
*/
public static VecView getMousePos()
public VecView getMousePos()
{
final VecMutable pos = new MutableCoord(Mouse.getX(), Mouse.getY());
flipScrY(pos);
return pos.view();
return mousePos;
}
/**
* @return true if mouse is inside window.
*/
public boolean isMouseInside()
{
return Mouse.isInsideWindow();
}
@@ -11,7 +11,7 @@ import mightypork.gamecore.control.bus.events.ScreenChangeEvent;
import mightypork.gamecore.control.timing.FpsMeter;
import mightypork.utils.logging.Log;
import mightypork.utils.math.constraints.RectConstraint;
import mightypork.utils.math.coord.FixedCoord;
import mightypork.utils.math.coord.SynthCoord2D;
import mightypork.utils.math.coord.VecView;
import mightypork.utils.math.rect.FixedRect;
import mightypork.utils.math.rect.RectView;
@@ -31,10 +31,24 @@ public class DisplaySystem extends AppModule implements RectConstraint {
private DisplayMode windowDisplayMode;
private int targetFps;
/** Y axis goes down (not up); Used also to adjust inputs. */
public static boolean yAxisDown = true;
private FpsMeter fpsMeter;
private final VecView cScreenSize = new SynthCoord2D() {
@Override
public double y()
{
return Display.getHeight();
}
@Override
public double x()
{
return Display.getWidth();
}
};
/**
* @param app app access
@@ -175,27 +189,27 @@ public class DisplaySystem extends AppModule implements RectConstraint {
*
* @return size
*/
public static VecView getSize()
public VecView getSize()
{
return new FixedCoord(getWidth(), getHeight());
return cScreenSize;
}
/**
* @return screen width
*/
public static int getWidth()
public int getWidth()
{
return Display.getWidth();
return cScreenSize.xi();
}
/**
* @return screen height
*/
public static int getHeight()
public int getHeight()
{
return Display.getHeight();
return cScreenSize.yi();
}
@@ -245,43 +259,4 @@ public class DisplaySystem extends AppModule implements RectConstraint {
{
return getSize().half();
}
// private static final VecView size = new SynthCoord2D() {
//
// @Override
// public double y()
// {
// return getHeight();
// }
//
//
// @Override
// public double x()
// {
// return getWidth();
// }
// };
//
// /** Screen width constraint */
// private static final NumberConstraint width = size.xc();
//
// /** Screen height constaint */
// private static final NumberConstraint height = size.yc();
//
// private static final VecView center = new SynthCoord2D() {
//
// @Override
// public double y()
// {
// return size.half().x();
// }
//
//
// @Override
// public double x()
// {
// return size.half().y();
// }
// };
}
+5 -4
View File
@@ -11,6 +11,7 @@ import mightypork.utils.logging.Log;
import mightypork.utils.math.color.RGB;
import mightypork.utils.math.coord.FixedCoord;
import mightypork.utils.math.coord.Vec;
import mightypork.utils.math.coord.VecView;
import mightypork.utils.math.rect.Rect;
import org.lwjgl.opengl.GL11;
@@ -540,15 +541,15 @@ public class Render {
/**
* Setup Ortho projection for 2D graphics
* @param size viewport size (screen size)
*/
public static void setupOrtho()
public static void setupOrtho(VecView size)
{
// fix projection for changed size
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
final Vec s = DisplaySystem.getSize();
glViewport(0, 0, s.xi(), s.yi());
glOrtho(0, s.x(), (DisplaySystem.yAxisDown ? 1 : -1) * s.y(), 0, -1000, 1000);
glViewport(0, 0, size.xi(), size.yi());
glOrtho(0, size.xi(), size.yi(), 0, -1000, 1000);
// back to modelview
glMatrixMode(GL_MODELVIEW);
@@ -1,7 +1,6 @@
package mightypork.gamecore.render.fonts;
import static mightypork.utils.math.constraints.Constraints.*;
import mightypork.gamecore.render.Render;
import mightypork.utils.math.color.RGB;
import mightypork.utils.math.coord.Vec;
@@ -148,16 +147,16 @@ public class FontRenderer {
switch (align) {
case LEFT:
start = _top_left(bounds);
start = bounds.getTopLeft();
break;
case CENTER:
start = _center_top(bounds);
start = bounds.getTopCenter();
break;
case RIGHT:
default:
start = _top_right(bounds);
start = bounds.getTopRight();
break;
}
+1 -1
View File
@@ -56,7 +56,7 @@ public class App extends BaseApp {
screens.add(new ScreenTestFont(this));
screens.add(new ScreenTestRender(this));
screens.showScreen("test.cat");
screens.showScreen("test.bouncy");
}
+21 -7
View File
@@ -2,9 +2,12 @@ package mightypork.rogue.screens;
import static mightypork.utils.math.constraints.Constraints.*;
import mightypork.gamecore.gui.Action;
import mightypork.gamecore.gui.components.painters.TextPainter;
import mightypork.gamecore.gui.screens.Screen;
import mightypork.gamecore.gui.screens.ScreenLayer;
import mightypork.gamecore.input.KeyStroke;
import mightypork.gamecore.input.Keys;
import mightypork.gamecore.render.fonts.FontRenderer.Align;
import mightypork.gamecore.render.fonts.GLFont;
import mightypork.rogue.Res;
@@ -22,20 +25,31 @@ public class LayerFps extends ScreenLayer {
public LayerFps(Screen screen) {
super(screen);
final StringProvider text = new StringProvider() {
/*
* Toggle key: F3
*/
bindKeyStroke(new KeyStroke(Keys.KEY_F3), new Action() {
@Override
public void execute()
{
setVisible(!isVisible());
}
});
final GLFont font = Res.getFont("default");
final RectConstraint constraint = cBox(cAdd(cTopRight(this), -8, 8), 0, 32);
tp = new TextPainter(font, Align.RIGHT, RGB.WHITE, new StringProvider() {
@Override
public String getString()
{
return getDisplay().getFps() + " fps";
}
};
});
final GLFont font = Res.getFont("default");
final RectConstraint constraint = _box(_sub(_top_right(this), 8, 8), 0, 32);
tp = new TextPainter(font, Align.RIGHT, RGB.WHITE, text);
tp.setContext(constraint);
tp.setShadow(RGB.BLACK, Vec.ONE);
@@ -26,16 +26,16 @@ public class BouncyBox extends PluggableRenderer implements Updateable {
public BouncyBox() {
// create box
final NumberConstraint side = _height(this);
RectConstraint abox = _box(this, side, side);
final NumberConstraint side = cHeight(this);
RectConstraint abox = cBox(this, side, side);
// move
final NumberConstraint move_length = _sub(_width(this), side);
final NumberConstraint offset = _mul(move_length, pos);
abox = _move(abox, offset, 0);
final NumberConstraint move_length = cSub(cWidth(this), side);
final NumberConstraint offset = cMul(move_length, pos);
abox = cMove(abox, offset, 0);
// add padding
abox = _shrink(abox, _percent(side, 10));
abox = cShrink(abox, cPerc(side, 10));
box = abox;
}
@@ -16,7 +16,7 @@ import mightypork.gamecore.render.fonts.FontRenderer.Align;
import mightypork.rogue.Res;
import mightypork.utils.math.color.RGB;
import mightypork.utils.math.constraints.RectConstraint;
import mightypork.utils.string.StringProvider;
import mightypork.utils.math.coord.FixedCoord;
public class LayerBouncyBoxes extends ScreenLayer {
@@ -47,7 +47,7 @@ public class LayerBouncyBoxes extends ScreenLayer {
});
// shrink screen rect by 8% on all sides
final RectConstraint holder_rect = _shrink(this, _percent(_height(this), 4));
final RectConstraint holder_rect = cShrink(this, cPerc(cWidth(this), 4));
addChildClient(layout = new RowHolder(screen, holder_rect, 11));
@@ -57,14 +57,11 @@ public class LayerBouncyBoxes extends ScreenLayer {
boxes.add(bbr);
}
layout.add(new TextPainter(Res.getFont("default"), Align.LEFT, RGB.WHITE, new StringProvider() {
@Override
public String getString()
{
return "Running at " + getDisplay().getFps() + " fps!";
}
}));
final TextPainter tp = new TextPainter(Res.getFont("default"), Align.LEFT, RGB.WHITE);
tp.setText("Press \"C\" for \"Cat\" screen.");
tp.setShadow(RGB.RED, new FixedCoord(2, 2));
layout.add(tp);
}
@@ -8,6 +8,7 @@ import java.util.Random;
import mightypork.gamecore.control.bus.events.MouseButtonEvent;
import mightypork.gamecore.control.timing.Updateable;
import mightypork.gamecore.gui.components.painters.ImagePainter;
import mightypork.gamecore.gui.components.painters.QuadPainter;
import mightypork.gamecore.gui.components.painters.TextPainter;
import mightypork.gamecore.gui.screens.Screen;
import mightypork.gamecore.gui.screens.ScreenLayer;
@@ -32,6 +33,7 @@ public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButt
private final ImagePainter cat;
private final TextPainter tp;
private final QuadPainter qp;
public LayerFlyingCat(Screen screen) {
@@ -41,14 +43,18 @@ public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButt
cat = new ImagePainter(Res.getTxQuad("test.kitten"));
cat.setContext(_align(_box(size, size), pos));
cat.setContext(cCenterTo(cBox(size, size), pos));
tp = new TextPainter(Res.getFont("default"));
tp.setAlign(Align.CENTER);
tp.setColor(RGB.YELLOW);
tp.setText("Meow!");
tp.setShadow(RGB.dark(0.8), new FixedCoord(2, 2));
tp.setContext(_align(_box(64, 64), _mouseX, _mouseY));
tp.setContext(cCenterTo(cBox(64, 64), cMousePos));
qp = QuadPainter.gradV(RGB.YELLOW, RGB.RED);
qp.setContext(cExpand(cBottomLeft(cat), 0, 0, 50, 50));
/*
* Register keys
@@ -79,9 +85,9 @@ public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButt
final Vec pos = event.getPos();
this.pos.animateWithSpeed(pos, 200);
this.pos.animateWithSpeed(pos, 160);
size.animate(200 + rand.nextInt(600), this.pos.getDuration() / 2);
size.animate(200 + rand.nextInt(600), Math.max(0.2, this.pos.getDuration() / 2));
}
@@ -90,8 +96,7 @@ public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButt
{
cat.render();
tp.render();
//System.out.println(tp.getRect());
qp.render();
}
@@ -8,6 +8,7 @@ import mightypork.gamecore.gui.screens.Screen;
import mightypork.gamecore.render.fonts.FontRenderer.Align;
import mightypork.rogue.Res;
import mightypork.utils.math.color.RGB;
import mightypork.utils.math.constraints.NumberConstraint;
import mightypork.utils.math.constraints.RectConstraint;
@@ -22,7 +23,9 @@ public class ScreenTestFont extends Screen {
tp = new TextPainter(Res.getFont("default"), Align.CENTER, RGB.GREEN);
tp.setText("Hello World!");
final RectConstraint strbox = _align(_box(_div(_screenH, 10)), this);
final NumberConstraint fontHeight = cMul(getDisplay().getSize().yc(), 0.1);
final RectConstraint strbox = cCenterTo(cBox(fontHeight), this);
tp.setContext(strbox);
}
@@ -22,8 +22,8 @@ public class LayerTestGradient extends ScreenLayer {
public LayerTestGradient(Screen screen) {
super(screen);
pos1 = _cache(p, _grow_down(_top_edge(this), 64));
pos2 = _cache(p, _shrink_top(_grow_right(_left_edge(this), 64), 64));
pos1 = cCached(p, cGrowDown(cTopEdge(this), 64));
pos2 = cCached(p, cShrinkTop(cGrowRight(cLeftEdge(this), 64), 64));
}
+30
View File
@@ -0,0 +1,30 @@
package mightypork.test;
import mightypork.utils.math.rect.FixedRect;
import mightypork.utils.math.rect.RectView;
public class TestConstr {
public static void main(String[] args)
{
final RectView rm = new FixedRect(0, 0, 100, 100);
System.out.println(rm);
final RectView added = rm.move(10, 10);
System.out.println(added);
System.out.println(added.getOrigin());
System.out.println(added.getSize());
System.out.println(added.getOrigin().add(added.getSize()));
// VecMutable vv = new MutableCoord(0,0);
//
// System.out.println(vv);
// System.out.println(vv.add(50,50));
}
}
@@ -0,0 +1,36 @@
package mightypork.utils.math.constraints;
import mightypork.utils.math.coord.VecView;
public class CReverseProxy extends VecView {
private final VecConstraint constraint;
public CReverseProxy(VecConstraint wrapped) {
this.constraint = wrapped;
}
@Override
public double x()
{
return constraint.getVec().x();
}
@Override
public double y()
{
return constraint.getVec().y();
}
@Override
public double z()
{
return constraint.getVec().z();
}
}
File diff suppressed because it is too large Load Diff
@@ -7,4 +7,13 @@ import mightypork.utils.math.coord.VecView;
public interface VecConstraint {
VecView getVec();
NumberConstraint xc();
NumberConstraint yc();
NumberConstraint zc();
}
@@ -0,0 +1,33 @@
package mightypork.utils.math.constraints;
import mightypork.utils.math.coord.VecView;
public abstract class VecConstraintSynth implements VecConstraint {
@Override
public abstract VecView getVec();
@Override
public NumberConstraint xc()
{
return Constraints.cX(getVec());
}
@Override
public NumberConstraint yc()
{
return Constraints.cY(getVec());
}
@Override
public NumberConstraint zc()
{
return Constraints.cZ(getVec());
}
}
@@ -1,23 +0,0 @@
package mightypork.utils.math.constraints;
import mightypork.utils.math.coord.Vec;
import mightypork.utils.math.coord.VecView;
public class VecWrapper implements VecConstraint {
private final Vec wrapped;
public VecWrapper(Vec wrapped) {
this.wrapped = wrapped;
}
@Override
public VecView getVec()
{
return wrapped.view();
}
}
+5 -1
View File
@@ -2,6 +2,7 @@ package mightypork.utils.math.coord;
import mightypork.utils.math.constraints.NumberConstraint;
import mightypork.utils.math.constraints.VecConstraint;
/**
@@ -9,7 +10,7 @@ import mightypork.utils.math.constraints.NumberConstraint;
*
* @author MightyPork
*/
public interface Vec {
public interface Vec extends VecConstraint {
public static final VecView ZERO = new FixedCoord(0, 0, 0);
public static final VecView ONE = new FixedCoord(1, 1, 1);
@@ -72,18 +73,21 @@ public interface Vec {
/**
* @return X constraint
*/
@Override
NumberConstraint xc();
/**
* @return Y constraint
*/
@Override
NumberConstraint yc();
/**
* @return Z constraint
*/
@Override
NumberConstraint zc();
@@ -71,6 +71,13 @@ abstract class VecMathImpl<V> implements VecMath<V> {
}
@Override
public VecView getVec()
{
return this.view();
}
/**
* <p>
* Some operation was performed and this result was obtained.
@@ -212,7 +219,7 @@ abstract class VecMathImpl<V> implements VecMath<V> {
@Override
public V add(double x, double y, double z)
{
return result(x, y, z);
return result(x() + x, y() + y, z() + z);
}
@@ -386,6 +393,6 @@ abstract class VecMathImpl<V> implements VecMath<V> {
@Override
public String toString()
{
return String.format("[ %.2f ; %.2f ; %.2f ]", x(), y(), z());
return String.format("(%.1f %.1f %.1f)", x(), y(), z());
}
}
@@ -165,13 +165,13 @@ public class MutableRect extends RectImpl<RectMutable> implements RectMutable {
* Shrink the rect
*
* @param left shrink
* @param top shrink
* @param right shrink
* @param top shrink
* @param bottom shrink
* @return result
*/
@Override
public RectMutable shrink(double left, double top, double right, double bottom)
public RectMutable shrink(double left, double right, double top, double bottom)
{
pos.add(left, top);
size.sub(left + right, top + bottom).abs();
@@ -183,13 +183,13 @@ public class MutableRect extends RectImpl<RectMutable> implements RectMutable {
* Grow the rect
*
* @param left growth
* @param top growth
* @param right growth
* @param top growth
* @param bottom growth
* @return result
*/
@Override
public RectMutable grow(double left, double top, double right, double bottom)
public RectMutable grow(double left, double right, double top, double bottom)
{
pos.sub(left, top);
size.add(left + right, top + bottom).abs();
+29 -16
View File
@@ -1,6 +1,7 @@
package mightypork.utils.math.rect;
import mightypork.utils.math.constraints.RectConstraint;
import mightypork.utils.math.coord.VecView;
@@ -9,7 +10,7 @@ import mightypork.utils.math.coord.VecView;
*
* @author MightyPork
*/
public interface Rect {
public interface Rect extends RectConstraint {
RectView ONE = new FixedRect(0, 0, 1, 1);
RectView ZERO = new FixedRect(0, 0, 0, 0);
@@ -37,30 +38,42 @@ public interface Rect {
VecView getOrigin();
/**
* @return center
*/
VecView getCenter();
/**
* @return rect size
*/
VecView getSize();
/**
* @return rect width
*/
double getWidth();
/**
* @return rect height
*/
double getHeight();
VecView getTopLeft();
VecView getTopCenter();
VecView getTopRight();
VecView getCenterLeft();
VecView getCenter();
VecView getCenterRight();
VecView getBottomLeft();
VecView getBottomCenter();
VecView getBottomRight();
double xMin();
+96 -4
View File
@@ -1,16 +1,101 @@
package mightypork.utils.math.rect;
import static mightypork.utils.math.constraints.Constraints.*;
import mightypork.utils.math.constraints.VecConstraint;
import mightypork.utils.math.coord.Vec;
import mightypork.utils.math.coord.VecView;
public abstract class RectImpl<T extends Rect> implements RectMath<T> {
private VecConstraint tl, tc, tr, cl, c, cr, bl, bc, br;
@Override
public RectView getRect()
{
return this.view();
}
@Override
public abstract VecView getOrigin();
@Override
public abstract VecView getSize();
@Override
public VecView getTopLeft()
{
if (tl == null) tl = cTopLeft(this);
return tl.getVec();
}
@Override
public VecView getTopCenter()
{
if (tc == null) tc = cTopCenter(this);
return tc.getVec();
}
@Override
public VecView getTopRight()
{
if (tr == null) tr = cTopRight(this);
return tr.getVec();
}
@Override
public VecView getCenterLeft()
{
if (cl == null) cl = cCenterLeft(this);
return cl.getVec();
}
@Override
public final VecView getCenter()
{
return getOrigin().add(getSize().half());
if (c == null) c = cCenter(this);
return c.getVec();
}
@Override
public VecView getCenterRight()
{
if (cr == null) cr = cCenterRight(this);
return cr.getVec();
}
@Override
public VecView getBottomLeft()
{
if (bl == null) bl = cBottomLeft(this);
return bl.getVec();
}
@Override
public VecView getBottomCenter()
{
if (bc == null) bc = cBottomCenter(this);
return bc.getVec();
}
@Override
public VecView getBottomRight()
{
if (br == null) br = cBottomRight(this);
return br.getVec();
}
@@ -73,7 +158,7 @@ public abstract class RectImpl<T extends Rect> implements RectMath<T> {
@Override
public final T shrink(double x, double y)
{
return shrink(x, y, x, y);
return shrink(x, x, y, y);
}
@@ -87,7 +172,7 @@ public abstract class RectImpl<T extends Rect> implements RectMath<T> {
@Override
public final T grow(double x, double y)
{
return grow(x, y, x, y);
return grow(x, x, y, y);
}
@@ -98,6 +183,13 @@ public abstract class RectImpl<T extends Rect> implements RectMath<T> {
}
@Override
public RectMutable copy()
{
return new MutableRect(this);
}
@Override
public final boolean contains(Vec point)
{
@@ -116,6 +208,6 @@ public abstract class RectImpl<T extends Rect> implements RectMath<T> {
@Override
public String toString()
{
return String.format("Rect[ %s - %s ]", getOrigin().toString(), getOrigin().add(getSize()));
return String.format("Rect { %s - %s }", getOrigin().toString(), getOrigin().add(getSize()));
}
}
+4 -4
View File
@@ -53,12 +53,12 @@ interface RectMath<T extends Rect> extends Rect {
* Shrink the rect
*
* @param left shrink
* @param top shrink
* @param right shrink
* @param top shrink
* @param bottom shrink
* @return result
*/
T shrink(double left, double top, double right, double bottom);
T shrink(double left, double right, double top, double bottom);
/**
@@ -84,12 +84,12 @@ interface RectMath<T extends Rect> extends Rect {
* Grow the rect
*
* @param left growth
* @param top growth
* @param right growth
* @param top growth
* @param bottom growth
* @return result
*/
T grow(double left, double top, double right, double bottom);
T grow(double left, double right, double top, double bottom);
/**
@@ -4,7 +4,7 @@ package mightypork.utils.math.rect;
import mightypork.utils.math.coord.Vec;
public interface RectMutable extends Rect {
public interface RectMutable extends RectMath<RectMutable> {
/**
* Set to other rect's coordinates
+2 -2
View File
@@ -25,14 +25,14 @@ public abstract class RectView extends RectImpl<RectView> {
@Override
public RectView shrink(double left, double top, double right, double bottom)
public RectView shrink(double left, double right, double top, double bottom)
{
return result(getOrigin().add(left, top), getSize().sub(left + right, top + bottom));
}
@Override
public RectView grow(double left, double top, double right, double bottom)
public RectView grow(double left, double right, double top, double bottom)
{
return result(getOrigin().sub(left, top), getSize().add(left + right, top + bottom));
}
@@ -1,279 +0,0 @@
package mightypork.utils.math.rect.xx;
//package mightypork.utils.math.rect;
//
//import mightypork.utils.math.constraints.NumberConstraint;
//import mightypork.utils.math.coord.VecValue;
//import mightypork.utils.math.coord.VecView;
//import mightypork.utils.math.coord.SynthCoord3D;
//
//
//public class RectCalc {
// /* ================= Coords ================= */
//
// public static NumberConstraint _x(final VecValue c)
// {
// return c.xc();
// }
//
//
// public static NumberConstraint _y(final VecValue c)
// {
// return c.yc();
// }
//
//
// public static NumberConstraint _z(final VecValue c)
// {
// return c.zc();
// }
//
//
// public static VecView _neg(final VecValue c)
// {
// return _mul(c, -1);
// }
//
//
// public static VecView _half(final VecValue c)
// {
// return _mul(c, 0.5);
// }
//
//
// // --- add ---
//
// public static VecView _add(final VecValue c1, final VecValue c2)
// {
// return new SynthCoord3D() {
//
// @Override
// public double x()
// {
// return c1.x() + c2.x();
// }
//
//
// @Override
// public double y()
// {
// return c1.y() + c2.y();
// }
//
//
// @Override
// public double z()
// {
// return c1.z() + c2.z();
// }
//
// };
// }
//
//
// public static VecView _add(final VecValue c, final Object x, final Object y)
// {
// return _add(c, x, y, 0);
// }
//
//
// public static VecView _add(final VecValue c, final Object x, final Object y, final Object z)
// {
// return new SynthCoord3D() {
//
// @Override
// public double x()
// {
// return c.x() + num(x);
// }
//
//
// @Override
// public double y()
// {
// return c.y() + num(y);
// }
//
//
// @Override
// public double z()
// {
// return c.z() + num(z);
// }
//
// };
// }
//
//
// // --- sub ---
//
// public static VecView _sub(final VecValue c1, final VecValue c2)
// {
// return new SynthCoord3D() {
//
// @Override
// public double x()
// {
// return c1.x() - c2.x();
// }
//
//
// @Override
// public double y()
// {
// return c1.y() - c2.y();
// }
//
//
// @Override
// public double z()
// {
// return c1.z() - c2.z();
// }
//
// };
// }
//
//
// public static VecView _sub(final VecValue c, final Object x, final Object y)
// {
// return _add(c, x, y, 0);
// }
//
//
// public static VecView _sub(final VecValue c, final Object x, final Object y, final Object z)
// {
// return new SynthCoord3D() {
//
// @Override
// public double x()
// {
// return c.x() - num(x);
// }
//
//
// @Override
// public double y()
// {
// return c.y() - num(y);
// }
//
//
// @Override
// public double z()
// {
// return c.z() - num(z);
// }
//
// };
// }
//
//
// // --- mul ---
//
// public static VecView _mul(final VecValue c, final Object mul)
// {
// return new SynthCoord3D() {
//
// @Override
// public double x()
// {
// return c.x() * num(mul);
// }
//
//
// @Override
// public double y()
// {
// return c.y() * num(mul);
// }
//
//
// @Override
// public double z()
// {
// return c.z() * num(mul);
// }
//
// };
// }
//
// public static VecView _origin(final Rect r)
// {
// return r.getOrigin().view();
// }
//
//
// public static VecView _size(final Rect r)
// {
// return r.getSize().view();
// }
//
//
// public static NumberConstraint _width(final Rect r)
// {
// return _x(_size(r));
// }
//
//
// public static NumberConstraint _height(final Rect r)
// {
// return _y(_size(r));
// }
//
//
// public static VecView _center(final Rect r)
// {
// return _add(_origin(r), _half(_size(r)));
// }
//
//
// public static VecView _top_left(final Rect r)
// {
// return _origin(r);
// }
//
//
// public static VecView _top_right(final Rect r)
// {
// return _add(_origin(r), _width(r), 0);
// }
//
//
// public static VecView _bottom_left(final Rect r)
// {
// return _add(_origin(r), 0, _height(r));
// }
//
//
// public static VecView _bottom_right(final Rect r)
// {
// return _add(_origin(r), _size(r));
// }
//
//
// public static VecView _center_top(final Rect r)
// {
// return _add(_origin(r), _half(_width(r)), 0);
// }
//
//
// public static VecView _center_bottom(final Rect r)
// {
// return _add(_origin(r), _half(_width(r)), _height(r));
// }
//
//
// public static VecView _center_left(final Rect r)
// {
// return _add(_origin(r), 0, _half(_height(r)));
// }
//
//
// public static VecView _center_right(final Rect r)
// {
// return _add(_origin(r), _width(r), _half(_height(r)));
// }
//
//}
@@ -1,909 +0,0 @@
package mightypork.utils.math.rect.xx;
//package mightypork.utils.math.rect;
//
//
//import mightypork.utils.math.Calc;
//import mightypork.utils.math.constraints.NumberConstraint;
//import mightypork.utils.math.constraints.RectConstraint;
//import mightypork.utils.math.coord.ConstrCoord;
//import mightypork.utils.math.coord.VecValue;
//import mightypork.utils.math.coord.VecArith;
//import mightypork.utils.math.coord.VecMutable;
//
//
///**
// * Rectangle determined by two coordinates - min and max.
// *
// * @author MightyPork
// */
//public class Rectd implements RectConstraint, IRect {
//
// public static final IRect ZERO = new FixedRect(0, 0, 0, 0).freeze();
// public static final Rect ONE = new FixedRect(0, 0, 1, 1).freeze();
//
//
// /**
// * Rectangle from size; coords are copied.
// *
// * @param min min coord
// * @param size rect size
// * @return the rect
// */
// public static Rect fromSize(VecArith min, VecValue size)
// {
// return fromSize(min, size.xi(), size.yi());
// }
//
//
// /**
// * Make rect from min coord and size; coords are copied.
// *
// * @param min min coord
// * @param width size x
// * @param height size y
// * @return the new rect
// */
// public static Rect fromSize(VecArith min, double width, double height)
// {
// return new FixedRect(min.copy(), min.add(width, height));
// }
//
//
// /**
// * Rectangle from size
// *
// * @param sizeX size x
// * @param sizeY size y
// * @return rect
// */
// public static IRect fromSize(double sizeX, double sizeY)
// {
// return fromSize(0, 0, sizeX, sizeY);
// }
//
//
// /**
// * Get rect from size
// *
// * @param size size
// * @return rect
// */
// public static IRect fromSize(VecValue size)
// {
// return fromSize(0, 0, size.x(), size.y());
// }
//
//
// /**
// * Make rect from min coord and size
// *
// * @param xmin min x
// * @param ymin min y
// * @param width size x
// * @param height size y
// * @return the new rect
// */
// public static Rect fromSize(double xmin, double ymin, double width, double height)
// {
// return new FixedRect(xmin, ymin, xmin + width, ymin + height);
// }
//
// /** Lowest coordinates xy */
// protected final VecArith min;
//
// /** Highest coordinates xy */
// protected final VecArith max;
//
// // view of secondary corners.
//
// //@formatter:off
// private final ConstrCoord HMinVMax = new ConstrCoord(
// new NumberConstraint() {
// @Override
// public double getValue()
// {
// return min.x();
// }
// },
// new NumberConstraint() {
// @Override
// public double getValue()
// {
// return max.y();
// }
// },
// null
// );
//
//
// private final ConstrCoord HMaxVMin = new ConstrCoord(
// new NumberConstraint() {
// @Override
// public double getValue() {
// return max.x();
// }
// },
// new NumberConstraint() {
// @Override
// public double getValue()
// {
// return min.y();
// }
// },
// null
// );
// //@formatter:on
//
// private boolean frozen;
//
//
// public boolean isWritable()
// {
// return !frozen && !isView();
// }
//
//
// public boolean isView()
// {
// return false;
// }
//
//
// public Rect freeze()
// {
// min.copy();
// max.copy();
// frozen = true;
// return this;
// }
//
//
// /**
// * Get a readonly view
// *
// * @return view
// */
// public RectView view()
// {
// return new RectView(this);
// }
//
//
// protected void assertWritable()
// {
// if (!isWritable()) {
// throw new UnsupportedOperationException("This Rect is not writable.");
// }
// }
//
//
// /**
// * New Rect [0, 0, 0, 0]
// */
// public Rect() {
// this(0, 0, 0, 0);
// }
//
//
// /**
// * Rect [0, 0, size.x, size.y]
// *
// * @param size size coord
// */
// public Rect(VecValue size) {
// this(0, 0, size.x(), size.y());
// }
//
//
// /**
// * New rect of two coords; Coords are plugged in directly (ie. views can be
// * used for frozen rect representing another)
// *
// * @param min coord 1
// * @param max coord 2
// */
// public Rect(VecValue min, VecValue max) {
// this.min = min; // must not copy
// this.max = max; // must not copy
// }
//
//
// /**
// * New Rect
// *
// * @param xmin lower x
// * @param ymin lower y
// * @param xmax upper x
// * @param ymax upper y
// */
// public Rect(double xmin, double ymin, double xmax, double ymax) {
// min = new VecArith(xmin, ymin);
// max = new VecArith(xmax, ymax);
// }
//
//
// /**
// * Rect [0, 0, x, y]
// *
// * @param x width
// * @param y height
// */
// public Rect(double x, double y) {
// this(0, 0, x, y);
// }
//
//
// /**
// * New rect as a copy of other rect
// *
// * @param r other rect
// */
// public Rect(Rect r) {
// this(r.min.copy(), r.max.copy());
// }
//
//
// /**
// * Get offset copy (add)
// *
// * @param move offset vector
// * @return offset copy
// */
// @Override
// public Rect move(VecMutable move)
// {
// return copy().add_ip(move);
// }
//
//
// /**
// * Add X and Y to all coordinates in a copy
// *
// * @param x x to add
// * @param y y to add
// * @return copy changed
// */
// @Override
// public Rect move(double x, double y)
// {
// return move(new VecArith(x, y));
// }
//
//
// /**
// * Offset in place (add)
// *
// * @param move offset vector
// * @return this
// */
// public Rect add_ip(VecMutable move)
// {
// min.add_ip(move);
// max.add_ip(move);
// return this;
// }
//
//
// /**
// * Add X and Y to all coordinates in place
// *
// * @param x x to add
// * @param y y to add
// * @return this
// */
// public IRect add_ip(double x, double y)
// {
// return add_ip(new VecArith(x, y));
// }
//
//
// /**
// * Get a copy
// *
// * @return copy
// */
// @Override
// public Rect copy()
// {
// return new FixedRect(this);
// }
//
//
// /**
// * Get rect center
// *
// * @return center
// */
// @Override
// public VecValue getCenter()
// {
// return min.midTo(max).copy();
// }
//
//
// /**
// * Get center of the lower edge.
// *
// * @return center
// */
// @Override
// public VecValue getCenterVMin()
// {
// return new VecArith((max.x() + min.x()) / 2D, min.y()).copy();
// }
//
//
// /**
// * Get center of the left edge.
// *
// * @return center
// */
// @Override
// public VecValue getCenterHMin()
// {
// return new VecArith(min.x(), (max.y() + min.y()) / 2D).copy();
// }
//
//
// /**
// * Get center of the right edge.
// *
// * @return center
// */
// @Override
// public VecValue getCenterHMax()
// {
// return new VecArith(max.x(), (max.y() + min.y()) / 2D).copy();
// }
//
//
// /**
// * Get center of the top edge.
// *
// * @return center
// */
// @Override
// public VecValue getCenterVMax()
// {
// return new VecArith((max.x() + min.x()) / 2D, max.y()).copy();
// }
//
//
// /**
// * Get left bottom
// *
// * @return center
// */
// @Override
// public VecArith getHMinVMin()
// {
// return min.view();
// }
//
//
// /**
// * Get left top
// *
// * @return center
// */
// @Override
// public VecValue getHMinVMax()
// {
// return HMinVMax;
// }
//
//
// /**
// * Get right bottom
// *
// * @return center
// */
// @Override
// public VecValue getHMaxVMin()
// {
// return HMaxVMin;
// }
//
//
// /**
// * Get right top
// *
// * @return center
// */
// @Override
// public VecArith getHMaxVMax()
// {
// return max.view();
// }
//
//
// /**
// * Alias for getX2Y2
// *
// * @return highest coordinates xy
// */
// @Override
// public VecMutable getMax()
// {
// return getHMaxVMax();
// }
//
//
// /**
// * Alias for getX1Y1
// *
// * @return lowest coordinates xy
// */
// @Override
// public VecMutable getMin()
// {
// return getHMinVMin();
// }
//
//
// /**
// * Alias for getX1Y1
// *
// * @return lowest coordinates xy
// */
// public VecValue getOrigin()
// {
// return getHMinVMin();
// }
//
//
// /**
// * Shrink to sides in copy
// *
// * @param shrink shrink size (added to each side)
// * @return shrinkn copy
// */
// @Override
// public IRect shrink(VecValue shrink)
// {
// return copy().shrink_ip(shrink);
// }
//
//
// /**
// * Shrink to sides in copy
// *
// * @param x x to add
// * @param y y to add
// * @return changed copy
// */
// @Override
// public IRect shrink(double x, double y)
// {
// return copy().shrink_ip(x, y);
// }
//
//
// /**
// * Shrink to sides in place
// *
// * @param shrink shrink size (added to each side)
// * @return this
// */
// public IRect shrink_ip(VecValue shrink)
// {
// shrink_ip(shrink.x(), shrink.y());
// return this;
// }
//
//
// /**
// * Shrink to sides in place
// *
// * @param x horizontal shrink
// * @param y vertical shrink
// * @return this
// */
// public IRect shrink_ip(double x, double y)
// {
// min.sub_ip(x, y);
// max.add_ip(-x, -y);
// return this;
// }
//
//
// /**
// * Shrink the rect
// *
// * @param xmin shrink
// * @param ymin shrink
// * @param xmax shrink
// * @param ymax shrink
// * @return changed copy
// */
// @Override
// public Rect shrink(double xmin, double ymin, double xmax, double ymax)
// {
// return copy().shrink_ip(xmin, ymin, xmax, ymax);
// }
//
//
// /**
// * Shrink the rect in place
// *
// * @param xmin shrink
// * @param ymin shrink
// * @param xmax shrink
// * @param ymax shrink
// * @return this
// */
// public Rect shrink_ip(double xmin, double ymin, double xmax, double ymax)
// {
// min.add_ip(xmin, ymin);
// max.add_ip(-xmax, -ymax);
// return this;
// }
//
//
// /**
// * Grow to sides in copy
// *
// * @param grow grow size (added to each side)
// * @return grown copy
// */
// @Override
// public IRect grow(VecValue grow)
// {
// return copy().grow_ip(grow);
// }
//
//
// /**
// * Grow to sides in copy
// *
// * @param x horizontal grow
// * @param y vertical grow
// * @return changed copy
// */
// @Override
// public IRect grow(double x, double y)
// {
// return copy().grow_ip(x, y);
// }
//
//
// /**
// * Grow to sides in place
// *
// * @param grow grow size (added to each side)
// * @return this
// */
// public IRect grow_ip(VecValue grow)
// {
// grow_ip(grow.x(), grow.y());
// return this;
// }
//
//
// /**
// * Grow to sides in place
// *
// * @param x horizontal grow
// * @param y vertical grow
// * @return this
// */
// public IRect grow_ip(double x, double y)
// {
// min.sub_ip(x, y);
// max.add_ip(x, y);
// return this;
// }
//
//
// /**
// * Grow the rect
// *
// * @param xmin growth
// * @param ymin growth
// * @param xmax growth
// * @param ymax growth
// * @return changed copy
// */
// @Override
// public Rect grow(double xmin, double ymin, double xmax, double ymax)
// {
// return copy().grow_ip(xmin, ymin, xmax, ymax);
// }
//
//
// /**
// * Grow the rect in place
// *
// * @param xmin growth
// * @param ymin growth
// * @param xmax growth
// * @param ymax growth
// * @return this
// */
// public Rect grow_ip(double xmin, double ymin, double xmax, double ymax)
// {
// min.add_ip(-xmin, -ymin);
// max.add_ip(xmax, ymax);
// return this;
// }
//
//
// /**
// * Check if point is inside this rectangle
// *
// * @param point point to test
// * @return is inside
// */
// @Override
// public boolean isInside(VecValue point)
// {
// return Calc.inRange(point.x(), min.x(), max.x()) && Calc.inRange(point.y(), min.y(), max.y());
// }
//
//
// /**
// * Multiply in copy
// *
// * @param factor multiplier
// * @return offset copy
// */
// @Override
// public IRect mul(double factor)
// {
// return copy().mul_ip(factor);
// }
//
//
// /**
// * Multiply by number (useful for centered rects)
// *
// * @param x x multiplier
// * @param y y multiplier
// * @return copy multiplied
// */
// @Override
// public IRect mul(double x, double y)
// {
// return copy().mul_ip(x, y);
// }
//
//
// /**
// * Multiply coord in place
// *
// * @param factor multiplier
// * @return this
// */
// public IRect mul_ip(double factor)
// {
// min.mul_ip(factor);
// max.mul_ip(factor);
// return this;
// }
//
//
// /**
// * Multiply coord in place
// *
// * @param x multiplier x
// * @param y multiplier y
// * @return this
// */
// public IRect mul_ip(double x, double y)
// {
// min.mul_ip(x, y, 1);
// max.mul_ip(x, y, 1);
// return this;
// }
//
//
// /**
// * Round coords in copy
// *
// * @return copy, rounded
// */
// @Override
// public Rect round()
// {
// return new FixedRect(min.round(), max.round());
// }
//
//
// /**
// * Round this in place
// *
// * @return this
// */
// public IRect round_ip()
// {
// min.round_ip();
// max.round_ip();
// return this;
// }
//
//
// /**
// * Set to coordinates
// *
// * @param xmin lower x
// * @param ymin lower y
// * @param xmax upper x
// * @param ymax upper y
// */
// @Override
// public void setTo(double xmin, double ymin, double xmax, double ymax)
// {
// min.setTo(Math.min(xmin, xmax), Math.min(ymin, ymax));
// max.setTo(Math.max(xmin, xmax), Math.max(ymin, ymax));
// }
//
//
// /**
// * Set to other rect's coordinates
// *
// * @param r other rect
// */
// @Override
// public void setTo(Rect r)
// {
// min.setTo(r.min);
// max.setTo(r.max);
// }
//
//
// /**
// * Subtract X and Y from all coordinates in a copy
// *
// * @param x x to subtract
// * @param y y to subtract
// * @return copy changed
// */
// @Override
// public IRect sub(double x, double y)
// {
// return sub(new VecArith(x, y));
// }
//
//
// /**
// * Get offset copy (subtract)
// *
// * @param move offset vector
// * @return offset copy
// */
// @Override
// public IRect sub(VecMutable move)
// {
// return copy().sub_ip(move);
// }
//
//
// /**
// * Subtract X and Y from all coordinates in place
// *
// * @param x x to subtract
// * @param y y to subtract
// * @return this
// */
// public IRect sub_ip(double x, double y)
// {
// return sub_ip(new VecArith(x, y));
// }
//
//
// /**
// * Offset in place (subtract)
// *
// * @param move offset vector
// * @return this
// */
// public IRect sub_ip(VecMutable move)
// {
// min.sub_ip(move);
// max.sub_ip(move);
// return this;
// }
//
//
// @Override
// public String toString()
// {
// return String.format("[%s-%s]", min.toString(), max.toString());
// }
//
//
// /**
// * @return lower x
// */
// @Override
// public double xMin()
// {
// return min.x();
// }
//
//
// /**
// * @return upper x
// */
// @Override
// public double xMax()
// {
// return max.x();
// }
//
//
// /**
// * @return lower y
// */
// @Override
// public double yMin()
// {
// return min.y();
// }
//
//
// /**
// * @return upper y
// */
// @Override
// public double yMax()
// {
// return max.y();
// }
//
//
// @Override
// public double getHeight()
// {
// return max.y() - min.y();
// }
//
//
// @Override
// public double getWidth()
// {
// return max.x() - min.x();
// }
//
//
// /**
// * Get size (width, height) as (x,y)
// *
// * @return coord of width,height
// */
// public VecValue getSize()
// {
// return new VecArith(max.x() - min.x(), max.y() - min.y());
// }
//
//
// @Override
// public RectView getRect()
// {
// return this;
// }
//
//
// /**
// * Generate zero rect
// *
// * @return zero
// */
// public static IRect zero()
// {
// return ZERO.copy();
// }
//
//
// /**
// * Generate 0,0-1,1 rect
// *
// * @return one
// */
// public static IRect one()
// {
// return ZERO.copy();
// }
//}