00001 /*========================================================================= 00002 00003 Program: Medical Imaging & Interaction Toolkit 00004 Language: C++ 00005 Date: $Date: 2010-07-05 09:49:37 +0200 (Mo, 05 Jul 2010) $ 00006 Version: $Revision: 24298 $ 00007 00008 Copyright (c) German Cancer Research Center, Division of Medical and 00009 Biological Informatics. All rights reserved. 00010 See MITKCopyright.txt or https://www.mitk.org/copyright.html for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 00018 00019 #include "mitkRenderWindowBase.h" 00020 #include "mitkDisplayPositionEvent.h" 00021 #include "mitkVtkLayerController.h" 00022 #include "mitkRenderingManager.h" 00023 #include "vtkRenderer.h" 00024 00025 00026 mitk::RenderWindowBase::RenderWindowBase( ) : m_ProcessWheelEvents(true) 00027 { 00028 00029 } 00030 00031 /* 00032 * "Member functions, including virtual functions (10.3), can be called during construction or destruction (12.6.2). When a 00033 * virtual function is called directly or indirectly from a constructor (including from the mem-initializer for a data member) or from 00034 * a destructor, and the object to which the call applies is the object under construction or destruction, the function called is 00035 * the one defined in the constructor or destructor’s own class or in one of its bases, but not a function overriding it in a class 00036 * derived from the constructor or destructor’s class, or overriding it in one of the other base classes of the most derived object[..]" 00037 00038 * or short: within constructors and destructors classes are not polymorph. 00039 */ 00040 void mitk::RenderWindowBase::Initialize( mitk::RenderingManager* renderingManager, const char* name ) 00041 { 00042 if ( renderingManager == NULL ) 00043 { 00044 renderingManager = mitk::RenderingManager::GetInstance(); 00045 } 00046 00047 if(m_Renderer.IsNull()) 00048 { 00049 m_Renderer = mitk::VtkPropRenderer::New( name , GetVtkRenderWindow(), renderingManager ); 00050 } 00051 00052 m_Renderer->InitRenderer(this->GetVtkRenderWindow()); 00053 00054 mitk::BaseRenderer::AddInstance(GetVtkRenderWindow(),m_Renderer); 00055 00056 renderingManager->AddRenderWindow(GetVtkRenderWindow()); 00057 00058 m_RenderProp = vtkMitkRenderProp::New(); 00059 m_RenderProp->SetPropRenderer(m_Renderer); 00060 m_Renderer->GetVtkRenderer()->AddViewProp(m_RenderProp); 00061 00062 if((this->GetVtkRenderWindow()->GetSize()[0] > 10) 00063 && (this->GetVtkRenderWindow()->GetSize()[1] > 10)) 00064 m_Renderer->InitSize(this->GetVtkRenderWindow()->GetSize()[0], this->GetVtkRenderWindow()->GetSize()[1]); 00065 00066 m_InResize = false; 00067 } 00068 00069 void mitk::RenderWindowBase::Destroy() 00070 { 00071 m_Renderer->GetRenderingManager()->RemoveRenderWindow(GetVtkRenderWindow()); 00072 mitk::BaseRenderer::RemoveInstance(GetVtkRenderWindow()); 00073 m_Renderer->GetVtkRenderer()->RemoveViewProp(m_RenderProp); 00074 m_RenderProp->Delete(); 00075 } 00076 00077 mitk::RenderWindowBase::~RenderWindowBase() 00078 { 00079 00080 } 00081 00082 void mitk::RenderWindowBase::mousePressMitkEvent(mitk::MouseEvent *me) 00083 { 00084 if (m_Renderer.IsNotNull()) 00085 m_Renderer->MousePressEvent(me); 00086 } 00087 00088 void mitk::RenderWindowBase::mouseReleaseMitkEvent(mitk::MouseEvent *me) 00089 { 00090 if(m_Renderer.IsNotNull()) 00091 m_Renderer->MouseReleaseEvent(me); 00092 } 00093 00094 void mitk::RenderWindowBase::mouseMoveMitkEvent(mitk::MouseEvent *me) 00095 { 00096 if (m_Renderer.IsNotNull()) 00097 m_Renderer->MouseMoveEvent(me); 00098 } 00099 00100 void mitk::RenderWindowBase::wheelMitkEvent(mitk::WheelEvent *we) 00101 { 00102 if ( !m_ProcessWheelEvents ) 00103 return; 00104 00105 if ( !GetSliceNavigationController()->GetSliceLocked() ) 00106 { 00107 mitk::Stepper* stepper = GetSliceNavigationController()->GetSlice(); 00108 00109 if (stepper->GetSteps() <= 1) 00110 { 00111 stepper = GetSliceNavigationController()->GetTime(); 00112 } 00113 00114 //if (we->orientation() * we->GetDelta() > 0) 00115 if (we->GetDelta() > 0) 00116 { 00117 stepper->Next(); 00118 } 00119 else 00120 { 00121 stepper->Previous(); 00122 } 00123 00124 //also send to Renderer to send if to MITK interaction mechanism 00125 if(m_Renderer.IsNotNull()) 00126 m_Renderer->WheelEvent(we); 00127 00128 } 00129 } 00130 00131 void mitk::RenderWindowBase::keyPressMitkEvent(mitk::KeyEvent* mke) 00132 { 00133 if (m_Renderer.IsNotNull()) 00134 m_Renderer->KeyPressEvent(mke); 00135 } 00136 00137 00138 void mitk::RenderWindowBase::resizeMitkEvent(int width, int height) 00139 { 00140 if(m_InResize) //@FIXME CRITICAL probably related to VtkSizeBug 00141 return; 00142 m_InResize = true; 00143 00144 if(m_Renderer.IsNotNull()) 00145 { 00146 m_Renderer->Resize(width, height); 00147 } 00148 00149 m_InResize = false; 00150 } 00151 00152 00153 mitk::SliceNavigationController * mitk::RenderWindowBase::GetSliceNavigationController() 00154 { 00155 return mitk::BaseRenderer::GetInstance(this->GetVtkRenderWindow())->GetSliceNavigationController(); 00156 } 00157 00158 mitk::CameraRotationController * mitk::RenderWindowBase::GetCameraRotationController() 00159 { 00160 return mitk::BaseRenderer::GetInstance(this->GetVtkRenderWindow())->GetCameraRotationController(); 00161 } 00162 00163 mitk::BaseController * mitk::RenderWindowBase::GetController() 00164 { 00165 mitk::BaseRenderer * renderer = mitk::BaseRenderer::GetInstance(GetVtkRenderWindow()); 00166 switch ( renderer->GetMapperID() ) 00167 { 00168 case mitk::BaseRenderer::Standard2D: 00169 return GetSliceNavigationController(); 00170 00171 case mitk::BaseRenderer::Standard3D: 00172 return GetCameraRotationController(); 00173 00174 default: 00175 return GetSliceNavigationController(); 00176 } 00177 } 00178 00179 mitk::VtkPropRenderer* mitk::RenderWindowBase::GetRenderer() 00180 { 00181 return m_Renderer; 00182 } 00183 00184 00185 00186 void mitk::RenderWindowBase::SetProcessWheelEvents( bool state ) 00187 { 00188 m_ProcessWheelEvents = state; 00189 } 00190 00191 bool mitk::RenderWindowBase::GetProcessWheelEvents() 00192 { 00193 return m_ProcessWheelEvents; 00194 }