1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    TestPickingManagerSeedWidget.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 /*==============================================================================
17 
18   Library: MSVTK
19 
20   Copyright (c) Kitware Inc.
21 
22   Licensed under the Apache License, Version 2.0 (the "License");
23   you may not use this file except in compliance with the License.
24   You may obtain a copy of the License at
25 
26       http://www.apache.org/licenses/LICENSE-2.0.txt
27 
28   Unless required by applicable law or agreed to in writing, software
29   distributed under the License is distributed on an "AS IS" BASIS,
30   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31   See the License for the specific language governing permissions and
32   limitations under the License.
33 
34 ==============================================================================*/
35 
36 //
37 // This example tests the PickingManager using a scene full of seed widgets.
38 // It measures the performances using the Picking manager into differents mode:
39 // * Disabled
40 // * Enabled
41 // * With/Without cache optimization
42 //
43 // The test depends on:
44 // * vtkSeedWidget
45 // * vtkSphereHandleRepresentation
46 //
47 // By default the Picking Manager is enabled.
48 // Press 'Ctrl' to switch the activation of the Picking Manager.
49 // Press 'o' to enable/disable the Optimization on render events.
50 // Press 'Space' to restore the cube
51 
52 // VTK includes
53 #include "vtkCommand.h"
54 #include "vtkHandleWidget.h"
55 #include "vtkInteractorEventRecorder.h"
56 #include "vtkInteractorStyleTrackballCamera.h"
57 #include "vtkNew.h"
58 #include "vtkPickingManager.h"
59 #include "vtkProperty.h"
60 #include "vtkRenderer.h"
61 #include "vtkRendererCollection.h"
62 #include "vtkRenderWindow.h"
63 #include "vtkRenderWindowInteractor.h"
64 #include "vtkSeedRepresentation.h"
65 #include "vtkSeedWidget.h"
66 #include "vtkSmartPointer.h"
67 #include "vtkSphereHandleRepresentation.h"
68 #include "vtkStdString.h"
69 #include "vtkTimerLog.h"
70 
71 // STL includes
72 #include <iostream>
73 #include <fstream>
74 #include <list>
75 
76 const char eventLogTestPickingManagerSeedWidget[] =
77   "# StreamVersion 1 \n"
78   "EnterEvent 570 160 0 0 0 0 0 i\n"
79   "MouseMoveEvent 570 160 0 0 0 0 0 i\n"
80   "MouseMoveEvent 473 164 0 0 0 0 0 i\n"
81   "MouseMoveEvent 442 166 0 0 0 0 0 i\n"
82   "MouseMoveEvent 415 168 0 0 0 0 0 i\n"
83   "MouseMoveEvent 398 171 0 0 0 0 0 i\n"
84   "MouseMoveEvent 376 173 0 0 0 0 0 i\n"
85   "MouseMoveEvent 372 173 0 0 0 0 0 i\n"
86   "MouseMoveEvent 371 173 0 0 0 0 0 i\n"
87   "MouseMoveEvent 370 173 0 0 0 0 0 i\n"
88   "MouseMoveEvent 370 171 0 0 0 0 0 i\n"
89   "MouseMoveEvent 369 169 0 0 0 0 0 i\n"
90   "MouseMoveEvent 368 169 0 0 0 0 0 i\n"
91   "MouseMoveEvent 368 168 0 0 0 0 0 i\n"
92   "MouseMoveEvent 368 167 0 0 0 0 0 i\n"
93   "MouseMoveEvent 367 167 0 0 0 0 0 i\n"
94   "MouseMoveEvent 367 166 0 0 0 0 0 i\n"
95   "MouseMoveEvent 366 165 0 0 0 0 0 i\n"
96   "MouseMoveEvent 366 164 0 0 0 0 0 i\n"
97   "LeftButtonPressEvent 366 164 0 0 0 0 0 i\n"
98   "StartInteractionEvent 366 164 0 0 0 0 0 i\n"
99   "MouseMoveEvent 365 165 0 0 0 0 0 i\n"
100   "MouseMoveEvent 327 185 0 0 0 0 0 i\n"
101   "MouseMoveEvent 321 187 0 0 0 0 0 i\n"
102   "MouseMoveEvent 319 189 0 0 0 0 0 i\n"
103   "MouseMoveEvent 318 190 0 0 0 0 0 i\n"
104   "MouseMoveEvent 316 190 0 0 0 0 0 i\n"
105   "MouseMoveEvent 314 190 0 0 0 0 0 i\n"
106   "MouseMoveEvent 313 191 0 0 0 0 0 i\n"
107   "MouseMoveEvent 312 191 0 0 0 0 0 i\n"
108   "MouseMoveEvent 311 191 0 0 0 0 0 i\n"
109   "MouseMoveEvent 310 191 0 0 0 0 0 i\n"
110   "MouseMoveEvent 309 191 0 0 0 0 0 i\n"
111   "MouseMoveEvent 308 191 0 0 0 0 0 i\n"
112   "MouseMoveEvent 307 191 0 0 0 0 0 i\n"
113   "MouseMoveEvent 306 190 0 0 0 0 0 i\n"
114   "MouseMoveEvent 305 190 0 0 0 0 0 i\n"
115   "MouseMoveEvent 303 190 0 0 0 0 0 i\n"
116   "MouseMoveEvent 302 190 0 0 0 0 0 i\n"
117   "MouseMoveEvent 301 190 0 0 0 0 0 i\n"
118   "MouseMoveEvent 300 189 0 0 0 0 0 i\n"
119   "MouseMoveEvent 299 189 0 0 0 0 0 i\n"
120   "MouseMoveEvent 298 189 0 0 0 0 0 i\n"
121   "MouseMoveEvent 296 188 0 0 0 0 0 i\n"
122   "MouseMoveEvent 295 188 0 0 0 0 0 i\n"
123   "MouseMoveEvent 294 188 0 0 0 0 0 i\n"
124   "MouseMoveEvent 293 188 0 0 0 0 0 i\n"
125   "MouseMoveEvent 291 188 0 0 0 0 0 i\n"
126   "LeftButtonReleaseEvent 291 188 0 0 0 0 0 i\n"
127   "EndInteractionEvent 291 188 0 0 0 0 0 i\n"
128   "MouseMoveEvent 308 205 0 0 0 0 0 i\n"
129   "MouseMoveEvent 363 268 0 0 0 0 0 i\n"
130   "MouseMoveEvent 376 316 0 0 0 0 0 i\n"
131   "MouseMoveEvent 383 343 0 0 0 0 0 i\n"
132   "MouseMoveEvent 392 375 0 0 0 0 0 i\n"
133   "MouseMoveEvent 394 386 0 0 0 0 0 i\n"
134   "MouseMoveEvent 396 399 0 0 0 0 0 i\n"
135   "MouseMoveEvent 398 421 0 0 0 0 0 i\n"
136   "MouseMoveEvent 398 430 0 0 0 0 0 i\n"
137   "MouseMoveEvent 398 437 0 0 0 0 0 i\n"
138   "MouseMoveEvent 396 441 0 0 0 0 0 i\n"
139   "MouseMoveEvent 396 445 0 0 0 0 0 i\n"
140   "MouseMoveEvent 395 445 0 0 0 0 0 i\n"
141   "MouseMoveEvent 395 446 0 0 0 0 0 i\n"
142   "MouseMoveEvent 395 445 0 0 0 0 0 i\n"
143   "MouseMoveEvent 395 443 0 0 0 0 0 i\n"
144   "LeftButtonPressEvent 395 443 0 0 0 0 0 i\n"
145   "StartInteractionEvent 395 443 0 0 0 0 0 i\n"
146   "MouseMoveEvent 395 442 0 0 0 0 0 i\n"
147   "MouseMoveEvent 393 435 0 0 0 0 0 i\n"
148   "MouseMoveEvent 392 433 0 0 0 0 0 i\n"
149   "MouseMoveEvent 392 432 0 0 0 0 0 i\n"
150   "MouseMoveEvent 390 430 0 0 0 0 0 i\n"
151   "MouseMoveEvent 390 429 0 0 0 0 0 i\n"
152   "MouseMoveEvent 389 427 0 0 0 0 0 i\n"
153   "MouseMoveEvent 389 426 0 0 0 0 0 i\n"
154   "MouseMoveEvent 388 426 0 0 0 0 0 i\n"
155   "MouseMoveEvent 387 425 0 0 0 0 0 i\n"
156   "MouseMoveEvent 387 424 0 0 0 0 0 i\n"
157   "MouseMoveEvent 386 423 0 0 0 0 0 i\n"
158   "MouseMoveEvent 385 421 0 0 0 0 0 i\n"
159   "MouseMoveEvent 384 420 0 0 0 0 0 i\n"
160   "MouseMoveEvent 384 419 0 0 0 0 0 i\n"
161   "MouseMoveEvent 384 418 0 0 0 0 0 i\n"
162   "LeftButtonReleaseEvent 384 418 0 0 0 0 0 i\n"
163   "EndInteractionEvent 384 418 0 0 0 0 0 i\n"
164   "MouseMoveEvent 380 400 0 0 0 0 0 i\n"
165   "MouseMoveEvent 368 362 0 0 0 0 0 i\n"
166   "MouseMoveEvent 350 314 0 0 0 0 0 i\n"
167   "MouseMoveEvent 337 295 0 0 0 0 0 i\n"
168   "MouseMoveEvent 315 265 0 0 0 0 0 i\n"
169   "MouseMoveEvent 301 251 0 0 0 0 0 i\n"
170   "MouseMoveEvent 296 246 0 0 0 0 0 i\n"
171   "MouseMoveEvent 293 242 0 0 0 0 0 i\n"
172   "MouseMoveEvent 292 241 0 0 0 0 0 i\n"
173   "MouseMoveEvent 291 240 0 0 0 0 0 i\n"
174   "MouseMoveEvent 291 239 0 0 0 0 0 i\n"
175   "MouseMoveEvent 292 239 0 0 0 0 0 i\n"
176   "MouseMoveEvent 293 239 0 0 0 0 0 i\n"
177   "MouseMoveEvent 296 242 0 0 0 0 0 i\n"
178   "MouseMoveEvent 297 244 0 0 0 0 0 i\n"
179   "MouseMoveEvent 297 248 0 0 0 0 0 i\n"
180   "MouseMoveEvent 297 249 0 0 0 0 0 i\n"
181   "MouseMoveEvent 297 251 0 0 0 0 0 i\n"
182   "LeftButtonPressEvent 297 251 0 0 0 0 0 i\n"
183   "MouseMoveEvent 297 252 0 0 0 0 0 i\n"
184   "MouseMoveEvent 298 253 0 0 0 0 0 i\n"
185   "MouseMoveEvent 301 259 0 0 0 0 0 i\n"
186   "MouseMoveEvent 301 263 0 0 0 0 0 i\n"
187   "MouseMoveEvent 302 265 0 0 0 0 0 i\n"
188   "MouseMoveEvent 305 278 0 0 0 0 0 i\n"
189   "MouseMoveEvent 307 285 0 0 0 0 0 i\n"
190   "MouseMoveEvent 311 301 0 0 0 0 0 i\n"
191   "MouseMoveEvent 314 311 0 0 0 0 0 i\n"
192   "MouseMoveEvent 316 320 0 0 0 0 0 i\n"
193   "MouseMoveEvent 321 336 0 0 0 0 0 i\n"
194   "MouseMoveEvent 327 353 0 0 0 0 0 i\n"
195   "MouseMoveEvent 330 365 0 0 0 0 0 i\n"
196   "MouseMoveEvent 332 371 0 0 0 0 0 i\n"
197   "MouseMoveEvent 332 376 0 0 0 0 0 i\n"
198   "MouseMoveEvent 335 381 0 0 0 0 0 i\n"
199   "MouseMoveEvent 335 382 0 0 0 0 0 i\n"
200   "MouseMoveEvent 336 384 0 0 0 0 0 i\n"
201   "MouseMoveEvent 337 386 0 0 0 0 0 i\n"
202   "MouseMoveEvent 337 389 0 0 0 0 0 i\n"
203   "MouseMoveEvent 337 391 0 0 0 0 0 i\n"
204   "MouseMoveEvent 338 395 0 0 0 0 0 i\n"
205   "MouseMoveEvent 338 397 0 0 0 0 0 i\n"
206   "MouseMoveEvent 339 399 0 0 0 0 0 i\n"
207   "MouseMoveEvent 339 401 0 0 0 0 0 i\n"
208   "MouseMoveEvent 339 402 0 0 0 0 0 i\n"
209   "MouseMoveEvent 338 401 0 0 0 0 0 i\n"
210   "MouseMoveEvent 336 401 0 0 0 0 0 i\n"
211   "LeftButtonReleaseEvent 336 401 0 0 0 0 0 i\n"
212   "MouseMoveEvent 333 395 0 0 0 0 0 i\n"
213   "MouseMoveEvent 332 392 0 0 0 0 0 i\n"
214   "MouseMoveEvent 330 383 0 0 0 0 0 i\n"
215   "MouseMoveEvent 328 377 0 0 0 0 0 i\n"
216   "MouseMoveEvent 325 361 0 0 0 0 0 i\n"
217   "MouseMoveEvent 323 353 0 0 0 0 0 i\n"
218   "MouseMoveEvent 322 346 0 0 0 0 0 i\n"
219   "MouseMoveEvent 319 335 0 0 0 0 0 i\n"
220   "MouseMoveEvent 318 325 0 0 0 0 0 i\n"
221   "MouseMoveEvent 318 317 0 0 0 0 0 i\n"
222   "MouseMoveEvent 317 315 0 0 0 0 0 i\n"
223   "MouseMoveEvent 317 311 0 0 0 0 0 i\n"
224   "MouseMoveEvent 317 308 0 0 0 0 0 i\n"
225   "MouseMoveEvent 317 307 0 0 0 0 0 i\n"
226   "MouseMoveEvent 317 306 0 0 0 0 0 i\n"
227   "MouseMoveEvent 317 305 0 0 0 0 0 i\n"
228   "MouseMoveEvent 317 304 0 0 0 0 0 i\n"
229   "MouseMoveEvent 317 302 0 0 0 0 0 i\n"
230   "LeftButtonPressEvent 317 302 0 0 0 0 0 i\n"
231   "MouseMoveEvent 316 302 0 0 0 0 0 i\n"
232   "MouseMoveEvent 314 302 0 0 0 0 0 i\n"
233   "MouseMoveEvent 310 303 0 0 0 0 0 i\n"
234   "MouseMoveEvent 289 308 0 0 0 0 0 i\n"
235   "MouseMoveEvent 271 316 0 0 0 0 0 i\n"
236   "MouseMoveEvent 243 324 0 0 0 0 0 i\n"
237   "MouseMoveEvent 221 334 0 0 0 0 0 i\n"
238   "MouseMoveEvent 211 341 0 0 0 0 0 i\n"
239   "MouseMoveEvent 205 345 0 0 0 0 0 i\n"
240   "MouseMoveEvent 201 348 0 0 0 0 0 i\n"
241   "MouseMoveEvent 196 352 0 0 0 0 0 i\n"
242   "MouseMoveEvent 192 356 0 0 0 0 0 i\n"
243   "MouseMoveEvent 189 357 0 0 0 0 0 i\n"
244   "MouseMoveEvent 189 358 0 0 0 0 0 i\n"
245   "MouseMoveEvent 188 359 0 0 0 0 0 i\n"
246   "MouseMoveEvent 188 360 0 0 0 0 0 i\n"
247   "MouseMoveEvent 188 361 0 0 0 0 0 i\n"
248   "LeftButtonReleaseEvent 188 361 0 0 0 0 0 i\n"
249   "MouseMoveEvent 188 360 0 0 0 0 0 i\n"
250   "MouseMoveEvent 190 355 0 0 0 0 0 i\n"
251   "MouseMoveEvent 192 350 0 0 0 0 0 i\n"
252   "MouseMoveEvent 194 348 0 0 0 0 0 i\n"
253   "MouseMoveEvent 198 345 0 0 0 0 0 i\n"
254   "MouseMoveEvent 204 340 0 0 0 0 0 i\n"
255   "MouseMoveEvent 207 337 0 0 0 0 0 i\n"
256   "MouseMoveEvent 217 336 0 0 0 0 0 i\n"
257   "MouseMoveEvent 224 328 0 0 0 0 0 i\n"
258   "MouseMoveEvent 226 326 0 0 0 0 0 i\n"
259   "MouseMoveEvent 228 324 0 0 0 0 0 i\n"
260   "MouseMoveEvent 231 321 0 0 0 0 0 i\n"
261   "MouseMoveEvent 232 320 0 0 0 0 0 i\n"
262   "MouseMoveEvent 235 317 0 0 0 0 0 i\n"
263   "MouseMoveEvent 237 315 0 0 0 0 0 i\n"
264   "MouseMoveEvent 240 309 0 0 0 0 0 i\n"
265   "MouseMoveEvent 244 303 0 0 0 0 0 i\n"
266   "MouseMoveEvent 248 299 0 0 0 0 0 i\n"
267   "MouseMoveEvent 249 298 0 0 0 0 0 i\n"
268   "MouseMoveEvent 252 296 0 0 0 0 0 i\n"
269   "MouseMoveEvent 252 295 0 0 0 0 0 i\n"
270   "MouseMoveEvent 254 295 0 0 0 0 0 i\n"
271   "MouseMoveEvent 255 294 0 0 0 0 0 i\n"
272   "MouseMoveEvent 256 294 0 0 0 0 0 i\n"
273   "LeftButtonPressEvent 256 294 0 0 0 0 0 i\n"
274   "MouseMoveEvent 254 294 0 0 0 0 0 i\n"
275   "MouseMoveEvent 252 294 0 0 0 0 0 i\n"
276   "MouseMoveEvent 250 293 0 0 0 0 0 i\n"
277   "MouseMoveEvent 246 293 0 0 0 0 0 i\n"
278   "MouseMoveEvent 244 292 0 0 0 0 0 i\n"
279   "MouseMoveEvent 228 292 0 0 0 0 0 i\n"
280   "MouseMoveEvent 218 292 0 0 0 0 0 i\n"
281   "MouseMoveEvent 185 292 0 0 0 0 0 i\n"
282   "MouseMoveEvent 179 292 0 0 0 0 0 i\n"
283   "MouseMoveEvent 160 292 0 0 0 0 0 i\n"
284   "MouseMoveEvent 155 292 0 0 0 0 0 i\n"
285   "MouseMoveEvent 152 292 0 0 0 0 0 i\n"
286   "MouseMoveEvent 146 292 0 0 0 0 0 i\n"
287   "MouseMoveEvent 142 294 0 0 0 0 0 i\n"
288   "MouseMoveEvent 140 294 0 0 0 0 0 i\n"
289   "MouseMoveEvent 139 294 0 0 0 0 0 i\n"
290   "MouseMoveEvent 138 294 0 0 0 0 0 i\n"
291   "LeftButtonReleaseEvent 138 294 0 0 0 0 0 i\n"
292   "MouseMoveEvent 139 294 0 0 0 0 0 i\n"
293   "MouseMoveEvent 141 294 0 0 0 0 0 i\n"
294   "MouseMoveEvent 142 294 0 0 0 0 0 i\n"
295   "MouseMoveEvent 147 291 0 0 0 0 0 i\n"
296   "MouseMoveEvent 161 287 0 0 0 0 0 i\n"
297   "MouseMoveEvent 167 284 0 0 0 0 0 i\n"
298   "MouseMoveEvent 171 283 0 0 0 0 0 i\n"
299   "MouseMoveEvent 176 280 0 0 0 0 0 i\n"
300   "MouseMoveEvent 197 277 0 0 0 0 0 i\n"
301   "MouseMoveEvent 207 275 0 0 0 0 0 i\n"
302   "MouseMoveEvent 222 271 0 0 0 0 0 i\n"
303   "MouseMoveEvent 258 263 0 0 0 0 0 i\n"
304   "MouseMoveEvent 289 255 0 0 0 0 0 i\n"
305   "MouseMoveEvent 300 251 0 0 0 0 0 i\n"
306   "MouseMoveEvent 320 241 0 0 0 0 0 i\n"
307   "MouseMoveEvent 325 239 0 0 0 0 0 i\n"
308   "MouseMoveEvent 327 238 0 0 0 0 0 i\n"
309   "MouseMoveEvent 327 236 0 0 0 0 0 i\n"
310   "MouseMoveEvent 327 233 0 0 0 0 0 i\n"
311   "MouseMoveEvent 327 232 0 0 0 0 0 i\n"
312   "MouseMoveEvent 327 231 0 0 0 0 0 i\n"
313   "MouseMoveEvent 327 229 0 0 0 0 0 i\n"
314   "MouseMoveEvent 326 229 0 0 0 0 0 i\n"
315   "MouseMoveEvent 326 231 0 0 0 0 0 i\n"
316   "MouseMoveEvent 328 233 0 0 0 0 0 i\n"
317   "MouseMoveEvent 329 233 0 0 0 0 0 i\n"
318   "MouseMoveEvent 333 233 0 0 0 0 0 i\n"
319   "MouseMoveEvent 334 232 0 0 0 0 0 i\n"
320   "MouseMoveEvent 335 227 0 0 0 0 0 i\n"
321   "MouseMoveEvent 336 224 0 0 0 0 0 i\n"
322   "MouseMoveEvent 338 210 0 0 0 0 0 i\n"
323   "MouseMoveEvent 338 208 0 0 0 0 0 i\n"
324   "MouseMoveEvent 337 200 0 0 0 0 0 i\n"
325   "MouseMoveEvent 334 194 0 0 0 0 0 i\n"
326   "MouseMoveEvent 333 193 0 0 0 0 0 i\n"
327   "MouseMoveEvent 333 192 0 0 0 0 0 i\n"
328   "MouseMoveEvent 332 191 0 0 0 0 0 i\n"
329   "MouseMoveEvent 332 190 0 0 0 0 0 i\n"
330   "MiddleButtonPressEvent 332 190 0 0 0 0 0 i\n"
331   "StartInteractionEvent 332 190 0 0 0 0 0 i\n"
332   "MouseMoveEvent 332 191 0 0 0 0 0 i\n"
333   "MouseMoveEvent 332 213 0 0 0 0 0 i\n"
334   "MouseMoveEvent 332 214 0 0 0 0 0 i\n"
335   "MouseMoveEvent 332 215 0 0 0 0 0 i\n"
336   "MiddleButtonReleaseEvent 332 215 0 0 0 0 0 i\n"
337   "EndInteractionEvent 332 215 0 0 0 0 0 i\n"
338   "MouseMoveEvent 348 216 0 0 0 0 0 i\n"
339   "MouseMoveEvent 351 216 0 0 0 0 0 i\n"
340   "MouseMoveEvent 353 216 0 0 0 0 0 i\n"
341   "MouseMoveEvent 357 218 0 0 0 0 0 i\n"
342   "MouseMoveEvent 359 220 0 0 0 0 0 i\n"
343   "MouseMoveEvent 361 222 0 0 0 0 0 i\n"
344   "MouseMoveEvent 363 224 0 0 0 0 0 i\n"
345   "MouseMoveEvent 365 226 0 0 0 0 0 i\n"
346   "MouseMoveEvent 369 232 0 0 0 0 0 i\n"
347   "MouseMoveEvent 372 238 0 0 0 0 0 i\n"
348   "MouseMoveEvent 372 239 0 0 0 0 0 i\n"
349   "MouseMoveEvent 372 238 0 0 0 0 0 i\n"
350   "MouseMoveEvent 371 235 0 0 0 0 0 i\n"
351   "RightButtonPressEvent 372 236 0 0 0 0 0 i\n"
352   "StartInteractionEvent 372 236 0 0 0 0 0 i\n"
353   "MouseMoveEvent 371 234 0 0 0 0 0 i\n"
354   "MouseMoveEvent 368 226 0 0 0 0 0 i\n"
355   "MouseMoveEvent 367 225 0 0 0 0 0 i\n"
356   "MouseMoveEvent 367 225 0 0 0 0 0 i\n"
357   "MouseMoveEvent 366 224 0 0 0 0 0 i\n"
358   "MouseMoveEvent 366 223 0 0 0 0 0 i\n"
359   "MouseMoveEvent 365 222 0 0 0 0 0 i\n"
360   "MouseMoveEvent 365 221 0 0 0 0 0 i\n"
361   "MouseMoveEvent 365 220 0 0 0 0 0 i\n"
362   "MouseMoveEvent 365 219 0 0 0 0 0 i\n"
363   "MouseMoveEvent 365 218 0 0 0 0 0 i\n"
364   "MouseMoveEvent 365 217 0 0 0 0 0 i\n"
365   "MouseMoveEvent 364 217 0 0 0 0 0 i\n"
366   "MouseMoveEvent 364 216 0 0 0 0 0 i\n"
367   "MouseMoveEvent 364 215 0 0 0 0 0 i\n"
368   "MouseMoveEvent 364 214 0 0 0 0 0 i\n"
369   "MouseMoveEvent 364 213 0 0 0 0 0 i\n"
370   "MouseMoveEvent 364 212 0 0 0 0 0 i\n"
371   "MouseMoveEvent 364 211 0 0 0 0 0 i\n"
372   "MouseMoveEvent 364 210 0 0 0 0 0 i\n"
373   "MouseMoveEvent 364 209 0 0 0 0 0 i\n"
374   "RightButtonReleaseEvent 364 209 0 0 0 0 0 i\n"
375   "EndInteractionEvent 364 209 0 0 0 0 0 i\n"
376   "MouseMoveEvent 363 209 0 0 0 0 0 i\n"
377   "MouseMoveEvent 361 206 0 0 0 0 0 i\n"
378   "MouseMoveEvent 359 204 0 0 0 0 0 i\n"
379   "MouseMoveEvent 357 203 0 0 0 0 0 i\n"
380   "MouseMoveEvent 354 199 0 0 0 0 0 i\n"
381   "MouseMoveEvent 352 195 0 0 0 0 0 i\n"
382   "MouseMoveEvent 350 193 0 0 0 0 0 i\n"
383   "MouseMoveEvent 348 191 0 0 0 0 0 i\n"
384   "MouseMoveEvent 346 188 0 0 0 0 0 i\n"
385   "MouseMoveEvent 345 188 0 0 0 0 0 i\n"
386   "LeftButtonPressEvent 345 188 0 0 0 0 0 i\n"
387   "StartInteractionEvent 345 188 0 0 0 0 0 i\n"
388   "MouseMoveEvent 344 187 0 0 0 0 0 i\n"
389   "MouseMoveEvent 338 186 0 0 0 0 0 i\n"
390   "MouseMoveEvent 337 185 0 0 0 0 0 i\n"
391   "MouseMoveEvent 335 184 0 0 0 0 0 i\n"
392   "MouseMoveEvent 334 183 0 0 0 0 0 i\n"
393   "MouseMoveEvent 332 182 0 0 0 0 0 i\n"
394   "MouseMoveEvent 331 182 0 0 0 0 0 i\n"
395   "MouseMoveEvent 329 181 0 0 0 0 0 i\n"
396   "MouseMoveEvent 327 180 0 0 0 0 0 i\n"
397   "MouseMoveEvent 326 179 0 0 0 0 0 i\n"
398   "MouseMoveEvent 325 179 0 0 0 0 0 i\n"
399   "MouseMoveEvent 324 180 0 0 0 0 0 i\n"
400   "MouseMoveEvent 324 179 0 0 0 0 0 i\n"
401   "MouseMoveEvent 323 179 0 0 0 0 0 i\n"
402   "MouseMoveEvent 323 178 0 0 0 0 0 i\n"
403   "MouseMoveEvent 322 178 0 0 0 0 0 i\n"
404   "MouseMoveEvent 321 177 0 0 0 0 0 i\n"
405   "MouseMoveEvent 319 177 0 0 0 0 0 i\n"
406   "MouseMoveEvent 319 176 0 0 0 0 0 i\n"
407   "MouseMoveEvent 317 175 0 0 0 0 0 i\n"
408   "MouseMoveEvent 316 174 0 0 0 0 0 i\n"
409   "MouseMoveEvent 315 172 0 0 0 0 0 i\n"
410   "MouseMoveEvent 314 171 0 0 0 0 0 i\n"
411   "MouseMoveEvent 312 170 0 0 0 0 0 i\n"
412   "MouseMoveEvent 311 168 0 0 0 0 0 i\n"
413   "MouseMoveEvent 310 166 0 0 0 0 0 i\n"
414   "MouseMoveEvent 309 164 0 0 0 0 0 i\n"
415   "MouseMoveEvent 309 163 0 0 0 0 0 i\n"
416   "MouseMoveEvent 307 161 0 0 0 0 0 i\n"
417   "MouseMoveEvent 306 160 0 0 0 0 0 i\n"
418   "MouseMoveEvent 305 158 0 0 0 0 0 i\n"
419   "MouseMoveEvent 305 157 0 0 0 0 0 i\n"
420   "MouseMoveEvent 304 155 0 0 0 0 0 i\n"
421   "MouseMoveEvent 303 154 0 0 0 0 0 i\n"
422   "MouseMoveEvent 302 152 0 0 0 0 0 i\n"
423   "MouseMoveEvent 301 150 0 0 0 0 0 i\n"
424   "MouseMoveEvent 300 149 0 0 0 0 0 i\n"
425   "MouseMoveEvent 299 148 0 0 0 0 0 i\n"
426   "MouseMoveEvent 298 147 0 0 0 0 0 i\n"
427   "MouseMoveEvent 296 145 0 0 0 0 0 i\n"
428   "MouseMoveEvent 295 144 0 0 0 0 0 i\n"
429   "MouseMoveEvent 293 142 0 0 0 0 0 i\n"
430   "MouseMoveEvent 291 140 0 0 0 0 0 i\n"
431   "MouseMoveEvent 290 139 0 0 0 0 0 i\n"
432   "MouseMoveEvent 288 138 0 0 0 0 0 i\n"
433   "MouseMoveEvent 286 136 0 0 0 0 0 i\n"
434   "MouseMoveEvent 286 135 0 0 0 0 0 i\n"
435   "MouseMoveEvent 285 135 0 0 0 0 0 i\n"
436   "MouseMoveEvent 284 134 0 0 0 0 0 i\n"
437   "MouseMoveEvent 283 134 0 0 0 0 0 i\n"
438   "MouseMoveEvent 283 133 0 0 0 0 0 i\n"
439   "LeftButtonReleaseEvent 283 133 0 0 0 0 0 i\n"
440   "EndInteractionEvent 283 133 0 0 0 0 0 i\n"
441   "MouseMoveEvent 284 134 0 0 0 0 0 i\n"
442   "MouseMoveEvent 287 135 0 0 0 0 0 i\n"
443   "MouseMoveEvent 289 135 0 0 0 0 0 i\n"
444   "MouseMoveEvent 291 137 0 0 0 0 0 i\n"
445   "MouseMoveEvent 296 140 0 0 0 0 0 i\n"
446   "MouseMoveEvent 304 148 0 0 0 0 0 i\n"
447   "MouseMoveEvent 310 150 0 0 0 0 0 i\n"
448   "MouseMoveEvent 314 153 0 0 0 0 0 i\n"
449   "MouseMoveEvent 318 157 0 0 0 0 0 i\n"
450   "MouseMoveEvent 325 166 0 0 0 0 0 i\n"
451   "MouseMoveEvent 330 173 0 0 0 0 0 i\n"
452   "MouseMoveEvent 341 187 0 0 0 0 0 i\n"
453   "MouseMoveEvent 345 195 0 0 0 0 0 i\n"
454   "MouseMoveEvent 353 212 0 0 0 0 0 i\n"
455   "KeyPressEvent 353 212 0 0 32 1 space i\n"
456   "CharEvent 353 212 0 0 32 1 space i\n"
457   "KeyReleaseEvent 420 372 0 0 32 1 space i\n"
458   "MouseMoveEvent 284 134 0 0 0 0 0 i\n"
459   ;
460 
461 //------------------------------------------------------------------------------
462 // Press 'Ctrl' to switch the activation of the Picking Manager.
463 // Press 'o' to switch the activation of the optimization based on the render
464 // events.
465 class vtkPickingManagerCallback : public vtkCommand
466 {
467 public:
New()468   static vtkPickingManagerCallback *New()
469     {return new vtkPickingManagerCallback;}
470 
Execute(vtkObject * caller,unsigned long,void *)471   virtual void Execute(vtkObject *caller, unsigned long, void*)
472     {
473     vtkRenderWindowInteractor *iren =
474       static_cast<vtkRenderWindowInteractor*>(caller);
475 
476     // Enable/Disable the PickingManager
477     if((vtkStdString(iren->GetKeySym()) == "Control_L" ||
478        vtkStdString(iren->GetKeySym()) == "Control_R") &&
479        iren->GetPickingManager())
480       {
481       if(!iren->GetPickingManager()->GetEnabled())
482         {
483         std::cout << "PickingManager ON !" << std::endl;
484         iren->GetPickingManager()->EnabledOn();
485         }
486       else
487         {
488         std::cout << "PickingManager OFF !" << std::endl;
489         iren->GetPickingManager()->EnabledOff();
490         }
491       }
492     // Enable/Disable the Optimization on render events.
493     else if (vtkStdString(iren->GetKeySym()) == "o" &&
494              iren->GetPickingManager())
495       {
496       if(!iren->GetPickingManager()->GetOptimizeOnInteractorEvents())
497         {
498         std::cout << "Optimization on Interactor events ON !" << std::endl;
499         iren->GetPickingManager()->SetOptimizeOnInteractorEvents(1);
500         }
501       else
502         {
503         std::cout << "Optimization on Interactor events OFF !" << std::endl;
504         iren->GetPickingManager()->SetOptimizeOnInteractorEvents(0);
505         }
506       }
507     }
508 
vtkPickingManagerCallback()509   vtkPickingManagerCallback() {}
510 };
511 
512 //------------------------------------------------------------------------------
513 // Press 'Space' to reorganize the cube of seeds
514 class vtkPMSCubeCallback : public vtkCommand
515 {
516 public:
New()517   static vtkPMSCubeCallback *New()
518   { return new vtkPMSCubeCallback; }
519 
Execute(vtkObject * caller,unsigned long,void *)520   virtual void Execute(vtkObject *caller, unsigned long, void*)
521   {
522     vtkRenderWindowInteractor *iren =
523       static_cast<vtkRenderWindowInteractor*>(caller);
524 
525     // Reorganize the cube
526     if(vtkStdString(iren->GetKeySym()) == "space")
527       {
528       const int baseCube =
529         static_cast<int>(pow(this->Seeds.size(), 1./3.) / 2 + 0.5);
530       std::list<vtkSmartPointer<vtkHandleWidget> >::iterator it =
531         this->Seeds.begin();
532 
533       for(int i=-baseCube; i<baseCube; ++i)
534         {
535         for(int j=-baseCube; j<baseCube; ++j)
536           {
537           for(int k=-baseCube; k<baseCube; ++k)
538             {
539             vtkSphereHandleRepresentation* newHandleRep =
540                 vtkSphereHandleRepresentation::SafeDownCast(
541                   (*it)->GetRepresentation());
542 
543             double pos[3] = {static_cast<double>(i),
544                              static_cast<double>(j),
545                              static_cast<double>(k)};
546             newHandleRep->SetWorldPosition(pos);
547 
548             ++it;
549             }
550           }
551         }
552       }
553   }
554 
555   std::list<vtkSmartPointer<vtkHandleWidget> > Seeds;
556 };
557 
558 //------------------------------------------------------------------------------
559 // Write timerlog in file
560 // Each time a render event occurs, the correspoding elapsed time is written.
561 class vtkPMSRecordPerfCallback : public vtkCommand
562 {
563 public:
New()564   static vtkPMSRecordPerfCallback *New()
565   { return new vtkPMSRecordPerfCallback; }
566 
vtkPMSRecordPerfCallback()567   vtkPMSRecordPerfCallback()
568   {
569     this->performanceReport.open("pickingManagerPerfs.txt");
570     this->logTime = vtkTimerLog::New();
571   }
572 
~vtkPMSRecordPerfCallback()573   ~vtkPMSRecordPerfCallback()
574   {
575     if (this->performanceReport.is_open())
576       {
577       this->performanceReport << "\n";
578       this->performanceReport.close();
579       }
580 
581     this->logTime->Delete();
582   }
583 
Execute(vtkObject * vtkNotUsed (caller),unsigned long,void *)584   virtual void Execute(vtkObject* vtkNotUsed(caller), unsigned long, void*)
585   {
586     // vtkRenderWindowInteractor *iren =
587     //   static_cast<vtkRenderWindowInteractor*>(caller);
588 
589     // Compute elapsed time
590     double elapsedTime;
591     this->logTime->StopTimer();
592     elapsedTime = this->logTime->GetElapsedTime();
593 
594     if (this->performanceReport.is_open())
595       {
596       // FPS Measurement
597       /*
598       this->performanceReport << "; " <<
599         iren->GetRenderWindow()->GetRenderers()->
600           GetFirstRenderer()->GetLastRenderTimeInSeconds();
601       */
602 
603       // Write delta time
604       this->performanceReport << "; " << elapsedTime;
605       }
606 
607     // Re-start timer
608     this->logTime->StartTimer();
609   }
610 
611   std::ofstream performanceReport;
612   vtkTimerLog* logTime;
613 
614 private:
615   vtkPMSRecordPerfCallback(const vtkPMSRecordPerfCallback&);  //Not implemented
616   void operator=(const vtkPMSRecordPerfCallback&);  //Not implemented
617 };
618 
619 //------------------------------------------------------------------------------
620 // Test Picking Manager with a lot of seeds
621 //------------------------------------------------------------------------------
TestPickingManagerSeedWidget(int vtkNotUsed (argc),char * vtkNotUsed (argv)[])622 int TestPickingManagerSeedWidget(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
623 {
624   // Create the RenderWindow, Renderer and both Actors
625   //
626   vtkNew<vtkRenderer> ren1;
627   vtkNew<vtkRenderWindow> renWin;
628   renWin->AddRenderer(ren1.GetPointer());
629 
630   vtkNew<vtkRenderWindowInteractor> iren;
631   vtkNew<vtkInteractorStyleTrackballCamera> irenStyle;
632   iren->SetRenderWindow(renWin.GetPointer());
633   iren->SetInteractorStyle(irenStyle.GetPointer());
634 
635   /*--------------------------------------------------------------------------*/
636   // PICKING MANAGER
637   /*--------------------------------------------------------------------------*/
638   // Callback to switch between the managed and non-managed mode of the
639   // Picking Manager
640   vtkNew<vtkPickingManagerCallback> callMode;
641   iren->AddObserver(vtkCommand::KeyPressEvent, callMode.GetPointer());
642 
643   /*--------------------------------------------------------------------------*/
644   // SEEDS
645   /*--------------------------------------------------------------------------*/
646   // Representations
647   double pos[3] = {0, 0, 0};
648   vtkNew<vtkSphereHandleRepresentation> handle;
649   //handle->SetHandleSize(15.0);
650   handle->GetProperty()->SetRepresentationToWireframe();
651   handle->GetProperty()->SetColor(1,1,1);
652 
653   vtkNew<vtkSeedRepresentation> seedRepresentation;
654   seedRepresentation->SetHandleRepresentation(handle.GetPointer());
655 
656     // Settings
657   vtkNew<vtkSeedWidget> seedWidget;
658   seedWidget->SetRepresentation(seedRepresentation.GetPointer());
659   seedWidget->SetInteractor(iren.GetPointer());
660   seedWidget->EnabledOn();
661 
662   // Create a cube full of seeds
663   // base correspond to the side of the cube --> (2*base)^3 seeds
664   const int baseCube = 2;
665   std::list <vtkSmartPointer<vtkHandleWidget> > seeds;
666   for(int i=-baseCube; i<baseCube; ++i)
667     {
668     for(int j=-baseCube; j<baseCube; ++j)
669       {
670       for(int k=-baseCube; k<baseCube; ++k)
671         {
672         vtkHandleWidget* newHandle = seedWidget->CreateNewHandle();
673         newHandle->SetEnabled(1);
674         vtkSphereHandleRepresentation* newHandleRep =
675             vtkSphereHandleRepresentation::SafeDownCast(
676               newHandle->GetRepresentation());
677 
678         pos[0] = i;
679         pos[1] = j;
680         pos[2] = k;
681         newHandleRep->GetProperty()->SetRepresentationToWireframe();
682         newHandleRep->GetProperty()->SetColor(1,1,1);
683         newHandleRep->SetWorldPosition(pos);
684 
685         seeds.push_back(newHandle);
686         }
687       }
688     }
689 
690   seedWidget->CompleteInteraction();
691 
692   // Callback to reorganize the cube when space is pressed
693   vtkNew<vtkPMSCubeCallback> reorganizeCallback;
694   reorganizeCallback->Seeds = seeds;
695   iren->AddObserver(vtkCommand::KeyPressEvent, reorganizeCallback.GetPointer());
696 
697   /*--------------------------------------------------------------------------*/
698   // Rendering
699   /*--------------------------------------------------------------------------*/
700   // Add the actors to the renderer, set the background and size
701   ren1->SetBackground(0.1, 0.2, 0.4);
702   renWin->SetSize(600, 600);
703 
704   // Record
705   //iren->GetPickingManager()->EnabledOff();
706   vtkNew<vtkInteractorEventRecorder> recorder;
707   recorder->SetInteractor(iren.GetPointer());
708   recorder->ReadFromInputStringOn();
709   recorder->SetInputString(eventLogTestPickingManagerSeedWidget);
710 
711   // render the image
712   iren->Initialize();
713   double extent[6] = {-7, 7, -7, 7, -1, 1};
714   ren1->ResetCamera(extent);
715   renWin->Render();
716 
717   // Performance Measurements
718   // Callback to write the rendering running time given different configurations
719   // vtkNew<vtkPMSRecordPerfCallback> writePerfsCallback;
720   // iren->AddObserver(vtkCommand::RenderEvent, writePerfsCallback.GetPointer());
721   // writePerfsCallback->logTime->StartTimer();
722 
723   recorder->Play();
724   recorder->Off();
725 
726   // writePerfsCallback->logTime->StopTimer();
727 
728   iren->Start();
729 
730   return EXIT_SUCCESS;
731 }
732