00001 /*========================================================================= 00002 00003 Program: Medical Imaging & Interaction Toolkit 00004 Language: C++ 00005 Date: $Date$ 00006 Version: $Revision$ 00007 00008 Copyright (c) German Cancer Research Center, Division of Medical and 00009 Biological Informatics. All rights reserved. 00010 See MITKCopyright.txt or http://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 #include "mitkCameraRotationController.h" 00019 00020 #include <vtkCamera.h> 00021 #include <itkCommand.h> 00022 #include <vtkRenderer.h> 00023 #include <vtkRenderWindow.h> 00024 00025 #include "mitkVtkPropRenderer.h" 00026 #include "mitkRenderingManager.h" 00027 00028 mitk::CameraRotationController::CameraRotationController(const char * type) 00029 : BaseController(type), m_LastStepperValue(180), m_Camera(NULL), m_RenderWindow(NULL) 00030 { 00031 m_Slice->SetAutoRepeat(true); 00032 m_Slice->SetSteps(360); 00033 m_Slice->SetPos(180); 00034 00035 itk::SimpleMemberCommand<CameraRotationController>::Pointer sliceStepperChangedCommand, timeStepperChangedCommand; 00036 sliceStepperChangedCommand = itk::SimpleMemberCommand<CameraRotationController>::New(); 00037 sliceStepperChangedCommand->SetCallbackFunction(this, &CameraRotationController::RotateCamera); 00038 00039 m_Slice->AddObserver(itk::ModifiedEvent(), sliceStepperChangedCommand); 00040 } 00041 00042 mitk::CameraRotationController::~CameraRotationController() 00043 { 00044 } 00045 00046 void mitk::CameraRotationController::RotateCamera() 00047 { 00048 if (!m_Camera) 00049 { 00050 this->AcquireCamera(); 00051 } 00052 00053 if (m_Camera) 00054 { 00055 int newStepperValue = m_Slice->GetPos(); 00056 m_Camera->Azimuth( m_LastStepperValue - newStepperValue ); 00057 m_LastStepperValue = newStepperValue; 00058 //const_cast< RenderWindow* >(m_RenderWindow)->RequestUpdate(); // TODO does not work with movie generator! 00059 mitk::RenderingManager::GetInstance()->RequestUpdate(m_RenderWindow); 00060 //m_MultiWidget->RequestUpdate(); 00061 } 00062 } 00063 00064 void mitk::CameraRotationController::AcquireCamera() 00065 { 00066 BaseRenderer* renderer = mitk::BaseRenderer::GetInstance(m_RenderWindow); 00067 00068 const mitk::VtkPropRenderer *propRenderer = dynamic_cast<const mitk::VtkPropRenderer * >( renderer ); 00069 if (propRenderer) 00070 { 00071 // get vtk renderer 00072 vtkRenderer* vtkrenderer = propRenderer->GetVtkRenderer(); 00073 if (vtkrenderer) 00074 { 00075 // get vtk camera 00076 vtkCamera* vtkcam = vtkrenderer->GetActiveCamera(); 00077 if (vtkcam) 00078 { 00079 // vtk smart pointer handling 00080 if (!m_Camera) 00081 { 00082 m_Camera = vtkcam; 00083 m_Camera->Register( NULL ); 00084 } 00085 else 00086 { 00087 m_Camera->UnRegister( NULL ); 00088 m_Camera = vtkcam; 00089 m_Camera->Register( NULL ); 00090 } 00091 } 00092 } 00093 } 00094 } 00095 00096 bool mitk::CameraRotationController::ExecuteAction( 00097 Action*, mitk::StateEvent const*) 00098 { 00099 return false; 00100 }