X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d.vtk%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fvtk%2Fswt%2FTranslateAction.java;fp=org.simantics.g3d.vtk%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fvtk%2Fswt%2FTranslateAction.java;h=ac0aada40b07a53f6d1bc2a08bf387258acee111;hb=fe54a2cc349351e49759839eb7e72e4a90eb27dc;hp=f80583a27ac3c966573cc080453d07cab7615513;hpb=19a843895745742ba1fd76f2ee574ef7f3835928;p=simantics%2F3d.git diff --git a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/swt/TranslateAction.java b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/swt/TranslateAction.java index f80583a2..ac0aada4 100644 --- a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/swt/TranslateAction.java +++ b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/swt/TranslateAction.java @@ -43,8 +43,8 @@ import org.simantics.utils.threads.ThreadUtils; import vtk.vtkProp; -public class TranslateAction extends vtkSwtAction{ - +public class TranslateAction extends vtkSwtAction { + public static final int X = 0; public static final int Y = 1; public static final int Z = 2; @@ -54,78 +54,92 @@ public class TranslateAction extends vtkSwtAction{ public static final int P = 6; private VTKNodeMap nodeMap; - //private TranslateGizmo gizmo = new TranslateGizmo(); + // private TranslateGizmo gizmo = new TranslateGizmo(); private TranslateAxisGizmo gizmo = new TranslateAxisGizmo(); protected IG3DNode node; - - - + private Cursor activeCursor;// = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); private Cursor dragCursor;// = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR); - + protected ToolComposite toolComposite; protected Combo axisCombo; - + public void setNode(IG3DNode node) { this.node = node; - if ((node instanceof IStructuralNode) && ((IStructuralNode)node).isPartOfInstantiatedModel() && !((IStructuralNode)node).isInstantiatedModelRoot()) { + if ((node instanceof IStructuralNode) && ((IStructuralNode) node).isPartOfInstantiatedModel() + && !((IStructuralNode) node).isInstantiatedModelRoot()) { setEnabled(false); } else { setEnabled(true); } } - + public IG3DNode getNode() { return node; } - - public TranslateAction(InteractiveVtkComposite panel, VTKNodeMap nodeMap, ToolComposite toolComposite) { + + public TranslateAction(InteractiveVtkComposite panel, VTKNodeMap nodeMap, + ToolComposite toolComposite) { super(panel); setImageDescriptor(Activator.imageDescriptorFromPlugin("com.famfamfam.silk", "icons/arrow_out.png")); setText("Translate"); this.nodeMap = nodeMap; - + activeCursor = Display.getCurrent().getSystemCursor(SWT.CURSOR_HAND); dragCursor = Display.getCurrent().getSystemCursor(SWT.CURSOR_SIZEALL); this.toolComposite = toolComposite; } - + protected void createTools(ToolComposite toolComposite) { - Label label = new Label(toolComposite, SWT.READ_ONLY); - label.setText("Translate direction:"); - axisCombo = new Combo(toolComposite, SWT.READ_ONLY); - axisCombo.add("X"); - axisCombo.add("Y"); - axisCombo.add("Z"); - axisCombo.add("XY"); - axisCombo.add("XZ"); - axisCombo.add("YZ"); - axisCombo.add("Camera"); - axisCombo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - Combo c = (Combo)e.getSource(); - index = c.getSelectionIndex(); - updateLock(); - panel.getComponent().setFocus(); - } - }); - axisCombo.select(index); - Button close = new Button(toolComposite, SWT.PUSH); - close.setText("Close"); - close.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - panel.useDefaultAction(); - }; - }); - toolComposite.relayout(); + createMessage(toolComposite); + createAxisSelection(toolComposite); + createCloseButton(toolComposite); + + toolComposite.relayout(); } - + + protected void createMessage(ToolComposite toolComposite) { + new Label(toolComposite, SWT.READ_ONLY).setText("Press ESC to close translation. "); + } + + protected void createAxisSelection(ToolComposite toolComposite) { + Label label = new Label(toolComposite, SWT.READ_ONLY); + label.setText("Translate direction:"); + axisCombo = new Combo(toolComposite, SWT.READ_ONLY); + axisCombo.add("X"); + axisCombo.add("Y"); + axisCombo.add("Z"); + axisCombo.add("XY"); + axisCombo.add("XZ"); + axisCombo.add("YZ"); + axisCombo.add("Camera"); + axisCombo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + Combo c = (Combo) e.getSource(); + index = c.getSelectionIndex(); + updateLock(); + panel.getComponent().setFocus(); + } + }); + axisCombo.select(index); + } + + protected void createCloseButton(ToolComposite toolComposite) { + Button close = new Button(toolComposite, SWT.PUSH); + close.setText("Close"); + close.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + panel.useDefaultAction(); + }; + }); + } + public void attach() { if (node == null) return; if (toolComposite != null) { - createTools(toolComposite); + createTools(toolComposite); } setDBUndo(false); super.attach(); @@ -136,30 +150,30 @@ public class TranslateAction extends vtkSwtAction{ } }); } - + public void deattach() { - if (toolComposite != null) { - toolComposite.clear(); - axisCombo = null; - } - setDBUndo(true); + if (toolComposite != null) { + toolComposite.clear(); + axisCombo = null; + } + setDBUndo(true); node = null; nodeMap.commit("Translate"); deattachUI(); super.deattach(); panel.refresh(); } - + private void attachUI() { panel.getComponent().setCursor(activeCursor); gizmo.attach(panel); } - + private void deattachUI() { panel.getComponent().setCursor(Display.getCurrent().getSystemCursor(SWT.CURSOR_ARROW)); gizmo.deattach(); } - + @Override public boolean keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ESCAPE) @@ -187,21 +201,20 @@ public class TranslateAction extends vtkSwtAction{ if (e.getKeyCode() == KeyEvent.VK_G) { worldCoord = !worldCoord; } - + updateLock(); update(); - //panel.repaint(); + // panel.repaint(); return true; } - + private void updateLock() { - gizmo.setType(index); - if (axisCombo != null) - axisCombo.select(index); - panel.refresh(); + gizmo.setType(index); + if (axisCombo != null) + axisCombo.select(index); + panel.refresh(); } - @Override public boolean mouseClicked(MouseEvent e) { if (e.getClickCount() > 1) { @@ -210,16 +223,16 @@ public class TranslateAction extends vtkSwtAction{ } else { panel.useDefaultAction(); } - //if(!gizmo.isPartOf(actor)) - // panel.useDefaultAction(); + // if(!gizmo.isPartOf(actor)) + // panel.useDefaultAction(); return true; } return false; } - + private boolean isOverNode(MouseEvent e) { vtkProp picked[] = panel.pick(e.getX(), e.getY()); - if (picked !=null) { + if (picked != null) { for (int i = 0; i < picked.length; i++) { if (node.equals(nodeMap.getNode(picked[i]))) return true; @@ -227,24 +240,21 @@ public class TranslateAction extends vtkSwtAction{ } return false; } - - + int index = P; protected boolean valid = false; private boolean worldCoord = true; private AxisAngle4d aa = null; private Quat4d q = null; - - + public void setWorldCoord(boolean b) { if (worldCoord == b) return; worldCoord = b; update(); - + } - - + protected void update() { if (node == null) return; @@ -254,21 +264,20 @@ public class TranslateAction extends vtkSwtAction{ q = null; } else { aa = new AxisAngle4d(); - aa.set(((IG3DNode)node.getParent()).getWorldOrientation()); + aa.set(((IG3DNode) node.getParent()).getWorldOrientation()); gizmo.setRotation(aa); q = new Quat4d(); MathTools.getQuat(aa, q); } - + Vector3d nodePos = node.getWorldPosition(); - //System.out.println(nodePos); + // System.out.println(nodePos); gizmo.setPosition(nodePos); - Point3d camPos = new Point3d(panel.getRenderer().GetActiveCamera().GetPosition()); Vector3d p = new Vector3d(nodePos); p.sub(camPos); - + if (q != null) { Quat4d qi = new Quat4d(q); qi.inverse(); @@ -278,10 +287,10 @@ public class TranslateAction extends vtkSwtAction{ double distance = p.length(); p.negate(); double fov = panel.getRenderer().GetActiveCamera().GetViewAngle(); - float s = (float) (Math.sin(fov) * distance * 0.1); + float s = (float) (Math.sin(fov) * distance * 0.1); Vector3d scale = new Vector3d(1., 1., 1.); - + // if (p.x > 0.f) // scale.x = -1.; // if (p.y > 0.f) @@ -290,7 +299,7 @@ public class TranslateAction extends vtkSwtAction{ // scale.z = -1.; scale.scale(s); gizmo.setScale(scale); - + } else { Vector3d scale = new Vector3d(1.f, 1.f, 1.f); double s = panel.getRenderer().GetActiveCamera().GetParallelScale() / 5.; @@ -303,13 +312,13 @@ public class TranslateAction extends vtkSwtAction{ scale.scale(s); gizmo.setScale(scale); } - - //panel.Render(); + + // panel.Render(); panel.refresh(); } - + protected Vector3d prevTranslate = null; - + @Override public boolean mousePressed(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { @@ -327,19 +336,17 @@ public class TranslateAction extends vtkSwtAction{ getDefaultAction().mousePressed(e); } return true; - //index = gizmo.getTranslateAxis(actor); - //if (index == -1) { - // valid = false; - // panel.getDefaultAction().mousePressed(e); - // return; - //} - //valid = true; - //prevTranslate = getTranslate(e.getX(), e.getY()); - //System.out.println("start translate " + prevTranslate); + // index = gizmo.getTranslateAxis(actor); + // if (index == -1) { + // valid = false; + // panel.getDefaultAction().mousePressed(e); + // return; + // } + // valid = true; + // prevTranslate = getTranslate(e.getX(), e.getY()); + // System.out.println("start translate " + prevTranslate); } - - - + @Override public boolean mouseReleased(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { @@ -351,14 +358,14 @@ public class TranslateAction extends vtkSwtAction{ } return true; } - + @Override public boolean mouseDragged(MouseEvent e) { - //if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) > 0 && valid) { - if (e.getButton() == MouseEvent.BUTTON1 && valid) { - + // if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) > 0 && valid) { + if (e.getButton() == MouseEvent.BUTTON1 && valid) { + Vector3d translate = getTranslate(e.getX(), e.getY(), prevTranslate); - //System.out.println("translate " + translate); + // System.out.println("translate " + translate); if (translate == null) return true; boolean step = ((e.getModifiers() & MouseEvent.CTRL_MASK) > 0); @@ -373,9 +380,9 @@ public class TranslateAction extends vtkSwtAction{ pos = constaints(pos, step); setPos(pos); } - //mapping.rangeModified(node); - - //nodeMap.modified(node); + // mapping.rangeModified(node); + + // nodeMap.modified(node); update(); } else { getDefaultAction().mouseDragged(e); @@ -383,25 +390,25 @@ public class TranslateAction extends vtkSwtAction{ } return true; } - + @Override public boolean mouseWheelMoved(MouseWheelEvent e) { return getDefaultAction().mouseWheelMoved(e); } - + protected void setPos(Vector3d pos) { node.setPosition(pos); } - + protected void setWorldPos(Vector3d pos) { node.setWorldPosition(pos); } - + private double istep = 10.0; private int decimals = 2; - + protected Vector3d constaints(Vector3d p, boolean step) { - if(!step) + if (!step) return p; switch (index) { case X: @@ -426,25 +433,25 @@ public class TranslateAction extends vtkSwtAction{ } return p; } - + @Override public boolean mouseMoved(MouseEvent e) { getDefaultAction().mouseMoved(e); return true; } - + protected Vector3d getTranslate(double x, double y) { return getTranslate(x, y, new Vector3d()); } - + protected Vector3d getTranslate(double x, double y, Vector3d offset) { Vector3d translate = new Vector3d(); - - Ray ray = vtkUtil.createMouseRay(panel.getRenderer(),x, y); - + + Ray ray = vtkUtil.createMouseRay(panel.getRenderer(), x, y); + Vector3d p = node.getWorldPosition(); Vector3d dir = null; - + switch (index) { case P: Vector3d normal = new Vector3d(panel.getRenderer().GetActiveCamera().GetDirectionOfProjection()); @@ -462,40 +469,40 @@ public class TranslateAction extends vtkSwtAction{ } break; - case X : - dir = new Vector3d(1.0,0.0,0.0); - if(!worldCoord) - MathTools.rotate(q, dir, dir); - Vector3d i1 = new Vector3d(); - Vector3d i2 = new Vector3d(); - s = new double[2]; - MathTools.intersectStraightStraight( p, dir,ray.pos, ray.dir, i2, i1,s); - translate.x = s[0]; - - break; - case Y : - dir = new Vector3d(0.0,1.0,0.0); - if(!worldCoord) + case X: + dir = new Vector3d(1.0, 0.0, 0.0); + if (!worldCoord) + MathTools.rotate(q, dir, dir); + Vector3d i1 = new Vector3d(); + Vector3d i2 = new Vector3d(); + s = new double[2]; + MathTools.intersectStraightStraight(p, dir, ray.pos, ray.dir, i2, i1, s); + translate.x = s[0]; + + break; + case Y: + dir = new Vector3d(0.0, 1.0, 0.0); + if (!worldCoord) MathTools.rotate(q, dir, dir); i1 = new Vector3d(); i2 = new Vector3d(); s = new double[2]; - MathTools.intersectStraightStraight( p, dir,ray.pos, ray.dir, i2, i1,s); + MathTools.intersectStraightStraight(p, dir, ray.pos, ray.dir, i2, i1, s); translate.y = s[0]; break; - case Z : - dir = new Vector3d(0.0,0.0,1.0); - if(!worldCoord) + case Z: + dir = new Vector3d(0.0, 0.0, 1.0); + if (!worldCoord) MathTools.rotate(q, dir, dir); i1 = new Vector3d(); i2 = new Vector3d(); s = new double[2]; - MathTools.intersectStraightStraight( p, dir,ray.pos, ray.dir, i2, i1,s); + MathTools.intersectStraightStraight(p, dir, ray.pos, ray.dir, i2, i1, s); translate.z = s[0]; break; - case XY : - normal = new Vector3d(0.0,0.0,1.0); - if(!worldCoord) + case XY: + normal = new Vector3d(0.0, 0.0, 1.0); + if (!worldCoord) MathTools.rotate(q, normal, normal); r = new Vector3d(); if (MathTools.intersectStraightPlane(ray.pos, ray.dir, p, normal, r)) { @@ -504,9 +511,9 @@ public class TranslateAction extends vtkSwtAction{ translate.y = r.y; } break; - case XZ : - normal = new Vector3d(0.0,1.0,0.0); - if(!worldCoord) + case XZ: + normal = new Vector3d(0.0, 1.0, 0.0); + if (!worldCoord) MathTools.rotate(q, normal, normal); r = new Vector3d(); if (MathTools.intersectStraightPlane(ray.pos, ray.dir, p, normal, r)) { @@ -515,9 +522,9 @@ public class TranslateAction extends vtkSwtAction{ translate.z = r.z; } break; - case YZ : - normal = new Vector3d(1.0,0.0,0.0); - if(!worldCoord) + case YZ: + normal = new Vector3d(1.0, 0.0, 0.0); + if (!worldCoord) MathTools.rotate(q, normal, normal); r = new Vector3d(); if (MathTools.intersectStraightPlane(ray.pos, ray.dir, p, normal, r)) { @@ -526,12 +533,12 @@ public class TranslateAction extends vtkSwtAction{ translate.z = r.z; } break; - default : - + default: + return null; } translate.sub(offset); return translate; } - + }