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