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_LastTick(0), m_CurrentActor(0), m_rActors(rActors) {
54 void SetFps(double fps) {
58 void StartCue(vtkAnimationCue::AnimationCueInfo *vtkNotUsed(info),
61 std::cout << "StartCue" << std::endl;
63 m_rActors[0]->SetVisibility(1);
65 for (unsigned int i = 1; i < m_rActors.size(); i++) {
66 m_rActors[i]->SetVisibility(0);
71 void Tick(vtkAnimationCue::AnimationCueInfo *info,
74 std::cout << "Tick AT:" << info->AnimationTime << " DT:" << info->DeltaTime << " CT:" << info->ClockTime << std::endl;
75 if (info->AnimationTime - m_LastTick < 1/m_Fps)
78 m_LastTick = info->AnimationTime;
80 m_rActors[m_CurrentActor]->SetVisibility(0);
83 m_CurrentActor %= m_rActors.size();
85 m_rActors[m_CurrentActor]->SetVisibility(1);
90 void EndCue(vtkAnimationCue::AnimationCueInfo *vtkNotUsed(info),
93 std::cout << "EndCue" << std::endl;
101 std::vector<ActorType>& m_rActors;
104 class vtkAnimationCueObserver : public vtkCommand
107 static vtkAnimationCueObserver *New()
109 return new vtkAnimationCueObserver;
112 virtual void Execute(vtkObject *vtkNotUsed(caller),
116 if(this->Animator!=0 && this->Renderer!=0)
118 vtkAnimationCue::AnimationCueInfo *info=
119 static_cast<vtkAnimationCue::AnimationCueInfo *>(calldata);
122 case vtkCommand::StartAnimationCueEvent:
123 this->Animator->StartCue(info,this->Renderer);
125 case vtkCommand::EndAnimationCueEvent:
126 this->Animator->EndCue(info,this->Renderer);
128 case vtkCommand::AnimationCueTickEvent:
129 this->Animator->Tick(info,this->Renderer);
135 this->RenWin->Render();
139 vtkRenderer *Renderer;
140 vtkRenderWindow *RenWin;
141 CueAnimator *Animator;
144 vtkAnimationCueObserver()
152 class vtkWindowObserver : public vtkCommand
155 static vtkWindowObserver *New()
157 return new vtkWindowObserver;
160 virtual void Execute(vtkObject *caller,
164 vtkRenderWindowInteractor *isi = dynamic_cast<vtkRenderWindowInteractor *>(caller);
165 std::cout << "Execute" << std::endl;
168 case vtkCommand::KeyPressEvent:
170 std::string key = isi->GetKeySym();
171 std::cout << key[0] << std::endl;
177 this->m_Scene->Play();
183 this->m_Scene->Stop();
198 vtkAnimationScene* m_Scene;
202 vtkWindowObserver() : m_Scene(0) {}
205 int main(int argc, char** argv)
208 std::cout << "Usage: clitkMeshViewer FILE1 FILE2 ..." << std::endl;
215 void run(int argc, char** argv)
217 std::vector<ObjReaderType> objs;
218 std::vector<MapperType> mappers;
219 std::vector<ActorType> actors;
222 std::string animate = argv[argc-1];
223 if (animate == "--animate")
226 vtkSmartPointer<vtkRenderer> aRenderer = vtkRenderer::New();
227 for (int i = 1; i < nfiles; i++) {
228 std::string file = argv[i];
230 std::cout << "Reading " << file << std::endl;
232 vtkSmartPointer<vtkOBJReader> preader = vtkOBJReader::New();
233 preader->SetFileName(file.c_str());
235 objs.push_back(preader);
237 vtkSmartPointer<vtkPolyDataMapper> skinMapper = vtkPolyDataMapper::New();
238 skinMapper->SetInputConnection(preader->GetOutputPort());
239 skinMapper->ScalarVisibilityOff();
240 mappers.push_back(skinMapper);
242 vtkSmartPointer<vtkActor> skin = vtkActor::New();
243 skin->SetMapper(skinMapper);
244 actors.push_back(skin);
246 aRenderer->AddActor(skin);
249 vtkSmartPointer<vtkCamera> aCamera = vtkCamera::New();
250 aCamera->SetViewUp (0, 0, -1);
251 aCamera->SetPosition (0, 1, 0);
252 aCamera->SetFocalPoint (0, 0, 0);
253 aCamera->ComputeViewPlaneNormal();
256 aRenderer->SetActiveCamera(aCamera);
257 aRenderer->ResetCamera ();
258 aRenderer->SetBackground(0,0,0);
259 aRenderer->ResetCameraClippingRange ();
261 vtkSmartPointer<vtkRenderWindow> renWin = vtkRenderWindow::New();
262 renWin->AddRenderer(aRenderer);
263 renWin->SetSize(640, 480);
265 vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkRenderWindowInteractor::New();
266 iren->SetRenderWindow(renWin);
269 vtkSmartPointer<vtkAnimationScene> scene;
270 vtkSmartPointer<vtkAnimationCue> cue1;
271 vtkSmartPointer<vtkAnimationCueObserver> anim_observer;
272 vtkSmartPointer<vtkWindowObserver> window_observer;
273 CueAnimator animator(actors);
276 animator.SetFps(fps);
278 if (animate == "--animate") {
279 // Create an Animation Scene
280 scene=vtkAnimationScene::New();
281 scene->SetModeToRealTime();
284 scene->SetTimeModeToRelative();
285 scene->SetStartTime(0);
286 scene->SetEndTime(actors.size()/fps);
288 // Create an Animation Cue.
289 cue1=vtkAnimationCue::New();
290 cue1->SetTimeModeToRelative();
291 cue1->SetStartTime(0);
292 cue1->SetEndTime(actors.size()/fps);
295 // Create Cue anim_observer.
296 anim_observer=vtkAnimationCueObserver::New();
297 anim_observer->Renderer=aRenderer;
298 anim_observer->Animator=&animator;
299 anim_observer->RenWin=renWin;
300 cue1->AddObserver(vtkCommand::StartAnimationCueEvent,anim_observer);
301 cue1->AddObserver(vtkCommand::EndAnimationCueEvent,anim_observer);
302 cue1->AddObserver(vtkCommand::AnimationCueTickEvent,anim_observer);
304 window_observer = vtkWindowObserver::New();
305 window_observer->m_Scene = scene;
306 iren->AddObserver(vtkCommand::KeyPressEvent, window_observer);