1 package org.simantics.plant3d.gizmo;
3 import java.awt.event.MouseEvent;
4 import java.awt.event.MouseMotionListener;
5 import java.util.ArrayList;
6 import java.util.Collection;
8 import javax.vecmath.AxisAngle4d;
9 import javax.vecmath.Point3d;
10 import javax.vecmath.Tuple3d;
11 import javax.vecmath.Vector2d;
12 import javax.vecmath.Vector3d;
14 import org.simantics.g3d.math.MathTools;
15 import org.simantics.g3d.math.Ray;
16 import org.simantics.g3d.scenegraph.RenderListener;
17 import org.simantics.g3d.shape.Color4d;
18 import org.simantics.g3d.shape.Cone;
19 import org.simantics.g3d.shape.Cylinder;
20 import org.simantics.g3d.shape.Mesh;
21 import org.simantics.g3d.vtk.common.InteractiveVtkPanel;
22 import org.simantics.g3d.vtk.gizmo.vtkGizmo;
23 import org.simantics.g3d.vtk.shape.MeshActor;
24 import org.simantics.g3d.vtk.utils.vtkUtil;
28 public class SplitPointSelectionGizmo extends vtkGizmo {
32 InteractiveVtkPanel panel;
33 private RenderListener listener;
34 private MouseMotionListener mouseListener;
40 Vector2d mousePos = new Vector2d();
42 Vector3d pa = new Vector3d();
43 Vector3d pb = new Vector3d();
45 Tuple3d splitPoint = null;
47 public SplitPointSelectionGizmo(InteractiveVtkPanel panel) {
52 Mesh cone_x = Cone.create(0.1, res);
53 cone_x.rotate(MathTools.getQuat(new AxisAngle4d(0,0,-1,Math.PI*0.5)));
54 cone_x.translate(new Vector3d(0.8,0,0));
56 Mesh tube_x = Cylinder.create(MathTools.ORIGIN, new Vector3d(0.8,0,0), 0.05, res);
59 Color4d z_col = new Color4d(0,1,0,1);
60 tube_x.setColor(z_col);
62 actor = new MeshActor();
63 actor.setMesh(tube_x);
64 panel.addDeletable(actor);
66 this.listener = new RenderListener() {
68 public void preRender() {
69 Ray ray = vtkUtil.createMouseRay(getRenderer(), mousePos.x, mousePos.y);
70 //ray.dir.add(ray.pos);
71 //if (MathTools.intersectLineLine(start, end, ray.pos, ray.dir, pa, pb)) {
72 double mu[] = new double[2];
73 if (MathTools.intersectStraightStraight(start, dir, ray.pos, ray.dir, pa, pb,mu)) {
79 Vector3d dir = new Vector3d(splitPoint);
81 double length = dir.length();
82 dir.scale(1.0/length);
83 AxisAngle4d aa = MathTools.createRotation(MathTools.X_AXIS, dir);
87 actor.SetVisibility(1);
90 actor.SetVisibility(0);
96 public void postRender() {
101 this.mouseListener = new MouseMotionListener() {
104 public void mouseMoved(MouseEvent e) {
105 mousePos.x = e.getX();
106 mousePos.y = e.getY();
107 SplitPointSelectionGizmo.this.panel.repaint();
111 public void mouseDragged(MouseEvent e) {
112 mousePos.x = e.getX();
113 mousePos.y = e.getY();
114 SplitPointSelectionGizmo.this.panel.repaint();
120 public void setSplit(Point3d start, Point3d end) {
123 dir = new Vector3d(end);
128 public void attach(Object renderingPart) {
129 super.attach(renderingPart);
130 panel.addListener(listener);
131 panel.addMouseMotionListener(mouseListener);
135 public void deattach() {
136 panel.removeListener(listener);
137 panel.removeMouseMotionListener(mouseListener);
142 public Collection<vtkProp> getGizmo() {
143 Collection<vtkProp> coll = new ArrayList<vtkProp>();
148 public Tuple3d getSplitPoint() {