/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package automenta.spacenet.var.vector;
import com.ardor3d.math.Vector3;
import com.ardor3d.math.type.ReadOnlyVector3;
import java.util.LinkedList;
import java.util.List;
public class V3 extends Vector3 {
//TODO lazy instantiate list with ensureChangesAllocated
private List<IfV3Changes> ifChanges = new LinkedList();
private boolean notifying = true;
public V3() {
this(0, 0, 0);
}
public V3(double s) {
this(s, s, s);
}
public V3(double x, double y, double z) {
super(x, y, z);
}
public V3 interpolate(V3 t, double speed) {
speed = Math.min(speed, 1.0);
speed = Math.max(speed, 0);
double nx = getX() * (1.0 - speed) + t.getX() * speed;
double ny = getY() * (1.0 - speed) + t.getY() * speed;
double nz = getZ() * (1.0 - speed) + t.getZ() * speed;
return set(nx, ny, nz);
}
public double getVolume() {
return Math.abs(getX() * getY() * getZ());
}
public abstract static class IfV3Changes {
abstract public void onV3Changed(V3 v);
}
public IfV3Changes add(IfV3Changes i) {
ifChanges.add(i);
return i;
}
public IfV3Changes remove(IfV3Changes i) {
ifChanges.remove(i);
return i;
}
@Override
public void setX(double x) {
super.setX(x);
notifyChanges();
}
@Override
public void setY(double y) {
super.setY(y);
notifyChanges();
}
@Override
public Vector3 set(ReadOnlyVector3 source) {
return set(source.getX(), source.getY(), source.getZ());
}
@Override public V3 set(double x, double y, double z) {
if ((getX() == x) && (getY() == y) && (getZ() == z)) {
return this;
}
notifying = false;
Vector3 v = super.set(x, y, z);
notifying = true;
notifyChanges();
return this;
}
protected void notifyChanges() {
if (notifying) {
for (IfV3Changes i : ifChanges) {
i.onV3Changed(this);
}
}
}
@Override
protected void finalize() throws Throwable {
if (ifChanges != null) {
ifChanges.clear();
ifChanges = null;
}
super.finalize();
}
public double getMinComponent() {
double ax = Math.abs(getX());
double ay = Math.abs(getY());
double az = Math.abs(getZ());
return Math.min( ax, Math.min( ay, az ) );
}
public double getMaxComponent() {
double ax = Math.abs(getX());
double ay = Math.abs(getY());
double az = Math.abs(getZ());
return Math.max( ax, Math.max( ay, az ) );
}
}