package automenta.spacenet.space.widget3d;
import automenta.spacenet.space.control.Draggable;
import automenta.spacenet.space.control.Touchable;
import automenta.spacenet.space.geom.Rect;
import automenta.spacenet.space.geom.Rect.RectShape;
import automenta.spacenet.space.widget.window.Window.DragMode;
import automenta.spacenet.var.physical.Color;
import com.ardor3d.intersection.PickData;
import com.ardor3d.math.Plane;
import com.ardor3d.math.Ray3;
import com.ardor3d.math.Vector3;
public class Window3D extends Panel3D implements Touchable, Draggable {
boolean touching = false;
DragMode dragMode = DragMode.None;
DragMode dragModeStart = DragMode.None;
//TODO account for dragStartOffset
Vector3 a = new Vector3();
Vector3 b = new Vector3();
Vector3 c = new Vector3();
Plane p = new Plane();
Vector3 iWorld = new Vector3();
Vector3 iParent = new Vector3();
Vector3 iParentStart = new Vector3();
Vector3 posStart = new Vector3();
Vector3 iLocal = new Vector3();
Vector3 iLocalStart = new Vector3();
private float sr = -1;
private float sg = -1;
private float sb = -1;
private float tr = -1;
private float tg = -1;
private float tb = -1;
float or = 0.1f;
float mr = 0.2f;
float og = 0.1f;
float mg = 0.2f;
float ob = 0.1f;
float mb = 0.2f;
double resizeBorder = 0.1;
double defaultDZ = 0.05;
private final Rect reactionRect;
public Window3D() {
super();
reactionRect = add(new Rect(RectShape.Empty));
}
@Override
public void onTouchStart(PickData pick) {
touching = true;
}
@Override
public void onTouching(PickData pick) {
Ray3 r = pick.getRay();
updateIntersect(r);
updateTouch();
}
protected void updateTouch() {
double x = iLocal.getX();
double y = iLocal.getY();
double rb = resizeBorder / 2.0;
reactionRect.removeAll();
if (x > 0.5 - rb) {
if (y > 0.5 - rb) {
dragMode = DragMode.SizeNE;
reactionRect.add(new Rect(Color.Purple).span(0.5 - rb, 0.5 - rb, 0.5 + rb, 0.5 + rb));
return;
} else if (y < -0.5 + rb) {
dragMode = DragMode.SizeSE;
reactionRect.add(new Rect(Color.Purple).span(0.5 - rb, -0.5 + rb, 0.5 + rb, -0.5 - rb));
return;
}
} else if (x < -0.5 + rb) {
if (y > 0.5 - rb) {
dragMode = DragMode.SizeNW;
reactionRect.add(new Rect(Color.Purple).span(-0.5 + rb, 0.5 - rb, -0.5 - rb, 0.5 + rb));
return;
} else if (y < -0.5 + rb) {
dragMode = DragMode.SizeSW;
reactionRect.add(new Rect(Color.Purple).span(-0.5 + rb, -0.5 + rb, -0.5 - rb, -0.5 - rb));
return;
}
}
dragMode = DragMode.Move;
}
@Override
public void onTouchStop() {
touching = false;
//System.out.println("stop touch");
dragMode = DragMode.None;
reactionRect.removeAll();
}
@Override
public void onDragStart(Ray3 rayDrag) {
updateIntersect(rayDrag);
dragModeStart = dragMode;
iLocalStart.set(iLocal);
iParentStart.set(iParent);
posStart.set(getPosition());
}
protected void updateIntersect(Ray3 r) {
double x = getWorldTranslation().getX();
double y = getWorldTranslation().getY();
double z = getWorldTranslation().getZ();
a.set(x, y, z);
b.set(x + 1, y, z);
c.set(x, y + 1, z);
p.setPlanePoints(a, b, c);
r.intersects(p, iWorld);
getParent().worldToLocal(iWorld, iParent);
worldToLocal(iWorld, iLocal);
}
@Override
public void onDragging(final Ray3 rayDrag) {
updateIntersect(rayDrag);
double px = getPosition().getX();
double py = getPosition().getY();
if (dragModeStart == DragMode.Move) {
px = posStart.getX() + (iParent.getX() - iParentStart.getX());
py = posStart.getY() + (iParent.getY() - iParentStart.getY());
} else {
double nx = getSize().getX();
double ny = getSize().getY();
double dx = iLocal.getX() - iLocalStart.getX();
double dy = iLocal.getY() - iLocalStart.getY();
// double dx = iParent.getX() - iParentStart.getX();
// double dy = iParent.getY() - iParentStart.getY();
if (dragModeStart == DragMode.SizeNE) {
nx += dx / 2.0;
ny += dy / 2.0;
} else if (dragModeStart == DragMode.SizeSE) {
nx += dx / 2.0;
ny -= dy / 2.0;
} else if (dragModeStart == DragMode.SizeNW) {
nx -= dx / 2.0;
ny += dy / 2.0;
} else if (dragModeStart == DragMode.SizeSW) {
nx -= dx / 2.0;
ny -= dy / 2.0;
}
px += dx / 4.0;
py += dy / 4.0;
nx = Math.abs(nx);
ny = Math.abs(ny);
scale(nx, ny, getScale().getZ());
setScale(nx, ny, 1.0);
}
move(px, py, 0);
setTranslation(px, py, 0);
}
@Override
public void onDragStop(Ray3 rayDragStop) {
}
}