00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkGeometry2DDataVtkMapper3D.h"
00019
00020 #include "mitkImageMapperGL2D.h"
00021 #include "mitkLookupTableProperty.h"
00022 #include "mitkSmartPointerProperty.h"
00023 #include "mitkSurface.h"
00024 #include "mitkVtkRepresentationProperty.h"
00025 #include "mitkWeakPointerProperty.h"
00026 #include "mitkNodePredicateDataType.h"
00027
00028 #include <vtkAssembly.h>
00029 #include <vtkDataSetMapper.h>
00030 #include <vtkFeatureEdges.h>
00031 #include <vtkHedgeHog.h>
00032 #include <vtkImageData.h>
00033 #include <vtkLinearTransform.h>
00034 #include <vtkLookupTable.h>
00035 #include <vtkPolyData.h>
00036 #include <vtkPolyDataMapper.h>
00037 #include <vtkProp3DCollection.h>
00038 #include <vtkProperty.h>
00039 #include <vtkTexture.h>
00040 #include <vtkTransformPolyDataFilter.h>
00041 #include <vtkTubeFilter.h>
00042
00043 namespace mitk
00044 {
00045
00046 Geometry2DDataVtkMapper3D::Geometry2DDataVtkMapper3D()
00047 : m_DisplayNormals(false),
00048 m_ColorTwoSides(false),
00049 m_InvertNormals(true),
00050 m_NormalsActorAdded(false),
00051 m_DataStorage(NULL)
00052 {
00053 m_EdgeTuber = vtkTubeFilter::New();
00054 m_EdgeMapper = vtkPolyDataMapper::New();
00055
00056
00057
00058
00059 m_SurfaceCreator = Geometry2DDataToSurfaceFilter::New();
00060 m_SurfaceCreatorBoundingBox = BoundingBox::New();
00061 m_SurfaceCreatorPointsContainer = BoundingBox::PointsContainer::New();
00062 m_Edges = vtkFeatureEdges::New();
00063
00064 m_Edges->BoundaryEdgesOn();
00065 m_Edges->FeatureEdgesOff();
00066 m_Edges->NonManifoldEdgesOff();
00067 m_Edges->ManifoldEdgesOff();
00068
00069 m_EdgeTransformer = vtkTransformPolyDataFilter::New();
00070 m_NormalsTransformer = vtkTransformPolyDataFilter::New();
00071 m_EdgeActor = vtkActor::New();
00072 m_BackgroundMapper = vtkPolyDataMapper::New();
00073 m_BackgroundActor = vtkActor::New();
00074 m_Prop3DAssembly = vtkAssembly::New();
00075 m_ImageAssembly = vtkAssembly::New();
00076
00077 m_SurfaceCreatorBoundingBox->SetPoints( m_SurfaceCreatorPointsContainer );
00078
00079 m_Cleaner = vtkCleanPolyData::New();
00080
00081 m_Cleaner->PieceInvariantOn();
00082 m_Cleaner->ConvertLinesToPointsOn();
00083 m_Cleaner->ConvertPolysToLinesOn();
00084 m_Cleaner->ConvertStripsToPolysOn();
00085 m_Cleaner->PointMergingOn();
00086
00087
00088
00089 vtkPolyData *emptyPolyData = vtkPolyData::New();
00090 m_Cleaner->SetInput( emptyPolyData );
00091 emptyPolyData->Delete();
00092
00093 m_Edges->SetInput(m_Cleaner->GetOutput());
00094 m_EdgeTransformer->SetInput( m_Edges->GetOutput() );
00095
00096 m_EdgeTuber->SetInput( m_EdgeTransformer->GetOutput() );
00097 m_EdgeTuber->SetVaryRadiusToVaryRadiusOff();
00098 m_EdgeTuber->SetNumberOfSides( 12 );
00099 m_EdgeTuber->CappingOn();
00100
00101 m_EdgeMapper->SetInput( m_EdgeTuber->GetOutput() );
00102 m_EdgeMapper->ScalarVisibilityOff();
00103
00104 m_BackgroundMapper->SetInput(emptyPolyData);
00105
00106 m_EdgeActor->SetMapper( m_EdgeMapper );
00107
00108 m_BackgroundMapper->SetInput(emptyPolyData);
00109 m_BackgroundMapper->ImmediateModeRenderingOn();
00110
00111 m_BackgroundActor->GetProperty()->SetAmbient( 0.5 );
00112 m_BackgroundActor->GetProperty()->SetColor( 0.0, 0.0, 0.0 );
00113 m_BackgroundActor->GetProperty()->SetOpacity( 1.0 );
00114 m_BackgroundActor->SetMapper( m_BackgroundMapper );
00115
00116 vtkProperty * backfaceProperty = m_BackgroundActor->MakeProperty();
00117 backfaceProperty->SetColor( 0.0, 0.0, 0.0 );
00118 m_BackgroundActor->SetBackfaceProperty( backfaceProperty );
00119 backfaceProperty->Delete();
00120
00121 m_FrontHedgeHog = vtkHedgeHog::New();
00122 m_BackHedgeHog = vtkHedgeHog::New();
00123
00124 m_FrontNormalsMapper = vtkPolyDataMapper::New();
00125 m_FrontNormalsMapper->SetInput( m_FrontHedgeHog->GetOutput() );
00126 m_BackNormalsMapper = vtkPolyDataMapper::New();
00127
00128
00129 m_Prop3DAssembly->AddPart( m_EdgeActor );
00130 m_Prop3DAssembly->AddPart( m_ImageAssembly );
00131 m_FrontNormalsActor = vtkActor::New();
00132 m_FrontNormalsActor->SetMapper(m_FrontNormalsMapper);
00133 m_BackNormalsActor = vtkActor::New();
00134 m_BackNormalsActor->SetMapper(m_BackNormalsMapper);
00135
00136 m_DefaultLookupTable = vtkLookupTable::New();
00137 m_DefaultLookupTable->SetTableRange( -1024.0, 4096.0 );
00138 m_DefaultLookupTable->SetSaturationRange( 0.0, 0.0 );
00139 m_DefaultLookupTable->SetHueRange( 0.0, 0.0 );
00140 m_DefaultLookupTable->SetValueRange( 0.0, 1.0 );
00141 m_DefaultLookupTable->Build();
00142 m_DefaultLookupTable->SetTableValue( 0, 0.0, 0.0, 0.0, 0.0 );
00143
00144
00145
00146
00147
00148 m_ImageMapperDeletedCommand = MemberCommandType::New();
00149
00150 m_ImageMapperDeletedCommand->SetCallbackFunction(
00151 this, &Geometry2DDataVtkMapper3D::ImageMapperDeletedCallback );
00152 }
00153
00154
00155 Geometry2DDataVtkMapper3D::~Geometry2DDataVtkMapper3D()
00156 {
00157 m_ImageAssembly->Delete();
00158 m_Prop3DAssembly->Delete();
00159 m_EdgeTuber->Delete();
00160 m_EdgeMapper->Delete();
00161 m_EdgeTransformer->Delete();
00162 m_Cleaner->Delete();
00163 m_Edges->Delete();
00164 m_NormalsTransformer->Delete();
00165 m_EdgeActor->Delete();
00166 m_BackgroundMapper->Delete();
00167 m_BackgroundActor->Delete();
00168 m_DefaultLookupTable->Delete();
00169 m_FrontNormalsMapper->Delete();
00170 m_FrontNormalsActor->Delete();
00171 m_FrontHedgeHog->Delete();
00172 m_BackNormalsMapper->Delete();
00173 m_BackNormalsActor->Delete();
00174 m_BackHedgeHog->Delete();
00175
00176
00177 m_ImageActors.clear();
00178
00179 LookupTablePropertiesList::iterator it;
00180 for(it = m_LookupTableProperties.begin(); it != m_LookupTableProperties.end();++it)
00181 {
00182 if ( it->second.LookupTableSource != NULL )
00183 {
00184 it->second.LookupTableSource->Delete();
00185 it->second.LookupTableSource = NULL;
00186 }
00187 }
00188 m_DataStorage = NULL;
00189 }
00190
00191
00192 vtkProp* Geometry2DDataVtkMapper3D::GetVtkProp(mitk::BaseRenderer * )
00193 {
00194 if ( (this->GetDataNode() != NULL )
00195 && (m_ImageAssembly != NULL) )
00196 {
00197
00198
00199
00200
00201 m_ImageAssembly->SetUserTransform( this->GetDataNode()->GetVtkTransform() );
00202 }
00203 return m_Prop3DAssembly;
00204 }
00205
00206
00207 void Geometry2DDataVtkMapper3D::UpdateVtkTransform(mitk::BaseRenderer * )
00208 {
00209 m_ImageAssembly->SetUserTransform(
00210 this->GetDataNode()->GetVtkTransform(this->GetTimestep()) );
00211 }
00212
00213 const Geometry2DData *
00214 Geometry2DDataVtkMapper3D::GetInput()
00215 {
00216 return static_cast<const Geometry2DData * > ( GetData() );
00217 }
00218
00219
00220 void Geometry2DDataVtkMapper3D::SetDataStorageForTexture(mitk::DataStorage* storage)
00221 {
00222 if (storage != NULL)
00223 {
00224 if( m_DataStorage != storage )
00225 {
00226 m_DataStorage = storage;
00227 this->Modified();
00228 }
00229 }
00230 }
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 int
00285 Geometry2DDataVtkMapper3D::FindPowerOfTwo( int i )
00286 {
00287 int size;
00288
00289 for ( --i, size = 1; i > 0; size *= 2 )
00290 {
00291 i /= 2;
00292 }
00293 return size;
00294 }
00295
00296 void
00297 Geometry2DDataVtkMapper3D::ImageMapperDeletedCallback(
00298 itk::Object *caller, const itk::EventObject& )
00299 {
00300 ImageMapperGL2D *imageMapper = dynamic_cast< ImageMapperGL2D * >( caller );
00301 if ( (imageMapper != NULL) )
00302 {
00303 if ( m_ImageActors.count( imageMapper ) > 0)
00304 {
00305 m_ImageActors[imageMapper].m_Sender = NULL;
00306 m_ImageActors.erase( imageMapper );
00307 }
00308 if ( m_LookupTableProperties.count( imageMapper ) > 0 )
00309 {
00310 m_LookupTableProperties[imageMapper].LookupTableSource->Delete();
00311 m_LookupTableProperties.erase( imageMapper );
00312 }
00313 }
00314 }
00315
00316
00317 void Geometry2DDataVtkMapper3D::GenerateData(BaseRenderer* renderer)
00318 {
00319 SetVtkMapperImmediateModeRendering(m_EdgeMapper);
00320 SetVtkMapperImmediateModeRendering(m_BackgroundMapper);
00321
00322
00323
00324 m_ImageAssembly->GetParts()->RemoveAllItems();
00325
00326 if ( !this->IsVisible(renderer) )
00327 {
00328
00329
00330
00331
00332
00333
00334 m_ImageAssembly->VisibilityOff();
00335 m_EdgeActor->VisibilityOff();
00336 return;
00337 }
00338
00339
00340
00341
00342
00343
00344
00345 m_ImageAssembly->VisibilityOn();
00346 m_EdgeActor->VisibilityOn();
00347
00348 Geometry2DData::Pointer input = const_cast< Geometry2DData * >(this->GetInput());
00349
00350 if (input.IsNotNull() && (input->GetGeometry2D() != NULL))
00351 {
00352 SmartPointerProperty::Pointer surfacecreatorprop;
00353 surfacecreatorprop = dynamic_cast< SmartPointerProperty * >(GetDataNode()->GetProperty("surfacegeometry", renderer));
00354
00355 if ( (surfacecreatorprop.IsNull())
00356 || (surfacecreatorprop->GetSmartPointer().IsNull())
00357 || ((m_SurfaceCreator = dynamic_cast<Geometry2DDataToSurfaceFilter*>(
00358 surfacecreatorprop->GetSmartPointer().GetPointer())).IsNull() )
00359 )
00360 {
00361
00362 m_SurfaceCreator->PlaceByGeometryOn();
00363 surfacecreatorprop = SmartPointerProperty::New( m_SurfaceCreator );
00364 GetDataNode()->SetProperty("surfacegeometry", surfacecreatorprop);
00365 }
00366
00367 m_SurfaceCreator->SetInput(input);
00368
00369 int res;
00370 if (GetDataNode()->GetIntProperty("xresolution", res, renderer))
00371 {
00372 m_SurfaceCreator->SetXResolution(res);
00373 }
00374 if (GetDataNode()->GetIntProperty("yresolution", res, renderer))
00375 {
00376 m_SurfaceCreator->SetYResolution(res);
00377 }
00378
00379 double tubeRadius = 1.0;
00380
00381
00382 if ( input->GetGeometry2D()->HasReferenceGeometry() )
00383 {
00384 Geometry3D *referenceGeometry =
00385 input->GetGeometry2D()->GetReferenceGeometry();
00386
00387 BoundingBox::PointType boundingBoxMin, boundingBoxMax;
00388 boundingBoxMin = referenceGeometry->GetBoundingBox()->GetMinimum();
00389 boundingBoxMax = referenceGeometry->GetBoundingBox()->GetMaximum();
00390
00391 if ( referenceGeometry->GetImageGeometry() )
00392 {
00393 for ( unsigned int i = 0; i < 3; ++i )
00394 {
00395 boundingBoxMin[i] -= 0.5;
00396 boundingBoxMax[i] -= 0.5;
00397 }
00398 }
00399
00400 m_SurfaceCreatorPointsContainer->CreateElementAt( 0 ) = boundingBoxMin;
00401 m_SurfaceCreatorPointsContainer->CreateElementAt( 1 ) = boundingBoxMax;
00402
00403 m_SurfaceCreatorBoundingBox->ComputeBoundingBox();
00404
00405 m_SurfaceCreator->SetBoundingBox( m_SurfaceCreatorBoundingBox );
00406
00407 tubeRadius = referenceGeometry->GetDiagonalLength() / 450.0;
00408 }
00409 else
00410 {
00411
00412
00413 if (m_DataStorage.IsNotNull())
00414 {
00415 m_SurfaceCreator->SetBoundingBox(m_DataStorage->ComputeVisibleBoundingBox(NULL, "includeInBoundingBox"));
00416
00417 tubeRadius = sqrt( m_SurfaceCreator->GetBoundingBox()->GetDiagonalLength2() ) / 450.0;
00418 }
00419 }
00420
00421
00422 m_SurfaceCreator->Update();
00423
00424 Surface *surface = m_SurfaceCreator->GetOutput();
00425
00426
00427 if ( (surface->GetVtkPolyData() == 0 )
00428 || (surface->GetVtkPolyData()->GetNumberOfCells() == 0) )
00429 {
00430 m_ImageAssembly->VisibilityOff();
00431 return;
00432 }
00433
00434
00435 DataNode* node = this->GetDataNode();
00436 node->GetBoolProperty("draw normals 3D", m_DisplayNormals, renderer);
00437 node->GetBoolProperty("color two sides", m_ColorTwoSides, renderer);
00438 node->GetBoolProperty("invert normals", m_InvertNormals, renderer);
00439
00440 if ( m_DisplayNormals || m_ColorTwoSides )
00441 {
00442 float frontColor[3] = { 0.0, 0.0, 1.0 };
00443 node->GetColor( frontColor, renderer, "front color" );
00444 float backColor[3] = { 1.0, 0.0, 0.0 };
00445 node->GetColor( backColor, renderer, "back color" );
00446
00447 if ( m_DisplayNormals )
00448 {
00449 m_NormalsTransformer->SetInput( surface->GetVtkPolyData() );
00450 m_NormalsTransformer->SetTransform(node->GetVtkTransform(this->GetTimestep()) );
00451
00452 m_FrontHedgeHog->SetInput( m_NormalsTransformer->GetOutput() );
00453 m_FrontHedgeHog->SetVectorModeToUseNormal();
00454 m_FrontHedgeHog->SetScaleFactor( m_InvertNormals ? 1.0 : -1.0 );
00455
00456 m_FrontNormalsActor->GetProperty()->SetColor( frontColor[0], frontColor[1], frontColor[2] );
00457
00458 m_BackHedgeHog->SetInput( m_NormalsTransformer->GetOutput() );
00459 m_BackHedgeHog->SetVectorModeToUseNormal();
00460 m_BackHedgeHog->SetScaleFactor( m_InvertNormals ? -1.0 : 1.0 );
00461
00462 m_BackNormalsActor->GetProperty()->SetColor( backColor[0], backColor[1], backColor[2] );
00463
00464 if ( !m_NormalsActorAdded )
00465 {
00466 m_Prop3DAssembly->AddPart( m_FrontNormalsActor );
00467 m_Prop3DAssembly->AddPart( m_BackNormalsActor );
00468 m_NormalsActorAdded = true;
00469 }
00470 }
00471
00472 if ( m_ColorTwoSides )
00473 {
00474 if ( !m_InvertNormals )
00475 {
00476 m_BackgroundActor->GetBackfaceProperty()->SetColor( frontColor[0], frontColor[1], frontColor[2] );
00477 m_BackgroundActor->GetProperty()->SetColor( backColor[0], backColor[1], backColor[2] );
00478 }
00479 else
00480 {
00481 m_BackgroundActor->GetProperty()->SetColor( frontColor[0], frontColor[1], frontColor[2] );
00482 m_BackgroundActor->GetBackfaceProperty()->SetColor( backColor[0], backColor[1], backColor[2] );
00483 }
00484 }
00485
00486 }
00487 else if ( !m_DisplayNormals )
00488 {
00489 if ( m_NormalsActorAdded )
00490 {
00491 m_Prop3DAssembly->RemovePart( m_FrontNormalsActor );
00492 m_Prop3DAssembly->RemovePart( m_BackNormalsActor );
00493 m_NormalsActorAdded = false;
00494 }
00495 }
00496
00497
00498 m_BackgroundMapper->SetInput( surface->GetVtkPolyData() );
00499 m_ImageAssembly->AddPart( m_BackgroundActor );
00500
00501 LayerSortedActorList layerSortedActors;
00502
00503
00504
00505 mitk::NodePredicateDataType::Pointer p = mitk::NodePredicateDataType::New("Image");
00506 mitk::DataStorage::SetOfObjects::ConstPointer all = m_DataStorage->GetSubset(p);
00507 for (mitk::DataStorage::SetOfObjects::ConstIterator it = all->Begin(); it != all->End(); ++it)
00508 {
00509 DataNode *node = it->Value();
00510 if (node != NULL)
00511 this->ProcessNode(node, renderer, surface, layerSortedActors);
00512 }
00513
00514
00515
00516
00517 LayerSortedActorList::iterator actorIt;
00518 for ( actorIt = layerSortedActors.begin(); actorIt != layerSortedActors.end(); ++actorIt )
00519 m_ImageAssembly->AddPart( actorIt->second );
00520
00521
00522
00523 vtkPolyData *surfacePolyData = surface->GetVtkPolyData();
00524 m_Cleaner->SetInput(surfacePolyData);
00525 m_EdgeTransformer->SetTransform(this->GetDataNode()->GetVtkTransform(this->GetTimestep()) );
00526
00527
00528 vtkFloatingPointType* surfaceBounds = surfacePolyData->GetBounds();
00529 vtkFloatingPointType extent = surfaceBounds[1] - surfaceBounds[0];
00530 vtkFloatingPointType extentY = surfaceBounds[3] - surfaceBounds[2];
00531 vtkFloatingPointType extentZ = surfaceBounds[5] - surfaceBounds[4];
00532
00533 if ( extent < extentY )
00534 extent = extentY;
00535 if ( extent < extentZ )
00536 extent = extentZ;
00537
00538
00539
00540 m_EdgeTuber->SetRadius( tubeRadius );
00541
00542
00543 ColorProperty::Pointer colorProperty;
00544 colorProperty = dynamic_cast<ColorProperty*>(this->GetDataNode()->GetProperty( "color" ));
00545 if ( colorProperty.IsNotNull() )
00546 {
00547 const Color& color = colorProperty->GetColor();
00548 m_EdgeActor->GetProperty()->SetColor(color.GetRed(), color.GetGreen(), color.GetBlue());
00549 }
00550 else
00551 {
00552 m_EdgeActor->GetProperty()->SetColor( 1.0, 1.0, 1.0 );
00553 }
00554
00555 m_ImageAssembly->SetUserTransform(this->GetDataNode()->GetVtkTransform(this->GetTimestep()) );
00556 }
00557
00558 VtkRepresentationProperty* representationProperty;
00559 this->GetDataNode()->GetProperty(representationProperty, "material.representation", renderer);
00560 if ( representationProperty != NULL )
00561 m_BackgroundActor->GetProperty()->SetRepresentation( representationProperty->GetVtkRepresentation() );
00562 }
00563
00564
00565 void Geometry2DDataVtkMapper3D::ProcessNode( DataNode * node, BaseRenderer* renderer, Surface * surface, LayerSortedActorList &layerSortedActors )
00566 {
00567 if ( node != NULL )
00568 {
00569 ImageMapperGL2D *imageMapper =
00570 dynamic_cast< ImageMapperGL2D * >( node->GetMapper(1) );
00571
00572 if ( (node->IsVisible(renderer)) && imageMapper )
00573 {
00574 WeakPointerProperty::Pointer rendererProp =
00575 dynamic_cast< WeakPointerProperty * >(GetDataNode()->GetPropertyList()->GetProperty("renderer"));
00576
00577 if ( rendererProp.IsNotNull() )
00578 {
00579 BaseRenderer::Pointer planeRenderer = dynamic_cast< BaseRenderer * >(rendererProp->GetWeakPointer().GetPointer());
00580 if ( planeRenderer.IsNotNull() )
00581 {
00582
00583
00584
00585 vtkActor *imageActor;
00586 vtkDataSetMapper *dataSetMapper = NULL;
00587 vtkLookupTable *lookupTable;
00588 vtkTexture *texture;
00589 if ( m_ImageActors.count( imageMapper ) == 0 )
00590 {
00591 dataSetMapper = vtkDataSetMapper::New();
00592 dataSetMapper->ImmediateModeRenderingOn();
00593
00594 lookupTable = vtkLookupTable::New();
00595 lookupTable->DeepCopy( m_DefaultLookupTable );
00596 lookupTable->SetRange( -1024.0, 4095.0 );
00597
00598 texture = vtkTexture::New();
00599 texture->InterpolateOn();
00600 texture->SetLookupTable( lookupTable );
00601 texture->RepeatOff();
00602
00603 imageActor = vtkActor::New();
00604 imageActor->GetProperty()->SetAmbient( 0.5 );
00605 imageActor->SetMapper( dataSetMapper );
00606 imageActor->SetTexture( texture );
00607
00608
00609
00610 lookupTable->UnRegister( NULL );
00611 dataSetMapper->UnRegister( NULL );
00612 texture->UnRegister( NULL );
00613
00614
00615
00616 m_ImageActors[imageMapper].Initialize(imageActor, imageMapper, m_ImageMapperDeletedCommand);
00617 }
00618 else
00619 {
00620
00621
00622 imageActor = m_ImageActors[imageMapper].m_Actor;
00623 dataSetMapper = (vtkDataSetMapper *)imageActor->GetMapper();
00624 texture = imageActor->GetTexture();
00625
00626
00627 #if ( ( VTK_MAJOR_VERSION >= 5 ) && ( VTK_MINOR_VERSION>=2) )
00628 lookupTable = dynamic_cast<vtkLookupTable*>(texture->GetLookupTable());
00629 #else
00630 lookupTable = texture->GetLookupTable();
00631 #endif
00632 }
00633
00634
00635
00636 if ( dataSetMapper != NULL )
00637 {
00638 if ( dataSetMapper->GetInput() != surface->GetVtkPolyData() )
00639 {
00640 dataSetMapper->SetInput( surface->GetVtkPolyData() );
00641 }
00642 }
00643
00644 imageActor->GetMapper()->GetInput()->Update();
00645 imageActor->GetMapper()->Update();
00646
00647
00648
00649
00650
00651
00652
00653 imageMapper->GetRendererInfo( planeRenderer );
00654
00655 imageMapper->GenerateAllData();
00656
00657
00658 renderer->GetRenderWindow()->MakeCurrent();
00659
00660
00661 const ImageMapperGL2D::RendererInfo *rit =
00662 imageMapper->GetRendererInfo( planeRenderer );
00663 if(rit->m_Image != NULL)
00664 {
00665 rit->m_Image->Update();
00666 texture->SetInput( rit->m_Image );
00667
00668 ScalarType windowMin = 0.0;
00669 ScalarType windowMax = 255.0;
00670 LevelWindow levelWindow;
00671
00672 bool binary = false;
00673 node->GetBoolProperty( "binary", binary, renderer );
00674
00675
00676
00677 if( binary )
00678 texture->MapColorScalarsThroughLookupTableOn();
00679 else
00680 texture->MapColorScalarsThroughLookupTableOff();
00681
00682 if( binary )
00683 {
00684 windowMin = 0;
00685 windowMax = 1;
00686 }
00687 else if( node->GetLevelWindow( levelWindow, planeRenderer, "levelWindow" )
00688 || node->GetLevelWindow( levelWindow, planeRenderer ) )
00689 {
00690 windowMin = levelWindow.GetLowerWindowBound();
00691 windowMax = levelWindow.GetUpperWindowBound();
00692 }
00693
00694 vtkLookupTable *lookupTableSource;
00695
00696 bool useColor;
00697 if ( !node->GetBoolProperty( "use color", useColor, planeRenderer ) )
00698 useColor = false;
00699 if ( binary )
00700 useColor = true;
00701
00702
00703 LookupTableProperty::Pointer lookupTableProp;
00704 lookupTableProp = dynamic_cast< LookupTableProperty * >(node->GetPropertyList()->GetProperty( "LookupTable" ));
00705
00706
00707
00708 if ( lookupTableProp.IsNotNull() && !useColor )
00709 {
00710 lookupTableSource = lookupTableProp->GetLookupTable()->GetVtkLookupTable();
00711 }
00712 else
00713 {
00714 lookupTableSource = m_DefaultLookupTable;
00715 }
00716
00717 LookupTableProperties &lutProperties =
00718 m_LookupTableProperties[imageMapper];
00719
00720
00721
00722 if ( (lutProperties.LookupTableSource != lookupTableSource)
00723 || (lutProperties.windowMin != windowMin)
00724 || (lutProperties.windowMax != windowMax) )
00725 {
00726
00727
00728 if ( lutProperties.LookupTableSource != NULL )
00729 {
00730 lutProperties.LookupTableSource->Delete();
00731 }
00732 lutProperties.LookupTableSource = lookupTableSource;
00733 lutProperties.LookupTableSource->Register( NULL );
00734 lutProperties.windowMin = windowMin;
00735 lutProperties.windowMax = windowMax;
00736
00737 lookupTable->DeepCopy( lookupTableSource );
00738 lookupTable->SetRange( windowMin, windowMax );
00739 }
00740
00741
00742 float rgb[3] = { 1.0, 1.0, 1.0 };
00743 node->GetColor( rgb, renderer );
00744 imageActor->GetProperty()->SetColor( rgb[0], rgb[1], rgb[2] );
00745
00746
00747
00748 float opacity = 0.999;
00749 node->GetOpacity( opacity, renderer );
00750 imageActor->GetProperty()->SetOpacity( opacity );
00751
00752
00753 bool textureInterpolation = node->IsOn( "texture interpolation", renderer );
00754 texture->SetInterpolate( textureInterpolation );
00755
00756
00757
00758 int layer = 1;
00759 node->GetIntProperty( "layer", layer );
00760 layerSortedActors.insert(std::pair< int, vtkActor * >( layer, imageActor ) );
00761 }
00762 }
00763 }
00764 }
00765 }
00766 }
00767
00768
00769 void Geometry2DDataVtkMapper3D::ActorInfo::Initialize(vtkActor* actor, itk::Object* sender, itk::Command* command)
00770 {
00771 m_Actor = actor;
00772 m_Sender = sender;
00773
00774
00775 m_ObserverID = sender->AddObserver( itk::DeleteEvent(), command );
00776 }
00777
00778
00779 Geometry2DDataVtkMapper3D::ActorInfo::ActorInfo() : m_Actor(NULL), m_Sender(NULL), m_ObserverID(0)
00780 {
00781 }
00782
00783
00784 Geometry2DDataVtkMapper3D::ActorInfo::~ActorInfo()
00785 {
00786 if(m_Sender != NULL)
00787 {
00788 m_Sender->RemoveObserver(m_ObserverID);
00789 }
00790 if(m_Actor != NULL)
00791 {
00792 m_Actor->Delete();
00793 }
00794 }
00795 }