]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.plant3d/src/org/simantics/plant3d/gizmo/TerminalSelectionGizmo.java
Merge "Publish Plant3D feature"
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / gizmo / TerminalSelectionGizmo.java
1 package org.simantics.plant3d.gizmo;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.List;
6 import java.util.Set;
7
8 import javax.vecmath.Point2d;
9 import javax.vecmath.Vector3d;
10
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;
20
21 import vtk.vtkCellArray;
22 import vtk.vtkFloatArray;
23 import vtk.vtkPNGReader;
24 import vtk.vtkPoints;
25 import vtk.vtkPolyData;
26 import vtk.vtkPolyDataMapper2D;
27 import vtk.vtkPolygon;
28 import vtk.vtkProp;
29 import vtk.vtkRenderer;
30 import vtk.vtkTexture;
31 import vtk.vtkTexturedActor2D;
32
33 public class TerminalSelectionGizmo extends vtkGizmo {
34         
35
36         
37         vtkTexturedActor2D prevProp;
38         vtkTexturedActor2D nextProp;
39         vtkTexturedActor2D middleProp;
40         
41         boolean showPrev = false;
42         boolean showNext = false;
43         boolean showMiddle = false;
44         
45         Vector3d middle = new Vector3d();
46         Vector3d prev = new Vector3d();
47         Vector3d next = new Vector3d();
48         
49         InteractiveVtkPanel panel;
50         
51         private RenderListener listener;
52         public TerminalSelectionGizmo(InteractiveVtkPanel panel) {
53                 this.panel = panel;
54                 this.listener = new RenderListener() {
55                         
56                         @Override
57                         public void preRender() {
58
59                                 if (showMiddle) {
60                                         Point2d p = vtkUtil.getScreenCoordinates(getRenderer(), middle);
61                                         middleProp.SetDisplayPosition((int)p.x, (int)p.y);
62                                 }
63                                 if (showPrev) {
64                                         Point2d p = vtkUtil.getScreenCoordinates(getRenderer(), prev);
65                                         prevProp.SetDisplayPosition((int)p.x, (int)p.y);
66                                 }
67                                 if (showNext) {
68                                         Point2d p = vtkUtil.getScreenCoordinates(getRenderer(), next);
69                                         nextProp.SetDisplayPosition((int)p.x, (int)p.y);
70                                 }
71                         }
72                         
73                         @Override
74                         public void postRender() {
75                                 
76                                 
77                         }
78                 };
79         }
80         
81         @Override
82         public void attach(Object renderingPart) {
83                 if (nextProp == null) {
84                         loadData();
85                         
86                 }
87                 panel.addListener(listener);
88                 
89                 super.attach(renderingPart);
90                 
91         }
92         
93         @Override
94         public Collection<vtkProp> getGizmo() {
95                 List<vtkProp> list = new ArrayList<vtkProp>();
96                 if (showPrev) {
97                         list.add(prevProp);
98                 }
99                 if (showNext) {
100                         list.add(nextProp);
101                         
102                 }
103                 if (showMiddle) {
104                         list.add(middleProp);
105                 }
106                 return list;
107         }
108         
109         protected void attachActors() {
110                 vtkRenderer ren = getRenderer();
111                 if (showPrev) {
112                         ren.AddActor(prevProp);
113                 }
114                 if (showNext) {
115                         ren.AddActor(nextProp);
116                 }
117                 if (showMiddle) {
118                         ren.AddActor(middleProp);
119                 }
120                 
121         }
122         
123         @Override
124         protected void deattachActors() {
125                 panel.removeListener(listener);
126                 vtkRenderer ren = getRenderer();
127                 ren.RemoveActor(prevProp);
128                 ren.RemoveActor(nextProp);
129                 ren.RemoveActor(middleProp);
130         }
131         
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);
139         
140                 middle = component.getControlPoint().getWorldPosition();
141                 component.getControlPoint().getControlPointEnds(prev, next);
142
143         }
144         
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.");
150                 
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);
156                 
157                 
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);
165                 
166                 cellArray.InsertNextCell(polygon);
167                 
168                 vtkPolyData quad = new vtkPolyData();
169                 quad.SetPoints(points);
170                 quad.SetPolys(cellArray);
171                 
172                 vtkFloatArray texCoords = new vtkFloatArray();
173                 
174                 texCoords.SetNumberOfComponents(2);
175                 
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);
180                 
181                 quad.GetPointData().SetTCoords(texCoords);
182
183                 vtkPNGReader middleReader = new vtkPNGReader();
184                 middleReader.SetFileName(middleTexFile);
185                 
186                 vtkPNGReader plusReader = new vtkPNGReader();
187                 plusReader.SetFileName(plusTexFile);
188                 
189                 vtkTexture middleTex = new vtkTexture();
190                 middleTex.SetInputConnection(middleReader.GetOutputPort());
191                 middleTex.SetInterpolate(1);
192                 
193                 vtkTexture plusTex = new vtkTexture();
194                 plusTex.SetInputConnection(plusReader.GetOutputPort());
195                 plusTex.SetInterpolate(1);
196                 
197                 vtkPolyDataMapper2D mapper = new vtkPolyDataMapper2D();
198                 mapper.SetInput(quad);
199
200                 nextProp = new vtkTexturedActor2D();
201                 prevProp = new vtkTexturedActor2D();
202                 middleProp = new vtkTexturedActor2D();
203                 
204                 nextProp.SetMapper(mapper);
205                 nextProp.SetTexture(plusTex);
206                 nextProp.SetPickable(1);
207                 
208                 prevProp.SetMapper(mapper);
209                 prevProp.SetTexture(plusTex);
210                 prevProp.SetPickable(1);
211                 
212                 middleProp.SetMapper(mapper);
213                 middleProp.SetTexture(middleTex);
214                 middleProp.SetPickable(1);
215                 
216                 
217                 plusReader.GetOutputPort().Delete();
218                 plusReader.Delete();
219                 middleReader.GetOutputPort().Delete();
220                 middleReader.Delete();
221                 middleTex.Delete();
222                 plusTex.Delete();
223                 
224                 mapper.Delete();
225                 quad.GetPointData().Delete();
226                 quad.Delete();
227                 points.Delete();
228                 polygon.GetPointIds().Delete();
229                 polygon.Delete();
230                 cellArray.Delete();
231                 texCoords.Delete();
232                 
233         }
234         
235         
236         public PositionType getPickedPosition(vtkProp[] picked) {
237                 if (picked == null)
238                         return null;
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;
246                 }
247                 return null;
248         }
249         
250
251 }