00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <mitkGL.h>
00020 #include "mitkUnstructuredGridMapper2D.h"
00021
00022 #include "mitkBaseRenderer.h"
00023 #include "mitkPlaneGeometry.h"
00024 #include "mitkUnstructuredGrid.h"
00025 #include "mitkTransferFunction.h"
00026 #include "mitkTransferFunctionProperty.h"
00027 #include "mitkColorProperty.h"
00028 #include "mitkVtkScalarModeProperty.h"
00029 #include "mitkProperties.h"
00030 #include "mitkAbstractTransformGeometry.h"
00031 #include "mitkVtkMapper3D.h"
00032
00033 #include <vtkPointSetSlicer.h>
00034 #include <vtkUnstructuredGrid.h>
00035 #include <vtkPlane.h>
00036 #include <vtkCellArray.h>
00037 #include <vtkLookupTable.h>
00038 #include <vtkPointData.h>
00039 #include <vtkCellData.h>
00040 #include <vtkLinearTransform.h>
00041 #include <vtkVolume.h>
00042 #include <vtkAssembly.h>
00043 #include <vtkVolumeProperty.h>
00044 #include <vtkAbstractMapper3D.h>
00045 #include <vtkAbstractVolumeMapper.h>
00046 #include <vtkScalarsToColors.h>
00047 #include <vtkPiecewiseFunction.h>
00048 #include <vtkColorTransferFunction.h>
00049 #include <vtkProp3DCollection.h>
00050
00051
00052 void mitk::UnstructuredGridMapper2D::GenerateData()
00053 {
00054 mitk::DataNode::ConstPointer node = this->GetDataNode();
00055 if ( node.IsNull() )
00056 return;
00057
00058
00059 if (!node->GetProperty(m_ScalarMode, "scalar mode"))
00060 {
00061 m_ScalarMode = mitk::VtkScalarModeProperty::New(0);
00062 }
00063
00064 if (!node->GetProperty(m_ScalarVisibility, "scalar visibility"))
00065 {
00066 m_ScalarVisibility = mitk::BoolProperty::New(true);
00067 }
00068
00069 if (!node->GetProperty(m_Outline, "outline polygons"))
00070 {
00071 m_Outline = mitk::BoolProperty::New(false);
00072 }
00073
00074 if (!node->GetProperty(m_Color, "color"))
00075 {
00076 m_Color = mitk::ColorProperty::New(1.0f, 1.0f, 1.0f);
00077 }
00078
00079 if (!node->GetProperty(m_LineWidth, "line width"))
00080 {
00081 m_LineWidth = mitk::IntProperty::New(1);
00082 }
00083
00084 }
00085
00086 void mitk::UnstructuredGridMapper2D::GenerateData( mitk::BaseRenderer* renderer )
00087 {
00088 mitk::BaseData::Pointer input = const_cast<mitk::BaseData*>( this->GetData() );
00089 assert( input );
00090
00091 input->Update();
00092
00093 if (m_VtkPointSet) m_VtkPointSet->UnRegister(0);
00094 m_VtkPointSet = this->GetVtkPointSet(renderer);
00095 assert(m_VtkPointSet);
00096 m_VtkPointSet->Register(0);
00097
00098 if (m_ScalarVisibility->GetValue())
00099 {
00100 mitk::DataNode::ConstPointer node = this->GetDataNode();
00101 mitk::TransferFunctionProperty::Pointer transferFuncProp;
00102 node->GetProperty(transferFuncProp, "TransferFunction", renderer);
00103 if (transferFuncProp.IsNotNull())
00104 {
00105 mitk::TransferFunction::Pointer tf = transferFuncProp->GetValue();
00106 if (m_ScalarsToColors) m_ScalarsToColors->UnRegister(0);
00107 m_ScalarsToColors = static_cast<vtkScalarsToColors*>(tf->GetColorTransferFunction());
00108 m_ScalarsToColors->Register(0);
00109
00110 if (m_ScalarsToOpacity) m_ScalarsToOpacity->UnRegister(0);
00111 m_ScalarsToOpacity = tf->GetScalarOpacityFunction();
00112 m_ScalarsToOpacity->Register(0);
00113 }
00114 else
00115 {
00116 if (m_ScalarsToColors) m_ScalarsToColors->UnRegister(0);
00117 m_ScalarsToColors = this->GetVtkLUT(renderer);
00118 assert(m_ScalarsToColors);
00119 m_ScalarsToColors->Register(0);
00120
00121 float opacity;
00122 node->GetOpacity(opacity, renderer);
00123 if (m_ScalarsToOpacity) m_ScalarsToOpacity->UnRegister(0);
00124 m_ScalarsToOpacity = vtkPiecewiseFunction::New();
00125 double range[2];
00126 m_VtkPointSet->GetScalarRange(range);
00127 m_ScalarsToOpacity->AddSegment(range[0], opacity, range[1], opacity);
00128 }
00129 }
00130 }
00131
00132 void mitk::UnstructuredGridMapper2D::Paint( mitk::BaseRenderer* renderer )
00133 {
00134 if ( IsVisible( renderer ) == false )
00135 return ;
00136
00137 vtkLinearTransform * vtktransform = GetDataNode()->GetVtkTransform();
00138 vtkLinearTransform * inversetransform = vtktransform->GetLinearInverse();
00139
00140 Geometry2D::ConstPointer worldGeometry = renderer->GetCurrentWorldGeometry2D();
00141 PlaneGeometry::ConstPointer worldPlaneGeometry = dynamic_cast<const PlaneGeometry*>( worldGeometry.GetPointer() );
00142
00143 Point3D point;
00144 Vector3D normal;
00145
00146 if(worldPlaneGeometry.IsNotNull())
00147 {
00148
00149 point=worldPlaneGeometry->GetOrigin();
00150 normal=worldPlaneGeometry->GetNormal(); normal.Normalize();
00151 m_Plane->SetTransform((vtkAbstractTransform*)NULL);
00152 }
00153 else
00154 {
00155
00156 return;
00157 AbstractTransformGeometry::ConstPointer worldAbstractGeometry = dynamic_cast<const AbstractTransformGeometry*>(renderer->GetCurrentWorldGeometry2D());
00158 if(worldAbstractGeometry.IsNotNull())
00159 {
00160
00161 point=const_cast<mitk::BoundingBox*>(worldAbstractGeometry->GetParametricBoundingBox())->GetMinimum();
00162 FillVector3D(normal, 0, 0, 1);
00163 m_Plane->SetTransform(worldAbstractGeometry->GetVtkAbstractTransform()->GetInverse());
00164 }
00165 else
00166 return;
00167 }
00168
00169 vtkFloatingPointType vp[ 3 ], vnormal[ 3 ];
00170
00171 vnl2vtk(point.Get_vnl_vector(), vp);
00172 vnl2vtk(normal.Get_vnl_vector(), vnormal);
00173
00174
00175
00176
00177
00178 inversetransform->TransformPoint( vp, vp );
00179 inversetransform->TransformNormalAtPoint( vp, vnormal, vnormal );
00180
00181 m_Plane->SetOrigin( vp );
00182 m_Plane->SetNormal( vnormal );
00183
00184
00185 m_Slicer->SetInput( m_VtkPointSet );
00186
00187
00188
00189
00190 m_Slicer->Update();
00191
00192
00193 mitk::DisplayGeometry::Pointer displayGeometry = renderer->GetDisplayGeometry();
00194 assert( displayGeometry );
00195
00196
00197
00198 ApplyProperties( renderer );
00199
00200
00201 vtkPolyData * contour = m_Slicer->GetOutput();
00202
00203 vtkPoints *vpoints = contour->GetPoints();
00204 vtkCellArray *vlines = contour->GetLines();
00205 vtkCellArray *vpolys = contour->GetPolys();
00206 vtkPointData *vpointdata = contour->GetPointData();
00207 vtkDataArray* vscalars = vpointdata->GetScalars();
00208
00209 vtkCellData *vcelldata = contour->GetCellData();
00210 vtkDataArray* vcellscalars = vcelldata->GetScalars();
00211
00212 const int numberOfLines = contour->GetNumberOfLines();
00213 const int numberOfPolys = contour->GetNumberOfPolys();
00214
00215 const bool useCellData = m_ScalarMode->GetVtkScalarMode() == VTK_SCALAR_MODE_DEFAULT ||
00216 m_ScalarMode->GetVtkScalarMode() == VTK_SCALAR_MODE_USE_CELL_DATA;
00217 const bool usePointData = m_ScalarMode->GetVtkScalarMode() == VTK_SCALAR_MODE_USE_POINT_DATA;
00218
00219 Point3D p;
00220 Point2D p2d;
00221
00222 vlines->InitTraversal();
00223 vpolys->InitTraversal();
00224
00225 mitk::Color outlineColor = m_Color->GetColor();
00226
00227 glLineWidth((float)m_LineWidth->GetValue());
00228
00229 for (int i = 0;i < numberOfLines;++i )
00230 {
00231 vtkIdType *cell(0);
00232 vtkIdType cellSize(0);
00233
00234 vlines->GetNextCell( cellSize, cell );
00235
00236 float rgba[4] = {outlineColor[0], outlineColor[1], outlineColor[2], 1.0f};
00237 if (m_ScalarVisibility->GetValue() && vcellscalars)
00238 {
00239 if ( useCellData )
00240 {
00241 double scalar = vcellscalars->GetComponent( i, 0 );
00242 double rgb[3] = { 1.0f, 1.0f, 1.0f };
00243 m_ScalarsToColors->GetColor(scalar, rgb);
00244 rgba[0] = (float)rgb[0];
00245 rgba[1] = (float)rgb[1];
00246 rgba[2] = (float)rgb[2];
00247 rgba[3] = (float)m_ScalarsToOpacity->GetValue(scalar);
00248 }
00249 else if ( usePointData )
00250 {
00251 double scalar = vscalars->GetComponent( i, 0 );
00252 double rgb[3] = { 1.0f, 1.0f, 1.0f };
00253 m_ScalarsToColors->GetColor(scalar, rgb);
00254 rgba[0] = (float)rgb[0];
00255 rgba[1] = (float)rgb[1];
00256 rgba[2] = (float)rgb[2];
00257 rgba[3] = (float)m_ScalarsToOpacity->GetValue(scalar);
00258 }
00259 }
00260
00261 glColor4fv( rgba );
00262
00263 glBegin ( GL_LINE_LOOP );
00264 for ( int j = 0;j < cellSize;++j )
00265 {
00266 vpoints->GetPoint( cell[ j ], vp );
00267
00268 vtktransform->TransformPoint( vp, vp );
00269
00270 vtk2itk( vp, p );
00271
00272
00273 worldGeometry->Map( p, p2d );
00274
00275
00276 displayGeometry->WorldToDisplay( p2d, p2d );
00277
00278
00279
00280
00281
00282 glVertex2f( p2d[0], p2d[1] );
00283 }
00284 glEnd ();
00285
00286 }
00287
00288 bool polyOutline = m_Outline->GetValue();
00289 bool scalarVisibility = m_ScalarVisibility->GetValue();
00290
00291
00292
00293 if ((scalarVisibility && vcellscalars) || polyOutline)
00294 {
00295 glEnable(GL_BLEND);
00296 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00297 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00298
00299
00300
00301
00302
00303 Point2D cachedPoints[10];
00304
00305 for (int i = 0;i < numberOfPolys;++i )
00306 {
00307 vtkIdType *cell(0);
00308 vtkIdType cellSize(0);
00309
00310 vpolys->GetNextCell( cellSize, cell );
00311
00312 float rgba[4] = {1.0f, 1.0f, 1.0f, 0};
00313 if (scalarVisibility && vcellscalars)
00314 {
00315 if ( useCellData )
00316 {
00317 double scalar = vcellscalars->GetComponent( i, 0 );
00318 double rgb[3] = { 1.0f, 1.0f, 1.0f };
00319 m_ScalarsToColors->GetColor(scalar, rgb);
00320 rgba[0] = (float)rgb[0];
00321 rgba[1] = (float)rgb[1];
00322 rgba[2] = (float)rgb[2];
00323 rgba[3] = (float)m_ScalarsToOpacity->GetValue(scalar);
00324 }
00325 else if ( usePointData )
00326 {
00327 double scalar = vscalars->GetComponent( i, 0 );
00328 double rgb[3] = { 1.0f, 1.0f, 1.0f };
00329 m_ScalarsToColors->GetColor(scalar, rgb);
00330 rgba[0] = (float)rgb[0];
00331 rgba[1] = (float)rgb[1];
00332 rgba[2] = (float)rgb[2];
00333 rgba[3] = (float)m_ScalarsToOpacity->GetValue(scalar);
00334 }
00335 }
00336 glColor4fv( rgba );
00337
00338 glBegin( GL_POLYGON );
00339 for (int j = 0; j < cellSize; ++j)
00340 {
00341 vpoints->GetPoint( cell[ j ], vp );
00342
00343 vtktransform->TransformPoint( vp, vp );
00344
00345 vtk2itk( vp, p );
00346
00347
00348 worldGeometry->Map( p, p2d );
00349
00350
00351 displayGeometry->WorldToDisplay( p2d, p2d );
00352
00353
00354
00355
00356 cachedPoints[j][0] = p2d[0];
00357 cachedPoints[j][1] = p2d[1];
00358
00359
00360 glVertex2f( p2d[0], p2d[1] );
00361 }
00362 glEnd();
00363
00364 if (polyOutline)
00365 {
00366 glColor4f(outlineColor[0], outlineColor[1], outlineColor[2], 1.0f);
00367
00368 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
00369 glBegin( GL_POLYGON );
00370
00371 for (int j = 0; j < cellSize; ++j)
00372 {
00373
00374 glVertex2f( cachedPoints[j][0], cachedPoints[j][1] );
00375 }
00376 glEnd();
00377 }
00378 }
00379 glDisable(GL_BLEND);
00380 }
00381 }
00382
00383
00384 vtkAbstractMapper3D*
00385 mitk::UnstructuredGridMapper2D
00386 ::GetVtkAbstractMapper3D(mitk::BaseRenderer * renderer)
00387 {
00388
00389 mitk::DataNode::ConstPointer node = this->GetDataNode();
00390 if ( node.IsNull() )
00391 return 0;
00392
00393 mitk::VtkMapper3D::Pointer mitkMapper = dynamic_cast< mitk::VtkMapper3D* > ( node->GetMapper( 2 ) );
00394 if ( mitkMapper.IsNull() )
00395 {
00396 return 0;
00397 }
00398
00399 mitkMapper->Update(renderer);
00400
00401 vtkAssembly* assembly = dynamic_cast<vtkAssembly*>(mitkMapper->GetVtkProp(renderer));
00402 if (assembly)
00403 {
00404 vtkProp3DCollection* collection = assembly->GetParts();
00405 collection->InitTraversal();
00406 vtkProp3D* prop3d = 0;
00407 do
00408 {
00409 prop3d = collection->GetNextProp3D();
00410 vtkActor* actor = dynamic_cast<vtkActor*>( prop3d );
00411 if (actor)
00412 {
00413 return dynamic_cast<vtkAbstractMapper3D*>( actor->GetMapper() );
00414 }
00415
00416 vtkVolume* volume = dynamic_cast<vtkVolume*>( prop3d );
00417 if (volume)
00418 {
00419 return dynamic_cast<vtkAbstractMapper3D*>( volume->GetMapper() );
00420 }
00421 } while (prop3d != collection->GetLastProp3D());
00422 }
00423 else
00424 {
00425 vtkActor* actor = dynamic_cast<vtkActor*>( mitkMapper->GetVtkProp(renderer) );
00426 if (actor)
00427 {
00428 return dynamic_cast<vtkAbstractMapper3D*>( actor->GetMapper() );
00429 }
00430
00431 vtkVolume* volume = dynamic_cast<vtkVolume*>( mitkMapper->GetVtkProp(renderer) );
00432 if (volume)
00433 {
00434 return dynamic_cast<vtkAbstractMapper3D*>( volume->GetMapper() );
00435 }
00436 }
00437 return 0;
00438 }
00439
00440
00441
00442 vtkPointSet*
00443 mitk::UnstructuredGridMapper2D
00444 ::GetVtkPointSet(mitk::BaseRenderer* renderer)
00445 {
00446
00447 vtkAbstractMapper3D * abstractMapper = GetVtkAbstractMapper3D(renderer);
00448 if ( abstractMapper == 0 )
00449 {
00450
00451 mitk::DataNode::ConstPointer node = this->GetDataNode();
00452 if ( node.IsNull() )
00453 return 0;
00454 mitk::BaseData::Pointer data = node->GetData();
00455 mitk::UnstructuredGrid::Pointer grid = dynamic_cast<mitk::UnstructuredGrid*>(data.GetPointer());
00456 if (!grid.IsNull())
00457 return static_cast<vtkPointSet*>(grid->GetVtkUnstructuredGrid());
00458
00459 return 0;
00460 }
00461 else
00462 {
00463 vtkMapper* mapper = dynamic_cast<vtkMapper*>(abstractMapper);
00464 if (mapper)
00465 {
00466 return dynamic_cast<vtkPointSet*>(mapper->GetInput());
00467 }
00468 vtkAbstractVolumeMapper* volMapper = dynamic_cast<vtkAbstractVolumeMapper*>(abstractMapper);
00469 if (volMapper)
00470 {
00471 return dynamic_cast<vtkPointSet*>(volMapper->GetDataSetInput());
00472 }
00473 }
00474
00475 return 0;
00476 }
00477
00478
00479
00480 vtkScalarsToColors* mitk::UnstructuredGridMapper2D::GetVtkLUT(mitk::BaseRenderer* renderer)
00481 {
00482
00483 vtkMapper * mapper = dynamic_cast<vtkMapper*>(GetVtkAbstractMapper3D(renderer));
00484 if (mapper)
00485 return mapper->GetLookupTable();
00486 else
00487 {
00488 mitk::DataNode::ConstPointer node = this->GetDataNode();
00489 if ( node.IsNull() )
00490 return 0;
00491
00492 mitk::VtkMapper3D::Pointer mitkMapper = dynamic_cast< mitk::VtkMapper3D* > ( node->GetMapper( 2 ) );
00493 if ( mitkMapper.IsNull() )
00494 {
00495
00496 return 0;
00497 }
00498
00499 mitkMapper->Update(renderer);
00500
00501 vtkVolume* volume = dynamic_cast<vtkVolume*>( mitkMapper->GetVtkProp(renderer) );
00502 if (volume)
00503 {
00504
00505 return static_cast<vtkScalarsToColors*>(volume->GetProperty()->GetRGBTransferFunction());
00506 }
00507
00508 vtkAssembly* assembly = dynamic_cast<vtkAssembly*>(mitkMapper->GetVtkProp(renderer));
00509 if (assembly)
00510 {
00511
00512 mitk::TransferFunctionProperty::Pointer transferFuncProp;
00513 node->GetProperty(transferFuncProp, "TransferFunction", 0);
00514 if (transferFuncProp.IsNotNull())
00515 {
00516 MITK_INFO << "return colortransferfunction\n";
00517 return static_cast<vtkScalarsToColors*>(transferFuncProp->GetValue()->GetColorTransferFunction());
00518 }
00519 }
00520 return 0;
00521 }
00522 }
00523
00524
00525 bool mitk::UnstructuredGridMapper2D::IsConvertibleToVtkPointSet(mitk::BaseRenderer * renderer)
00526 {
00527 return ( GetVtkPointSet(renderer) != 0 );
00528 }
00529
00530 mitk::UnstructuredGridMapper2D::UnstructuredGridMapper2D()
00531 {
00532 m_Plane = vtkPlane::New();
00533 m_Slicer = vtkPointSetSlicer::New();
00534
00535 m_Slicer->SetSlicePlane( m_Plane );
00536
00537 m_ScalarsToColors = 0;
00538 m_ScalarsToOpacity = 0;
00539 m_VtkPointSet = 0;
00540
00541
00542
00543
00544
00545
00546 }
00547
00548
00549
00550 mitk::UnstructuredGridMapper2D::~UnstructuredGridMapper2D()
00551 {
00552 m_Slicer->Delete();
00553 m_Plane->Delete();
00554
00555 if (m_ScalarsToOpacity != 0) m_ScalarsToOpacity->UnRegister(0);
00556 if (m_ScalarsToColors != 0) m_ScalarsToColors->UnRegister(0);
00557 if (m_VtkPointSet != 0) m_VtkPointSet->UnRegister(0);
00558 }
00559