1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkPHardwareSelector.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 #include "vtkPHardwareSelector.h"
16
17 #include "vtkCommand.h"
18 #include "vtkObjectFactory.h"
19 #include "vtkRenderWindow.h"
20 #include "vtkRenderer.h"
21
22 class vtkPHardwareSelector::vtkObserver : public vtkCommand
23 {
24 public:
New()25 static vtkObserver* New() { return new vtkObserver(); }
Execute(vtkObject *,unsigned long eventId,void *)26 void Execute(vtkObject*, unsigned long eventId, void*) override
27 {
28 if (eventId == vtkCommand::StartEvent)
29 {
30 this->Target->StartRender();
31 }
32 else if (eventId == vtkCommand::EndEvent)
33 {
34 this->Target->EndRender();
35 }
36 }
37 vtkPHardwareSelector* Target;
38 };
39
40 //------------------------------------------------------------------------------
41 vtkStandardNewMacro(vtkPHardwareSelector);
42
43 //------------------------------------------------------------------------------
vtkPHardwareSelector()44 vtkPHardwareSelector::vtkPHardwareSelector()
45 {
46 this->ProcessIsRoot = false;
47 this->Observer = vtkObserver::New();
48 this->Observer->Target = this;
49 }
50
51 //------------------------------------------------------------------------------
~vtkPHardwareSelector()52 vtkPHardwareSelector::~vtkPHardwareSelector()
53 {
54 this->Observer->Target = nullptr;
55 this->Observer->Delete();
56 }
57
58 //------------------------------------------------------------------------------
CaptureBuffers()59 bool vtkPHardwareSelector::CaptureBuffers()
60 {
61 if (this->ProcessIsRoot)
62 {
63 return this->Superclass::CaptureBuffers();
64 }
65
66 this->InvokeEvent(vtkCommand::StartEvent);
67 this->BeginSelection();
68 vtkRenderWindow* rwin = this->Renderer->GetRenderWindow();
69 rwin->AddObserver(vtkCommand::StartEvent, this->Observer);
70 rwin->AddObserver(vtkCommand::EndEvent, this->Observer);
71
72 for (this->CurrentPass = MIN_KNOWN_PASS; this->CurrentPass < MAX_KNOWN_PASS; this->CurrentPass++)
73 {
74 if (this->PassRequired(this->CurrentPass))
75 {
76 break;
77 }
78 }
79
80 if (this->CurrentPass == MAX_KNOWN_PASS)
81 {
82 this->EndRender();
83 }
84 return false;
85 }
86
87 //------------------------------------------------------------------------------
StartRender()88 void vtkPHardwareSelector::StartRender() {}
89
90 //------------------------------------------------------------------------------
EndRender()91 void vtkPHardwareSelector::EndRender()
92 {
93 this->CurrentPass++;
94 for (; this->CurrentPass < MAX_KNOWN_PASS; this->CurrentPass++)
95 {
96 if (this->PassRequired(this->CurrentPass))
97 {
98 break;
99 }
100 }
101
102 if (this->CurrentPass >= MAX_KNOWN_PASS)
103 {
104 vtkRenderWindow* rwin = this->Renderer->GetRenderWindow();
105 rwin->RemoveObserver(this->Observer);
106 this->EndSelection();
107 this->InvokeEvent(vtkCommand::EndEvent);
108 }
109 }
110
111 //------------------------------------------------------------------------------
PrintSelf(ostream & os,vtkIndent indent)112 void vtkPHardwareSelector::PrintSelf(ostream& os, vtkIndent indent)
113 {
114 this->Superclass::PrintSelf(os, indent);
115 os << indent << "ProcessIsRoot: " << this->ProcessIsRoot << endl;
116 }
117