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