mirror of
https://github.com/OpenFOAM/ThirdParty-6.git
synced 2025-12-08 06:57:43 +00:00
200 lines
5.5 KiB
C++
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);
|
|
}
|