1 #ifndef __FPA__VTK__IMAGE3DOBSERVER__HXX__
2 #define __FPA__VTK__IMAGE3DOBSERVER__HXX__
4 #include <itkImageBase.h>
6 #include <vtkCellArray.h>
7 #include <vtkFloatArray.h>
8 #include <vtkPointData.h>
10 #include <vtkRenderer.h>
11 #include <vtkRendererCollection.h>
14 #include <vtkCellArray.h>
15 #include <vtkProperty.h>
18 // -------------------------------------------------------------------------
19 template< class F, class R >
20 void fpa::VTK::Image3DObserver< F, R >::
21 SetRenderWindow( R* rw )
23 this->m_RenderWindow = rw;
26 // -------------------------------------------------------------------------
27 template< class F, class R >
28 void fpa::VTK::Image3DObserver< F, R >::
29 Execute( const itk::Object* c, const itk::EventObject& e )
31 typedef itk::ImageBase< 3 > _TImage;
32 typedef typename F::TEvent _TEvent;
33 typedef typename F::TFrontEvent _TFrontEvent;
34 typedef typename F::TMarkEvent _TMarkEvent;
35 typedef typename F::TCollisionEvent _TCollisionEvent;
36 typedef typename F::TEndEvent _TEndEvent;
37 typedef typename F::TBacktrackingEvent _TBacktrackingEvent;
40 if( this->m_RenderWindow == NULL )
43 this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
46 const F* filter = dynamic_cast< const F* >( c );
49 const _TImage* image = filter->GetInput( );
54 _TImage::RegionType reg = image->GetLargestPossibleRegion( );
55 _TImage::SizeType siz = reg.GetSize( );
56 if( this->m_Data.GetPointer( ) == NULL )
58 this->m_Data = vtkSmartPointer< vtkPolyData >::New( );
59 this->m_Mapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
60 this->m_Actor = vtkSmartPointer< vtkActor >::New( );
62 vtkSmartPointer< vtkPoints > points =
63 vtkSmartPointer< vtkPoints >::New( );
64 vtkSmartPointer< vtkCellArray > vertices =
65 vtkSmartPointer< vtkCellArray >::New( );
66 vtkSmartPointer< vtkFloatArray > scalars =
67 vtkSmartPointer< vtkFloatArray >::New( );
68 this->m_Data->SetPoints( points );
69 this->m_Data->SetVerts( vertices );
70 this->m_Data->GetPointData( )->SetScalars( scalars );
72 this->m_Mapper->SetInputData( this->m_Data );
73 this->m_Actor->SetMapper( this->m_Mapper );
74 ren->AddActor( this->m_Actor );
76 this->m_Marks = TMarks::New( );
77 this->m_Marks->SetLargestPossibleRegion(
78 image->GetLargestPossibleRegion( )
80 this->m_Marks->SetRequestedRegion( image->GetRequestedRegion( ) );
81 this->m_Marks->SetBufferedRegion( image->GetBufferedRegion( ) );
82 this->m_Marks->SetOrigin( image->GetOrigin( ) );
83 this->m_Marks->SetSpacing( image->GetSpacing( ) );
84 this->m_Marks->SetDirection( image->GetDirection( ) );
85 this->m_Marks->Allocate( );
86 this->m_Marks->FillBuffer( -1 );
88 this->m_RenderCount = reg.GetNumberOfPixels( );
92 // Get possible events
93 const _TEvent* evt = dynamic_cast< const _TEvent* >( &e );
96 _TCollisionEvent cevt;
101 if( fevt.CheckEvent( evt ) )
103 if( this->m_Marks->GetPixel( evt->Node.Vertex ) == -1 )
105 typename _TImage::PointType pnt;
106 image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt );
108 long pId = this->m_Data->GetNumberOfPoints( );
109 this->m_Data->GetVerts( )->InsertNextCell( 1 );
110 this->m_Data->GetVerts( )->InsertCellPoint( pId );
111 this->m_Data->GetPoints( )->
112 InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
113 this->m_Data->GetPointData( )->
114 GetScalars( )->InsertNextTuple1( 0.5 );
115 this->m_Data->Modified( );
117 this->m_Marks->SetPixel( evt->Node.Vertex, pId );
120 // Render visual debug
121 double per = double( this->m_RenderCount ) * this->m_RenderPercentage;
122 if( double( this->m_Count ) >= per )
123 this->m_RenderWindow->Render( );
124 if( double( this->m_Count ) >= per )
130 else if( mevt.CheckEvent( evt ) )
132 // TODO: std::cout << "mark" << std::endl;
137 if( cevt.CheckEvent( evt ) )
139 // TODO: std::cout << "collision" << std::endl;
144 if( eevt.CheckEvent( evt ) )
146 this->m_RenderWindow->Render( );
147 ren->RemoveActor( this->m_Actor );
148 this->m_RenderWindow->Render( );
149 this->m_Marks = NULL;
151 this->m_Mapper = NULL;
152 this->m_Actor = NULL;
159 const _TBacktrackingEvent* bevt =
160 dynamic_cast< const _TBacktrackingEvent* >( &e );
163 static const unsigned long nColors = 10;
164 double back_id = double( bevt->BackId % nColors ) / double( nColors );
165 typename _TImage::PointType pnt;
166 image->TransformIndexToPhysicalPoint( bevt->Node, pnt );
168 long pId = this->m_Data->GetNumberOfPoints( );
169 this->m_Data->GetVerts( )->InsertNextCell( 1 );
170 this->m_Data->GetVerts( )->InsertCellPoint( pId );
171 this->m_Data->GetPoints( )->
172 InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
173 this->m_Data->GetPointData( )->
174 GetScalars( )->InsertNextTuple1( back_id );
175 this->m_Data->Modified( );
176 this->m_RenderWindow->Render( );
185 // -------------------------------------------------------------------------
186 template< class F, class R >
187 fpa::VTK::Image3DObserver< F, R >::
190 m_RenderWindow( NULL ),
191 m_RenderPercentage( double( 0.0001 ) )
195 #endif // __FPA__VTK__IMAGE3DOBSERVER__HXX__