Files
ThirdParty-6/ParaView-5.0.1/ParaViewCore/Animation/vtkAnimationPlayer.cxx

200 lines
5.5 KiB
C++

/*=========================================================================
Program: ParaView
Module: vtkAnimationPlayer.cxx
Copyright (c) Kitware, Inc.
All rights reserved.
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtkAnimationPlayer.h"
#include "vtkSMAnimationScene.h"
#include "vtkCommand.h"
#include "vtkObjectFactory.h"
//----------------------------------------------------------------------------
vtkAnimationPlayer::vtkAnimationPlayer()
{
this->AnimationScene = 0;
this->InPlay = false;
this->CurrentTime = 0;
this->StopPlay = false;
this->Loop = false;
}
//----------------------------------------------------------------------------
vtkAnimationPlayer::~vtkAnimationPlayer()
{
this->SetAnimationScene(0);
}
//----------------------------------------------------------------------------
void vtkAnimationPlayer::SetAnimationScene(vtkSMAnimationScene* scene)
{
if (this->AnimationScene != scene)
{
this->AnimationScene = scene;
this->Modified();
}
}
//----------------------------------------------------------------------------
vtkSMAnimationScene* vtkAnimationPlayer::GetAnimationScene()
{
return this->AnimationScene;
}
//----------------------------------------------------------------------------
void vtkAnimationPlayer::Play()
{
if (!this->AnimationScene)
{
vtkErrorMacro("No animation scene to play.");
return;
}
if (this->InPlay)
{
vtkErrorMacro("Cannot play while playing.");
return;
}
this->InvokeEvent(vtkCommand::StartEvent);
double starttime = this->AnimationScene->GetStartTime();
double endtime = this->AnimationScene->GetEndTime();
this->CurrentTime = this->AnimationScene->GetSceneTime();
double playbackWindow[2];
this->AnimationScene->GetPlaybackTimeWindow(playbackWindow);
if(playbackWindow[0] > playbackWindow[1])
{
playbackWindow[0] = this->AnimationScene->GetStartTime();
playbackWindow[1] = endtime;
}
else
{
this->CurrentTime = playbackWindow[0];
}
// clamp current time to range
this->CurrentTime = (this->CurrentTime < starttime ||
this->CurrentTime >= endtime)? starttime : this->CurrentTime;
this->InPlay = true;
this->StopPlay = false;
do
{
this->StartLoop(starttime, endtime, playbackWindow);
this->AnimationScene->Initialize();
double deltatime = 0.0;
while (!this->StopPlay && this->CurrentTime <= playbackWindow[1])
{
this->AnimationScene->Tick(this->CurrentTime, deltatime, this->CurrentTime);
double progress = (this->CurrentTime-playbackWindow[0])/(playbackWindow[1]-playbackWindow[0]);
this->InvokeEvent(vtkCommand::ProgressEvent, &progress);
double nexttime = this->GetNextTime(this->CurrentTime);
deltatime = nexttime - this->CurrentTime;
this->CurrentTime = nexttime;
}
// Finalize will get called when Tick() is called with time>=endtime on the
// cue. However,no harm is calling this method again since it has any effect
// only the first time it gets called.
// TODO: not sure what's the right thing here.
// this->AnimationScene->Finalize();
this->CurrentTime = starttime;
this->EndLoop();
// loop when this->Loop is true.
} while (this->Loop && !this->StopPlay);
this->InPlay = false;
this->StopPlay = false;
this->InvokeEvent(vtkCommand::EndEvent);
}
//----------------------------------------------------------------------------
void vtkAnimationPlayer::Stop()
{
if (this->InPlay)
{
this->StopPlay = true;
}
}
//----------------------------------------------------------------------------
void vtkAnimationPlayer::GoToFirst()
{
this->Stop();
if (this->AnimationScene)
{
this->AnimationScene->SetSceneTime(
this->AnimationScene->GetStartTime());
}
}
//----------------------------------------------------------------------------
void vtkAnimationPlayer::GoToLast()
{
this->Stop();
if (this->AnimationScene)
{
this->AnimationScene->SetSceneTime(
this->AnimationScene->GetEndTime());
}
}
//----------------------------------------------------------------------------
void vtkAnimationPlayer::GoToNext()
{
this->Stop();
double starttime = this->AnimationScene->GetStartTime();
double endtime = this->AnimationScene->GetEndTime();
double time = this->GoToNext(starttime, endtime,
this->AnimationScene->GetSceneTime());
if (time >= starttime && time < endtime)
{
this->AnimationScene->SetSceneTime(time);
}
else
{
this->AnimationScene->SetSceneTime(endtime);
}
}
//----------------------------------------------------------------------------
void vtkAnimationPlayer::GoToPrevious()
{
this->Stop();
double starttime = this->AnimationScene->GetStartTime();
double endtime = this->AnimationScene->GetEndTime();
double time = this->GoToPrevious(starttime, endtime,
this->AnimationScene->GetSceneTime());
if (time >= starttime && time < endtime)
{
this->AnimationScene->SetSceneTime(time);
}
else
{
this->AnimationScene->SetSceneTime(starttime);
}
}
//----------------------------------------------------------------------------
void vtkAnimationPlayer::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
}