Cleaned up coord, rect and constraint system.
This commit is contained in:
@@ -12,7 +12,6 @@ import mightypork.gamecore.control.bus.clients.RootBusNode;
|
||||
import mightypork.gamecore.control.bus.events.ResourceLoadRequest;
|
||||
import mightypork.gamecore.control.timing.Updateable;
|
||||
import mightypork.utils.math.Calc.Buffers;
|
||||
import mightypork.utils.math.coord.MutableCoord;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecMutable;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
@@ -32,9 +31,8 @@ public class SoundSystem extends RootBusNode implements Updateable {
|
||||
private static final Vec INITIAL_LISTENER_POS = Vec.ZERO;
|
||||
private static final int MAX_SOURCES = 256;
|
||||
|
||||
private static VecMutable listener = new MutableCoord(0, 0, 0);
|
||||
|
||||
private static boolean inited;
|
||||
private static VecMutable listener = VecMutable.zero();
|
||||
private static boolean soundSystemInited = false;
|
||||
|
||||
|
||||
/**
|
||||
@@ -45,10 +43,10 @@ public class SoundSystem extends RootBusNode implements Updateable {
|
||||
public static void setListener(Vec pos)
|
||||
{
|
||||
listener.setTo(pos);
|
||||
FloatBuffer buf3 = Buffers.alloc(3);
|
||||
FloatBuffer buf6 = Buffers.alloc(6);
|
||||
final FloatBuffer buf3 = Buffers.alloc(3);
|
||||
final FloatBuffer buf6 = Buffers.alloc(6);
|
||||
buf3.clear();
|
||||
Buffers.fill(buf3, pos.xf(), pos.yf(), pos.zf());
|
||||
Buffers.fill(buf3, (float) pos.x(), (float) pos.y(), (float) pos.z());
|
||||
AL10.alListener(AL10.AL_POSITION, buf3);
|
||||
buf3.clear();
|
||||
Buffers.fill(buf3, 0, 0, 0);
|
||||
@@ -56,7 +54,6 @@ public class SoundSystem extends RootBusNode implements Updateable {
|
||||
buf6.clear();
|
||||
Buffers.fill(buf6, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);
|
||||
AL10.alListener(AL10.AL_ORIENTATION, buf6);
|
||||
buf3 = buf6 = null;
|
||||
}
|
||||
|
||||
|
||||
@@ -84,13 +81,12 @@ public class SoundSystem extends RootBusNode implements Updateable {
|
||||
public SoundSystem(AppAccess app) {
|
||||
super(app);
|
||||
|
||||
if (!inited) {
|
||||
if (!soundSystemInited) {
|
||||
SoundStore.get().setMaxSources(MAX_SOURCES);
|
||||
SoundStore.get().init();
|
||||
|
||||
setListener(INITIAL_LISTENER_POS);
|
||||
|
||||
inited = true;
|
||||
soundSystemInited = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -293,7 +293,7 @@ final public class EventBus implements Destroyable {
|
||||
@Override
|
||||
public int compareTo(Delayed o)
|
||||
{
|
||||
return -Long.valueOf(o.getDelay(TimeUnit.MILLISECONDS)).compareTo(getDelay(TimeUnit.MILLISECONDS));
|
||||
return Long.valueOf(getDelay(TimeUnit.MILLISECONDS)).compareTo(o.getDelay(TimeUnit.MILLISECONDS));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ import mightypork.utils.math.coord.VecView;
|
||||
@UnloggedEvent
|
||||
public class MouseMotionEvent implements Event<MouseMotionEvent.Listener> {
|
||||
|
||||
private final Vec move;
|
||||
private final Vec pos;
|
||||
private final VecView move;
|
||||
private final VecView pos;
|
||||
|
||||
|
||||
/**
|
||||
@@ -23,8 +23,8 @@ public class MouseMotionEvent implements Event<MouseMotionEvent.Listener> {
|
||||
* @param move move vector
|
||||
*/
|
||||
public MouseMotionEvent(Vec pos, Vec move) {
|
||||
this.move = move;
|
||||
this.pos = pos;
|
||||
this.move = move.value();
|
||||
this.pos = pos.value();
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ public class MouseMotionEvent implements Event<MouseMotionEvent.Listener> {
|
||||
*/
|
||||
public VecView getMove()
|
||||
{
|
||||
return move.view();
|
||||
return move;
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ public class MouseMotionEvent implements Event<MouseMotionEvent.Listener> {
|
||||
*/
|
||||
public VecView getPos()
|
||||
{
|
||||
return pos.view();
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ public class TimerFps {
|
||||
* @param fps target FPS
|
||||
*/
|
||||
public TimerFps(long fps) {
|
||||
FRAME = Math.round(SECOND / fps);
|
||||
FRAME = Math.round(SECOND / (double) fps);
|
||||
|
||||
lastFrame = System.nanoTime();
|
||||
nextFrame = System.nanoTime() + FRAME;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package mightypork.gamecore.gui.components;
|
||||
|
||||
|
||||
import mightypork.utils.math.constraints.PluggableContext;
|
||||
import mightypork.utils.math.constraints.PluggableRect;
|
||||
import mightypork.utils.math.constraints.RectConstraint;
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
/**
|
||||
@@ -11,14 +11,14 @@ import mightypork.utils.math.rect.RectView;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface PluggableRenderable extends Renderable, PluggableContext {
|
||||
public interface PluggableRenderable extends Renderable, PluggableRect {
|
||||
|
||||
@Override
|
||||
void render();
|
||||
|
||||
|
||||
@Override
|
||||
RectView getRect();
|
||||
RectValue getRect();
|
||||
|
||||
|
||||
@Override
|
||||
|
||||
@@ -3,7 +3,7 @@ package mightypork.gamecore.gui.components;
|
||||
|
||||
import mightypork.utils.math.constraints.ContextAdapter;
|
||||
import mightypork.utils.math.constraints.RectConstraint;
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
/**
|
||||
@@ -18,7 +18,7 @@ public abstract class PluggableRenderer extends ContextAdapter implements Plugga
|
||||
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return super.getRect();
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import mightypork.gamecore.gui.components.PluggableRenderable;
|
||||
import mightypork.gamecore.gui.components.PluggableRenderer;
|
||||
import mightypork.gamecore.gui.components.Renderable;
|
||||
import mightypork.utils.math.constraints.RectConstraint;
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
/**
|
||||
@@ -60,7 +60,7 @@ public abstract class ElementHolder extends BusNode implements PluggableRenderab
|
||||
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return context.getRect();
|
||||
}
|
||||
|
||||
@@ -6,10 +6,9 @@ import mightypork.gamecore.render.fonts.FontRenderer;
|
||||
import mightypork.gamecore.render.fonts.FontRenderer.Align;
|
||||
import mightypork.gamecore.render.fonts.GLFont;
|
||||
import mightypork.utils.math.color.RGB;
|
||||
import mightypork.utils.math.coord.MutableCoord;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecMutable;
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
import mightypork.utils.string.StringProvider;
|
||||
import mightypork.utils.string.StringProvider.StringWrapper;
|
||||
|
||||
@@ -30,7 +29,7 @@ public class TextPainter extends PluggableRenderer {
|
||||
private boolean shadow;
|
||||
|
||||
private RGB shadowColor = RGB.BLACK;
|
||||
private final VecMutable shadowOffset = new MutableCoord(1, 1);
|
||||
private final VecMutable shadowOffset = VecMutable.make(1, 1);
|
||||
|
||||
|
||||
/**
|
||||
@@ -86,7 +85,7 @@ public class TextPainter extends PluggableRenderer {
|
||||
if (text == null) return;
|
||||
|
||||
final String str = text.getString();
|
||||
final RectView rect = getRect();
|
||||
final RectValue rect = getRect();
|
||||
|
||||
if (shadow) {
|
||||
font.draw(str, rect.move(shadowOffset), align, shadowColor);
|
||||
|
||||
@@ -12,7 +12,7 @@ import mightypork.gamecore.input.KeyStroke;
|
||||
import mightypork.gamecore.render.Render;
|
||||
import mightypork.utils.math.constraints.RectConstraint;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
/**
|
||||
@@ -104,7 +104,7 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind
|
||||
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return getDisplay().getRect();
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ 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;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
/**
|
||||
@@ -26,7 +26,9 @@ public abstract class ScreenLayer extends AppSubModule implements Comparable<Scr
|
||||
|
||||
private final KeyBindingPool keybindings = new KeyBindingPool();
|
||||
|
||||
/** Mouse position constraint */
|
||||
protected final VecView cMousePos = getInput().getMousePos();
|
||||
/** Screen size constraint */
|
||||
protected final VecView cScreenSize = getDisplay().getSize();
|
||||
|
||||
|
||||
@@ -65,7 +67,7 @@ public abstract class ScreenLayer extends AppSubModule implements Comparable<Scr
|
||||
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return screen.getRect();
|
||||
}
|
||||
|
||||
@@ -9,8 +9,6 @@ import mightypork.gamecore.control.bus.events.MouseMotionEvent;
|
||||
import mightypork.gamecore.control.timing.Updateable;
|
||||
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,7 +28,8 @@ public class InputSystem extends RootBusNode implements Updateable, KeyBinder {
|
||||
// listeners
|
||||
private final KeyBindingPool keybindings;
|
||||
|
||||
private final VecView mousePos = new SynthCoord2D() {
|
||||
/** Current mouse position */
|
||||
private final VecView mousePos = new VecView() {
|
||||
|
||||
@Override
|
||||
public double x()
|
||||
@@ -103,9 +102,13 @@ public class InputSystem extends RootBusNode implements Updateable, KeyBinder {
|
||||
keybindings.unbindKeyStroke(stroke);
|
||||
}
|
||||
|
||||
// counters as fields to save memory.
|
||||
private final VecMutable mouseMove = VecMutable.zero();
|
||||
private final VecMutable mouseLastPos = VecMutable.zero();
|
||||
|
||||
|
||||
@Override
|
||||
public void update(double delta)
|
||||
public synchronized void update(double delta)
|
||||
{
|
||||
// was destroyed
|
||||
if (!Display.isCreated()) return;
|
||||
@@ -114,17 +117,17 @@ public class InputSystem extends RootBusNode implements Updateable, KeyBinder {
|
||||
|
||||
Display.processMessages();
|
||||
|
||||
final VecMutable moveSum = new MutableCoord();
|
||||
final VecMutable lastPos = new MutableCoord();
|
||||
// sum the moves
|
||||
mouseMove.reset();
|
||||
mouseLastPos.reset();
|
||||
boolean wasMouse = false;
|
||||
|
||||
while (Mouse.next()) {
|
||||
onMouseEvent(moveSum, lastPos);
|
||||
onMouseEvent(mouseMove, mouseLastPos);
|
||||
wasMouse = true;
|
||||
}
|
||||
|
||||
if (wasMouse && !moveSum.isZero()) {
|
||||
getEventBus().send(new MouseMotionEvent(lastPos, moveSum));
|
||||
if (wasMouse && !mouseMove.isZero()) {
|
||||
getEventBus().send(new MouseMotionEvent(mouseLastPos, mouseMove));
|
||||
}
|
||||
|
||||
while (Keyboard.next()) {
|
||||
@@ -142,8 +145,8 @@ public class InputSystem extends RootBusNode implements Updateable, KeyBinder {
|
||||
final int button = Mouse.getEventButton();
|
||||
final boolean down = Mouse.getEventButtonState();
|
||||
|
||||
final VecMutable pos = new MutableCoord(Mouse.getEventX(), Mouse.getEventY());
|
||||
final VecMutable move = new MutableCoord(Mouse.getEventDX(), Mouse.getEventDY());
|
||||
final VecMutable pos = VecMutable.make(Mouse.getEventX(), Mouse.getEventY());
|
||||
final VecMutable move = VecMutable.make(Mouse.getEventDX(), Mouse.getEventDY());
|
||||
|
||||
final int wheeld = Mouse.getEventDWheel();
|
||||
|
||||
@@ -152,7 +155,7 @@ public class InputSystem extends RootBusNode implements Updateable, KeyBinder {
|
||||
move.mul(1, -1, 1);
|
||||
|
||||
if (button != -1 || wheeld != 0) {
|
||||
getEventBus().send(new MouseButtonEvent(pos.copy(), button, down, wheeld));
|
||||
getEventBus().send(new MouseButtonEvent(pos.value(), button, down, wheeld));
|
||||
}
|
||||
|
||||
moveSum.add(move);
|
||||
|
||||
@@ -11,10 +11,8 @@ 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.SynthCoord2D;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
import mightypork.utils.math.rect.FixedRect;
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
import org.lwjgl.BufferUtils;
|
||||
import org.lwjgl.LWJGLException;
|
||||
@@ -33,7 +31,8 @@ public class DisplaySystem extends AppModule implements RectConstraint {
|
||||
private int targetFps;
|
||||
private FpsMeter fpsMeter;
|
||||
|
||||
private final VecView cScreenSize = new SynthCoord2D() {
|
||||
/** Current screen size */
|
||||
private final VecView screenSize = new VecView() {
|
||||
|
||||
@Override
|
||||
public double y()
|
||||
@@ -191,7 +190,7 @@ public class DisplaySystem extends AppModule implements RectConstraint {
|
||||
*/
|
||||
public VecView getSize()
|
||||
{
|
||||
return cScreenSize;
|
||||
return screenSize;
|
||||
}
|
||||
|
||||
|
||||
@@ -200,7 +199,7 @@ public class DisplaySystem extends AppModule implements RectConstraint {
|
||||
*/
|
||||
public int getWidth()
|
||||
{
|
||||
return cScreenSize.xi();
|
||||
return screenSize.xi();
|
||||
}
|
||||
|
||||
|
||||
@@ -209,7 +208,7 @@ public class DisplaySystem extends AppModule implements RectConstraint {
|
||||
*/
|
||||
public int getHeight()
|
||||
{
|
||||
return cScreenSize.yi();
|
||||
return screenSize.yi();
|
||||
}
|
||||
|
||||
|
||||
@@ -240,9 +239,9 @@ public class DisplaySystem extends AppModule implements RectConstraint {
|
||||
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return new FixedRect(getSize());
|
||||
return RectValue.make(getSize());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ import mightypork.gamecore.render.textures.TxQuad;
|
||||
import mightypork.utils.files.FileUtils;
|
||||
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;
|
||||
@@ -28,9 +27,9 @@ import org.newdawn.slick.util.ResourceLoader;
|
||||
*/
|
||||
public class Render {
|
||||
|
||||
public static final Vec AXIS_X = new FixedCoord(1, 0, 0);
|
||||
public static final Vec AXIS_Y = new FixedCoord(0, 1, 0);
|
||||
public static final Vec AXIS_Z = new FixedCoord(0, 0, 1);
|
||||
public static final VecView AXIS_X = VecView.make(1, 0, 0);
|
||||
public static final VecView AXIS_Y = VecView.make(0, 1, 0);
|
||||
public static final VecView AXIS_Z = VecView.make(0, 0, 1);
|
||||
|
||||
|
||||
/**
|
||||
@@ -541,6 +540,7 @@ public class Render {
|
||||
|
||||
/**
|
||||
* Setup Ortho projection for 2D graphics
|
||||
*
|
||||
* @param size viewport size (screen size)
|
||||
*/
|
||||
public static void setupOrtho(VecView size)
|
||||
|
||||
@@ -4,6 +4,7 @@ package mightypork.gamecore.render.fonts;
|
||||
import mightypork.gamecore.render.Render;
|
||||
import mightypork.utils.math.color.RGB;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecMutable;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
import mightypork.utils.math.rect.Rect;
|
||||
|
||||
@@ -71,7 +72,7 @@ public class FontRenderer {
|
||||
|
||||
private double getScale(double height)
|
||||
{
|
||||
return height / font.getHeight();
|
||||
return height / font.getLineHeight();
|
||||
}
|
||||
|
||||
|
||||
@@ -109,7 +110,7 @@ public class FontRenderer {
|
||||
{
|
||||
Render.pushMatrix();
|
||||
|
||||
Render.translate(pos.view().round());
|
||||
Render.translate(pos.value().round());
|
||||
Render.scaleXY(getScale(height));
|
||||
|
||||
font.draw(text, color);
|
||||
@@ -192,20 +193,19 @@ public class FontRenderer {
|
||||
|
||||
final double w = getWidth(text, height);
|
||||
|
||||
final Vec start;
|
||||
final VecMutable start = pos.mutable();
|
||||
|
||||
switch (align) {
|
||||
case LEFT:
|
||||
start = pos.view();
|
||||
break;
|
||||
|
||||
case CENTER:
|
||||
start = pos.view().sub(w / 2D, 0);
|
||||
start.sub(w / 2D, 0);
|
||||
break;
|
||||
|
||||
case RIGHT:
|
||||
default:
|
||||
start = pos.view().sub(w, 0);
|
||||
start.sub(w, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ public interface GLFont {
|
||||
/**
|
||||
* @return font height
|
||||
*/
|
||||
int getHeight();
|
||||
int getLineHeight();
|
||||
|
||||
|
||||
/**
|
||||
@@ -46,5 +46,5 @@ public interface GLFont {
|
||||
/**
|
||||
* @return specified font size
|
||||
*/
|
||||
int getSize();
|
||||
int getFontSize();
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@ import mightypork.gamecore.render.fonts.GLFont;
|
||||
import mightypork.gamecore.render.textures.FilterMode;
|
||||
import mightypork.utils.logging.Log;
|
||||
import mightypork.utils.math.color.RGB;
|
||||
import mightypork.utils.math.coord.FixedCoord;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
import org.lwjgl.BufferUtils;
|
||||
@@ -376,14 +375,14 @@ public class CachedFont implements GLFont {
|
||||
|
||||
|
||||
@Override
|
||||
public int getHeight()
|
||||
public int getLineHeight()
|
||||
{
|
||||
return fontHeight;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getSize()
|
||||
public int getFontSize()
|
||||
{
|
||||
return fontSize;
|
||||
}
|
||||
@@ -425,7 +424,7 @@ public class CachedFont implements GLFont {
|
||||
@Override
|
||||
public VecView getNeededSpace(String text)
|
||||
{
|
||||
return new FixedCoord(getWidth(text), getHeight());
|
||||
return VecView.make(getWidth(text), getLineHeight());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -79,37 +79,31 @@ public class DeferredFont extends DeferredResource implements GLFont {
|
||||
}
|
||||
|
||||
|
||||
public void setFont(GLFont font)
|
||||
{
|
||||
this.font = font;
|
||||
}
|
||||
|
||||
|
||||
public void setSize(double size)
|
||||
public synchronized void setSize(double size)
|
||||
{
|
||||
this.size = size;
|
||||
}
|
||||
|
||||
|
||||
public void setStyle(FontStyle style)
|
||||
public synchronized void setStyle(FontStyle style)
|
||||
{
|
||||
this.style = style;
|
||||
}
|
||||
|
||||
|
||||
public void setChars(String chars)
|
||||
public synchronized void setChars(String chars)
|
||||
{
|
||||
this.chars = chars;
|
||||
}
|
||||
|
||||
|
||||
public void setFilter(FilterMode filter)
|
||||
public synchronized void setFilter(FilterMode filter)
|
||||
{
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
|
||||
public void setAntialias(boolean antialias)
|
||||
public synchronized void setAntialias(boolean antialias)
|
||||
{
|
||||
this.antialias = antialias;
|
||||
}
|
||||
@@ -182,20 +176,20 @@ public class DeferredFont extends DeferredResource implements GLFont {
|
||||
* @return font height
|
||||
*/
|
||||
@Override
|
||||
public int getHeight()
|
||||
public int getLineHeight()
|
||||
{
|
||||
if (!ensureLoaded()) return 0;
|
||||
|
||||
return font.getHeight();
|
||||
return font.getLineHeight();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getSize()
|
||||
public int getFontSize()
|
||||
{
|
||||
if (!ensureLoaded()) return 0;
|
||||
|
||||
return font.getSize();
|
||||
return font.getFontSize();
|
||||
}
|
||||
|
||||
|
||||
@@ -212,11 +206,4 @@ public class DeferredFont extends DeferredResource implements GLFont {
|
||||
// this will have to suffice
|
||||
font = null;
|
||||
}
|
||||
|
||||
|
||||
public void setFiltering(FilterMode filter)
|
||||
{
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ public class NullFont implements GLFont {
|
||||
|
||||
|
||||
@Override
|
||||
public int getHeight()
|
||||
public int getLineHeight()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -44,7 +44,7 @@ public class NullFont implements GLFont {
|
||||
|
||||
|
||||
@Override
|
||||
public int getSize()
|
||||
public int getFontSize()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package mightypork.gamecore.render.textures;
|
||||
|
||||
|
||||
import mightypork.utils.math.rect.FixedRect;
|
||||
import mightypork.utils.math.rect.Rect;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
import org.newdawn.slick.opengl.Texture;
|
||||
|
||||
@@ -65,7 +65,7 @@ public class TxQuad {
|
||||
* @param y2 right bottom Y (0-1)
|
||||
*/
|
||||
public TxQuad(Texture tx, double x1, double y1, double x2, double y2) {
|
||||
this(tx, new FixedRect(x1, y1, x2, y2));
|
||||
this(tx, RectValue.make(x1, y1, x2, y2));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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.math.coord.FixedCoord;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
public class LayerBouncyBoxes extends ScreenLayer {
|
||||
@@ -59,7 +59,7 @@ public class LayerBouncyBoxes extends ScreenLayer {
|
||||
|
||||
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));
|
||||
tp.setShadow(RGB.RED, VecView.make(2, 2));
|
||||
|
||||
layout.add(tp);
|
||||
}
|
||||
|
||||
@@ -19,15 +19,16 @@ import mightypork.rogue.Res;
|
||||
import mightypork.utils.math.animation.AnimDouble;
|
||||
import mightypork.utils.math.animation.Easing;
|
||||
import mightypork.utils.math.color.RGB;
|
||||
import mightypork.utils.math.coord.AnimCoord;
|
||||
import mightypork.utils.math.coord.FixedCoord;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecMutable;
|
||||
import mightypork.utils.math.coord.VecMutableAnim;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButtonEvent.Listener {
|
||||
|
||||
private final AnimDouble size = new AnimDouble(400, Easing.SINE_BOTH);
|
||||
private final AnimCoord pos = new AnimCoord(Vec.ZERO, Easing.ELASTIC_OUT);
|
||||
private final VecMutableAnim pos = VecMutable.makeAnim(Easing.ELASTIC_OUT);
|
||||
|
||||
private final Random rand = new Random();
|
||||
|
||||
@@ -40,6 +41,7 @@ public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButt
|
||||
super(screen);
|
||||
|
||||
pos.setTo(getDisplay().getCenter());
|
||||
pos.setDefaultDuration(3);
|
||||
|
||||
cat = new ImagePainter(Res.getTxQuad("test.kitten"));
|
||||
|
||||
@@ -49,7 +51,7 @@ public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButt
|
||||
tp.setAlign(Align.CENTER);
|
||||
tp.setColor(RGB.YELLOW);
|
||||
tp.setText("Meow!");
|
||||
tp.setShadow(RGB.dark(0.8), new FixedCoord(2, 2));
|
||||
tp.setShadow(RGB.dark(0.8), VecView.make(2, 2));
|
||||
|
||||
tp.setContext(cCenterTo(cBox(64, 64), cMousePos));
|
||||
|
||||
@@ -64,7 +66,7 @@ public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButt
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
pos.animateWithSpeed(getDisplay().getCenter(), 300);
|
||||
pos.setTo(getDisplay().getCenter());
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -85,9 +87,9 @@ public class LayerFlyingCat extends ScreenLayer implements Updateable, MouseButt
|
||||
|
||||
final Vec pos = event.getPos();
|
||||
|
||||
this.pos.animateWithSpeed(pos, 160);
|
||||
this.pos.setTo(pos);
|
||||
|
||||
size.animate(200 + rand.nextInt(600), Math.max(0.2, this.pos.getDuration() / 2));
|
||||
size.animate(200 + rand.nextInt(600), 1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
package mightypork.test;
|
||||
|
||||
|
||||
import mightypork.utils.math.rect.FixedRect;
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
public class TestConstr {
|
||||
@@ -10,10 +9,10 @@ public class TestConstr {
|
||||
public static void main(String[] args)
|
||||
{
|
||||
|
||||
final RectView rm = new FixedRect(0, 0, 100, 100);
|
||||
final RectValue rm = RectValue.make(0, 0, 100, 100);
|
||||
System.out.println(rm);
|
||||
|
||||
final RectView added = rm.move(10, 10);
|
||||
final RectValue added = rm.move(10, 10);
|
||||
|
||||
System.out.println(added);
|
||||
System.out.println(added.getOrigin());
|
||||
|
||||
@@ -173,7 +173,9 @@ public class PropertyManager {
|
||||
public void apply()
|
||||
{
|
||||
boolean needsSave = false;
|
||||
new File(file.getParent()).mkdirs();
|
||||
if (!new File(file.getParent()).mkdirs()) {
|
||||
throw new RuntimeException("Cound not create config file.");
|
||||
}
|
||||
|
||||
try(FileInputStream fis = new FileInputStream(file)) {
|
||||
props.load(fis);
|
||||
|
||||
@@ -39,8 +39,8 @@ public class FileUtils {
|
||||
if (!source.exists()) return;
|
||||
|
||||
if (source.isDirectory()) {
|
||||
if (!target.exists()) {
|
||||
target.mkdir();
|
||||
if (!target.exists() && !target.mkdir()) {
|
||||
throw new IOException("Could not open destination directory.");
|
||||
}
|
||||
|
||||
final String[] children = source.list();
|
||||
@@ -371,7 +371,7 @@ public class FileUtils {
|
||||
}
|
||||
|
||||
|
||||
public static void deleteEmptyDirs(File base)
|
||||
public static void deleteEmptyDirs(File base) throws IOException
|
||||
{
|
||||
for (final File f : listDirectory(base)) {
|
||||
if (!f.isDirectory()) continue;
|
||||
@@ -380,7 +380,7 @@ public class FileUtils {
|
||||
|
||||
final List<File> children = listDirectory(f);
|
||||
if (children.size() == 0) {
|
||||
f.delete();
|
||||
if (!f.delete()) throw new IOException("Could not delete a directory: " + f);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class InstanceLock {
|
||||
try {
|
||||
fileLock.release();
|
||||
randomAccessFile.close();
|
||||
lockFile.delete();
|
||||
if (!lockFile.delete()) throw new IOException();
|
||||
} catch (final Exception e) {
|
||||
System.err.println("Unable to remove lock file.");
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
package mightypork.utils.files;
|
||||
|
||||
|
||||
import java.io.*;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.HashSet;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
@@ -22,11 +26,11 @@ public class ZipBuilder {
|
||||
|
||||
/**
|
||||
* @param target target zip file
|
||||
* @throws FileNotFoundException if the file is directory or cannot be
|
||||
* created
|
||||
* @throws IOException if the file is directory or cannot be created
|
||||
*/
|
||||
public ZipBuilder(File target) throws FileNotFoundException {
|
||||
target.getParentFile().mkdirs();
|
||||
public ZipBuilder(File target) throws IOException {
|
||||
|
||||
if (!target.getParentFile().mkdirs()) throw new IOException("Could not create output directory.");
|
||||
|
||||
final FileOutputStream dest = new FileOutputStream(target);
|
||||
out = new ZipOutputStream(new BufferedOutputStream(dest));
|
||||
|
||||
@@ -8,6 +8,7 @@ import java.util.List;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipFile;
|
||||
|
||||
import mightypork.utils.logging.Log;
|
||||
import mightypork.utils.string.validation.StringFilter;
|
||||
|
||||
|
||||
@@ -45,13 +46,13 @@ public class ZipUtils {
|
||||
* @param outputDir target directory
|
||||
* @param filter string filter (will be used to test entry names (paths))
|
||||
* @return list of entries extracted (paths)
|
||||
* @throws IOException
|
||||
* @throws IOException if the file)s) cannot be created
|
||||
*/
|
||||
public static List<String> extractZip(ZipFile zip, File outputDir, StringFilter filter) throws IOException
|
||||
{
|
||||
final ArrayList<String> files = new ArrayList<>();
|
||||
|
||||
outputDir.mkdirs();
|
||||
if (!outputDir.mkdirs()) throw new IOException("Could not create output directory.");
|
||||
|
||||
final Enumeration<? extends ZipEntry> zipFileEntries = zip.entries();
|
||||
|
||||
@@ -67,7 +68,7 @@ public class ZipUtils {
|
||||
if (entry.isDirectory() || (filter != null && !filter.accept(entryPath))) continue;
|
||||
|
||||
// make sure directories exist
|
||||
destinationParent.mkdirs();
|
||||
if (!destinationParent.mkdirs()) throw new IOException("Could not create directory.");
|
||||
|
||||
if (!entry.isDirectory()) {
|
||||
extractZipEntry(zip, entry, destFile);
|
||||
@@ -130,7 +131,7 @@ public class ZipUtils {
|
||||
*/
|
||||
public static void extractZipEntry(ZipFile zip, ZipEntry entry, File destFile) throws IOException
|
||||
{
|
||||
destFile.getParentFile().mkdirs();
|
||||
if (!destFile.getParentFile().mkdirs()) throw new IOException("Could not create output directory.");
|
||||
|
||||
try(InputStream in = zip.getInputStream(entry);
|
||||
BufferedInputStream is = new BufferedInputStream(in);
|
||||
@@ -171,7 +172,8 @@ public class ZipUtils {
|
||||
{
|
||||
try(ZipFile zf = new ZipFile(selectedFile)) {
|
||||
return zf.getEntry(string) != null;
|
||||
} catch (final Exception e) {
|
||||
} catch (final IOException | RuntimeException e) {
|
||||
Log.w("Error reading zip.", e);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -176,7 +176,7 @@ public class BinaryUtils {
|
||||
|
||||
public static char readChar(InputStream in) throws IOException
|
||||
{
|
||||
in.read(ac, 0, ac.length);
|
||||
if (-1 == in.read(ac, 0, ac.length)) throw new IOException("End of stream.");
|
||||
final ByteBuffer buf = ByteBuffer.wrap(ac);
|
||||
return buf.getChar();
|
||||
}
|
||||
@@ -184,7 +184,7 @@ public class BinaryUtils {
|
||||
|
||||
public static short readShort(InputStream in) throws IOException
|
||||
{
|
||||
in.read(as, 0, as.length);
|
||||
if (-1 == in.read(as, 0, as.length)) throw new IOException("End of stream.");
|
||||
final ByteBuffer buf = ByteBuffer.wrap(as);
|
||||
return buf.getShort();
|
||||
}
|
||||
@@ -192,7 +192,8 @@ public class BinaryUtils {
|
||||
|
||||
public static long readLong(InputStream in) throws IOException
|
||||
{
|
||||
in.read(al, 0, al.length);
|
||||
if (-1 == in.read(al, 0, al.length)) throw new IOException("End of stream.");
|
||||
|
||||
final ByteBuffer buf = ByteBuffer.wrap(al);
|
||||
return buf.getLong();
|
||||
}
|
||||
@@ -200,7 +201,7 @@ public class BinaryUtils {
|
||||
|
||||
public static int readInt(InputStream in) throws IOException
|
||||
{
|
||||
in.read(ai, 0, ai.length);
|
||||
if (-1 == in.read(ai, 0, ai.length)) throw new IOException("End of stream.");
|
||||
final ByteBuffer buf = ByteBuffer.wrap(ai);
|
||||
return buf.getInt();
|
||||
}
|
||||
@@ -208,7 +209,7 @@ public class BinaryUtils {
|
||||
|
||||
public static float readFloat(InputStream in) throws IOException
|
||||
{
|
||||
in.read(af, 0, af.length);
|
||||
if (-1 == in.read(af, 0, af.length)) throw new IOException("End of stream.");
|
||||
final ByteBuffer buf = ByteBuffer.wrap(af);
|
||||
return buf.getFloat();
|
||||
}
|
||||
@@ -216,7 +217,7 @@ public class BinaryUtils {
|
||||
|
||||
public static double readDouble(InputStream in) throws IOException
|
||||
{
|
||||
in.read(ad, 0, ad.length);
|
||||
if (-1 == in.read(ad, 0, ad.length)) throw new IOException("End of stream.");
|
||||
final ByteBuffer buf = ByteBuffer.wrap(ad);
|
||||
return buf.getDouble();
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ public class Ion {
|
||||
final String f = path.toString();
|
||||
final File dir = new File(f.substring(0, f.lastIndexOf(File.separator)));
|
||||
|
||||
dir.mkdirs();
|
||||
if (!dir.mkdirs()) throw new IOException("Could not create file.");
|
||||
|
||||
toStream(out, obj);
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ public class ArchivingLog extends SimpleLog {
|
||||
|
||||
for (int cnt = 0; (f2 = new File(log_dir, fbase + cntStr + suff)).exists(); cntStr = "_" + (++cnt)) {}
|
||||
|
||||
f.renameTo(f2);
|
||||
if (!f.renameTo(f2)) throw new RuntimeException("Could not move log file.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,7 +110,9 @@ public class ArchivingLog extends SimpleLog {
|
||||
|
||||
// playing with fireee
|
||||
for (int i = 0; i < oldLogs.size() - logs_to_keep; i++) {
|
||||
oldLogs.get(i).delete();
|
||||
if (!oldLogs.get(i).delete()) {
|
||||
throw new RuntimeException("Could not delete old log file.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -200,7 +200,30 @@ public class Log {
|
||||
|
||||
|
||||
/**
|
||||
* Log THROWING message
|
||||
* Log warning message with exception
|
||||
*
|
||||
* @param msg message
|
||||
* @param thrown thrown exception
|
||||
*/
|
||||
public static void w(String msg, Throwable thrown)
|
||||
{
|
||||
log(Level.WARNING, msg, thrown);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log exception thrown as warning
|
||||
*
|
||||
* @param thrown thrown exception
|
||||
*/
|
||||
public static void w(Throwable thrown)
|
||||
{
|
||||
log(Level.WARNING, null, thrown);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log error message
|
||||
*
|
||||
* @param msg message
|
||||
* @param thrown thrown exception
|
||||
@@ -212,7 +235,7 @@ public class Log {
|
||||
|
||||
|
||||
/**
|
||||
* Log exception thrown
|
||||
* Log exception thrown as error
|
||||
*
|
||||
* @param thrown thrown exception
|
||||
*/
|
||||
|
||||
@@ -76,7 +76,7 @@ public class SimpleLog implements LogWriter {
|
||||
protected void printHeader()
|
||||
{
|
||||
final String stamp = (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date());
|
||||
i("Logger \"" + getName() + "\" initialized.\n" + stamp);
|
||||
log(Level.INFO, "Logger \"" + getName() + "\" initialized.\n" + stamp);
|
||||
}
|
||||
|
||||
|
||||
@@ -159,93 +159,4 @@ public class SimpleLog implements LogWriter {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log FINE message
|
||||
*
|
||||
* @param msg message
|
||||
*/
|
||||
public void f1(String msg)
|
||||
{
|
||||
log(Level.FINE, msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log FINER message
|
||||
*
|
||||
* @param msg message
|
||||
*/
|
||||
public void f2(String msg)
|
||||
{
|
||||
log(Level.FINER, msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log FINEST message
|
||||
*
|
||||
* @param msg message
|
||||
*/
|
||||
public void f3(String msg)
|
||||
{
|
||||
log(Level.FINEST, msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log INFO message
|
||||
*
|
||||
* @param msg message
|
||||
*/
|
||||
public void i(String msg)
|
||||
{
|
||||
log(Level.INFO, msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log WARNING message (less severe than ERROR)
|
||||
*
|
||||
* @param msg message
|
||||
*/
|
||||
public void w(String msg)
|
||||
{
|
||||
log(Level.WARNING, msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log ERROR message
|
||||
*
|
||||
* @param msg message
|
||||
*/
|
||||
public void e(String msg)
|
||||
{
|
||||
log(Level.SEVERE, msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log THROWING message
|
||||
*
|
||||
* @param msg message
|
||||
* @param thrown thrown exception
|
||||
*/
|
||||
public void e(String msg, Throwable thrown)
|
||||
{
|
||||
log(Level.SEVERE, msg, thrown);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log exception thrown
|
||||
*
|
||||
* @param thrown thrown exception
|
||||
*/
|
||||
public void e(Throwable thrown)
|
||||
{
|
||||
log(Level.SEVERE, null, thrown);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,8 +3,6 @@ package mightypork.utils.math;
|
||||
|
||||
import mightypork.utils.math.Calc.Deg;
|
||||
import mightypork.utils.math.Calc.Rad;
|
||||
import mightypork.utils.math.constraints.NumberConstraint;
|
||||
import mightypork.utils.math.coord.ConstraintCoord;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
@@ -22,7 +20,7 @@ public class Polar {
|
||||
/** distance in units */
|
||||
private double radius = 0;
|
||||
|
||||
private ConstraintCoord coord = null;
|
||||
private VecView coord = null;
|
||||
|
||||
|
||||
/**
|
||||
@@ -141,21 +139,21 @@ public class Polar {
|
||||
{
|
||||
// lazy init
|
||||
if (coord == null) {
|
||||
coord = new ConstraintCoord(new NumberConstraint() {
|
||||
coord = new VecView() {
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
public double x()
|
||||
{
|
||||
return radius * Math.cos(angle);
|
||||
}
|
||||
}, new NumberConstraint() {
|
||||
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
public double y()
|
||||
{
|
||||
return radius * Math.sin(angle);
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
return coord;
|
||||
|
||||
@@ -2,12 +2,10 @@ package mightypork.utils.math.constraints;
|
||||
|
||||
|
||||
import mightypork.gamecore.control.timing.Poller;
|
||||
import mightypork.utils.math.coord.FixedCoord;
|
||||
import mightypork.utils.math.coord.SynthCoord3D;
|
||||
import mightypork.utils.math.coord.AbstractVecProxy;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
import mightypork.utils.math.rect.FixedRect;
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
/**
|
||||
@@ -132,7 +130,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().round();
|
||||
}
|
||||
@@ -255,7 +253,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
final double height = r.getRect().getHeight();
|
||||
final double perRow = height / rows;
|
||||
@@ -263,7 +261,7 @@ public class Constraints {
|
||||
final Vec origin = r.getRect().getOrigin().add(0, perRow * index);
|
||||
final Vec size = r.getRect().getSize().setY(perRow);
|
||||
|
||||
return new FixedRect(origin, size);
|
||||
return RectValue.make(origin, size);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -274,7 +272,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
final double width = r.getRect().getWidth();
|
||||
final double perCol = width / columns;
|
||||
@@ -282,7 +280,7 @@ public class Constraints {
|
||||
final Vec origin = r.getRect().getOrigin().add(perCol * index, 0);
|
||||
final Vec size = r.getRect().getSize().setX(perCol);
|
||||
|
||||
return new FixedRect(origin, size);
|
||||
return RectValue.make(origin, size);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -293,7 +291,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
final double height = r.getRect().getHeight();
|
||||
final double width = r.getRect().getHeight();
|
||||
@@ -302,7 +300,7 @@ public class Constraints {
|
||||
|
||||
final Vec origin = r.getRect().getOrigin().add(perCol * left, perRow * (rows - top - 1));
|
||||
|
||||
return new FixedRect(origin, perCol, perRow);
|
||||
return RectValue.make(origin, perCol, perRow);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -328,7 +326,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().shrink(toDouble(left), toDouble(top), toDouble(right), toDouble(bottom));
|
||||
}
|
||||
@@ -341,7 +339,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().shrink(0, toDouble(shrink), 0, 0);
|
||||
}
|
||||
@@ -354,7 +352,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().shrink(0, 0, 0, toDouble(shrink));
|
||||
}
|
||||
@@ -367,7 +365,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().shrink(toDouble(shrink), 0, 0, 0);
|
||||
}
|
||||
@@ -380,7 +378,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().shrink(0, 0, toDouble(shrink), 0);
|
||||
}
|
||||
@@ -406,7 +404,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().grow(toDouble(left), toDouble(right), toDouble(top), toDouble(bottom));
|
||||
}
|
||||
@@ -419,7 +417,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().grow(0, toDouble(grow), 0, 0);
|
||||
}
|
||||
@@ -432,7 +430,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().grow(0, 0, 0, toDouble(grow));
|
||||
}
|
||||
@@ -445,7 +443,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().grow(toDouble(grow), 0, 0, 0);
|
||||
}
|
||||
@@ -458,7 +456,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().grow(0, 0, toDouble(grow), 0);
|
||||
}
|
||||
@@ -479,9 +477,9 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return new FixedRect(origin.getVec(), toDouble(width), toDouble(height));
|
||||
return RectValue.make(origin.getVec(), toDouble(width), toDouble(height));
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -492,9 +490,9 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return new FixedRect(0, 0, toDouble(width), toDouble(height));
|
||||
return RectValue.make(0, 0, toDouble(width), toDouble(height));
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -505,11 +503,11 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
final Vec origin = r.getRect().getOrigin();
|
||||
|
||||
return new FixedRect(origin.x(), origin.y(), toDouble(width), toDouble(height));
|
||||
return RectValue.make(origin.x(), origin.y(), toDouble(width), toDouble(height));
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -520,11 +518,11 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
final Vec origin = r.getRect().getOrigin();
|
||||
|
||||
return new FixedRect(origin.x() + toDouble(x), origin.y() + toDouble(y), toDouble(width), toDouble(height));
|
||||
return RectValue.make(origin.x() + toDouble(x), origin.y() + toDouble(y), toDouble(width), toDouble(height));
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -535,12 +533,12 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
final VecView size = r.getRect().getSize();
|
||||
final VecView center = centerTo.getRect().getCenter();
|
||||
|
||||
return new FixedRect(center.sub(size.half()), size);
|
||||
return RectValue.make(center.sub(size.half()), size);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -551,11 +549,11 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
final VecView size = r.getRect().getSize();
|
||||
|
||||
return new FixedRect(centerTo.getVec().sub(size.half()), size);
|
||||
return RectValue.make(centerTo.getVec().sub(size.half()), size);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -566,12 +564,12 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
final VecView size = r.getRect().getSize();
|
||||
final VecView v = new FixedCoord(toDouble(x), toDouble(y));
|
||||
final VecView v = VecView.make(toDouble(x), toDouble(y));
|
||||
|
||||
return new FixedRect(v.sub(size.half()), size);
|
||||
return RectValue.make(v.sub(size.half()), size);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -582,7 +580,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().move(move.getVec());
|
||||
}
|
||||
@@ -595,7 +593,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().move(toDouble(x), toDouble(y));
|
||||
}
|
||||
@@ -645,7 +643,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
final double t = toDouble(top);
|
||||
final double r = toDouble(right);
|
||||
@@ -655,7 +653,7 @@ public class Constraints {
|
||||
final double x = c.getVec().x();
|
||||
final double y = c.getVec().y();
|
||||
|
||||
return new FixedRect(x - l, y - t, l + r, t + b);
|
||||
return RectValue.make(x - l, y - t, l + r, t + b);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -668,7 +666,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().shrink(0, 0, r.getRect().getWidth(), 0);
|
||||
}
|
||||
@@ -681,7 +679,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().shrink(0, 0, 0, r.getRect().getHeight());
|
||||
}
|
||||
@@ -694,7 +692,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().shrink(r.getRect().getWidth(), 0, 0, 0);
|
||||
}
|
||||
@@ -707,7 +705,7 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return r.getRect().shrink(0, r.getRect().getHeight(), 0, 0);
|
||||
}
|
||||
@@ -770,10 +768,10 @@ public class Constraints {
|
||||
|
||||
public static VecConstraint cAdd(final VecConstraint c1, final VecConstraint c2)
|
||||
{
|
||||
return new VecConstraintSynth() {
|
||||
return new AbstractVecProxy() {
|
||||
|
||||
@Override
|
||||
public VecView getVec()
|
||||
public VecView getSource()
|
||||
{
|
||||
return c1.getVec().add(c2.getVec());
|
||||
}
|
||||
@@ -789,28 +787,13 @@ public class Constraints {
|
||||
|
||||
public static VecConstraint cAdd(final VecConstraint c, final Object x, final Object y, final Object z)
|
||||
{
|
||||
return new SynthCoord3D() {
|
||||
return new AbstractVecProxy() {
|
||||
|
||||
@Override
|
||||
public double x()
|
||||
public VecView getSource()
|
||||
{
|
||||
return c.getVec().x() + toDouble(x);
|
||||
return c.getVec().add(toDouble(x), toDouble(y), toDouble(z));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double y()
|
||||
{
|
||||
return c.getVec().y() + toDouble(y);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double z()
|
||||
{
|
||||
return c.getVec().z() + toDouble(z);
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@@ -819,10 +802,10 @@ public class Constraints {
|
||||
|
||||
public static VecConstraint cSub(final VecConstraint c1, final VecConstraint c2)
|
||||
{
|
||||
return new VecConstraintSynth() {
|
||||
return new AbstractVecProxy() {
|
||||
|
||||
@Override
|
||||
public VecView getVec()
|
||||
public VecView getSource()
|
||||
{
|
||||
return c1.getVec().sub(c2.getVec());
|
||||
}
|
||||
@@ -838,10 +821,10 @@ public class Constraints {
|
||||
|
||||
public static VecConstraint cSub(final VecConstraint c, final Object x, final Object y, final Object z)
|
||||
{
|
||||
return new VecConstraintSynth() {
|
||||
return new AbstractVecProxy() {
|
||||
|
||||
@Override
|
||||
public VecView getVec()
|
||||
public VecView getSource()
|
||||
{
|
||||
return c.getVec().sub(toDouble(x), toDouble(y), toDouble(z));
|
||||
}
|
||||
@@ -854,10 +837,10 @@ public class Constraints {
|
||||
|
||||
public static VecConstraint cMul(final VecConstraint c, final Object mul)
|
||||
{
|
||||
return new VecConstraintSynth() {
|
||||
return new AbstractVecProxy() {
|
||||
|
||||
@Override
|
||||
public VecView getVec()
|
||||
public VecView getSource()
|
||||
{
|
||||
return c.getVec().mul(toDouble(mul));
|
||||
}
|
||||
@@ -870,10 +853,10 @@ public class Constraints {
|
||||
|
||||
public static VecConstraint cOrigin(final RectConstraint r)
|
||||
{
|
||||
return new VecConstraintSynth() {
|
||||
return new AbstractVecProxy() {
|
||||
|
||||
@Override
|
||||
public VecView getVec()
|
||||
public VecView getSource()
|
||||
{
|
||||
return r.getRect().getOrigin();
|
||||
}
|
||||
@@ -883,10 +866,10 @@ public class Constraints {
|
||||
|
||||
public static VecConstraint cSize(final RectConstraint r)
|
||||
{
|
||||
return new VecConstraintSynth() {
|
||||
return new AbstractVecProxy() {
|
||||
|
||||
@Override
|
||||
public VecView getVec()
|
||||
public VecView getSource()
|
||||
{
|
||||
return r.getRect().getSize();
|
||||
}
|
||||
@@ -971,11 +954,11 @@ public class Constraints {
|
||||
return new RectConstraint() {
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
final Vec v = c.getVec();
|
||||
|
||||
return new FixedRect(v.x(), v.y(), 0, 0);
|
||||
return RectValue.make(v.x(), v.y(), 0, 0);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package mightypork.utils.math.constraints;
|
||||
|
||||
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ import mightypork.utils.math.rect.RectView;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class ContextAdapter implements PluggableContext {
|
||||
public abstract class ContextAdapter implements PluggableRect {
|
||||
|
||||
private RectConstraint backing = null;
|
||||
|
||||
@@ -22,7 +22,7 @@ public abstract class ContextAdapter implements PluggableContext {
|
||||
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return backing.getRect();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
package mightypork.utils.math.constraints;
|
||||
|
||||
|
||||
/**
|
||||
* Constant number {@link NumberConstraint}
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class FixedNumberConstraint implements NumberConstraint {
|
||||
|
||||
private final double value;
|
||||
|
||||
|
||||
public FixedNumberConstraint(double value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -8,23 +8,8 @@ package mightypork.utils.math.constraints;
|
||||
*/
|
||||
public interface NumberConstraint {
|
||||
|
||||
public static final NumberConstraint ZERO = new NumberConstraint() {
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
public static final NumberConstraint ONE = new NumberConstraint() {
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
public static final NumberConstraint ZERO = new FixedNumberConstraint(0);
|
||||
public static final NumberConstraint ONE = new FixedNumberConstraint(1);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
package mightypork.utils.math.constraints;
|
||||
|
||||
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ import mightypork.utils.math.rect.RectView;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface PluggableContext extends RectConstraint {
|
||||
public interface PluggableRect extends RectConstraint {
|
||||
|
||||
/**
|
||||
* @param rect context to set
|
||||
@@ -18,6 +18,6 @@ public interface PluggableContext extends RectConstraint {
|
||||
|
||||
|
||||
@Override
|
||||
abstract RectView getRect();
|
||||
abstract RectValue getRect();
|
||||
|
||||
}
|
||||
@@ -3,13 +3,13 @@ package mightypork.utils.math.constraints;
|
||||
|
||||
import mightypork.gamecore.control.timing.Pollable;
|
||||
import mightypork.gamecore.control.timing.Poller;
|
||||
import mightypork.utils.math.rect.MutableRect;
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectMutable;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
/**
|
||||
* {@link RectConstraint} cache, used to reduce CPU load with very complex
|
||||
* constraints.<br>
|
||||
* {@link RectConstraint} cache, used for caching computed Rect from a complex
|
||||
* {@link RectConstraint}.<br>
|
||||
* Calculates only when polled.
|
||||
*
|
||||
* @author MightyPork
|
||||
@@ -17,7 +17,7 @@ import mightypork.utils.math.rect.RectView;
|
||||
public class RectCache implements RectConstraint, Pollable {
|
||||
|
||||
private final RectConstraint observed;
|
||||
private final MutableRect cached = new MutableRect();
|
||||
private final RectMutable cached = RectMutable.zero();
|
||||
|
||||
|
||||
/**
|
||||
@@ -42,7 +42,7 @@ public class RectCache implements RectConstraint, Pollable {
|
||||
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public RectValue getRect()
|
||||
{
|
||||
return cached.view();
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package mightypork.utils.math.constraints;
|
||||
|
||||
|
||||
import mightypork.utils.math.rect.RectView;
|
||||
import mightypork.utils.math.rect.RectValue;
|
||||
|
||||
|
||||
/**
|
||||
@@ -14,5 +14,5 @@ public interface RectConstraint {
|
||||
/**
|
||||
* @return rect region
|
||||
*/
|
||||
RectView getRect();
|
||||
RectValue getRect();
|
||||
}
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,188 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
import mightypork.utils.math.constraints.NumberConstraint;
|
||||
|
||||
|
||||
public abstract class AbstractVec implements Vec {
|
||||
|
||||
private AbstractVecProxy view;
|
||||
private NumberConstraint constraintX;
|
||||
private NumberConstraint constraintY;
|
||||
private NumberConstraint constraintZ;
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getVec()
|
||||
{
|
||||
return view();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double x();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double y();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double z();
|
||||
|
||||
|
||||
@Override
|
||||
public int xi()
|
||||
{
|
||||
return (int) Math.round(x());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int yi()
|
||||
{
|
||||
return (int) Math.round(y());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int zi()
|
||||
{
|
||||
return (int) Math.round(z());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NumberConstraint xc()
|
||||
{
|
||||
if (constraintX == null) constraintX = new NumberConstraint() {
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
{
|
||||
return x();
|
||||
}
|
||||
};
|
||||
|
||||
return constraintX;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NumberConstraint yc()
|
||||
{
|
||||
if (constraintY == null) constraintY = new NumberConstraint() {
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
{
|
||||
return y();
|
||||
}
|
||||
};
|
||||
|
||||
return constraintY;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NumberConstraint zc()
|
||||
{
|
||||
if (constraintZ == null) constraintZ = new NumberConstraint() {
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
{
|
||||
return z();
|
||||
}
|
||||
};
|
||||
|
||||
return constraintZ;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double size()
|
||||
{
|
||||
final double x = x(), y = y(), z = z();
|
||||
return Math.sqrt(x * x + y * y + z * z);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isZero()
|
||||
{
|
||||
return x() == 0 && y() == 0 && z() == 0;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView value()
|
||||
{
|
||||
return new ConstVec(this);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double distTo(Vec point)
|
||||
{
|
||||
final double dx = x() - point.x();
|
||||
final double dy = y() - point.y();
|
||||
final double dz = z() - point.z();
|
||||
|
||||
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView midTo(Vec point)
|
||||
{
|
||||
final double dx = (point.x() - x()) * 0.5;
|
||||
final double dy = (point.y() - y()) * 0.5;
|
||||
final double dz = (point.z() - z()) * 0.5;
|
||||
|
||||
return VecView.make(dx, dy, dz);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView vecTo(Vec point)
|
||||
{
|
||||
return VecView.make(point.x() - x(), point.y() - y(), point.z() - z());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView cross(Vec vec)
|
||||
{
|
||||
//@formatter:off
|
||||
return VecView.make(
|
||||
y() * vec.z() - z() * vec.y(),
|
||||
z() * vec.x() - x() * vec.z(),
|
||||
x() * vec.y() - y() * vec.x());
|
||||
//@formatter:on
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double dot(Vec vec)
|
||||
{
|
||||
return x() * vec.x() + y() * vec.y() + z() * vec.z();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecMutable mutable()
|
||||
{
|
||||
return VecMutable.make(this);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView view()
|
||||
{
|
||||
if (view == null) view = new VecProxy(this);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
public abstract class AbstractVecProxy extends VecView {
|
||||
|
||||
/**
|
||||
* @return the proxied coord
|
||||
*/
|
||||
protected abstract Vec getSource();
|
||||
|
||||
|
||||
@Override
|
||||
public double x()
|
||||
{
|
||||
return processX(getSource().x());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double y()
|
||||
{
|
||||
return processY(getSource().y());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double z()
|
||||
{
|
||||
return processZ(getSource().z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process X before it's returned by x()
|
||||
*
|
||||
* @param x original X
|
||||
* @return output X
|
||||
*/
|
||||
protected double processX(double x)
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process Y before it's returned by y()
|
||||
*
|
||||
* @param y original Y
|
||||
* @return output Y
|
||||
*/
|
||||
protected double processY(double y)
|
||||
{
|
||||
return y;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process Z before it's returned by z()
|
||||
*
|
||||
* @param z original Z
|
||||
* @return output Z
|
||||
*/
|
||||
protected double processZ(double z)
|
||||
{
|
||||
return z;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,155 +0,0 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
import mightypork.gamecore.control.timing.Pauseable;
|
||||
import mightypork.gamecore.control.timing.Updateable;
|
||||
import mightypork.utils.math.animation.AnimDouble;
|
||||
import mightypork.utils.math.animation.Easing;
|
||||
|
||||
|
||||
/**
|
||||
* 3D coordinated with support for transitions, mutable.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class AnimCoord extends VecMutableImpl implements Pauseable, Updateable {
|
||||
|
||||
private final AnimDouble x, y, z;
|
||||
|
||||
|
||||
public AnimCoord(AnimDouble x, AnimDouble y, AnimDouble z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
|
||||
public AnimCoord(Vec start, Easing easing) {
|
||||
x = new AnimDouble(start.x(), easing);
|
||||
y = new AnimDouble(start.y(), easing);
|
||||
z = new AnimDouble(start.z(), easing);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double x()
|
||||
{
|
||||
return x.now();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double y()
|
||||
{
|
||||
return y.now();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double z()
|
||||
{
|
||||
return z.now();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public AnimCoord result(double x, double y, double z)
|
||||
{
|
||||
this.x.setTo(x);
|
||||
this.y.setTo(y);
|
||||
this.z.setTo(z);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public AnimCoord add(Vec offset, double speed)
|
||||
{
|
||||
animate(offset.x() - x(), offset.y() - y(), offset.z() - z(), speed);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public AnimCoord animate(double x, double y, double z, double duration)
|
||||
{
|
||||
this.x.animate(x, duration);
|
||||
this.y.animate(y, duration);
|
||||
this.z.animate(z, duration);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public AnimCoord animate(Vec target, double duration)
|
||||
{
|
||||
x.animate(target.x(), duration);
|
||||
y.animate(target.y(), duration);
|
||||
z.animate(target.z(), duration);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public void animateWithSpeed(Vec target, double unitsPerSecond)
|
||||
{
|
||||
final double dist = distTo(target);
|
||||
final double duration = dist / unitsPerSecond;
|
||||
animate(target, duration);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void update(double delta)
|
||||
{
|
||||
x.update(delta);
|
||||
y.update(delta);
|
||||
z.update(delta);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void pause()
|
||||
{
|
||||
x.pause();
|
||||
y.pause();
|
||||
z.pause();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void resume()
|
||||
{
|
||||
x.resume();
|
||||
y.resume();
|
||||
z.resume();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isPaused()
|
||||
{
|
||||
return x.isPaused(); // BUNO
|
||||
}
|
||||
|
||||
|
||||
public boolean isFinished()
|
||||
{
|
||||
return x.isFinished(); // BUNO
|
||||
}
|
||||
|
||||
|
||||
public double getDuration()
|
||||
{
|
||||
return x.getDuration(); // BUNO
|
||||
}
|
||||
|
||||
|
||||
public double getElapsed()
|
||||
{
|
||||
return x.getElapsed(); // BUNO
|
||||
}
|
||||
|
||||
|
||||
public double getProgress()
|
||||
{
|
||||
return x.getProgress(); // BUNO
|
||||
}
|
||||
}
|
||||
+12
-6
@@ -2,27 +2,26 @@ package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
/**
|
||||
* Coordinate with immutable numeric values.<br>
|
||||
* Operations yield a new {@link MutableCoord} with the result.
|
||||
* Coordinate with immutable numeric values.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class FixedCoord extends VecView {
|
||||
class ConstVec extends VecView {
|
||||
|
||||
private final double x, y, z;
|
||||
|
||||
|
||||
public FixedCoord(Vec other) {
|
||||
public ConstVec(Vec other) {
|
||||
this(other.x(), other.y(), other.z());
|
||||
}
|
||||
|
||||
|
||||
public FixedCoord(double x, double y) {
|
||||
public ConstVec(double x, double y) {
|
||||
this(x, y, 0);
|
||||
}
|
||||
|
||||
|
||||
public FixedCoord(double x, double y, double z) {
|
||||
public ConstVec(double x, double y, double z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
@@ -49,4 +48,11 @@ public class FixedCoord extends VecView {
|
||||
return z;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView value()
|
||||
{
|
||||
return this; // it's constant already
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* <b>[ Use Vec.view() method to make a proxy! ]</b>
|
||||
* </p>
|
||||
* <p>
|
||||
* View of another coordinate, immutable.<br>
|
||||
* Operations yield a new {@link MutableCoord} with the result.
|
||||
* </p>
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class CoordProxy extends VecView {
|
||||
|
||||
private final Vec observed;
|
||||
|
||||
|
||||
/**
|
||||
* Protected, in order to enforce the use of view() method on Vec, which
|
||||
* uses caching.
|
||||
*
|
||||
* @param observed
|
||||
*/
|
||||
public CoordProxy(Vec observed) {
|
||||
this.observed = observed;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public CoordProxy view()
|
||||
{
|
||||
return this; // no need to make another
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double x()
|
||||
{
|
||||
return observed.x();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double y()
|
||||
{
|
||||
return observed.y();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double z()
|
||||
{
|
||||
return observed.z();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
/**
|
||||
* Mutable coordinate.<br>
|
||||
* All Vec methods (except copy) alter data values and return this instance.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class MutableCoord extends VecMutableImpl {
|
||||
|
||||
private double x, y, z;
|
||||
|
||||
|
||||
/**
|
||||
* Zero coord
|
||||
*/
|
||||
public MutableCoord() {
|
||||
this(0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param copied other coord to vopy
|
||||
*/
|
||||
public MutableCoord(Vec copied) {
|
||||
this(copied.x(), copied.y(), copied.z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param x X coordinate
|
||||
* @param y Y coordinate
|
||||
*/
|
||||
public MutableCoord(double x, double y) {
|
||||
super();
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param x X coordinate
|
||||
* @param y Y coordinate
|
||||
* @param z Z coordinate
|
||||
*/
|
||||
public MutableCoord(double x, double y, double z) {
|
||||
super();
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double x()
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double y()
|
||||
{
|
||||
return y;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double z()
|
||||
{
|
||||
return z;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public MutableCoord result(double x, double y, double z)
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
||||
+4
-5
@@ -6,26 +6,25 @@ import mightypork.utils.math.constraints.NumberConstraint;
|
||||
|
||||
/**
|
||||
* Coord view composed of given {@link NumberConstraint}s, using their current
|
||||
* values.<br>
|
||||
* Operations yield a new {@link MutableCoord} with the result.
|
||||
* values.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class ConstraintCoord extends VecView {
|
||||
class NumConstrVec extends VecView {
|
||||
|
||||
private final NumberConstraint constrX;
|
||||
private final NumberConstraint constrY;
|
||||
private final NumberConstraint constrZ;
|
||||
|
||||
|
||||
public ConstraintCoord(NumberConstraint x, NumberConstraint y, NumberConstraint z) {
|
||||
public NumConstrVec(NumberConstraint x, NumberConstraint y, NumberConstraint z) {
|
||||
this.constrX = x;
|
||||
this.constrY = y;
|
||||
this.constrZ = z;
|
||||
}
|
||||
|
||||
|
||||
public ConstraintCoord(NumberConstraint x, NumberConstraint y) {
|
||||
public NumConstrVec(NumberConstraint x, NumberConstraint y) {
|
||||
this.constrX = x;
|
||||
this.constrY = y;
|
||||
this.constrZ = NumberConstraint.ZERO;
|
||||
@@ -1,25 +0,0 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
/**
|
||||
* 2D coord for anonymous implementations.<br>
|
||||
* Operations yield a new {@link MutableCoord} with the result.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class SynthCoord2D extends VecView {
|
||||
|
||||
@Override
|
||||
public abstract double x();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double y();
|
||||
|
||||
|
||||
@Override
|
||||
public double z()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
/**
|
||||
* 3D immutable coord for anonymous implementations.<br>
|
||||
* Operations yield a new {@link MutableCoord} with the result.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class SynthCoord3D extends VecView {
|
||||
|
||||
@Override
|
||||
public abstract double x();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double y();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double z();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
public class Synths {
|
||||
|
||||
private static abstract class HeteroSynth extends VecProxy {
|
||||
|
||||
public HeteroSynth(Vec observed) {
|
||||
super(observed);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected abstract double processX(double x);
|
||||
|
||||
|
||||
@Override
|
||||
protected abstract double processY(double y);
|
||||
|
||||
|
||||
@Override
|
||||
protected abstract double processZ(double z);
|
||||
}
|
||||
|
||||
private static abstract class UniformSynth extends VecProxy {
|
||||
|
||||
public UniformSynth(Vec observed) {
|
||||
super(observed);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double processX(double x)
|
||||
{
|
||||
return super.processX(x);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double processY(double y)
|
||||
{
|
||||
return super.processY(y);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double processZ(double z)
|
||||
{
|
||||
return super.processZ(z);
|
||||
}
|
||||
|
||||
|
||||
protected abstract double process(double a);
|
||||
}
|
||||
|
||||
public static class Round extends UniformSynth {
|
||||
|
||||
public Round(Vec observed) {
|
||||
super(observed);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double process(double a)
|
||||
{
|
||||
return Math.round(a);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Ceil extends UniformSynth {
|
||||
|
||||
public Ceil(Vec observed) {
|
||||
super(observed);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double process(double a)
|
||||
{
|
||||
return Math.ceil(a);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Floor extends UniformSynth {
|
||||
|
||||
public Floor(Vec observed) {
|
||||
super(observed);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double process(double a)
|
||||
{
|
||||
return Math.floor(a);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Neg extends UniformSynth {
|
||||
|
||||
public Neg(Vec observed) {
|
||||
super(observed);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double process(double a)
|
||||
{
|
||||
return -a;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Half extends UniformSynth {
|
||||
|
||||
public Half(Vec observed) {
|
||||
super(observed);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double process(double a)
|
||||
{
|
||||
return a / 2;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Norm extends HeteroSynth {
|
||||
|
||||
public Norm(Vec observed) {
|
||||
super(observed);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double processX(double x)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double processY(double y)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected double processZ(double z)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,8 @@ import mightypork.utils.math.constraints.VecConstraint;
|
||||
*/
|
||||
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);
|
||||
public static final VecView ZERO = new ConstVec(0, 0, 0);
|
||||
public static final VecView ONE = new ConstVec(0, 0, 0);
|
||||
|
||||
|
||||
/**
|
||||
@@ -52,24 +52,6 @@ public interface Vec extends VecConstraint {
|
||||
int zi();
|
||||
|
||||
|
||||
/**
|
||||
* @return X as float
|
||||
*/
|
||||
float xf();
|
||||
|
||||
|
||||
/**
|
||||
* @return Y as float
|
||||
*/
|
||||
float yf();
|
||||
|
||||
|
||||
/**
|
||||
* @return Z as float
|
||||
*/
|
||||
float zf();
|
||||
|
||||
|
||||
/**
|
||||
* @return X constraint
|
||||
*/
|
||||
@@ -92,18 +74,84 @@ public interface Vec extends VecConstraint {
|
||||
|
||||
|
||||
/**
|
||||
* Get a new mutable variable holding the current state
|
||||
* Get vector size
|
||||
*
|
||||
* @return a mutable copy
|
||||
* @return size
|
||||
*/
|
||||
VecMutable copy();
|
||||
double size();
|
||||
|
||||
|
||||
/**
|
||||
* Get immutable view at this vec
|
||||
* @return true if zero
|
||||
*/
|
||||
public boolean isZero();
|
||||
|
||||
|
||||
/**
|
||||
* Get distance to other point
|
||||
*
|
||||
* @param point other point
|
||||
* @return distance
|
||||
*/
|
||||
double distTo(Vec point);
|
||||
|
||||
|
||||
/**
|
||||
* Get middle of line to other point
|
||||
*
|
||||
* @param point other point
|
||||
* @return result
|
||||
*/
|
||||
VecView midTo(Vec point);
|
||||
|
||||
|
||||
/**
|
||||
* Create vector from this point to other point
|
||||
*
|
||||
* @param point second point
|
||||
* @return result
|
||||
*/
|
||||
public VecView vecTo(Vec point);
|
||||
|
||||
|
||||
/**
|
||||
* Get cross product (vector multiplication)
|
||||
*
|
||||
* @param vec other vector
|
||||
* @return result
|
||||
*/
|
||||
public VecView cross(Vec vec);
|
||||
|
||||
|
||||
/**
|
||||
* Get dot product (scalar multiplication)
|
||||
*
|
||||
* @param vec other vector
|
||||
* @return dot product
|
||||
*/
|
||||
public double dot(Vec vec);
|
||||
|
||||
|
||||
/**
|
||||
* Get a view at current state, not propagating further changes.
|
||||
*
|
||||
* @return a immutable copy
|
||||
*/
|
||||
VecView value();
|
||||
|
||||
|
||||
/**
|
||||
* Get immutable proxy view at this vec
|
||||
*
|
||||
* @return immutable view
|
||||
*/
|
||||
VecView view();
|
||||
|
||||
|
||||
/**
|
||||
* Get a mutable copy of current values.
|
||||
*
|
||||
* @return mutable copy
|
||||
*/
|
||||
VecMutable mutable();
|
||||
}
|
||||
|
||||
@@ -2,11 +2,29 @@ package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
/**
|
||||
* 3D coordinate methods
|
||||
* Implementation of coordinate methods
|
||||
*
|
||||
* @author MightyPork
|
||||
* @param <V> Return type of methods
|
||||
*/
|
||||
interface VecMath<V> extends Vec {
|
||||
abstract class VecMath<V extends Vec> extends AbstractVec {
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Some operation was performed and this result was obtained.
|
||||
* </p>
|
||||
* <p>
|
||||
* It's now up to implementing class what to do - mutable ones can alter
|
||||
* it's data values, immutable can return a new Vec.
|
||||
* </p>
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @param z
|
||||
* @return the result Vec
|
||||
*/
|
||||
public abstract V result(double x, double y, double z);
|
||||
|
||||
|
||||
/**
|
||||
* Set X coordinate (if immutable, in a copy).
|
||||
@@ -14,7 +32,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param x x coordinate
|
||||
* @return result
|
||||
*/
|
||||
V setX(double x);
|
||||
public V setX(double x)
|
||||
{
|
||||
return result(x, y(), z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -23,7 +44,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param y y coordinate
|
||||
* @return result
|
||||
*/
|
||||
V setY(double y);
|
||||
public V setY(double y)
|
||||
{
|
||||
return result(x(), y, z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -32,33 +56,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param z z coordinate
|
||||
* @return result
|
||||
*/
|
||||
V setZ(double z);
|
||||
|
||||
|
||||
/**
|
||||
* Get distance to other point
|
||||
*
|
||||
* @param point other point
|
||||
* @return distance
|
||||
*/
|
||||
double distTo(Vec point);
|
||||
|
||||
|
||||
/**
|
||||
* Get dot product (scalar multiplication)
|
||||
*
|
||||
* @param vec other vector
|
||||
* @return dot product
|
||||
*/
|
||||
double dot(Vec vec);
|
||||
|
||||
|
||||
/**
|
||||
* Get vector size
|
||||
*
|
||||
* @return size
|
||||
*/
|
||||
double size();
|
||||
public V setZ(double z)
|
||||
{
|
||||
return result(x(), y(), z);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -66,31 +67,10 @@ interface VecMath<V> extends Vec {
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
V abs();
|
||||
|
||||
|
||||
/**
|
||||
* @return true if zero
|
||||
*/
|
||||
boolean isZero();
|
||||
|
||||
|
||||
/**
|
||||
* Create vector from this point to other point
|
||||
*
|
||||
* @param point second point
|
||||
* @return result
|
||||
*/
|
||||
V vecTo(Vec point);
|
||||
|
||||
|
||||
/**
|
||||
* Get middle of line to other point
|
||||
*
|
||||
* @param point other point
|
||||
* @return result
|
||||
*/
|
||||
V midTo(Vec point);
|
||||
public V abs()
|
||||
{
|
||||
return result(Math.abs(x()), Math.abs(y()), Math.abs(z()));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -99,7 +79,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param vec offset
|
||||
* @return result
|
||||
*/
|
||||
V add(Vec vec);
|
||||
public V add(Vec vec)
|
||||
{
|
||||
return add(vec.x(), vec.y(), vec.z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -110,7 +93,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param y y offset
|
||||
* @return result
|
||||
*/
|
||||
V add(double x, double y);
|
||||
public V add(double x, double y)
|
||||
{
|
||||
return add(x, y, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -121,7 +107,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param z z offset
|
||||
* @return result
|
||||
*/
|
||||
V add(double x, double y, double z);
|
||||
public V add(double x, double y, double z)
|
||||
{
|
||||
return result(x() + x, y() + y, z() + z);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -129,7 +118,10 @@ interface VecMath<V> extends Vec {
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
V half();
|
||||
public V half()
|
||||
{
|
||||
return mul(0.5);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -138,7 +130,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param d multiplier
|
||||
* @return result
|
||||
*/
|
||||
V mul(double d);
|
||||
public V mul(double d)
|
||||
{
|
||||
return mul(d, d, d);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -147,7 +142,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param vec vector of multipliers
|
||||
* @return result
|
||||
*/
|
||||
V mul(Vec vec);
|
||||
public V mul(Vec vec)
|
||||
{
|
||||
return mul(vec.x(), vec.y(), vec.z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -158,7 +156,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param y y multiplier
|
||||
* @return result
|
||||
*/
|
||||
V mul(double x, double y);
|
||||
public V mul(double x, double y)
|
||||
{
|
||||
return mul(x, y, 1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -169,7 +170,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param z z multiplier
|
||||
* @return result
|
||||
*/
|
||||
V mul(double x, double y, double z);
|
||||
public V mul(double x, double y, double z)
|
||||
{
|
||||
return result(x() * x, y() * y, z() * z);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -177,7 +181,10 @@ interface VecMath<V> extends Vec {
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
V round();
|
||||
public V round()
|
||||
{
|
||||
return result(Math.round(x()), Math.round(y()), Math.round(z()));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -185,7 +192,10 @@ interface VecMath<V> extends Vec {
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
V floor();
|
||||
public V floor()
|
||||
{
|
||||
return result(Math.floor(x()), Math.floor(y()), Math.floor(z()));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -193,7 +203,10 @@ interface VecMath<V> extends Vec {
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
V ceil();
|
||||
public V ceil()
|
||||
{
|
||||
return result(Math.ceil(x()), Math.ceil(y()), Math.ceil(z()));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -202,7 +215,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param vec offset
|
||||
* @return result
|
||||
*/
|
||||
V sub(Vec vec);
|
||||
public V sub(Vec vec)
|
||||
{
|
||||
return sub(vec.x(), vec.y(), vec.z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -213,7 +229,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param y y offset
|
||||
* @return result
|
||||
*/
|
||||
V sub(double x, double y);
|
||||
public V sub(double x, double y)
|
||||
{
|
||||
return sub(x, y, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -224,7 +243,10 @@ interface VecMath<V> extends Vec {
|
||||
* @param z z offset
|
||||
* @return result
|
||||
*/
|
||||
V sub(double x, double y, double z);
|
||||
public V sub(double x, double y, double z)
|
||||
{
|
||||
return result(x() - x, y() - y, z() - z);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -232,7 +254,10 @@ interface VecMath<V> extends Vec {
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
V neg();
|
||||
public V neg()
|
||||
{
|
||||
return result(-x(), -y(), -z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -241,15 +266,43 @@ interface VecMath<V> extends Vec {
|
||||
* @param size size we need
|
||||
* @return result
|
||||
*/
|
||||
V norm(double size);
|
||||
public V norm(double size)
|
||||
{
|
||||
if (isZero()) return result(x(), y(), z()); // can't norm zero vector
|
||||
|
||||
final double k = size / size();
|
||||
|
||||
return mul(k);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get cross product (vector multiplication)
|
||||
*
|
||||
* @param vec other vector
|
||||
* @return result
|
||||
*/
|
||||
V cross(Vec vec);
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + Double.valueOf(x()).hashCode();
|
||||
result = prime * result + Double.valueOf(y()).hashCode();
|
||||
result = prime * result + Double.valueOf(z()).hashCode();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
if (this == obj) return true;
|
||||
if (obj == null) return false;
|
||||
if (!(obj instanceof Vec)) return false;
|
||||
final Vec other = (Vec) obj;
|
||||
|
||||
return x() == other.x() && y() == other.y() && z() == other.z();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return String.format("(%.1f %.1f %.1f)", x(), y(), z());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,398 +0,0 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
import mightypork.utils.math.constraints.NumberConstraint;
|
||||
|
||||
|
||||
/**
|
||||
* Implementation of coordinate methods
|
||||
*
|
||||
* @author MightyPork
|
||||
* @param <V> Return type of methods
|
||||
*/
|
||||
abstract class VecMathImpl<V> implements VecMath<V> {
|
||||
|
||||
private NumberConstraint constraintZ, constraintY, constraintX;
|
||||
|
||||
private CoordProxy view = null;
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double x();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double y();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double z();
|
||||
|
||||
|
||||
@Override
|
||||
public int xi()
|
||||
{
|
||||
return (int) Math.round(x());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int yi()
|
||||
{
|
||||
return (int) Math.round(y());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int zi()
|
||||
{
|
||||
return (int) Math.round(z());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public float xf()
|
||||
{
|
||||
return (float) x();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public float yf()
|
||||
{
|
||||
return (float) y();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public float zf()
|
||||
{
|
||||
return (float) z();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getVec()
|
||||
{
|
||||
return this.view();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Some operation was performed and this result was obtained.
|
||||
* </p>
|
||||
* <p>
|
||||
* It's now up to implementing class what to do - mutable ones can alter
|
||||
* it's data values, immutable can return a new Vec.
|
||||
* </p>
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @param z
|
||||
* @return the result Vec
|
||||
*/
|
||||
public abstract V result(double x, double y, double z);
|
||||
|
||||
|
||||
@Override
|
||||
public VecMutable copy()
|
||||
{
|
||||
return new MutableCoord(this);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView view()
|
||||
{
|
||||
if (view == null) view = new CoordProxy(this);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NumberConstraint xc()
|
||||
{
|
||||
if (constraintX == null) constraintX = new NumberConstraint() {
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
{
|
||||
return x();
|
||||
}
|
||||
};
|
||||
|
||||
return constraintX;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NumberConstraint yc()
|
||||
{
|
||||
if (constraintY == null) constraintY = new NumberConstraint() {
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
{
|
||||
return y();
|
||||
}
|
||||
};
|
||||
|
||||
return constraintY;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NumberConstraint zc()
|
||||
{
|
||||
if (constraintZ == null) constraintZ = new NumberConstraint() {
|
||||
|
||||
@Override
|
||||
public double getValue()
|
||||
{
|
||||
return z();
|
||||
}
|
||||
};
|
||||
|
||||
return constraintZ;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V setX(double x)
|
||||
{
|
||||
return result(x, y(), z());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V setY(double y)
|
||||
{
|
||||
return result(x(), y, z());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V setZ(double z)
|
||||
{
|
||||
return result(x(), y(), z);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double size()
|
||||
{
|
||||
final double x = x(), y = y(), z = z();
|
||||
return Math.sqrt(x * x + y * y + z * z);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isZero()
|
||||
{
|
||||
return x() == 0 && y() == 0 && z() == 0;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V abs()
|
||||
{
|
||||
return result(Math.abs(x()), Math.abs(y()), Math.abs(z()));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V add(Vec vec)
|
||||
{
|
||||
return add(vec.x(), vec.y(), vec.z());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V add(double x, double y)
|
||||
{
|
||||
return add(x, y, 0);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V add(double x, double y, double z)
|
||||
{
|
||||
return result(x() + x, y() + y, z() + z);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double distTo(Vec point)
|
||||
{
|
||||
final double dx = x() - point.x();
|
||||
final double dy = y() - point.y();
|
||||
final double dz = z() - point.z();
|
||||
|
||||
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V midTo(Vec point)
|
||||
{
|
||||
final double dx = (point.x() - x()) * 0.5;
|
||||
final double dy = (point.y() - y()) * 0.5;
|
||||
final double dz = (point.z() - z()) * 0.5;
|
||||
|
||||
return result(dx, dy, dz);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V half()
|
||||
{
|
||||
return mul(0.5);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V mul(double d)
|
||||
{
|
||||
return mul(d, d, d);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V mul(Vec vec)
|
||||
{
|
||||
return mul(vec.x(), vec.y(), vec.z());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V mul(double x, double y)
|
||||
{
|
||||
return mul(x, y, 1);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V mul(double x, double y, double z)
|
||||
{
|
||||
return result(x() * x, y() * y, z() * z);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V round()
|
||||
{
|
||||
return result(Math.round(x()), Math.round(y()), Math.round(z()));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V floor()
|
||||
{
|
||||
return result(Math.floor(x()), Math.floor(y()), Math.floor(z()));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V ceil()
|
||||
{
|
||||
return result(Math.ceil(x()), Math.ceil(y()), Math.ceil(z()));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V sub(Vec vec)
|
||||
{
|
||||
return sub(vec.x(), vec.y(), vec.z());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V sub(double x, double y)
|
||||
{
|
||||
return sub(x, y, 0);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V sub(double x, double y, double z)
|
||||
{
|
||||
return result(x() - x, y() - y, z() - z);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V vecTo(Vec point)
|
||||
{
|
||||
return result(point.x() - x(), point.y() - y(), point.z() - z());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V cross(Vec vec)
|
||||
{
|
||||
//@formatter:off
|
||||
return result(
|
||||
y() * vec.z() - z() * vec.y(),
|
||||
z() * vec.x() - x() * vec.z(),
|
||||
x() * vec.y() - y() * vec.x());
|
||||
//@formatter:on
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double dot(Vec vec)
|
||||
{
|
||||
return x() * vec.x() + y() * vec.y() + z() * vec.z();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V neg()
|
||||
{
|
||||
return result(-x(), -y(), -z());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public V norm(double size)
|
||||
{
|
||||
if (isZero()) return result(x(), y(), z()); // can't norm zero vector
|
||||
|
||||
final double k = size / size();
|
||||
|
||||
return mul(k);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + Double.valueOf(x()).hashCode();
|
||||
result = prime * result + Double.valueOf(y()).hashCode();
|
||||
result = prime * result + Double.valueOf(z()).hashCode();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
if (this == obj) return true;
|
||||
if (obj == null) return false;
|
||||
if (!(obj instanceof Vec)) return false;
|
||||
final Vec other = (Vec) obj;
|
||||
|
||||
return x() == other.x() && y() == other.y() && z() == other.z();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return String.format("(%.1f %.1f %.1f)", x(), y(), z());
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,139 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
import mightypork.utils.math.animation.AnimDouble;
|
||||
import mightypork.utils.math.animation.Easing;
|
||||
|
||||
|
||||
/**
|
||||
* Mutable coord
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface VecMutable extends VecMath<VecMutable> {
|
||||
public abstract class VecMutable extends VecMath<VecMutable> {
|
||||
|
||||
/**
|
||||
* Get a variable initialized as zero (0,0,0)
|
||||
*
|
||||
* @return new mutable vector
|
||||
*/
|
||||
public static VecMutable zero()
|
||||
{
|
||||
return make(ZERO);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a variable initialized as one (1,1,1)
|
||||
*
|
||||
* @return one mutable vector
|
||||
*/
|
||||
public static VecMutable one()
|
||||
{
|
||||
return make(ONE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make new from coords
|
||||
*
|
||||
* @param x X coordinate
|
||||
* @param y Y coordinate
|
||||
* @return mutable vector
|
||||
*/
|
||||
public static VecMutable make(double x, double y)
|
||||
{
|
||||
return make(x, y, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make new as copy of another
|
||||
*
|
||||
* @param copied copied vec
|
||||
* @return mutable vector
|
||||
*/
|
||||
public static VecMutable make(Vec copied)
|
||||
{
|
||||
return make(copied.x(), copied.y(), copied.z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make new from coords
|
||||
*
|
||||
* @param x X coordinate
|
||||
* @param y Y coordinate
|
||||
* @param z Z coordinate
|
||||
* @return mutable vector
|
||||
*/
|
||||
public static VecMutable make(double x, double y, double z)
|
||||
{
|
||||
return new VecMutableImpl(x, y, z);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create an animated vector; This way different easing / settings can be
|
||||
* specified for each coordinate.
|
||||
*
|
||||
* @param animX x animator
|
||||
* @param animY y animator
|
||||
* @param animZ z animator
|
||||
* @return animated mutable vector
|
||||
*/
|
||||
public static VecMutableAnim makeAnim(AnimDouble animX, AnimDouble animY, AnimDouble animZ)
|
||||
{
|
||||
return new VecMutableAnim(animX, animY, animZ);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create an animated vector
|
||||
*
|
||||
* @param animStart initial positioon
|
||||
* @param easing animation easing
|
||||
* @return animated mutable vector
|
||||
*/
|
||||
public static VecMutableAnim makeAnim(Vec animStart, Easing easing)
|
||||
{
|
||||
return new VecMutableAnim(animStart, easing);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create an animated vector, initialized at 0,0,0
|
||||
*
|
||||
* @param easing animation easing
|
||||
* @return animated mutable vector
|
||||
*/
|
||||
public static VecMutableAnim makeAnim(Easing easing)
|
||||
{
|
||||
return new VecMutableAnim(Vec.ZERO, easing);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public abstract VecMutable result(double x, double y, double z);
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double x();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double y();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double z();
|
||||
|
||||
|
||||
public VecMutable reset()
|
||||
{
|
||||
return result(0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set coordinates to match other coord.
|
||||
@@ -14,7 +141,10 @@ public interface VecMutable extends VecMath<VecMutable> {
|
||||
* @param copied coord whose coordinates are used
|
||||
* @return result
|
||||
*/
|
||||
VecMutable setTo(Vec copied);
|
||||
public VecMutable setTo(Vec copied)
|
||||
{
|
||||
return result(copied.x(), copied.y(), copied.z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -25,7 +155,10 @@ public interface VecMutable extends VecMath<VecMutable> {
|
||||
* @param y y coordinate
|
||||
* @return result
|
||||
*/
|
||||
VecMutable setTo(double x, double y);
|
||||
public VecMutable setTo(double x, double y)
|
||||
{
|
||||
return result(x, y, z());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -36,5 +169,8 @@ public interface VecMutable extends VecMath<VecMutable> {
|
||||
* @param z z coordinate
|
||||
* @return result
|
||||
*/
|
||||
VecMutable setTo(double x, double y, double z);
|
||||
public VecMutable setTo(double x, double y, double z)
|
||||
{
|
||||
return result(x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,192 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
import mightypork.gamecore.control.timing.Pauseable;
|
||||
import mightypork.gamecore.control.timing.Updateable;
|
||||
import mightypork.utils.math.animation.AnimDouble;
|
||||
import mightypork.utils.math.animation.Easing;
|
||||
|
||||
|
||||
/**
|
||||
* 3D coordinated with support for transitions, mutable.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class VecMutableAnim extends VecMutable implements Pauseable, Updateable {
|
||||
|
||||
private final AnimDouble x, y, z;
|
||||
private double defaultDuration = 0;
|
||||
|
||||
|
||||
VecMutableAnim(AnimDouble x, AnimDouble y, AnimDouble z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
|
||||
VecMutableAnim(Vec start, Easing easing) {
|
||||
x = new AnimDouble(start.x(), easing);
|
||||
y = new AnimDouble(start.y(), easing);
|
||||
z = new AnimDouble(start.z(), easing);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double x()
|
||||
{
|
||||
return x.now();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double y()
|
||||
{
|
||||
return y.now();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double z()
|
||||
{
|
||||
return z.now();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return the default duration (seconds)
|
||||
*/
|
||||
public double getDefaultDuration()
|
||||
{
|
||||
return defaultDuration;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set default animation duration (when changed without using animate())
|
||||
*
|
||||
* @param defaultDuration default duration (seconds)
|
||||
*/
|
||||
public void setDefaultDuration(double defaultDuration)
|
||||
{
|
||||
this.defaultDuration = defaultDuration;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecMutableAnim result(double x, double y, double z)
|
||||
{
|
||||
this.x.animate(x, defaultDuration);
|
||||
this.y.animate(y, defaultDuration);
|
||||
this.z.animate(z, defaultDuration);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public VecMutableAnim add(Vec offset, double speed)
|
||||
{
|
||||
animate(view().add(offset), speed);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public VecMutableAnim animate(double x, double y, double z, double duration)
|
||||
{
|
||||
this.x.animate(x, duration);
|
||||
this.y.animate(y, duration);
|
||||
this.z.animate(z, duration);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public VecMutableAnim animate(Vec target, double duration)
|
||||
{
|
||||
animate(target.x(), target.y(), target.z(), duration);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void update(double delta)
|
||||
{
|
||||
x.update(delta);
|
||||
y.update(delta);
|
||||
z.update(delta);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void pause()
|
||||
{
|
||||
x.pause();
|
||||
y.pause();
|
||||
z.pause();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void resume()
|
||||
{
|
||||
x.resume();
|
||||
y.resume();
|
||||
z.resume();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isPaused()
|
||||
{
|
||||
return x.isPaused(); // BÚNO
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return true if the animation is finished
|
||||
*/
|
||||
public boolean isFinished()
|
||||
{
|
||||
return x.isFinished(); // BÚNO
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return current animation duration
|
||||
*/
|
||||
public double getDuration()
|
||||
{
|
||||
return x.getDuration(); // BÚNO
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return elapsed time since the start of the animation
|
||||
*/
|
||||
public double getElapsed()
|
||||
{
|
||||
return x.getElapsed(); // BÚNO
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return animation progress (elapsed / duration)
|
||||
*/
|
||||
public double getProgress()
|
||||
{
|
||||
return x.getProgress(); // BÚNO
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set easing for all three coordinates
|
||||
*
|
||||
* @param easing
|
||||
*/
|
||||
public void setEasing(Easing easing)
|
||||
{
|
||||
x.setEasing(easing);
|
||||
y.setEasing(easing);
|
||||
z.setEasing(easing);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,45 +2,57 @@ package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
/**
|
||||
* Mutable vec default implementation
|
||||
* Mutable coordinate.<br>
|
||||
* All Vec methods (except copy) alter data values and return this instance.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
abstract class VecMutableImpl extends VecMathImpl<VecMutable> implements VecMutable {
|
||||
class VecMutableImpl extends VecMutable {
|
||||
|
||||
@Override
|
||||
public abstract double x();
|
||||
private double x, y, z;
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double y();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double z();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract VecMutable result(double x, double y, double z);
|
||||
|
||||
|
||||
@Override
|
||||
public VecMutable setTo(Vec copied)
|
||||
{
|
||||
return result(copied.x(), copied.y(), copied.z());
|
||||
/**
|
||||
* @param x X coordinate
|
||||
* @param y Y coordinate
|
||||
* @param z Z coordinate
|
||||
*/
|
||||
public VecMutableImpl(double x, double y, double z) {
|
||||
super();
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecMutable setTo(double x, double y, double z)
|
||||
public double x()
|
||||
{
|
||||
return result(x, y, z);
|
||||
return x;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecMutable setTo(double x, double y)
|
||||
public double y()
|
||||
{
|
||||
return result(x, y, z());
|
||||
return y;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double z()
|
||||
{
|
||||
return z;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecMutableImpl result(double x, double y, double z)
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
/**
|
||||
* View of another coordinate, immutable.<br>
|
||||
* GetVec()
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
class VecProxy extends AbstractVecProxy {
|
||||
|
||||
final Vec observed;
|
||||
|
||||
|
||||
/**
|
||||
* Protected, in order to enforce the use of view() method on Vec, which
|
||||
* uses caching.
|
||||
*
|
||||
* @param observed
|
||||
*/
|
||||
public VecProxy(Vec observed) {
|
||||
this.observed = observed;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected Vec getSource()
|
||||
{
|
||||
return observed;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,24 +1,177 @@
|
||||
package mightypork.utils.math.coord;
|
||||
|
||||
|
||||
import mightypork.gamecore.control.interf.DefaultImpl;
|
||||
import mightypork.utils.math.constraints.NumberConstraint;
|
||||
|
||||
|
||||
/**
|
||||
* Read-only coordinate, operations with it will yield a new
|
||||
* {@link MutableCoord} with the result.
|
||||
* Read-only coordinate.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class VecView extends VecMathImpl<VecView> {
|
||||
public abstract class VecView extends VecMath<VecView> {
|
||||
|
||||
/**
|
||||
* Get a zero (0,0,0) constant
|
||||
*
|
||||
* @return new constant vec
|
||||
*/
|
||||
public static VecView zero()
|
||||
{
|
||||
return ZERO.view();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a one (1,1,1) constant
|
||||
*
|
||||
* @return one constant
|
||||
*/
|
||||
public static VecView one()
|
||||
{
|
||||
return ONE.view();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a constant vector
|
||||
*
|
||||
* @param x X value
|
||||
* @param y Y value
|
||||
* @return new constant vec
|
||||
*/
|
||||
public static VecView make(double x, double y)
|
||||
{
|
||||
return new ConstVec(x, y);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a constant vector
|
||||
*
|
||||
* @param x X value
|
||||
* @param y Y value
|
||||
* @param z Z value
|
||||
* @return new constant vector
|
||||
*/
|
||||
public static VecView make(double x, double y, double z)
|
||||
{
|
||||
return new ConstVec(x, y, z);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a view at number constraints, reflecting their future changes.
|
||||
*
|
||||
* @param x X value
|
||||
* @param y Y value
|
||||
* @return view at the values
|
||||
*/
|
||||
public static VecView make(NumberConstraint x, NumberConstraint y)
|
||||
{
|
||||
return new NumConstrVec(x, y);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make a view at number constraints, reflecting their future changes.
|
||||
*
|
||||
* @param x X value
|
||||
* @param y Y value
|
||||
* @param z Z value
|
||||
* @return view at the values
|
||||
*/
|
||||
public static VecView make(NumberConstraint x, NumberConstraint y, NumberConstraint z)
|
||||
{
|
||||
return new NumConstrVec(x, y, z);
|
||||
}
|
||||
|
||||
// synth views
|
||||
private VecView view_round;
|
||||
private VecView view_floor;
|
||||
private VecView view_ceil;
|
||||
private VecView view_neg;
|
||||
private VecView view_half;
|
||||
|
||||
|
||||
@Override
|
||||
public VecView result(double x, double y, double z)
|
||||
{
|
||||
return new FixedCoord(x, y, z);
|
||||
return new ConstVec(x, y, z);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Deprecated
|
||||
public VecView view()
|
||||
{
|
||||
return this; // already not mutable
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double x();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract double y();
|
||||
|
||||
|
||||
@Override
|
||||
@DefaultImpl
|
||||
public double z()
|
||||
{
|
||||
return 0; // implemented for ease with 2D anonymous subtypes
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView round()
|
||||
{
|
||||
// lazy init
|
||||
if (view_round == null) view_round = new Synths.Round(this);
|
||||
|
||||
return view_round;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView floor()
|
||||
{
|
||||
// lazy init
|
||||
if (view_floor == null) view_floor = new Synths.Floor(this);
|
||||
|
||||
return view_floor;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView ceil()
|
||||
{
|
||||
// lazy init
|
||||
if (view_ceil == null) view_ceil = new Synths.Ceil(this);
|
||||
|
||||
return view_ceil;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView half()
|
||||
{
|
||||
// lazy init
|
||||
if (view_half == null) view_half = new Synths.Half(this);
|
||||
|
||||
return view_half;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView neg()
|
||||
{
|
||||
// lazy init
|
||||
if (view_neg == null) view_neg = new Synths.Neg(this);
|
||||
|
||||
return view_neg;
|
||||
}
|
||||
}
|
||||
|
||||
+44
-57
@@ -7,53 +7,62 @@ import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
public abstract class RectImpl<T extends Rect> implements RectMath<T> {
|
||||
/**
|
||||
* Abstract {@link Rect}, implementing all but the data getters
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class AbstractRect implements Rect {
|
||||
|
||||
private VecConstraint tl, tc, tr, cl, c, cr, bl, bc, br;
|
||||
private VecConstraint tl;
|
||||
private VecConstraint tc;
|
||||
private VecConstraint tr;
|
||||
private VecConstraint cl;
|
||||
private VecConstraint c;
|
||||
private VecConstraint cr;
|
||||
private VecConstraint bl;
|
||||
private VecConstraint bc;
|
||||
private VecConstraint br;
|
||||
|
||||
|
||||
@Override
|
||||
public RectView getRect()
|
||||
public final RectValue getRect()
|
||||
{
|
||||
return this.view();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public abstract VecView getOrigin();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract VecView getSize();
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getTopLeft()
|
||||
public final VecView getTopLeft()
|
||||
{
|
||||
// lazy init
|
||||
if (tl == null) tl = cTopLeft(this);
|
||||
return tl.getVec();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getTopCenter()
|
||||
public final VecView getTopCenter()
|
||||
{
|
||||
// lazy init
|
||||
if (tc == null) tc = cTopCenter(this);
|
||||
return tc.getVec();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getTopRight()
|
||||
public final VecView getTopRight()
|
||||
{
|
||||
// lazy init
|
||||
if (tr == null) tr = cTopRight(this);
|
||||
return tr.getVec();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getCenterLeft()
|
||||
public final VecView getCenterLeft()
|
||||
{
|
||||
// lazy init
|
||||
if (cl == null) cl = cCenterLeft(this);
|
||||
return cl.getVec();
|
||||
}
|
||||
@@ -62,38 +71,43 @@ public abstract class RectImpl<T extends Rect> implements RectMath<T> {
|
||||
@Override
|
||||
public final VecView getCenter()
|
||||
{
|
||||
// lazy init
|
||||
if (c == null) c = cCenter(this);
|
||||
return c.getVec();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getCenterRight()
|
||||
public final VecView getCenterRight()
|
||||
{
|
||||
// lazy init
|
||||
if (cr == null) cr = cCenterRight(this);
|
||||
return cr.getVec();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getBottomLeft()
|
||||
public final VecView getBottomLeft()
|
||||
{
|
||||
// lazy init
|
||||
if (bl == null) bl = cBottomLeft(this);
|
||||
return bl.getVec();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getBottomCenter()
|
||||
public final VecView getBottomCenter()
|
||||
{
|
||||
// lazy init
|
||||
if (bc == null) bc = cBottomCenter(this);
|
||||
return bc.getVec();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getBottomRight()
|
||||
public final VecView getBottomRight()
|
||||
{
|
||||
// lazy init
|
||||
if (br == null) br = cBottomRight(this);
|
||||
return br.getVec();
|
||||
}
|
||||
@@ -142,51 +156,23 @@ public abstract class RectImpl<T extends Rect> implements RectMath<T> {
|
||||
|
||||
|
||||
@Override
|
||||
public final T move(Vec move)
|
||||
{
|
||||
return move(move.x(), move.y());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public final T shrink(Vec shrink)
|
||||
{
|
||||
return shrink(shrink.x(), shrink.y());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public final T shrink(double x, double y)
|
||||
{
|
||||
return shrink(x, x, y, y);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public final T grow(Vec grow)
|
||||
{
|
||||
return grow(grow.x(), grow.y());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public final T grow(double x, double y)
|
||||
{
|
||||
return grow(x, x, y, y);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectView view()
|
||||
public RectValue view()
|
||||
{
|
||||
return new RectProxy(this);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectMutable copy()
|
||||
public final RectMutable mutable()
|
||||
{
|
||||
return new MutableRect(this);
|
||||
return RectMutable.make(this);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectValue value()
|
||||
{
|
||||
return RectValue.make(getOrigin(), getSize());
|
||||
}
|
||||
|
||||
|
||||
@@ -210,4 +196,5 @@ public abstract class RectImpl<T extends Rect> implements RectMath<T> {
|
||||
{
|
||||
return String.format("Rect { %s - %s }", getOrigin().toString(), getOrigin().add(getSize()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package mightypork.utils.math.rect;
|
||||
|
||||
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
class ConstRect extends RectValue {
|
||||
|
||||
private final VecView pos;
|
||||
private final VecView size;
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @param width
|
||||
* @param height
|
||||
*/
|
||||
public ConstRect(double x, double y, double width, double height) {
|
||||
pos = VecView.make(x, y);
|
||||
size = VecView.make(Math.abs(width), Math.abs(height));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ConstRect value()
|
||||
{
|
||||
return this; // nothing can change.
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getOrigin()
|
||||
{
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getSize()
|
||||
{
|
||||
return size;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
package mightypork.utils.math.rect;
|
||||
|
||||
|
||||
import mightypork.utils.math.coord.FixedCoord;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
public class FixedRect extends RectView {
|
||||
|
||||
private final VecView pos;
|
||||
private final VecView size;
|
||||
|
||||
|
||||
/**
|
||||
* Create at 0,0 with zero size
|
||||
*/
|
||||
public FixedRect() {
|
||||
pos = Vec.ZERO;
|
||||
size = Vec.ZERO;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at 0,0 with given size
|
||||
*
|
||||
* @param width
|
||||
* @param height
|
||||
*/
|
||||
public FixedRect(double width, double height) {
|
||||
this(0, 0, width, height);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param origin
|
||||
* @param width
|
||||
* @param height
|
||||
*/
|
||||
public FixedRect(Vec origin, double width, double height) {
|
||||
this(origin.x(), origin.y(), width, height);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at 0,0 with given size.
|
||||
*
|
||||
* @param size
|
||||
*/
|
||||
public FixedRect(Vec size) {
|
||||
this(0, 0, size.x(), size.y());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param origin
|
||||
* @param size
|
||||
*/
|
||||
public FixedRect(Vec origin, Vec size) {
|
||||
this(origin.x(), origin.y(), size.x(), size.y());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @param width
|
||||
* @param height
|
||||
*/
|
||||
public FixedRect(double x, double y, double width, double height) {
|
||||
pos = new FixedCoord(x, y);
|
||||
size = new FixedCoord(Math.abs(width), Math.abs(height));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create as copy of another
|
||||
*
|
||||
* @param other copied
|
||||
*/
|
||||
public FixedRect(Rect other) {
|
||||
this(other.getOrigin(), other.getSize());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getOrigin()
|
||||
{
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getSize()
|
||||
{
|
||||
return size;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,233 +0,0 @@
|
||||
package mightypork.utils.math.rect;
|
||||
|
||||
|
||||
import mightypork.utils.math.coord.MutableCoord;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecMutable;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
public class MutableRect extends RectImpl<RectMutable> implements RectMutable {
|
||||
|
||||
private final VecMutable pos = new MutableCoord();
|
||||
private final VecMutable size = new MutableCoord();
|
||||
|
||||
|
||||
/**
|
||||
* Create at 0,0 with zero size
|
||||
*/
|
||||
public MutableRect() {
|
||||
// keep default zeros
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at 0,0 with given size
|
||||
*
|
||||
* @param width
|
||||
* @param height
|
||||
*/
|
||||
public MutableRect(double width, double height) {
|
||||
this.pos.setTo(0, 0);
|
||||
this.size.setTo(width, height).abs();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param origin
|
||||
* @param width
|
||||
* @param height
|
||||
*/
|
||||
public MutableRect(Vec origin, double width, double height) {
|
||||
this.pos.setTo(origin);
|
||||
this.size.setTo(width, height).abs();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at 0,0 with given size.
|
||||
*
|
||||
* @param size
|
||||
*/
|
||||
public MutableRect(Vec size) {
|
||||
this(0, 0, size.x(), size.y());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param origin
|
||||
* @param size
|
||||
*/
|
||||
public MutableRect(Vec origin, Vec size) {
|
||||
this.pos.setTo(origin);
|
||||
this.size.setTo(size).abs();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @param width
|
||||
* @param height
|
||||
*/
|
||||
public MutableRect(double x, double y, double width, double height) {
|
||||
pos.setTo(x, y);
|
||||
size.setTo(width, height).abs();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create as copy of another
|
||||
*
|
||||
* @param other copied
|
||||
*/
|
||||
public MutableRect(Rect other) {
|
||||
this(other.getOrigin(), other.getSize());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set to other rect's coordinates
|
||||
*
|
||||
* @param rect other rect
|
||||
*/
|
||||
@Override
|
||||
public void setTo(Rect rect)
|
||||
{
|
||||
setTo(rect.getOrigin(), rect.getSize());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setTo(Vec origin, Vec size)
|
||||
{
|
||||
this.pos.setTo(origin);
|
||||
this.size.setTo(size).abs();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setTo(Vec origin, double width, double height)
|
||||
{
|
||||
this.pos.setTo(origin);
|
||||
this.size.setTo(width, height).abs();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setOrigin(Vec origin)
|
||||
{
|
||||
this.pos.setTo(origin);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setSize(Vec size)
|
||||
{
|
||||
this.size.setTo(size).abs();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add X and Y to origin
|
||||
*
|
||||
* @param x x to add
|
||||
* @param y y to add
|
||||
* @return result
|
||||
*/
|
||||
@Override
|
||||
public RectMutable move(double x, double y)
|
||||
{
|
||||
pos.add(x, y);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a copy
|
||||
*
|
||||
* @return copy
|
||||
*/
|
||||
@Override
|
||||
public RectMutable copy()
|
||||
{
|
||||
return new MutableRect(this);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Shrink the rect
|
||||
*
|
||||
* @param left shrink
|
||||
* @param right shrink
|
||||
* @param top shrink
|
||||
* @param bottom shrink
|
||||
* @return result
|
||||
*/
|
||||
@Override
|
||||
public RectMutable shrink(double left, double right, double top, double bottom)
|
||||
{
|
||||
pos.add(left, top);
|
||||
size.sub(left + right, top + bottom).abs();
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Grow the rect
|
||||
*
|
||||
* @param left growth
|
||||
* @param right growth
|
||||
* @param top growth
|
||||
* @param bottom growth
|
||||
* @return result
|
||||
*/
|
||||
@Override
|
||||
public RectMutable grow(double left, double right, double top, double bottom)
|
||||
{
|
||||
pos.sub(left, top);
|
||||
size.add(left + right, top + bottom).abs();
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Round coords
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
@Override
|
||||
public RectMutable round()
|
||||
{
|
||||
pos.round();
|
||||
size.round();
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getOrigin()
|
||||
{
|
||||
return pos.view();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getSize()
|
||||
{
|
||||
return size.view();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectView view()
|
||||
{
|
||||
return new FixedRect(this);
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package mightypork.utils.math.rect;
|
||||
|
||||
|
||||
import mightypork.utils.math.constraints.RectConstraint;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
@@ -12,8 +13,8 @@ import mightypork.utils.math.coord.VecView;
|
||||
*/
|
||||
public interface Rect extends RectConstraint {
|
||||
|
||||
RectView ONE = new FixedRect(0, 0, 1, 1);
|
||||
RectView ZERO = new FixedRect(0, 0, 0, 0);
|
||||
RectValue ONE = new ConstRect(0, 0, 1, 1);
|
||||
RectValue ZERO = new ConstRect(0, 0, 0, 0);
|
||||
|
||||
|
||||
/**
|
||||
@@ -21,15 +22,23 @@ public interface Rect extends RectConstraint {
|
||||
*
|
||||
* @return copy
|
||||
*/
|
||||
RectMutable copy();
|
||||
RectMutable mutable();
|
||||
|
||||
|
||||
/**
|
||||
* Get a readonly copy
|
||||
* Get a copy of current value
|
||||
*
|
||||
* @return copy
|
||||
*/
|
||||
RectView view();
|
||||
RectValue value();
|
||||
|
||||
|
||||
/**
|
||||
* Get a proxying view
|
||||
*
|
||||
* @return copy
|
||||
*/
|
||||
RectValue view();
|
||||
|
||||
|
||||
/**
|
||||
@@ -85,4 +94,13 @@ public interface Rect extends RectConstraint {
|
||||
|
||||
double yMax();
|
||||
|
||||
|
||||
/**
|
||||
* Check if point is inside this rectangle
|
||||
*
|
||||
* @param point point to test
|
||||
* @return is inside
|
||||
*/
|
||||
boolean contains(Vec point);
|
||||
|
||||
}
|
||||
|
||||
@@ -4,12 +4,7 @@ package mightypork.utils.math.rect;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
|
||||
|
||||
/**
|
||||
* Operations available in rects
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
interface RectMath<T extends Rect> extends Rect {
|
||||
abstract class RectMath<T extends Rect> extends AbstractRect {
|
||||
|
||||
/**
|
||||
* Add vector to origin
|
||||
@@ -17,7 +12,10 @@ interface RectMath<T extends Rect> extends Rect {
|
||||
* @param move offset vector
|
||||
* @return result
|
||||
*/
|
||||
T move(Vec move);
|
||||
public T move(Vec move)
|
||||
{
|
||||
return move(move.x(), move.y());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -27,7 +25,7 @@ interface RectMath<T extends Rect> extends Rect {
|
||||
* @param y y to add
|
||||
* @return result
|
||||
*/
|
||||
T move(double x, double y);
|
||||
public abstract T move(double x, double y);
|
||||
|
||||
|
||||
/**
|
||||
@@ -36,7 +34,11 @@ interface RectMath<T extends Rect> extends Rect {
|
||||
* @param shrink shrink size (horisontal and vertical)
|
||||
* @return result
|
||||
*/
|
||||
T shrink(Vec shrink);
|
||||
|
||||
public T shrink(Vec shrink)
|
||||
{
|
||||
return shrink(shrink.x(), shrink.y());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -46,7 +48,10 @@ interface RectMath<T extends Rect> extends Rect {
|
||||
* @param y vertical shrink
|
||||
* @return result
|
||||
*/
|
||||
T shrink(double x, double y);
|
||||
public T shrink(double x, double y)
|
||||
{
|
||||
return shrink(x, x, y, y);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -58,7 +63,7 @@ interface RectMath<T extends Rect> extends Rect {
|
||||
* @param bottom shrink
|
||||
* @return result
|
||||
*/
|
||||
T shrink(double left, double right, double top, double bottom);
|
||||
public abstract T shrink(double left, double right, double top, double bottom);
|
||||
|
||||
|
||||
/**
|
||||
@@ -67,7 +72,10 @@ interface RectMath<T extends Rect> extends Rect {
|
||||
* @param grow grow size (added to each side)
|
||||
* @return grown copy
|
||||
*/
|
||||
T grow(Vec grow);
|
||||
public final T grow(Vec grow)
|
||||
{
|
||||
return grow(grow.x(), grow.y());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -77,7 +85,10 @@ interface RectMath<T extends Rect> extends Rect {
|
||||
* @param y vertical grow
|
||||
* @return result
|
||||
*/
|
||||
T grow(double x, double y);
|
||||
public final T grow(double x, double y)
|
||||
{
|
||||
return grow(x, x, y, y);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -89,16 +100,7 @@ interface RectMath<T extends Rect> extends Rect {
|
||||
* @param bottom growth
|
||||
* @return result
|
||||
*/
|
||||
T grow(double left, double right, double top, double bottom);
|
||||
|
||||
|
||||
/**
|
||||
* Check if point is inside this rectangle
|
||||
*
|
||||
* @param point point to test
|
||||
* @return is inside
|
||||
*/
|
||||
boolean contains(Vec point);
|
||||
public abstract T grow(double left, double right, double top, double bottom);
|
||||
|
||||
|
||||
/**
|
||||
@@ -106,6 +108,5 @@ interface RectMath<T extends Rect> extends Rect {
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
T round();
|
||||
|
||||
public abstract T round();
|
||||
}
|
||||
|
||||
@@ -2,27 +2,173 @@ package mightypork.utils.math.rect;
|
||||
|
||||
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
public interface RectMutable extends RectMath<RectMutable> {
|
||||
/**
|
||||
* Mutable rectangle; operations change it's state.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class RectMutable extends RectMath<RectMutable> {
|
||||
|
||||
/**
|
||||
* Create at 0,0 with zero size
|
||||
*
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectMutable zero()
|
||||
{
|
||||
return make(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at 1,1 with zero size
|
||||
*
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectMutable one()
|
||||
{
|
||||
return make(0, 0, 1, 1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at 0,0 with given size
|
||||
*
|
||||
* @param width
|
||||
* @param height
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectMutable make(double width, double height)
|
||||
{
|
||||
return make(0, 0, width, height);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param origin
|
||||
* @param width
|
||||
* @param height
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectMutable make(Vec origin, double width, double height)
|
||||
{
|
||||
return make(origin, VecView.make(width, height));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at 0,0 with given size.
|
||||
*
|
||||
* @param size
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectMutable make(Vec size)
|
||||
{
|
||||
return make(VecView.zero(), size);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @param width
|
||||
* @param height
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectMutable make(double x, double y, double width, double height)
|
||||
{
|
||||
return make(VecView.make(x, y), VecView.make(width, height));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create as copy of another
|
||||
*
|
||||
* @param other copied
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectMutable make(Rect other)
|
||||
{
|
||||
return make(other.getOrigin(), other.getSize());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param origin
|
||||
* @param size
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectMutable make(Vec origin, Vec size)
|
||||
{
|
||||
return new RectMutableImpl(origin, size);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set to other rect's coordinates
|
||||
*
|
||||
* @param rect other rect
|
||||
* @return this
|
||||
*/
|
||||
void setTo(Rect rect);
|
||||
public RectMutable setTo(Rect rect)
|
||||
{
|
||||
return setTo(rect.getOrigin(), rect.getSize());
|
||||
}
|
||||
|
||||
|
||||
void setTo(Vec origin, Vec size);
|
||||
/**
|
||||
* Set to given size and position
|
||||
*
|
||||
* @param origin new origin
|
||||
* @param width new width
|
||||
* @param height new height
|
||||
* @return this
|
||||
*/
|
||||
public RectMutable setTo(Vec origin, double width, double height)
|
||||
{
|
||||
return setTo(origin, VecView.make(width, height));
|
||||
}
|
||||
|
||||
|
||||
void setTo(Vec origin, double width, double height);
|
||||
/**
|
||||
* Set to given size and position
|
||||
*
|
||||
* @param origin new origin
|
||||
* @param size new size
|
||||
* @return this
|
||||
*/
|
||||
public RectMutable setTo(Vec origin, Vec size)
|
||||
{
|
||||
setOrigin(origin);
|
||||
setSize(size);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
void setOrigin(Vec origin);
|
||||
/**
|
||||
* Set new origin
|
||||
*
|
||||
* @param origin new origin
|
||||
* @return this
|
||||
*/
|
||||
public abstract RectMutable setOrigin(Vec origin);
|
||||
|
||||
|
||||
void setSize(Vec size);
|
||||
/**
|
||||
* Set new size
|
||||
*
|
||||
* @param size new size
|
||||
* @return this
|
||||
*/
|
||||
public abstract RectMutable setSize(Vec size);
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
package mightypork.utils.math.rect;
|
||||
|
||||
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecMutable;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
class RectMutableImpl extends RectMutable {
|
||||
|
||||
final VecMutable pos = VecMutable.zero();
|
||||
final VecMutable size = VecMutable.zero();
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param origin
|
||||
* @param size
|
||||
*/
|
||||
public RectMutableImpl(Vec origin, Vec size) {
|
||||
this.pos.setTo(origin);
|
||||
this.size.setTo(size).abs();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add X and Y to origin
|
||||
*
|
||||
* @param x x to add
|
||||
* @param y y to add
|
||||
* @return result
|
||||
*/
|
||||
@Override
|
||||
public RectMutableImpl move(double x, double y)
|
||||
{
|
||||
pos.add(x, y);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Shrink the rect
|
||||
*
|
||||
* @param left shrink
|
||||
* @param right shrink
|
||||
* @param top shrink
|
||||
* @param bottom shrink
|
||||
* @return result
|
||||
*/
|
||||
@Override
|
||||
public RectMutableImpl shrink(double left, double right, double top, double bottom)
|
||||
{
|
||||
pos.add(left, top);
|
||||
size.sub(left + right, top + bottom).abs();
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Grow the rect
|
||||
*
|
||||
* @param left growth
|
||||
* @param right growth
|
||||
* @param top growth
|
||||
* @param bottom growth
|
||||
* @return result
|
||||
*/
|
||||
@Override
|
||||
public RectMutableImpl grow(double left, double right, double top, double bottom)
|
||||
{
|
||||
pos.sub(left, top);
|
||||
size.add(left + right, top + bottom).abs();
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Round coords
|
||||
*
|
||||
* @return result
|
||||
*/
|
||||
@Override
|
||||
public RectMutableImpl round()
|
||||
{
|
||||
pos.round();
|
||||
size.round();
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getOrigin()
|
||||
{
|
||||
return pos.view();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public VecView getSize()
|
||||
{
|
||||
return size.view();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectMutable setOrigin(Vec origin)
|
||||
{
|
||||
this.pos.setTo(origin);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectMutable setSize(Vec size)
|
||||
{
|
||||
this.size.setTo(size).abs();
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import mightypork.utils.math.coord.VecView;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class RectProxy extends RectView {
|
||||
public class RectProxy extends RectValue {
|
||||
|
||||
private final Rect observed;
|
||||
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
package mightypork.utils.math.rect;
|
||||
|
||||
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
/**
|
||||
* Immutable rect
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class RectValue extends RectMath<RectValue> {
|
||||
|
||||
/**
|
||||
* Create at 0,0 with zero size
|
||||
*
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectValue zero()
|
||||
{
|
||||
return make(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at 1,1 with zero size
|
||||
*
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectValue one()
|
||||
{
|
||||
return make(0, 0, 1, 1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at 0,0 with given size
|
||||
*
|
||||
* @param width
|
||||
* @param height
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectValue make(double width, double height)
|
||||
{
|
||||
return make(0, 0, width, height);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param origin
|
||||
* @param width
|
||||
* @param height
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectValue make(Vec origin, double width, double height)
|
||||
{
|
||||
return make(origin, VecView.make(width, height));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at 0,0 with given size.
|
||||
*
|
||||
* @param size
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectValue make(Vec size)
|
||||
{
|
||||
return make(VecView.zero(), size);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @param width
|
||||
* @param height
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectValue make(double x, double y, double width, double height)
|
||||
{
|
||||
return new ConstRect(x, y, width, height);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create at given origin, with given size.
|
||||
*
|
||||
* @param origin
|
||||
* @param size
|
||||
* @return new mutable rect
|
||||
*/
|
||||
public static RectValue make(Vec origin, Vec size)
|
||||
{
|
||||
return make(origin.x(), origin.y(), size.x(), size.y());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectValue move(double x, double y)
|
||||
{
|
||||
return RectValue.make(getOrigin().add(x, y), getSize());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectValue shrink(double left, double right, double top, double bottom)
|
||||
{
|
||||
return RectValue.make(getOrigin().add(left, top), getSize().sub(left + right, top + bottom));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectValue grow(double left, double right, double top, double bottom)
|
||||
{
|
||||
return RectValue.make(getOrigin().sub(left, top), getSize().add(left + right, top + bottom));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectValue round()
|
||||
{
|
||||
return RectValue.make(getOrigin().round(), getSize().round());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectValue view()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
package mightypork.utils.math.rect;
|
||||
|
||||
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
|
||||
/**
|
||||
* Immutable rect
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class RectView extends RectImpl<RectView> {
|
||||
|
||||
protected RectView result(VecView origin, VecView size)
|
||||
{
|
||||
return new FixedRect(origin, size);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectView move(double x, double y)
|
||||
{
|
||||
return result(getOrigin().add(x, y), getSize());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
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 right, double top, double bottom)
|
||||
{
|
||||
return result(getOrigin().sub(left, top), getSize().add(left + right, top + bottom));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectView round()
|
||||
{
|
||||
return result(getOrigin().round(), getSize().round());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public MutableRect copy()
|
||||
{
|
||||
return new MutableRect(this);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RectView view()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public abstract VecView getOrigin();
|
||||
|
||||
|
||||
@Override
|
||||
public abstract VecView getSize();
|
||||
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package mightypork.utils.objects;
|
||||
|
||||
import mightypork.utils.logging.Log;
|
||||
import mightypork.utils.math.Range;
|
||||
import mightypork.utils.math.coord.FixedCoord;
|
||||
import mightypork.utils.math.coord.Vec;
|
||||
import mightypork.utils.math.coord.VecView;
|
||||
|
||||
@@ -155,8 +154,8 @@ public class Convert {
|
||||
public static VecView toCoord(Object o, Vec def)
|
||||
{
|
||||
try {
|
||||
if (o == null) return new FixedCoord(def);
|
||||
if (o instanceof Vec) return new FixedCoord((Vec) o);
|
||||
if (o == null) return def.value();
|
||||
if (o instanceof Vec) return ((Vec) o).value();
|
||||
if (o instanceof String) {
|
||||
String s = ((String) o).trim().toUpperCase();
|
||||
|
||||
@@ -172,19 +171,19 @@ public class Convert {
|
||||
final double y = Double.parseDouble(parts[1].trim());
|
||||
|
||||
if (parts.length == 2) {
|
||||
return new FixedCoord(x, y);
|
||||
return VecView.make(x, y);
|
||||
}
|
||||
|
||||
final double z = Double.parseDouble(parts[2].trim());
|
||||
|
||||
return new FixedCoord(x, y, z);
|
||||
return VecView.make(x, y, z);
|
||||
}
|
||||
}
|
||||
} catch (final NumberFormatException | ArrayIndexOutOfBoundsException e) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
return new FixedCoord(def);
|
||||
return def.value();
|
||||
}
|
||||
|
||||
|
||||
@@ -292,7 +291,7 @@ public class Convert {
|
||||
*/
|
||||
public static VecView toCoord(Object o)
|
||||
{
|
||||
return toCoord(o, Vec.ZERO);
|
||||
return toCoord(o, VecView.zero());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -45,6 +45,14 @@ public class Mutable<T> {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
if (o == null) return "<null>";
|
||||
return o.toString();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
@@ -61,21 +69,10 @@ public class Mutable<T> {
|
||||
if (this == obj) return true;
|
||||
if (obj == null) return false;
|
||||
if (!(obj instanceof Mutable)) return false;
|
||||
|
||||
final Mutable<?> other = (Mutable<?>) obj;
|
||||
if (o == null) {
|
||||
if (other.o != null) return false;
|
||||
} else if (!o.equals(other.o)) {
|
||||
return false;
|
||||
}
|
||||
} else if (!o.equals(other.o)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
if (o == null) return "<null>";
|
||||
return o.toString();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user