1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    TestImageTracerWidget.cxx
5 
6   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7   All rights reserved.
8   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10      This software is distributed WITHOUT ANY WARRANTY; without even
11      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12      PURPOSE.  See the above copyright notice for more information.
13 
14 =========================================================================*/
15 
16 #include <vtkActor.h>
17 #include <vtkAssemblyPath.h>
18 #include <vtkCamera.h>
19 #include <vtkCubeSource.h>
20 #include <vtkInteractorEventRecorder.h>
21 #include <vtkInteractorStyleTrackballCamera.h>
22 #include <vtkNew.h>
23 #include <vtkObjectFactory.h>
24 #include <vtkPoints.h>
25 #include <vtkPolyData.h>
26 #include <vtkPolyDataMapper.h>
27 #include <vtkPolyDataNormals.h>
28 #include <vtkPolyDataReader.h>
29 #include <vtkPropPicker.h>
30 #include <vtkProperty.h>
31 #include <vtkRenderWindow.h>
32 #include <vtkRenderWindowInteractor.h>
33 #include <vtkRenderer.h>
34 #include <vtkRendererCollection.h>
35 #include <vtkSphereSource.h>
36 
37 bool corner = true;
38 // bool corner = false;
39 
40 double sphereColor[3] = { 0.73, 0.33, 0.83 };
41 double sphereColorPicked[3] = { 1.0, 1., 0.0 };
42 double sphereColor2[3] = { 0.33, 0.73, 0.83 };
43 
44 // Handle mouse events
45 class MouseInteractorStyle2 : public vtkInteractorStyleTrackballCamera
46 {
47 public:
48   static MouseInteractorStyle2* New();
49   vtkTypeMacro(MouseInteractorStyle2, vtkInteractorStyleTrackballCamera);
50 
OnLeftButtonDown()51   void OnLeftButtonDown() override
52   {
53     int* clickPos = this->GetInteractor()->GetEventPosition();
54 
55     vtkRenderWindow* renwin = this->GetInteractor()->GetRenderWindow();
56     vtkRenderer* aren = this->GetInteractor()->FindPokedRenderer(clickPos[0], clickPos[1]);
57 
58     vtkNew<vtkPropPicker> picker2;
59     if (0 != picker2->Pick(clickPos[0], clickPos[1], 0, aren))
60     {
61       vtkAssemblyPath* path = picker2->GetPath();
62       vtkProp* prop = path->GetFirstNode()->GetViewProp();
63       vtkActor* actor = vtkActor::SafeDownCast(prop);
64       actor->GetProperty()->SetColor(sphereColorPicked);
65     }
66     else
67       renwin->SetCurrentCursor(VTK_CURSOR_DEFAULT);
68 
69     renwin->Render();
70   }
71 
72 private:
73 };
74 
75 vtkStandardNewMacro(MouseInteractorStyle2);
76 
InitRepresentation(vtkRenderer * renderer)77 void InitRepresentation(vtkRenderer* renderer)
78 {
79   // Sphere
80   vtkNew<vtkSphereSource> sphereSource;
81   sphereSource->SetPhiResolution(24);
82   sphereSource->SetThetaResolution(24);
83   sphereSource->SetRadius(1.75);
84   sphereSource->Update();
85 
86   vtkNew<vtkActor> sphere;
87   vtkNew<vtkPolyDataMapper> sphereM;
88   sphereM->SetInputConnection(sphereSource->GetOutputPort());
89   sphereM->Update();
90   sphere->SetMapper(sphereM);
91   sphere->GetProperty()->BackfaceCullingOff();
92   sphere->GetProperty()->SetColor(sphereColor);
93   sphere->SetPosition(0, 0, 2);
94   renderer->AddActor(sphere);
95 }
96 
97 const char PropPickerEventLog[] = "# StreamVersion 1.1\n"
98                                   "LeftButtonPressEvent 160 150 0 0 0 0\n"
99                                   "LeftButtonReleaseEvent 160 150 0 0 0 0\n";
100 
TestPropPicker2Renderers(int,char * [])101 int TestPropPicker2Renderers(int, char*[])
102 {
103   vtkNew<vtkRenderer> renderer0;
104   renderer0->SetUseDepthPeeling(1);
105   renderer0->SetMaximumNumberOfPeels(8);
106   renderer0->LightFollowCameraOn();
107   renderer0->TwoSidedLightingOn();
108   renderer0->SetOcclusionRatio(0.0);
109 
110   renderer0->GetActiveCamera()->SetParallelProjection(1);
111 
112   vtkNew<vtkRenderWindow> renWin;
113   renWin->SetAlphaBitPlanes(1);
114   renWin->SetMultiSamples(0);
115   renWin->AddRenderer(renderer0);
116 
117   vtkNew<vtkRenderWindowInteractor> iren;
118   iren->SetRenderWindow(renWin);
119   iren->LightFollowCameraOff();
120 
121   // Set the custom stype to use for interaction.
122   vtkNew<MouseInteractorStyle2> istyle;
123 
124   iren->SetInteractorStyle(istyle);
125 
126   if (corner) // corner
127   {
128     vtkNew<vtkRenderer> renderer1;
129     renderer1->SetViewport(0, 0, 0.1, 0.1);
130     renWin->AddRenderer(renderer1);
131 
132     vtkNew<vtkSphereSource> sphereSource;
133     vtkNew<vtkPolyDataMapper> mapper;
134     mapper->SetInputConnection(sphereSource->GetOutputPort());
135     mapper->Update();
136 
137     vtkNew<vtkActor> actor;
138     actor->PickableOff();
139     actor->SetMapper(mapper);
140     renderer1->AddActor(actor);
141   }
142 
143   {
144     vtkNew<vtkCubeSource> reader;
145     reader->SetXLength(80);
146     reader->SetYLength(50);
147     reader->SetZLength(1);
148     reader->Update();
149 
150     vtkNew<vtkPolyDataNormals> norm;
151     norm->SetInputConnection(reader->GetOutputPort());
152     norm->ComputePointNormalsOn();
153     norm->SplittingOff();
154     norm->Update();
155 
156     vtkNew<vtkPolyDataMapper> mapper;
157     mapper->ScalarVisibilityOff();
158     mapper->SetResolveCoincidentTopologyToPolygonOffset();
159     mapper->SetInputConnection(norm->GetOutputPort());
160     mapper->Update();
161 
162     vtkNew<vtkActor> actor;
163     actor->SetMapper(mapper);
164     actor->GetProperty()->BackfaceCullingOff();
165     actor->GetProperty()->SetColor(0.93, 0.5, 0.5);
166 
167     {
168       renderer0->AddActor(actor);
169 
170       InitRepresentation(renderer0);
171 
172       renderer0->ResetCameraClippingRange();
173       renderer0->ResetCamera();
174 
175       istyle->SetDefaultRenderer(renderer0);
176     }
177 
178     actor->PickableOff();
179   }
180   renWin->SetSize(300, 300);
181 
182   vtkNew<vtkInteractorEventRecorder> recorder;
183   recorder->SetInteractor(iren);
184   recorder->ReadFromInputStringOn();
185   recorder->SetInputString(PropPickerEventLog);
186 
187   renWin->Render();
188   recorder->Play();
189   // Remove the observers so we can go interactive. Without this the "-I"
190   // testing option fails.
191   recorder->Off();
192 
193   iren->Start();
194 
195   return EXIT_SUCCESS;
196 }
197