00001 /*========================================================================= 00002 00003 Program: Medical Imaging & Interaction Toolkit 00004 Language: C++ 00005 Date: $Date: 2009-05-26 17:32:07 +0200 (Tue, 26 May 2009) $ 00006 Version: $Revision: 17418 $ 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 00019 #ifndef MITKGPUVOLUMEMAPPER3D_H_HEADER_INCLUDED 00020 #define MITKGPUVOLUMEMAPPER3D_H_HEADER_INCLUDED 00021 00022 #include "mitkCommon.h" 00023 #include "MitkExtExports.h" 00024 00025 #include "mitkBaseRenderer.h" 00026 #include "mitkVtkMapper3D.h" 00027 #include "mitkImage.h" 00028 00029 #include <vtkFixedPointVolumeRayCastMapper.h> 00030 #include "vtkMitkVolumeTextureMapper3D.h" 00031 00032 // Only with VTK 5.6 or above 00033 #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) )) 00034 00035 #include "vtkMitkGPUVolumeRayCastMapper.h" 00036 00037 #endif 00038 00039 #include <vtkVolumeProperty.h> 00040 #include <vtkImageChangeInformation.h> 00041 00042 namespace mitk { 00043 00044 /************************************************************************/ 00045 /* Properties that influence the mapper are: 00046 * 00047 * - \b "level window": for the level window of the volume data 00048 * - \b "LookupTable" : for the lookup table of the volume data 00049 * - \b "TransferFunction" (mitk::TransferFunctionProperty): for the used transfer function of the volume data 00050 ************************************************************************/ 00051 00052 //##Documentation 00053 //## @brief Vtk-based mapper for VolumeData 00054 //## 00055 //## @ingroup Mapper 00056 class MitkExt_EXPORT GPUVolumeMapper3D : public VtkMapper3D 00057 { 00058 public: 00059 mitkClassMacro(GPUVolumeMapper3D, VtkMapper3D); 00060 00061 itkNewMacro(Self); 00062 00063 virtual const mitk::Image* GetInput(); 00064 00065 virtual vtkProp *GetVtkProp(mitk::BaseRenderer *renderer); 00066 00067 virtual void ApplyProperties(vtkActor* actor, mitk::BaseRenderer* renderer); 00068 static void SetDefaultProperties(mitk::DataNode* node, mitk::BaseRenderer* renderer = NULL, bool overwrite = false); 00069 00073 virtual bool IsLODEnabled( BaseRenderer *renderer = NULL ) const; 00074 bool IsMIPEnabled( BaseRenderer *renderer = NULL ); 00075 bool IsGPUEnabled( BaseRenderer *renderer = NULL ); 00076 bool IsRAYEnabled( BaseRenderer *renderer = NULL ); 00077 00078 virtual void MitkRenderVolumetricGeometry(mitk::BaseRenderer* renderer); 00079 00080 protected: 00081 00082 GPUVolumeMapper3D(); 00083 virtual ~GPUVolumeMapper3D(); 00084 00085 bool IsRenderable(mitk::BaseRenderer* renderer); 00086 00087 void InitCommon(); 00088 void DeinitCommon(); 00089 00090 void InitCPU(mitk::BaseRenderer* renderer); 00091 void DeinitCPU(mitk::BaseRenderer* renderer); 00092 void GenerateDataCPU(mitk::BaseRenderer* renderer); 00093 00094 bool InitGPU(mitk::BaseRenderer* renderer); 00095 void DeinitGPU(mitk::BaseRenderer* renderer); 00096 void GenerateDataGPU(mitk::BaseRenderer* renderer); 00097 00098 // Only with VTK 5.6 or above 00099 #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) )) 00100 00101 bool InitRAY(mitk::BaseRenderer* renderer); 00102 void DeinitRAY(mitk::BaseRenderer* renderer); 00103 void GenerateDataRAY(mitk::BaseRenderer* renderer); 00104 00105 #endif 00106 00107 virtual void GenerateData(mitk::BaseRenderer* renderer); 00108 00109 void CreateDefaultTransferFunctions(); 00110 void UpdateTransferFunctions( mitk::BaseRenderer *renderer ); 00111 00112 vtkVolume * m_VolumeNULL; 00113 00114 bool m_commonInitialized; 00115 vtkImageChangeInformation* m_UnitSpacingImageFilter; 00116 vtkPiecewiseFunction *m_DefaultOpacityTransferFunction; 00117 vtkPiecewiseFunction *m_DefaultGradientTransferFunction; 00118 vtkColorTransferFunction *m_DefaultColorTransferFunction; 00119 vtkPiecewiseFunction *m_BinaryOpacityTransferFunction; 00120 vtkPiecewiseFunction *m_BinaryGradientTransferFunction; 00121 vtkColorTransferFunction *m_BinaryColorTransferFunction; 00122 00123 class LocalStorage : public mitk::Mapper::BaseLocalStorage 00124 { 00125 public: 00126 00127 bool m_cpuInitialized; 00128 vtkVolume *m_VolumeCPU; 00129 vtkFixedPointVolumeRayCastMapper* m_MapperCPU; 00130 vtkVolumeProperty* m_VolumePropertyCPU; 00131 00132 bool m_gpuSupported; 00133 bool m_gpuInitialized; 00134 vtkVolume *m_VolumeGPU; 00135 vtkMitkVolumeTextureMapper3D* m_MapperGPU; 00136 vtkVolumeProperty* m_VolumePropertyGPU; 00137 00138 // Only with VTK 5.6 or above 00139 #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) )) 00140 00141 bool m_raySupported; 00142 bool m_rayInitialized; 00143 vtkVolume *m_VolumeRAY; 00144 vtkMitkGPUVolumeRayCastMapper* m_MapperRAY; 00145 vtkVolumeProperty* m_VolumePropertyRAY; 00146 00147 #endif 00148 00149 LocalStorage() 00150 { 00151 m_cpuInitialized = false; 00152 00153 m_gpuInitialized = false; 00154 m_gpuSupported = true; // assume initially gpu slicing is supported 00155 00156 // Only with VTK 5.6 or above 00157 #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) )) 00158 m_rayInitialized = false; 00159 m_raySupported = true; // assume initially gpu raycasting is supported 00160 #endif 00161 } 00162 00163 ~LocalStorage() 00164 { 00165 if(m_cpuInitialized) 00166 { 00167 m_VolumeCPU->Delete(); 00168 m_MapperCPU->Delete(); 00169 m_VolumePropertyCPU->Delete(); 00170 m_cpuInitialized=false; 00171 } 00172 00173 if(m_gpuInitialized) 00174 { 00175 m_VolumeGPU->Delete(); 00176 m_MapperGPU->Delete(); 00177 m_VolumePropertyGPU->Delete(); 00178 m_gpuInitialized=false; 00179 } 00180 00181 // Only with VTK 5.6 or above 00182 #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) )) 00183 00184 if(m_rayInitialized) 00185 { 00186 m_VolumeRAY->Delete(); 00187 m_MapperRAY->Delete(); 00188 m_VolumePropertyRAY->Delete(); 00189 m_rayInitialized=false; 00190 } 00191 00192 #endif 00193 00194 } 00195 }; 00196 00197 mitk::Mapper::LocalStorageHandler<LocalStorage> m_LSH; 00198 }; 00199 00200 } // namespace mitk 00201 00202 #endif /* MITKVOLUMEDATAVTKMAPPER3D_H_HEADER_INCLUDED */