1 package org.simantics.plant3d.gizmo;
3 import java.util.ArrayList;
4 import java.util.Collection;
8 import javax.vecmath.Point2d;
9 import javax.vecmath.Vector3d;
11 import org.simantics.g3d.scenegraph.RenderListener;
12 import org.simantics.g3d.tools.PluginTools;
13 import org.simantics.g3d.vtk.common.InteractiveVtkPanel;
14 import org.simantics.g3d.vtk.gizmo.vtkGizmo;
15 import org.simantics.g3d.vtk.utils.vtkUtil;
16 import org.simantics.plant3d.Activator;
17 import org.simantics.plant3d.scenegraph.InlineComponent;
18 import org.simantics.plant3d.scenegraph.PipelineComponent;
19 import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.PositionType;
21 import vtk.vtkCellArray;
22 import vtk.vtkFloatArray;
23 import vtk.vtkPNGReader;
25 import vtk.vtkPolyData;
26 import vtk.vtkPolyDataMapper2D;
27 import vtk.vtkPolygon;
29 import vtk.vtkRenderer;
30 import vtk.vtkTexture;
31 import vtk.vtkTexturedActor2D;
33 public class TerminalSelectionGizmo extends vtkGizmo {
37 vtkTexturedActor2D prevProp;
38 vtkTexturedActor2D nextProp;
39 vtkTexturedActor2D middleProp;
41 boolean showPrev = false;
42 boolean showNext = false;
43 boolean showMiddle = false;
45 Vector3d middle = new Vector3d();
46 Vector3d prev = new Vector3d();
47 Vector3d next = new Vector3d();
49 InteractiveVtkPanel panel;
51 private RenderListener listener;
52 public TerminalSelectionGizmo(InteractiveVtkPanel panel) {
54 this.listener = new RenderListener() {
57 public void preRender() {
60 Point2d p = vtkUtil.getScreenCoordinates(getRenderer(), middle);
61 middleProp.SetDisplayPosition((int)p.x, (int)p.y);
64 Point2d p = vtkUtil.getScreenCoordinates(getRenderer(), prev);
65 prevProp.SetDisplayPosition((int)p.x, (int)p.y);
68 Point2d p = vtkUtil.getScreenCoordinates(getRenderer(), next);
69 nextProp.SetDisplayPosition((int)p.x, (int)p.y);
74 public void postRender() {
82 public void attach(Object renderingPart) {
83 if (nextProp == null) {
87 panel.addListener(listener);
89 super.attach(renderingPart);
94 public Collection<vtkProp> getGizmo() {
95 List<vtkProp> list = new ArrayList<vtkProp>();
104 list.add(middleProp);
109 protected void attachActors() {
110 vtkRenderer ren = getRenderer();
112 ren.AddActor(prevProp);
115 ren.AddActor(nextProp);
118 ren.AddActor(middleProp);
124 protected void deattachActors() {
125 panel.removeListener(listener);
126 vtkRenderer ren = getRenderer();
127 ren.RemoveActor(prevProp);
128 ren.RemoveActor(nextProp);
129 ren.RemoveActor(middleProp);
132 public void setComponent(PipelineComponent component, Set<PositionType> allowed) {
133 // showPrev = component.getPrevious() == null;
134 // showNext = component.getNext() == null;
135 // showMiddle = (component instanceof InlineComponent) && !component.getControlPoint().isFixed();
136 showPrev = allowed.contains(PositionType.PREVIOUS);
137 showNext = allowed.contains(PositionType.NEXT);
138 showMiddle = allowed.contains(PositionType.SPLIT);
140 middle = component.getControlPoint().getWorldPosition();
141 component.getControlPoint().getControlPointEnds(prev, next);
145 private void loadData() {
146 String middleTexFile = PluginTools.getAbsolutePath(Activator.getDefault().getBundle(), "icons/middle.png");
147 String plusTexFile = PluginTools.getAbsolutePath(Activator.getDefault().getBundle(), "icons/plus.png");
148 if (middleTexFile == null || plusTexFile == null)
149 throw new RuntimeException("Cannot resolve required image files.");
151 vtkPoints points = new vtkPoints();
152 points.InsertNextPoint(-8, -8, 0.0);
153 points.InsertNextPoint( 8, -8, 0.0);
154 points.InsertNextPoint( 8, 8, 0.0);
155 points.InsertNextPoint(-8, 8, 0.0);
158 vtkCellArray cellArray = new vtkCellArray();
159 vtkPolygon polygon = new vtkPolygon();
160 polygon.GetPointIds().SetNumberOfIds(4);
161 polygon.GetPointIds().SetId(0, 0);
162 polygon.GetPointIds().SetId(1, 1);
163 polygon.GetPointIds().SetId(2, 2);
164 polygon.GetPointIds().SetId(3, 3);
166 cellArray.InsertNextCell(polygon);
168 vtkPolyData quad = new vtkPolyData();
169 quad.SetPoints(points);
170 quad.SetPolys(cellArray);
172 vtkFloatArray texCoords = new vtkFloatArray();
174 texCoords.SetNumberOfComponents(2);
176 texCoords.InsertNextTuple2(0.0, 0.0);
177 texCoords.InsertNextTuple2(1.0, 0.0);
178 texCoords.InsertNextTuple2(1.0, 1.0);
179 texCoords.InsertNextTuple2(0.0, 1.0);
181 quad.GetPointData().SetTCoords(texCoords);
183 vtkPNGReader middleReader = new vtkPNGReader();
184 middleReader.SetFileName(middleTexFile);
186 vtkPNGReader plusReader = new vtkPNGReader();
187 plusReader.SetFileName(plusTexFile);
189 vtkTexture middleTex = new vtkTexture();
190 middleTex.SetInputConnection(middleReader.GetOutputPort());
191 middleTex.SetInterpolate(1);
193 vtkTexture plusTex = new vtkTexture();
194 plusTex.SetInputConnection(plusReader.GetOutputPort());
195 plusTex.SetInterpolate(1);
197 vtkPolyDataMapper2D mapper = new vtkPolyDataMapper2D();
198 mapper.SetInputData(quad);
200 nextProp = new vtkTexturedActor2D();
201 prevProp = new vtkTexturedActor2D();
202 middleProp = new vtkTexturedActor2D();
204 nextProp.SetMapper(mapper);
205 nextProp.SetTexture(plusTex);
206 nextProp.SetPickable(1);
208 prevProp.SetMapper(mapper);
209 prevProp.SetTexture(plusTex);
210 prevProp.SetPickable(1);
212 middleProp.SetMapper(mapper);
213 middleProp.SetTexture(middleTex);
214 middleProp.SetPickable(1);
217 plusReader.GetOutputPort().Delete();
219 middleReader.GetOutputPort().Delete();
220 middleReader.Delete();
225 quad.GetPointData().Delete();
228 polygon.GetPointIds().Delete();
236 public PositionType getPickedPosition(vtkProp[] picked) {
239 for (vtkProp p : picked) {
240 if (p.equals(middleProp))
241 return PositionType.SPLIT;
242 if (p.equals(nextProp))
243 return PositionType.NEXT;
244 if (p.equals(prevProp))
245 return PositionType.PREVIOUS;