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) { } }