1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://www.centreleonberard.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
18 #include "vvMeshActor.h"
19 #include "clitkCommon.h"
20 #include <vtkVersion.h>
21 #include <vtkPolyDataMapper.h>
22 #include <vtkMarchingSquares.h>
23 #include <vtkImageData.h>
25 #include <vtkProperty.h>
29 vvMeshActor::vvMeshActor() :
30 mCutDimension(0), mMesh(NULL),
31 mMarching(NULL), mMapper(NULL),
33 mSuperpostionMode(false), mTimeSlice(0)
36 vvMeshActor::~vvMeshActor()
43 void vvMeshActor::Init(vvMesh::Pointer mesh,int time_slice,vvImage::Pointer vf)
47 mMarching=vtkMarchingSquares::New();
48 mTimeSlice=time_slice;
49 if (static_cast<unsigned int>(time_slice)<mMesh->GetNumberOfMeshes()) {
50 #if VTK_MAJOR_VERSION <= 5
51 mMarching->SetInput(mMesh->GetMask(time_slice));
53 mMarching->SetInputData(mMesh->GetMask(time_slice));
56 #if VTK_MAJOR_VERSION <= 5
57 mMarching->SetInput(mMesh->GetMask(0));
59 mMarching->SetInputData(mMesh->GetMask(0));
62 mMarching->SetValue(0,0.5);
63 //mMarching->Update();
65 mMapper=vtkPolyDataMapper::New();
66 #if VTK_MAJOR_VERSION <= 5
67 mMapper->SetInput(mMarching->GetOutput());
69 mMapper->SetInputConnection(mMarching->GetOutputPort());
71 //The following line allows to display the contour over the image
72 //(http://www.nabble.com/What-happens-when-two-actors-are-at-the-same-depth--td23175458.html)
73 vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
74 mActor=vtkActor::New();
75 mActor->SetMapper(mMapper);
76 mActor->SetPickable(false);
77 mActor->GetProperty()->EdgeVisibilityOn();
78 mActor->GetProperty()->SetEdgeColor(mMesh->r,mMesh->g,mMesh->b);
79 mActor->GetProperty()->SetLineWidth(2.);
80 mActor->GetProperty()->SetOpacity(0.995); //in order to get VTK to turn on the alpha-blending in OpenGL
83 void vvMeshActor::SetCutSlice(double slice)
89 if (static_cast<unsigned int>(mTimeSlice)<mMesh->GetNumberOfMasks())
90 mask=mMesh->GetMask(mTimeSlice);
92 mask=mMesh->GetMask(0);
93 int* dims=mask->GetDimensions();
94 int mask_slice=(slice-mask->GetOrigin()[mCutDimension])/mask->GetSpacing()[mCutDimension];
95 switch (mCutDimension) {
97 mMarching->SetImageRange(mask_slice,mask_slice,0,dims[1],0,dims[2]);
100 mMarching->SetImageRange(0,dims[0],mask_slice,mask_slice,0,dims[2]);
103 mMarching->SetImageRange(0,dims[0],0,dims[1],mask_slice,mask_slice);
111 void vvMeshActor::SetTimeSlice(int time)
114 if (static_cast<unsigned int>(time)<mMesh->GetNumberOfMasks()) {
115 #if VTK_MAJOR_VERSION <= 5
116 mMarching->SetInput(mMesh->GetMask(time));
118 mMarching->SetInputData(mMesh->GetMask(time));
121 #if VTK_MAJOR_VERSION <= 5
122 mMarching->SetInput(mMesh->GetMask(0));
124 mMarching->SetInputData(mMesh->GetMask(0));
127 SetCutSlice(mCutSlice); //We need to find the new mask cut slice,
128 //since masks do not all have the same origin
131 void vvMeshActor::SetSlicingOrientation(unsigned int d)
136 void vvMeshActor::ToggleSuperposition()
138 DD("Warning: superposition not implemented");
139 // std::cout << "vvMeshActor::ToggleSuperposition size = " << mMeshes.size() << std::endl;
140 if (! mSuperpostionMode && mMesh->GetNumberOfMeshes() > 1) {
141 mSuperpostionMode=true;
143 mSuperpostionMode=false;