Fraxinus  18.10
An IGT application
cxViewportListener.cpp
Go to the documentation of this file.
1 /*=========================================================================
2 This file is part of CustusX, an Image Guided Therapy Application.
3 
4 Copyright (c) SINTEF Department of Medical Technology.
5 All rights reserved.
6 
7 CustusX is released under a BSD 3-Clause license.
8 
9 See Lisence.txt (https://github.com/SINTEFMedtek/CustusX/blob/master/License.txt) for details.
10 =========================================================================*/
11 #include "cxViewportListener.h"
12 #include "vtkRenderer.h"
13 #include "cxVector3D.h"
14 #include "vtkCamera.h"
15 #include "vtkCommand.h"
16 #include "cxLogger.h"
17 
18 namespace cx
19 {
20 
21 class ViewportObserverPrivate : public vtkCommand
22 {
23 public:
26  void SetBase(ViewportListenerBase* base) {mBase = base;}
27  virtual void Execute(vtkObject* caller, unsigned long, void*)
28  {
29  if (mBase)
30  mBase->callback();
31  }
33 };
34 
35 
37 {
38 
39 }
40 
42 {
43 // this->stopListen();
44 }
45 
47 {
48  mRenderer = renderer;
49 
50  // turn on observer
51  if (!mObserver)
52  {
53  mObserver = ViewportObserverPrivatePtr::New();
54  mObserver->SetBase(this);
55  this->addObservers();
56 // mRenderer->GetActiveCamera()->AddObserver(vtkCommand::ModifiedEvent, mObserver); // needed during startup
57 // mRenderer->AddObserver(vtkCommand::ModifiedEvent, mObserver); // camera changes, viewport changes
58 // mRenderer->AddObserver(vtkCommand::ActiveCameraEvent, mObserver);
59 // mRenderer->AddObserver(vtkCommand::ResetCameraEvent, mObserver);
60  // mRenderer->AddObserver(vtkCommand::CreateCameraEvent, mObserver);
61  // mRenderer->AddObserver(vtkCommand::LeaveEvent, mObserver);
62  }
63 }
64 
65 
67 {
68  // turn off observer
69  if (mObserver)
70  {
71  mObserver->SetBase(NULL);
72  this->removeObservers();
73 
74 // mRenderer->GetActiveCamera()->RemoveObserver(mObserver);
75 // mRenderer->RemoveObserver(mObserver);
76 
77 // if (mRenderer->GetActiveCamera()->HasObserver(vtkCommand::ModifiedEvent, mObserver))
78 // std::cout << "ERROR camera vtkCommand::ModifiedEvent" << std::endl;
79 // if (mRenderer->HasObserver(vtkCommand::ModifiedEvent, mObserver))
80 // std::cout << "ERROR vtkCommand::ModifiedEvent" << std::endl;
81 // if (mRenderer->HasObserver(vtkCommand::ActiveCameraEvent, mObserver))
82 // std::cout << "ERROR vtkCommand::ActiveCameraEvent" << std::endl;
83 // if (mRenderer->HasObserver(vtkCommand::ResetCameraEvent, mObserver))
84 // std::cout << "ERROR vtkCommand::ResetCameraEvent" << std::endl;
85 
86  mObserver = 0;
87  }
88 }
89 
91 {
92  return mObserver!=0;
93 }
94 
95 void ViewportListenerBase::setCallback(boost::function<void ()> func)
96 {
97  mCallback = func;
98 }
99 
101 {
102  if (mCallback)
103  mCallback();
104 }
105 
111 {
112  vtkCameraPtr camera = mRenderer->GetActiveCamera();
113  Vector3D p_f(camera->GetFocalPoint());
114  return this->getVpnZoom(p_f);
115 }
116 
126 {
127  if (!mRenderer)
128  {
129  reportError("No renderer set, using zoom=1");
130  return 1;
131  }
132  // use the focal point and focal point + vup.
133  // Transform both to view space and remove z-coord.
134  // The distance between then in the view plane can
135  // be used to rescale the text.
136  vtkCameraPtr camera = mRenderer->GetActiveCamera();
137  Vector3D p_f(focalPoint);
138  Vector3D vup(camera->GetViewUp());
139  Vector3D p_fup = p_f+vup;
140 
141  mRenderer->WorldToView(p_f[0],p_f[1],p_f[2]);
142  mRenderer->WorldToView(p_fup[0],p_fup[1],p_fup[2]);
143  p_f[2] = 0;
144  p_fup[2] = 0;
145  double size = (p_f - p_fup).length()/2.0;
146  return size;
147 }
148 
149 //---------------------------------------------------------
150 //---------------------------------------------------------
151 //---------------------------------------------------------
152 
154 {
155  mRenderer->GetActiveCamera()->AddObserver(vtkCommand::ModifiedEvent, mObserver); // needed during startup
156  mRenderer->AddObserver(vtkCommand::ModifiedEvent, mObserver); // camera changes, viewport changes
157  mRenderer->AddObserver(vtkCommand::ActiveCameraEvent, mObserver);
158  mRenderer->AddObserver(vtkCommand::ResetCameraEvent, mObserver);
159 }
161 {
162  mRenderer->GetActiveCamera()->RemoveObserver(mObserver);
163  mRenderer->RemoveObserver(mObserver);
164 }
165 
167 {
168  this->stopListen();
169 }
170 
171 //---------------------------------------------------------
172 //---------------------------------------------------------
173 //---------------------------------------------------------
174 
176 {
177 }
178 
180 {
181  mModified = true;
182 }
183 
185 {
186  if (!mModified)
187  return;
189  mModified = false;
190 }
191 
193 {
194  mRenderer->AddObserver(vtkCommand::StartEvent, mObserver, 1.0);
195 }
197 {
198  mRenderer->RemoveObserver(mObserver);
199 }
200 
202 {
203  this->stopListen();
204 }
205 
206 }
ViewportListenerBase * mBase
void reportError(QString msg)
Definition: cxLogger.cpp:71
virtual void removeObservers()
ViewportObserverPrivatePtr mObserver
virtual void Execute(vtkObject *caller, unsigned long, void *)
void setCallback(boost::function< void()> func)
vtkSmartPointer< class vtkRenderer > vtkRendererPtr
Base class for listening to a vtkRenderer.
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
Definition: cxVector3D.h:42
RealScalar length() const
static ViewportObserverPrivate * New()
void SetBase(ViewportListenerBase *base)
void startListen(vtkRendererPtr renderer)
vtkSmartPointer< class vtkCamera > vtkCameraPtr
Namespace for all CustusX production code.