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;
38 typedef typename F::TEndBacktrackingEvent _TEndBacktrackingEvent;
41 if( this->m_RenderWindow == NULL )
44 this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
47 const F* filter = dynamic_cast< const F* >( c );
50 const _TImage* image = filter->GetInput( );
55 _TImage::RegionType reg = image->GetLargestPossibleRegion( );
56 _TImage::SizeType siz = reg.GetSize( );
57 if( this->m_Data.GetPointer( ) == NULL )
59 this->m_Data = vtkSmartPointer< vtkPolyData >::New( );
60 this->m_Mapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
61 this->m_Actor = vtkSmartPointer< vtkActor >::New( );
63 vtkSmartPointer< vtkPoints > points =
64 vtkSmartPointer< vtkPoints >::New( );
65 vtkSmartPointer< vtkCellArray > vertices =
66 vtkSmartPointer< vtkCellArray >::New( );
67 vtkSmartPointer< vtkFloatArray > scalars =
68 vtkSmartPointer< vtkFloatArray >::New( );
69 this->m_Data->SetPoints( points );
70 this->m_Data->SetVerts( vertices );
71 this->m_Data->GetPointData( )->SetScalars( scalars );
73 this->m_Mapper->SetInputData( this->m_Data );
74 this->m_Actor->SetMapper( this->m_Mapper );
75 ren->AddActor( this->m_Actor );
77 this->m_Marks = TMarks::New( );
78 this->m_Marks->SetLargestPossibleRegion(
79 image->GetLargestPossibleRegion( )
81 this->m_Marks->SetRequestedRegion( image->GetRequestedRegion( ) );
82 this->m_Marks->SetBufferedRegion( image->GetBufferedRegion( ) );
83 this->m_Marks->SetOrigin( image->GetOrigin( ) );
84 this->m_Marks->SetSpacing( image->GetSpacing( ) );
85 this->m_Marks->SetDirection( image->GetDirection( ) );
86 this->m_Marks->Allocate( );
87 this->m_Marks->FillBuffer( -1 );
89 this->m_RenderCount = reg.GetNumberOfPixels( );
93 // Get possible events
94 const _TEvent* evt = dynamic_cast< const _TEvent* >( &e );
97 _TCollisionEvent cevt;
102 if( fevt.CheckEvent( evt ) )
104 if( this->m_Marks->GetPixel( evt->Node.Vertex ) == -1 )
106 typename _TImage::PointType pnt;
107 image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt );
109 long pId = this->m_Data->GetNumberOfPoints( );
110 this->m_Data->GetVerts( )->InsertNextCell( 1 );
111 this->m_Data->GetVerts( )->InsertCellPoint( pId );
112 this->m_Data->GetPoints( )->
113 InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
114 this->m_Data->GetPointData( )->
115 GetScalars( )->InsertNextTuple1( 0.5 );
116 this->m_Data->Modified( );
118 this->m_Marks->SetPixel( evt->Node.Vertex, pId );
121 // Render visual debug
122 double per = double( this->m_RenderCount ) * this->m_RenderPercentage;
123 if( double( this->m_Count ) >= per )
124 this->m_RenderWindow->Render( );
125 if( double( this->m_Count ) >= per )
131 else if( mevt.CheckEvent( evt ) )
133 // TODO: std::cout << "mark" << std::endl;
138 if( cevt.CheckEvent( evt ) )
140 // TODO: std::cout << "collision" << std::endl;
145 if( eevt.CheckEvent( evt ) )
147 this->m_RenderWindow->Render( );
148 ren->RemoveActor( this->m_Actor );
149 this->m_RenderWindow->Render( );
150 this->m_Marks = NULL;
152 this->m_Mapper = NULL;
153 this->m_Actor = NULL;
160 const _TBacktrackingEvent* bevt =
161 dynamic_cast< const _TBacktrackingEvent* >( &e );
162 const _TEndBacktrackingEvent* ebevt =
163 dynamic_cast< const _TEndBacktrackingEvent* >( &e );
166 static const unsigned long nColors = 10;
167 double back_id = double( bevt->BackId % nColors ) / double( nColors );
168 typename _TImage::PointType pnt;
169 image->TransformIndexToPhysicalPoint( bevt->Node, pnt );
171 long pId = this->m_Data->GetNumberOfPoints( );
172 this->m_Data->GetVerts( )->InsertNextCell( 1 );
173 this->m_Data->GetVerts( )->InsertCellPoint( pId );
174 this->m_Data->GetPoints( )->
175 InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
176 this->m_Data->GetPointData( )->
177 GetScalars( )->InsertNextTuple1( back_id );
178 this->m_Data->Modified( );
186 this->m_RenderWindow->Render( );
194 // -------------------------------------------------------------------------
195 template< class F, class R >
196 fpa::VTK::Image3DObserver< F, R >::
199 m_RenderWindow( NULL ),
200 m_RenderPercentage( double( 0.0001 ) )
204 #endif // __FPA__VTK__IMAGE3DOBSERVER__HXX__