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