+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import java.awt.event.MouseEvent;\r
-import java.math.BigDecimal;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.AxisAngle4f;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Quat4d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequest;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.gizmo.TransformGizmo;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.Orientation;\r
-import org.simantics.proconf.g3d.stubs.Position;\r
-\r
-\r
-public class TranslateAction extends ConstrainedTransformAction {\r
- \r
- \r
- private TransformGizmo gizmo;\r
- \r
- private double istep = 10.0;\r
- private int decimals = 2;\r
- \r
- \r
- private Action csAction;\r
- List<IGraphicsNode> mos = null;\r
- \r
- private boolean worldCoord = true;\r
- \r
- \r
- private AxisAngle4d aa;\r
- private Quat4d q;\r
- \r
- public TranslateAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- \r
- csAction = new Action("World",Action.AS_CHECK_BOX) {\r
- public void run() {\r
- GraphRequest r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- setWorldCoord(g,!isChecked());\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- };\r
- TranslateAction.this.parent.getSession().asyncRead(r);\r
- \r
- }\r
- };\r
- gizmo = new TransformGizmo(component.getDisplaySystem().getRenderer());\r
- }\r
- \r
- public void init() {\r
- this.setText("Translate");\r
- this.setToolTipText("Translate the object");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/translate.png"));\r
- }\r
- \r
- @Override\r
- public boolean usable(Graph graph, List<Resource> resources) {\r
- if (resources.size() == 0)\r
- return false;\r
- for (Resource r : resources) {\r
- IEntity t = EntityFactory.create(graph,r);\r
- if (t.isInstanceOf(Resources.g3dResource.G3DNode)) {\r
- Collection<IEntity> p = t.getRelatedObjects(Resources.g3dResource.HasLocalPosition);\r
- if (p == null || p.size() != 1)\r
- return false;\r
- }\r
- \r
- }\r
- return true;\r
- \r
- }\r
- \r
- @Override\r
- public void deactivate() {\r
- super.deactivate();\r
- parent.setGizmo(null);\r
- mos = null;\r
- }\r
- \r
- private void setWorldCoord(Graph graph,boolean b) {\r
- if (worldCoord == b)\r
- return;\r
- worldCoord = b;\r
- updateWorldCoord(graph);\r
- }\r
- \r
- private void updateWorldCoord(Graph graph) {\r
- if (worldCoord) {\r
- csAction.setText("World");\r
- gizmo.setRotation(new AxisAngle4f());\r
- aa = null;\r
- q = null;\r
- } else {\r
- csAction.setText("Local");\r
- Orientation o = mos.get(0).getParent().getG3DNode(graph).getWorldOrientation();\r
- if (o == null) {\r
- aa = new AxisAngle4d();\r
- } else {\r
- aa = G3DTools.getOrientation(o);\r
- }\r
- \r
- gizmo.setRotation(new AxisAngle4f(aa));\r
- q = new Quat4d();\r
- q.set(aa);\r
- }\r
-// if (manager != null)\r
-// parent.getRenderingComposite().getDisplay().asyncExec(new Runnable() {\r
-// public void run() {\r
-// manager.update(true);\r
-// }\r
-// });\r
- \r
- this.parent.setViewChanged(true);\r
- }\r
- \r
- public void fillToolBar(IToolBarManager manager) {\r
- super.fillToolBar(manager);\r
- csAction.setChecked(!worldCoord);\r
- manager.add(csAction);\r
- }\r
-\r
- @Override\r
- public void activate() {\r
- GraphRequest r = new GraphRequestAdapter() {\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- parent.setGizmo(gizmo);\r
-\r
- updateGizmo(g);\r
-\r
- component.getNoShadowRoot().attachChild(gizmo.getNode());\r
- \r
- String text = "";\r
- mos = parent.getSelectionAdapter().getSelectedObjects();\r
- for (IGraphicsNode mo : mos) {\r
- if (worldCoord)\r
- text += G3DTools.getVector(mo.getG3DNode(g).getWorldPosition()) + " ";//mo.getWorldPosition() + " ";\r
- else\r
- text += G3DTools.getVector(mo.getG3DNode(g).getLocalPosition()) + " ";\r
- }\r
- final String fText = text;\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable() {\r
- public void run() {\r
- setInfoText(fText); \r
- }\r
- });\r
- \r
- Resource r[] = new Resource[mos.size()];\r
- for (int i = 0; i < mos.size(); i++) {\r
- r[i] = mos.get(i).getResource();\r
- }\r
- \r
- TranslateActionConstraints.addConstraints(r, detector); \r
- updateWorldCoord(g);\r
- return GraphRequestStatus.transactionComplete();\r
- };\r
- \r
- };\r
- parent.getSession().asyncRead(r);\r
- \r
- }\r
- \r
- Vector3d getTranslate(Graph graph) {\r
- return getTranslate(graph,new Vector3d());\r
- }\r
- \r
- Vector3d getTranslate(Graph graph,Vector3d offset) {\r
- Vector3d translate = new Vector3d();\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- Vector3d p = G3DTools.getVector(mos.get(0).getG3DNode(graph).getWorldPosition());//gizmo.getPosition();\r
- Vector3d dir = null;\r
- switch (gizmo.getSelected()) {\r
- case TransformGizmo.XYZ :\r
- Vector3d normal = camera.getUnNormalizedHeading();\r
- if(!worldCoord)\r
- MathTools.rotate(q, normal, normal);\r
- normal.normalize();\r
- double s[] = new double[1];\r
- Vector3d r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.y = r.y;\r
- translate.z = r.z;\r
- }\r
- break;\r
- case TransformGizmo.X :\r
- dir = new Vector3d(1.0,0.0,0.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, dir, dir);\r
- Vector3d i1 = new Vector3d();\r
- Vector3d i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.x = s[0];\r
- \r
- break;\r
- case TransformGizmo.Y :\r
- dir = new Vector3d(0.0,1.0,0.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, dir, dir);\r
- i1 = new Vector3d();\r
- i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.y = s[0];\r
- break;\r
- case TransformGizmo.Z :\r
- dir = new Vector3d(0.0,0.0,1.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, dir, dir);\r
- i1 = new Vector3d();\r
- i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.z = s[0];\r
- break;\r
- case TransformGizmo.XY :\r
- normal = new Vector3d(0.0,0.0,1.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, normal, normal);\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.y = r.y;\r
- }\r
- break;\r
- case TransformGizmo.XZ :\r
- normal = new Vector3d(0.0,1.0,0.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, normal, normal);\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.z = r.z;\r
- }\r
- break;\r
- case TransformGizmo.YZ :\r
- normal = new Vector3d(1.0,0.0,0.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, normal, normal);\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.y = r.y;\r
- translate.z = r.z;\r
- }\r
- break;\r
- default :\r
- \r
- return null;\r
- }\r
- translate.sub(offset);\r
- \r
- if (useConstraints && dir != null) {\r
- switch (gizmo.getSelected()) {\r
- case TransformGizmo.X:\r
- case TransformGizmo.Y:\r
- case TransformGizmo.Z:\r
- Vector3d t = new Vector3d(translate);\r
- // TODO : to the test against all translated objects and snap to closest one\r
- Point3d pos = G3DTools.getPoint(mos.get(0).getG3DNode(graph).getWorldPosition());\r
- t.add(pos);\r
- Point3d snap = detector.getPointSnap2(t, dir);\r
- if (snap != null) {\r
- // System.out.print("t: " + translate);\r
- translate = new Vector3d(snap);\r
- translate.sub(pos);\r
- // System.out.println(" " + translate);\r
- }\r
- break;\r
- \r
- }\r
- }\r
- return translate;\r
- }\r
- \r
- Vector3d prevTranslate = new Vector3d();\r
- \r
- @Override\r
- public void doChanges(Graph graph) throws Exception {\r
- if (input.mousePressed()) {\r
- boolean b = useConstraints;\r
- useConstraints = false;\r
- prevTranslate = getTranslate(graph);\r
- useConstraints = b;\r
- }\r
- if (input.mouseClicked()) {\r
- end();\r
- return;\r
- }\r
- if (!input.mouseDragged()) {\r
- parent.getDefaultAction().update();\r
- return;\r
- } \r
- detector.clearConstraintHighlights();\r
- parent.setViewChanged(true);\r
- \r
- \r
- \r
- Vector3d translate = getTranslate(graph,prevTranslate);\r
- \r
- if (translate == null) {\r
- //cameraRotateAction.update();\r
- parent.getDefaultAction().update();\r
- updateGizmo(graph);\r
- return;\r
- }\r
- //translate.sub(prevTranslate);\r
- \r
- if ((input.dragModifiers() & MouseEvent.CTRL_MASK) > 0) {\r
- String text = "";\r
- for (IGraphicsNode mo : mos) {\r
- \r
- Point3d p;\r
- if (worldCoord)\r
- p = G3DTools.getPoint(mo.getG3DNode(graph).getWorldPosition());//mo.getWorldPosition();\r
- else\r
- p = G3DTools.getPoint(mo.getG3DNode(graph).getLocalPosition());\r
- p.add(translate);\r
- if (gizmo.getSelected() == TransformGizmo.X || gizmo.getSelected() == TransformGizmo.XY || gizmo.getSelected() == TransformGizmo.XZ || gizmo.getSelected() == TransformGizmo.XYZ) {\r
- p.x = Math.round(istep * p.x) / istep;\r
- BigDecimal bx = new BigDecimal(p.x);\r
- bx.setScale(decimals, BigDecimal.ROUND_HALF_UP);\r
- p.x = bx.doubleValue();\r
- }\r
- if (gizmo.getSelected() == TransformGizmo.Y || gizmo.getSelected() == TransformGizmo.XY || gizmo.getSelected() == TransformGizmo.YZ || gizmo.getSelected() == TransformGizmo.XYZ) {\r
- p.y = Math.round(istep * p.y) / istep;\r
- BigDecimal by = new BigDecimal(p.y);\r
- by.setScale(decimals, BigDecimal.ROUND_HALF_UP);\r
- p.y = by.doubleValue();\r
- }\r
- if (gizmo.getSelected() == TransformGizmo.Z || gizmo.getSelected() == TransformGizmo.YZ || gizmo.getSelected() == TransformGizmo.XZ || gizmo.getSelected() == TransformGizmo.XYZ) { \r
- p.z = Math.round(istep * p.z) / istep;\r
- BigDecimal bz = new BigDecimal(p.z);\r
- bz.setScale(decimals, BigDecimal.ROUND_HALF_UP);\r
- p.z = bz.doubleValue();\r
- }\r
- text += p + " ";\r
- if (worldCoord)\r
- G3DTools.setTuple3(mo.getG3DNode(graph).getWorldPosition(), p); \r
- else\r
- G3DTools.setTuple3(mo.getG3DNode(graph).getLocalPosition(), p);\r
- //mo.setWorldTranslation(p);\r
- \r
- }\r
- if (useConstraints)\r
- text+=detector.getSnapString();\r
- setInfoText(text);\r
- \r
- } else {\r
- String text = "";\r
- for (IGraphicsNode mo : mos) {\r
- Position pos;\r
- if (worldCoord) {\r
- pos = mo.getG3DNode(graph).getWorldPosition(); \r
- } else {\r
- pos = mo.getG3DNode(graph).getLocalPosition();\r
- }\r
- Point3d p = G3DTools.getPoint(pos);\r
- p.add(translate);\r
- text += p;\r
- G3DTools.setTuple3(pos, p);\r
- }\r
- if (useConstraints)\r
- text+=detector.getSnapString();\r
- setInfoText(text);\r
- // parent.getGraph().commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- }\r
- updateGizmo(graph);\r
-\r
- }\r
- \r
- protected void updateGizmo(Graph graph) {\r
- List<IGraphicsNode> mos = parent.getSelectionAdapter().getSelectedObjects();\r
- if (mos.size() == 0) {\r
- end();\r
- return;\r
- }\r
- gizmo.update(G3DTools.getVector(mos.get(0).getG3DNode(graph).getWorldPosition()),camera.getCameraPos(),component);\r
- \r
- }\r
- \r
- public void setInfoText(String text) {\r
- \r
- }\r
-\r
-}
\ No newline at end of file