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 ===========================================================================*/
19 #include "vtkOBJReader.h"
20 #include "vtkPolyDataMapper.h"
21 #include "vtkRenderer.h"
22 #include "vtkRenderWindow.h"
24 #include "vtkCamera.h"
25 #include "vtkRenderWindowInteractor.h"
26 #include "vtkSmartPointer.h"
27 #include "vtkCommand.h"
28 #include "vtkAnimationCue.h"
29 #include "vtkAnimationScene.h"
30 #include "vtkProperty.h"
31 #include "vtkInteractorStyle.h"
37 typedef vtkSmartPointer<vtkOBJReader> ObjReaderType;
38 typedef vtkSmartPointer<vtkPolyDataMapper> MapperType;
39 typedef vtkSmartPointer<vtkActor> ActorType;
42 void run(int argc, char** argv);
44 // Adapted from vtkAnimationCue example...
48 CueAnimator(std::vector<ActorType>& rActors) : m_Fps(1), m_CurrentActor(0), m_rActors(rActors) {
49 m_rActors[0]->SetVisibility(1);
50 for (unsigned int i = 1; i < m_rActors.size(); i++) {
51 m_rActors[i]->SetVisibility(0);
58 void SetFps(double fps) {
62 void StartCue(vtkAnimationCue::AnimationCueInfo *vtkNotUsed(info),
65 //std::cout << "StartCue" << std::endl;
68 void Tick(vtkAnimationCue::AnimationCueInfo *info,
71 //std::cout << "Tick AT:" << info->AnimationTime << " DT:" << info->DeltaTime << " CT:" << info->ClockTime << std::endl;
73 m_rActors[m_CurrentActor]->SetVisibility(0);
75 int step = round(m_Fps * info->AnimationTime);
76 int actor = step % m_rActors.size();
78 //if (actor != m_CurrentActor) std::cout << "Showing frame: " << m_CurrentActor << std::endl;
79 m_CurrentActor = actor;
80 m_rActors[m_CurrentActor]->SetVisibility(1);
85 void EndCue(vtkAnimationCue::AnimationCueInfo *info,
88 //std::cout << "EndCue" << std::endl;
97 std::vector<ActorType>& m_rActors;
100 class vtkAnimationCueObserver : public vtkCommand
103 static vtkAnimationCueObserver *New()
105 return new vtkAnimationCueObserver;
108 virtual void Execute(vtkObject *vtkNotUsed(caller),
112 if(this->Animator!=0 && this->Renderer!=0)
114 vtkAnimationCue::AnimationCueInfo *info=
115 static_cast<vtkAnimationCue::AnimationCueInfo *>(calldata);
118 case vtkCommand::StartAnimationCueEvent:
119 this->Animator->StartCue(info,this->Renderer);
121 case vtkCommand::EndAnimationCueEvent:
122 this->Animator->EndCue(info,this->Renderer);
124 case vtkCommand::AnimationCueTickEvent:
125 this->Animator->Tick(info,this->Renderer);
131 this->RenWin->Render();
135 vtkRenderer *Renderer;
136 vtkRenderWindow *RenWin;
137 CueAnimator *Animator;
140 vtkAnimationCueObserver()
148 class vtkWindowObserver : public vtkCommand
151 static vtkWindowObserver *New()
153 return new vtkWindowObserver;
156 virtual void Execute(vtkObject *caller,
160 vtkRenderWindowInteractor *isi = dynamic_cast<vtkRenderWindowInteractor *>(caller);
161 //std::cout << "Execute" << std::endl;
164 case vtkCommand::KeyPressEvent:
166 std::string key = isi->GetKeySym();
167 //std::cout << key[0] << std::endl;
173 this->m_Scene->Play();
179 this->m_Scene->Stop();
194 vtkAnimationScene* m_Scene;
198 vtkWindowObserver() : m_Scene(0) {}
201 int main(int argc, char** argv)
204 std::cout << "Usage: clitkMeshViewer FILE1 FILE2 ... [--animate]" << std::endl;
211 void run(int argc, char** argv)
213 std::vector<ObjReaderType> objs;
214 std::vector<MapperType> mappers;
215 std::vector<ActorType> actors;
218 std::string animate = argv[argc-1];
219 if (animate == "--animate")
222 vtkSmartPointer<vtkRenderer> aRenderer = vtkRenderer::New();
223 for (int i = 1; i < nfiles; i++) {
224 std::string file = argv[i];
226 //std::cout << "Reading " << file << std::endl;
228 vtkSmartPointer<vtkOBJReader> preader = vtkOBJReader::New();
229 preader->SetFileName(file.c_str());
231 objs.push_back(preader);
233 vtkSmartPointer<vtkPolyDataMapper> skinMapper = vtkPolyDataMapper::New();
234 skinMapper->SetInputConnection(preader->GetOutputPort());
235 skinMapper->ScalarVisibilityOff();
236 mappers.push_back(skinMapper);
238 vtkSmartPointer<vtkActor> skin = vtkActor::New();
239 skin->SetMapper(skinMapper);
240 actors.push_back(skin);
242 aRenderer->AddActor(skin);
245 vtkSmartPointer<vtkCamera> aCamera = vtkCamera::New();
246 aCamera->SetViewUp (0, 0, -1);
247 aCamera->SetPosition (0, 1, 0);
248 aCamera->SetFocalPoint (0, 0, 0);
249 aCamera->ComputeViewPlaneNormal();
252 aRenderer->SetActiveCamera(aCamera);
253 aRenderer->ResetCamera ();
254 aRenderer->SetBackground(0,0,0);
255 aRenderer->ResetCameraClippingRange ();
257 vtkSmartPointer<vtkRenderWindow> renWin = vtkRenderWindow::New();
258 renWin->AddRenderer(aRenderer);
259 renWin->SetSize(640, 480);
261 vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkRenderWindowInteractor::New();
262 iren->SetRenderWindow(renWin);
265 vtkSmartPointer<vtkAnimationScene> scene;
266 vtkSmartPointer<vtkAnimationCue> cue1;
267 vtkSmartPointer<vtkAnimationCueObserver> anim_observer;
268 vtkSmartPointer<vtkWindowObserver> window_observer;
269 CueAnimator animator(actors);
272 animator.SetFps(fps);
274 if (animate == "--animate") {
275 // Create an Animation Scene
276 scene=vtkAnimationScene::New();
277 scene->SetModeToRealTime();
280 scene->SetTimeModeToRelative();
281 scene->SetStartTime(0);
282 scene->SetEndTime(actors.size()/fps);
284 // Create an Animation Cue.
285 cue1=vtkAnimationCue::New();
286 cue1->SetTimeModeToRelative();
287 cue1->SetStartTime(0);
288 cue1->SetEndTime(actors.size()/fps);
291 // Create Cue anim_observer.
292 anim_observer=vtkAnimationCueObserver::New();
293 anim_observer->Renderer=aRenderer;
294 anim_observer->Animator=&animator;
295 anim_observer->RenWin=renWin;
296 cue1->AddObserver(vtkCommand::StartAnimationCueEvent,anim_observer);
297 cue1->AddObserver(vtkCommand::EndAnimationCueEvent,anim_observer);
298 cue1->AddObserver(vtkCommand::AnimationCueTickEvent,anim_observer);
300 window_observer = vtkWindowObserver::New();
301 window_observer->m_Scene = scene;
302 iren->AddObserver(vtkCommand::KeyPressEvent, window_observer);