37 #include <vtkImageData.h>
38 #include <vtkPlaneSource.h>
39 #include <vtkTransformTextureCoords.h>
40 #include <vtkTextureMapToPlane.h>
41 #include <vtkDataSetMapper.h>
42 #include <vtkTexture.h>
43 #include <vtkProperty.h>
44 #include <vtkImageMask.h>
45 #include <vtkPointData.h>
46 #include <vtkMatrix4x4.h>
47 #include <vtkLookupTable.h>
48 #include <vtkImageThreshold.h>
49 #include <vtkImageChangeInformation.h>
50 #include <vtkExtractVOI.h>
60 mPlaneActor = vtkActorPtr::New();
61 mPlaneSource = vtkPlaneSourcePtr::New();
63 mDataRedirecter = vtkImageChangeInformationPtr::New();
64 mUSSource = UltrasoundSectorSourcePtr::New();
68 mMapZeroToOne = vtkImageThresholdPtr::New();
69 mMapZeroToOne->ThresholdByLower(1.0);
70 mMapZeroToOne->SetInValue(1);
71 mMapZeroToOne->SetReplaceIn(
true);
74 mMaskFilter = vtkImageMaskPtr::New();
76 mMaskFilter->SetMaskedOutputValue(0.0);
79 mTextureMapToPlane = vtkTextureMapToPlanePtr::New();
81 mTransformTextureCoords = vtkTransformTextureCoordsPtr::New();
82 mTransformTextureCoords->SetOrigin( 0, 0.5, 0);
83 mTransformTextureCoords->SetScale( 1, 1, 0);
84 mTransformTextureCoords->FlipROn();
86 mTexture = vtkTexturePtr::New();
87 mTexture->RepeatOff();
89 mDataSetMapper = vtkDataSetMapperPtr::New();
91 mPlaneActor->SetTexture(mTexture);
92 mPlaneActor->SetMapper(mDataSetMapper);
93 mPlaneActor->SetVisibility(
false);
94 mPlaneActor->GetProperty()->LightingOff();
104 mTransformTextureCoords->SetFlipR(on);
109 return mTransformTextureCoords->GetFlipR();
120 void VideoGraphics::setupPipeline()
124 mTexture->SetInputData(NULL);
130 mTextureMapToPlane->SetInputConnection(mPlaneSource->GetOutputPort());
131 mTransformTextureCoords->SetInputConnection(mTextureMapToPlane->GetOutputPort() );
132 mDataSetMapper->SetInputConnection(mTransformTextureCoords->GetOutputPort() );
134 mMaskFilter->SetMaskInputData(mInputMask);
135 mMapZeroToOne->SetInputConnection(mDataRedirecter->GetOutputPort());
136 mMaskFilter->SetInputConnection(0, mMapZeroToOne->GetOutputPort());
137 mTexture->SetInputConnection(mMaskFilter->GetOutputPort());
139 else if (mInputSector)
141 mUSSource->setProbeSector(mInputSector);
142 mTransformTextureCoords->SetInputConnection(mUSSource->GetOutputPort() );
143 mDataSetMapper->SetInputConnection(mTransformTextureCoords->GetOutputPort() );
145 mTexture->SetInputConnection(mDataRedirecter->GetOutputPort());
149 mTextureMapToPlane->SetInputConnection(mPlaneSource->GetOutputPort());
150 mTransformTextureCoords->SetInputConnection(mTextureMapToPlane->GetOutputPort() );
151 mDataSetMapper->SetInputConnection(mTransformTextureCoords->GetOutputPort() );
153 mTexture->SetInputConnection(mDataRedirecter->GetOutputPort());
156 this->setLookupTable();
157 mPlaneActor->SetTexture(mTexture);
158 mPlaneActor->SetMapper(mDataSetMapper);
163 if (mInputMask==mask)
167 this->setupPipeline();
172 if (mInputSector==sector)
175 mInputSector = sector;
176 this->setupPipeline();
181 if (mInputVideo==video)
184 this->setupPipeline();
189 mPlaneActor->SetUserMatrix(rMu);
194 mPlaneActor->SetVisibility(visible);
195 mPlaneActor->Modified();
200 if (this->inputImageIsEmpty())
206 this->connectVideoImageToPipeline();
208 this->updatePlaneSourceBounds();
210 mPlaneActor->Modified();
213 void VideoGraphics::connectVideoImageToPipeline()
215 if (mInputVideo == NULL)
217 mTexture->SetInputData(NULL);
222 int* extent = mInputVideo->GetExtent();
223 if(extent[5] - extent[4] > 0)
225 int slice = floor(extent[4]+0.5f*(extent[5]-extent[4]));
226 if (slice < 0) slice = 0;
228 vtkSmartPointer<vtkExtractVOI> extractVOI = vtkSmartPointer<vtkExtractVOI>::New();
229 extractVOI->SetInputData(mInputVideo);
230 extractVOI->SetVOI(extent[0], extent[1], extent[2], extent[3], slice, slice);
231 extractVOI->Update();
232 mDataRedirecter->SetInputConnection(extractVOI->GetOutputPort());
236 mDataRedirecter->SetInputData(mInputVideo);
239 mDataRedirecter->UpdateWholeExtent();
240 mDataRedirecter->Update();
244 void VideoGraphics::updatePlaneSourceBounds()
248 DoubleBoundingBox3D bounds(mDataRedirecter->GetOutput()->GetBounds());
249 if (!
similar(bounds.range()[0], 0.0) || !
similar(bounds.range()[1], 0.0))
251 mPlaneSource->SetOrigin(bounds.corner(0,0,0).begin());
252 mPlaneSource->SetPoint1(bounds.corner(1,0,0).begin());
253 mPlaneSource->SetPoint2(bounds.corner(0,1,0).begin());
254 mPlaneSource->GetOutput()->GetPointData()->Modified();
255 mPlaneSource->GetOutput()->Modified();
259 void VideoGraphics::updateLUT()
261 this->setLookupTable();
262 mTexture->SetLookupTable(mLUT);
265 int numComp = mDataRedirecter->GetOutput()->GetNumberOfScalarComponents();
266 bool is8bit = mDataRedirecter->GetOutput()->GetScalarType()==VTK_UNSIGNED_CHAR;
277 mDataRedirecter->GetOutput()->GetScalarRange(srange);
280 mTexture->GetLookupTable()->SetRange(srange[0], srange[1]);
281 mTexture->MapColorScalarsThroughLookupTableOn();
285 mTexture->MapColorScalarsThroughLookupTableOff();
291 void VideoGraphics::setLookupTable()
301 lut->SetNumberOfTableValues(1000);
303 lut->SetTableRange (0, 255);
304 lut->SetSaturationRange (0, 0);
305 lut->SetHueRange (0, 0);
306 lut->SetValueRange (0, 1);
307 lut->SetRampToLinear();
312 lut->SetTableValue(0, 0, 0, 0, 0);
319 bool VideoGraphics::inputImageIsEmpty()
321 if (mInputVideo == NULL)
325 int* dim = mInputVideo->GetDimensions();
326 if(dim[0] == 0 || dim[1] == 0)
vtkSmartPointer< class vtkMatrix4x4 > vtkMatrix4x4Ptr
vtkSmartPointer< class vtkActor > vtkActorPtr
void setActorUserMatrix(vtkMatrix4x4Ptr rMu)
void setClip(vtkPolyDataPtr sector)
vtkSmartPointer< class vtkPolyData > vtkPolyDataPtr
bool similar(const DoubleBoundingBox3D &a, const DoubleBoundingBox3D &b, double tol)
void setFlipVertical(bool on)
void setVisibility(bool visible)
vtkSmartPointer< class vtkLookupTable > vtkLookupTablePtr
void setInputVideo(vtkImageDataPtr video)
void setMask(vtkImageDataPtr mask)