diff --git a/src/mightypork/rogue/display/ScreenSplash.java b/src/mightypork/rogue/display/ScreenSplash.java index c93f1b5..67c9952 100644 --- a/src/mightypork/rogue/display/ScreenSplash.java +++ b/src/mightypork/rogue/display/ScreenSplash.java @@ -2,7 +2,6 @@ package mightypork.rogue.display; import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; import org.lwjgl.opengl.Display; import mightypork.rogue.App; diff --git a/src/mightypork/rogue/display/constraints/Constraint.java b/src/mightypork/rogue/display/constraints/Constraint.java new file mode 100644 index 0000000..12bbf1f --- /dev/null +++ b/src/mightypork/rogue/display/constraints/Constraint.java @@ -0,0 +1,34 @@ +package mightypork.rogue.display.constraints; + +import mightypork.utils.math.coord.Coord; + + +public abstract class Constraint implements ConstraintContext { + + protected ConstraintContext context; + + + public Constraint(ConstraintContext context) { + this.context = context; + } + + + public void setContext(ConstraintContext context) { + this.context = context; + } + + + public ConstraintContext getContext() + { + return context; + } + + protected Coord origin() { + return context.getRect().getOrigin(); + } + + protected Coord size() { + return context.getRect().getSize(); + } + +} diff --git a/src/mightypork/rogue/display/constraints/ConstraintContext.java b/src/mightypork/rogue/display/constraints/ConstraintContext.java new file mode 100644 index 0000000..4395a02 --- /dev/null +++ b/src/mightypork/rogue/display/constraints/ConstraintContext.java @@ -0,0 +1,9 @@ +package mightypork.rogue.display.constraints; + +import mightypork.utils.math.coord.Coord; +import mightypork.utils.math.coord.Rect; + + +public interface ConstraintContext { + public Rect getRect(); +} diff --git a/src/mightypork/rogue/testing/TestConstraints.java b/src/mightypork/rogue/testing/TestConstraints.java new file mode 100644 index 0000000..5823d28 --- /dev/null +++ b/src/mightypork/rogue/testing/TestConstraints.java @@ -0,0 +1,84 @@ +package mightypork.rogue.testing; + + +import mightypork.rogue.display.constraints.Constraint; +import mightypork.rogue.display.constraints.ConstraintContext; +import mightypork.utils.math.coord.Coord; +import mightypork.utils.math.coord.Rect; + + +public class TestConstraints { + + public static void main(String[] args) + { + ConstraintContext context = new ConstraintContext() { + + @Override + public Rect getRect() + { + return Rect.fromSize(new Coord(0, 0), new Coord(400, 300)); + } + }; + + class Navbar extends Constraint { + + private double height; + + + public Navbar(ConstraintContext context, double height) { + super(context); + this.height = height; + } + + + @Override + public Rect getRect() + { + return Rect.fromSize(origin().setY(size().y - height), size().setY(height)); + } + } + + class TileHorizontal extends Constraint { + + private int count; + private int tile; + + + public TileHorizontal(ConstraintContext context, int tileCount, int aTile) { + super(context); + this.count = tileCount; + setTile(aTile); + } + + + public void setTile(int aTile) + { + if (aTile > count) throw new IndexOutOfBoundsException("Tile count exceeded: " + aTile + " max: " + count); + this.tile = aTile; + } + + + @Override + public Rect getRect() + { + Coord size = size().mul(1D / count, 1); + return Rect.fromSize(origin().add(size.x * tile, 0), size); + } + } + + Navbar nb = new Navbar(context, 100); + + TileHorizontal tile = new TileHorizontal(nb, 5, 0); + + for (int i = 0; i < 5; i++) { + tile.setTile(i); + + System.out.println(tile.getRect()); + } + + System.out.println("nb:" + nb.getRect()); + + System.out.println("ctx:" + context.getRect()); + } + +} diff --git a/src/mightypork/rogue/util/RenderUtils.java b/src/mightypork/rogue/util/RenderUtils.java index 0643515..6fa2844 100644 --- a/src/mightypork/rogue/util/RenderUtils.java +++ b/src/mightypork/rogue/util/RenderUtils.java @@ -19,11 +19,12 @@ import org.newdawn.slick.opengl.Texture; * @author MightyPork */ public class RenderUtils { - + private static final Coord AXIS_X = new Coord(1, 0, 0); private static final Coord AXIS_Y = new Coord(0, 1, 0); private static final Coord AXIS_Z = new Coord(0, 0, 1); + /** * Render quad 2D * @@ -371,7 +372,7 @@ public class RenderUtils { */ public static void quadRect(Rect rect) { - quadCoord(rect.getMin(), rect.getMax()); + quadCoord(rect.getOrigin(), rect.getMax()); } @@ -384,7 +385,7 @@ public class RenderUtils { public static void quadRect(Rect rect, RGB color) { setColor(color); - quadCoord(rect.getMin(), rect.getMax()); + quadCoord(rect.getOrigin(), rect.getMax()); } @@ -398,7 +399,7 @@ public class RenderUtils { */ public static void quadBorder(Rect rect, double border, RGB borderColor, RGB insideColor) { - quadCoordBorder(rect.getMin(), rect.getMax(), border, borderColor, insideColor); + quadCoordBorder(rect.getOrigin(), rect.getMax(), border, borderColor, insideColor); } @@ -411,7 +412,7 @@ public class RenderUtils { */ public static void quadGradH(Rect rect, RGB colorLeft, RGB colorRight) { - quadCoordGradH(rect.getMin(), rect.getMax(), colorLeft, colorRight); + quadCoordGradH(rect.getOrigin(), rect.getMax(), colorLeft, colorRight); } @@ -424,7 +425,7 @@ public class RenderUtils { */ public static void quadGradHBilinear(Rect rect, RGB colorOuter, RGB colorMiddle) { - quadCoordGradHBilinear(rect.getMin(), rect.getMax(), colorOuter, colorMiddle); + quadCoordGradHBilinear(rect.getOrigin(), rect.getMax(), colorOuter, colorMiddle); } @@ -437,7 +438,7 @@ public class RenderUtils { */ public static void quadGradV(Rect rect, RGB colorTop, RGB colorBottom) { - quadCoordGradV(rect.getMin(), rect.getMax(), colorTop, colorBottom); + quadCoordGradV(rect.getOrigin(), rect.getMax(), colorTop, colorBottom); } @@ -450,7 +451,7 @@ public class RenderUtils { */ public static void quadGradVBilinear(Rect rect, RGB colorOuter, RGB colorMiddle) { - quadCoordGradVBilinear(rect.getMin(), rect.getMax(), colorOuter, colorMiddle); + quadCoordGradVBilinear(rect.getOrigin(), rect.getMax(), colorOuter, colorMiddle); } @@ -464,7 +465,7 @@ public class RenderUtils { */ public static void quadRectOutset(Rect rect, double border, RGB fill, boolean inset) { - quadCoordOutset(rect.getMin(), rect.getMax(), border, fill, inset); + quadCoordOutset(rect.getOrigin(), rect.getMax(), border, fill, inset); } @@ -526,7 +527,7 @@ public class RenderUtils { setColor(tint); TextureManager.bind(texture); - quadTexturedAbs(quad, txCoords.div(texture.getImageHeight())); + quadTexturedAbs(quad, txCoords.mul(1 / texture.getImageHeight())); TextureManager.unbind(); glDisable(GL_TEXTURE_2D); diff --git a/src/mightypork/utils/math/coord/Coord.java b/src/mightypork/utils/math/coord/Coord.java index 7e40402..6cc9365 100644 --- a/src/mightypork/utils/math/coord/Coord.java +++ b/src/mightypork/utils/math/coord/Coord.java @@ -7,13 +7,12 @@ import mightypork.utils.math.Calc; /** - * Coordinate class, object with three or two double coordinates.
+ * Coordinate in 3D space, or a vector of three {@link Double}s
* * @author MightyPork */ public class Coord { - /** RNG */ protected static Random rand = new Random(); @@ -29,33 +28,6 @@ public class Coord { return a.distTo(b); } - - /** - * Generate random coord (gaussian) - * - * @param max max distance from 0 - * @return new coord - */ - public static Coord random(double max) - { - return new Coord(Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2), Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2), - Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2)); - } - - - /** - * Generate random coord (min-max) - * - * @param min min offset - * @param max max offset - * @return new coord - */ - public static Coord random(double min, double max) - { - return new Coord((rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min)), (rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min)), - (rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min))); - } - /** X coordinate */ public double x = 0; @@ -78,9 +50,7 @@ public class Coord { * @param copied copied coord */ public Coord(Coord copied) { - this.x = copied.x; - this.y = copied.y; - this.z = copied.z; + setTo(copied); } @@ -108,76 +78,73 @@ public class Coord { /** - * Get a copy offset by vector + * Add a vector, in a copy * * @param vec offset - * @return the offset copy + * @return changed copy */ public Coord add(Coord vec) { - return getCopy().add_ip(vec); + return copy().add_ip(vec); } /** - * Get a copy offset by 2D coordinate + * Add a vector, in place * - * @param x x offset - * @param y y offset - * @return the offset copy + * @param vec offset + * @return this */ - public Coord add(Number x, Number y) + public Coord add_ip(Coord vec) { - return getCopy().add_ip(x, y); + return add_ip(vec.x, vec.y, vec.z); } /** - * Get a copy offset by 3D coordinate + * Add to each component, in a copy.
+ * Z is unchanged. * * @param x x offset * @param y y offset - * @param z z offset - * @return the offset copy + * @return changed copy */ - public Coord add(Number x, Number y, Number z) + public Coord add(Number x, Number y) { - return getCopy().add_ip(x, y, z); + return copy().add_ip(x, y); } /** - * Offset by vector in place + * Add to each component, in place.
+ * Z is unchanged. * - * @param vec offset + * @param x x offset + * @param y y offset * @return this */ - public Coord add_ip(Coord vec) + public Coord add_ip(Number x, Number y) { - this.x += vec.x; - this.y += vec.y; - this.z += vec.z; - return this; + return add_ip(x, y, 0); } /** - * Offset by 2D coordinate in place + * Add to each component, in a copy. * * @param x x offset * @param y y offset - * @return this + * @param z z offset + * @return changed copy */ - public Coord add_ip(Number x, Number y) + public Coord add(Number x, Number y, Number z) { - this.x += x.doubleValue(); - this.y += y.doubleValue(); - return this; + return copy().add_ip(x, y, z); } /** - * Offset by 3D coordinate in place + * Add to each component, in place. * * @param x x offset * @param y y offset @@ -194,9 +161,11 @@ public class Coord { /** - * @return copy of this vector + * Make a copy + * + * @return a copy */ - public Coord getCopy() + public Coord copy() { return new Coord(x, y, z); } @@ -215,30 +184,14 @@ public class Coord { /** - * Get copy divided by number - * - * @param d number to divide by - * @return divided copy - */ - public Coord div(double d) - { - return getCopy().div_ip(d); - } - - - /** - * Divide by number in place + * Check if this rectangle in inside a rectangular zone * - * @param d number to divide by - * @return this + * @param rect checked rect. + * @return is inside */ - public Coord div_ip(double d) + public boolean isInRect(Rect rect) { - if (d == 0) return this; - x /= d; - y /= d; - z /= d; - return this; + return isInRect(rect.min, rect.max); } @@ -256,111 +209,150 @@ public class Coord { /** - * Check if this rectangle in inside a rectangular zone + * Get middle of line to other point * - * @param rect checked rect. - * @return is inside + * @param other other point + * @return middle */ - public boolean isInRect(Rect rect) + public Coord midTo(Coord other) { - return isInRect(rect.min, rect.max); + return add(vecTo(other).half_ip()); } /** - * Get middle of line to other point + * Get copy divided by two * - * @param other other point - * @return middle + * @return copy halved */ - public Coord midTo(Coord other) + public Coord half() { - return add(vecTo(other).mul_ip(0.5)); + return copy().half_ip(); } /** - * Multiply by number + * Divide in place by two * - * @param d number - * @return multiplied copy + * @return this */ - public Coord mul(double d) + public Coord half_ip() { - return getCopy().mul_ip(d); + mul_ip(0.5); + return this; } /** - * Multiply coords by number + * Multiply each component, in a copy. * - * @param xd x multiplier - * @param yd y multiplier - * @param zd z multiplier - * @return multiplied copy + * @param d multiplier + * @return changed copy */ - public Coord mul(double xd, double yd, double zd) + public Coord mul(double d) { - return getCopy().mul_ip(xd, yd, zd); + return copy().mul_ip(d); } /** - * Multiply by number in place + * Multiply each component, in place. * * @param d multiplier * @return this */ public Coord mul_ip(double d) { - x *= d; - y *= d; - z *= d; - return this; + return mul_ip(d, d, d); } /** - * Multiply coords by number in place + * Multiply each component, in a copy. * - * @param xd x multiplier - * @param yd y multiplier - * @param zd z multiplier + * @param vec vector of multipliers + * @return changed copy + */ + public Coord mul(Coord vec) + { + return copy().mul_ip(vec); + } + + + /** + * Multiply each component, in a copy.
+ * Z is unchanged. + * + * @param x x multiplier + * @param y y multiplier + * @return changed copy + */ + public Coord mul(double x, int y) + { + return copy().mul_ip(x, y); + } + + + /** + * Multiply each component, in place.
+ * Z is unchanged. + * + * @param x x multiplier + * @param y y multiplier * @return this */ - public Coord mul_ip(double xd, double yd, double zd) + public Coord mul_ip(double x, double y) { - x *= xd; - y *= yd; - z *= zd; - return this; + return mul_ip(x, y, 1); } /** - * offset randomly + * Multiply each component, in a copy. * - * @param max max +- offset - * @return offset coord + * @param x x multiplier + * @param y y multiplier + * @param z z multiplier + * @return changed copy */ - public Coord random_offset(double max) + public Coord mul(double x, double y, double z) { - Coord v = random(1).norm_ip(0.00001 + rand.nextDouble() * max); + return copy().mul_ip(x, y, z); + } - return getCopy().add_ip(v); + + /** + * Multiply each component, in place. + * + * @param vec vector of multipliers + * @return this + */ + public Coord mul_ip(Coord vec) + { + return mul_ip(vec.x, vec.y, vec.z); } /** - * offset randomly + * Multiply each component, in place. * - * @param min min offset - * @param max max offset - * @return offset coord + * @param x x multiplier + * @param y y multiplier + * @param z z multiplier + * @return this */ - public Coord random_offset(double min, double max) + public Coord mul_ip(double x, double y, double z) + { + this.x *= x; + this.y *= y; + this.z *= z; + return this; + } + + + public Coord random_offset(double max) { - return getCopy().add_ip(random(min, max)); + return copy().random_offset_ip(max); } @@ -372,7 +364,20 @@ public class Coord { */ public Coord random_offset_ip(double max) { - return add(random(max)); + return add(random(1).norm_ip(rand.nextDouble() * max)); + } + + + /** + * offset randomly + * + * @param min min offset + * @param max max offset + * @return offset coord + */ + public Coord random_offset(double min, double max) + { + return copy().random_offset_ip(min, max); } @@ -385,7 +390,7 @@ public class Coord { */ public Coord random_offset_ip(double min, double max) { - add(random(min, max)); + add_ip(random(min, max)); return this; } @@ -397,7 +402,7 @@ public class Coord { */ public Coord round() { - return getCopy().round_ip(); + return copy().round_ip(); } @@ -420,7 +425,7 @@ public class Coord { * * @param other other coord */ - public void setMax(Coord other) + public void setToMax(Coord other) { x = Math.max(x, other.x); y = Math.max(y, other.y); @@ -433,7 +438,7 @@ public class Coord { * * @param other other coord */ - public void setMin(Coord other) + public void setToMin(Coord other) { x = Math.min(x, other.x); y = Math.min(y, other.y); @@ -449,8 +454,7 @@ public class Coord { */ public Coord setTo(Coord copied) { - setTo(copied.x, copied.y, copied.z); - return this; + return setTo(copied.x, copied.y, copied.z); } @@ -463,8 +467,7 @@ public class Coord { */ public Coord setTo(Number x, Number y) { - setTo(x, y, 0); - return this; + return setTo(x, y, 0); } @@ -493,7 +496,7 @@ public class Coord { */ public Coord setX(Number x) { - return getCopy().setX_ip(x); + return copy().setX_ip(x); } @@ -518,7 +521,7 @@ public class Coord { */ public Coord setY(Number y) { - return getCopy().setY_ip(y); + return copy().setY_ip(y); } @@ -543,7 +546,7 @@ public class Coord { */ public Coord setZ(Number z) { - return getCopy().setZ_ip(z); + return copy().setZ_ip(z); } @@ -568,7 +571,7 @@ public class Coord { */ public Coord sub(Coord vec) { - return getCopy().sub_ip(vec); + return copy().sub_ip(vec); } @@ -581,7 +584,7 @@ public class Coord { */ public Coord sub(Number x, Number y) { - return getCopy().sub_ip(x, y); + return copy().sub_ip(x, y); } @@ -595,7 +598,7 @@ public class Coord { */ public Coord sub(Number x, Number y, Number z) { - return getCopy().sub_ip(x, y, z); + return copy().sub_ip(x, y, z); } @@ -607,10 +610,7 @@ public class Coord { */ public Coord sub_ip(Coord vec) { - this.x -= vec.x; - this.y -= vec.y; - this.z -= vec.z; - return this; + return sub_ip(vec.x, vec.y, vec.z); } @@ -623,9 +623,7 @@ public class Coord { */ public Coord sub_ip(Number x, Number y) { - this.x -= x.doubleValue(); - this.y -= y.doubleValue(); - return this; + return sub_ip(x, y, 0); } @@ -667,24 +665,6 @@ public class Coord { } - /** - * @return X as double - */ - public double xd() - { - return x; - } - - - /** - * @return X as float - */ - public float xf() - { - return (float) x; - } - - /** * @return X as int */ @@ -703,24 +683,6 @@ public class Coord { } - /** - * @return Y as double - */ - public double yd() - { - return y; - } - - - /** - * @return Y as float - */ - public float yf() - { - return (float) y; - } - - /** * @return Y as int */ @@ -739,24 +701,6 @@ public class Coord { } - /** - * @return Z as double - */ - public double zd() - { - return z; - } - - - /** - * @return Z as float - */ - public float zf() - { - return (float) z; - } - - /** * @return Z as int */ @@ -796,11 +740,11 @@ public class Coord { * Multiply by other vector, vector multiplication * * @param vec other vector - * @return copy multiplied + * @return changed copy */ public Coord cross(Coord vec) { - return getCopy().cross_ip(vec); + return copy().cross_ip(vec); } @@ -812,7 +756,13 @@ public class Coord { */ public Coord cross_ip(Coord vec) { - setTo(y * vec.z - z * vec.y, z * vec.x - x * vec.z, x * vec.y - y * vec.x); + //@formatter:off + setTo( + y * vec.z - z * vec.y, + z * vec.x - x * vec.z, + x * vec.y - y * vec.x + ); + //@formatter:on return this; } @@ -832,11 +782,11 @@ public class Coord { /** * Negate all coordinates (* -1) * - * @return negated coordinate + * @return negated copy */ public Coord neg() { - return getCopy().neg_ip(); + return copy().neg_ip(); } @@ -860,60 +810,45 @@ public class Coord { */ public Coord norm(double size) { - return getCopy().norm_ip(size); + return copy().norm_ip(size); } /** - * Scale vector to given size, in place + * Scale vector to given size, in place.
+ * Zero vector remains zero. * * @param size size we need * @return scaled vector */ public Coord norm_ip(double size) { - if (size() == 0) { - z = -1; - } - if (size == 0) { - setTo(0, 0, 0); - return this; - } + if (isZero()) return this; + double k = size / size(); - mul_ip(k); - return this; + return mul_ip(k); } /** * Get vector size * - * @return vector size in units + * @return size in units */ public double size() { - return Math.sqrt(x * x + y * y + z * z); - } + if (isZero()) return 0; - - /** - * Get copy divided by two - * @return copy halved - */ - public Coord half() - { - return getCopy().half_ip(); + return Math.sqrt(x * x + y * y + z * z); } /** - * Divide in place by two - * @return this + * @return true if this coord is a zero coord */ - public Coord half_ip() + public boolean isZero() { - mul_ip(0.5); - return this; + return x == 0 && y == 0 && z == 0; } @@ -955,22 +890,60 @@ public class Coord { /** - * @return true if this coord is a zero coord + * Generate a zero coordinate + * + * @return coord of all zeros */ - public boolean isZero() - { - return x == 0 && y == 0 && z == 0; - } - - public static Coord zero() { return new Coord(0, 0, 0); } + /** + * Generate a unit coordinate + * + * @return coord of all ones + */ public static Coord one() { return new Coord(1, 1, 1); } + + + /** + * Generate random coord (gaussian) + * + * @param max max distance from 0 + * @return new coord + */ + public static Coord random(double max) + { + //@formatter:off + return new Coord( + Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2), + Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2), + Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2) + ); + //@formatter:on + } + + + /** + * Generate random coord (min-max) + * + * @param min min offset + * @param max max offset + * @return new coord + */ + public static Coord random(double min, double max) + { + //@formatter:off + return new Coord( + (rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min)), + (rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min)), + (rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min)) + ); + //@formatter:on + } } diff --git a/src/mightypork/utils/math/coord/CoordAnimated.java b/src/mightypork/utils/math/coord/CoordAnimated.java index 5605fad..71be196 100644 --- a/src/mightypork/utils/math/coord/CoordAnimated.java +++ b/src/mightypork/utils/math/coord/CoordAnimated.java @@ -4,6 +4,11 @@ import mightypork.utils.math.Calc; import mightypork.utils.time.Updateable; +/** + * TODO revise + * + * @author MightyPork + */ public class CoordAnimated extends Coord implements Updateable { private double animTime = 0; @@ -81,7 +86,7 @@ public class CoordAnimated extends Coord implements Updateable { */ public Coord animGetCurrent() { - if (time == 0) return getCopy(); // avoid zero division + if (time == 0) return copy(); // avoid zero division if (start == null) start = new Coord(); if (offs == null) offs = new Coord(); diff --git a/src/mightypork/utils/math/coord/Rect.java b/src/mightypork/utils/math/coord/Rect.java index cabfe9a..ba6bf50 100644 --- a/src/mightypork/utils/math/coord/Rect.java +++ b/src/mightypork/utils/math/coord/Rect.java @@ -205,32 +205,6 @@ public class Rect { } - /** - * Divide in copy - * - * @param factor divisor - * @return offset copy - */ - public Rect div(double factor) - { - return copy().div_ip(factor); - } - - - /** - * Divide coord in place - * - * @param factor divisor - * @return this - */ - public Rect div_ip(double factor) - { - min.div_ip(factor); - max.div_ip(factor); - return this; - } - - /** * Get copy with the same center and height=0 * @@ -375,7 +349,7 @@ public class Rect { /** - * @return highjest coordinates xy + * @return highest coordinates xy */ public Coord getMax() { @@ -386,7 +360,7 @@ public class Rect { /** * @return lowest coordinates xy */ - public Coord getMin() + public Coord getOrigin() { return min; } @@ -764,7 +738,7 @@ public class Rect { @Override public String toString() { - return "rect{ " + min + " - " + max + " }"; + return String.format("[( %4d, %4d )-( %4d, %4d )]", (int) min.x, (int) min.y, (int) max.x, (int) max.y); }