You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

222 lines
7.4 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkAnimationCue.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm 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.
=========================================================================*/
/**
* @class vtkAnimationCue
* @brief a seqin an animation.
*
* vtkAnimationCue and vtkAnimationScene provide the framework to support
* animations in VTK. vtkAnimationCue represents an entity that changes/
* animates with time, while vtkAnimationScene represents scene or setup
* for the animation, which consists on individual cues or other scenes.
*
* A cue has three states: UNINITIALIZED, ACTIVE and INACTIVE.
* UNINITIALIZED represents an point in time before the start time of the cue.
* The cue is in ACTIVE state at a point in time between start time and end time
* for the cue. While, beyond the end time, it is in INACTIVE state.
* When the cue enters the ACTIVE state, StartAnimationCueEvent is fired. This
* event may be handled to initialize the entity to be animated.
* When the cue leaves the ACTIVE state, EndAnimationCueEvent is fired, which
* can be handled to cleanup after having run the animation.
* For every request to render during the ACTIVE state, AnimationCueTickEvent is
* fired, which must be handled to perform the actual animation.
* @sa
* vtkAnimationScene
*/
#ifndef vtkAnimationCue_h
#define vtkAnimationCue_h
#include "vtkCommonCoreModule.h" // For export macro
#include "vtkObject.h"
class VTKCOMMONCORE_EXPORT vtkAnimationCue : public vtkObject
{
public:
vtkTypeMacro(vtkAnimationCue, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
static vtkAnimationCue* New();
// Structure passed on every event invocation.
// Depending upon the cue time mode, these times are either
// normalized [0,1] or relative to the scene that contains the cue.
// All this information is also available by asking the cue
// directly for it within the handler. Thus, this information can
// be accessed in wrapped languages.
class AnimationCueInfo
{
public:
double StartTime;
double EndTime;
double AnimationTime; // valid only in AnimationCueTickEvent handler
double DeltaTime; // valid only in AnimationCueTickEvent handler
double ClockTime; // valid only in AnimationCueTickEvent handler
};
//@{
/**
* Get/Set the time mode. In Normalized mode, the start and end
* times of the cue are normalized [0,1] with respect to the start and
* end times of the container scene. In Relative mode the start and end
* time of the cue are specified in offset seconds relative to the
* start time of the container scene.
*/
virtual void SetTimeMode(int mode);
vtkGetMacro(TimeMode, int);
void SetTimeModeToRelative() { this->SetTimeMode(TIMEMODE_RELATIVE); }
void SetTimeModeToNormalized() { this->SetTimeMode(TIMEMODE_NORMALIZED); }
//@}
//@{
/**
* Get/Set the Start time for this cue.
* When the current time is >= StartTime, the Cue is in
* ACTIVE state. if Current time i < StartTime, the Cue is in
* UNINITIALIZED state. Whenever the cue enters the ACTIVE state from
* an INACTIVE state, it triggers the StartEvent.
* The Start time is in seconds relative to the start of the
* container Scene (when in Relative time mode) or is normalized
* over the span of the container Scene (when in Normalized time mode).
*/
vtkSetMacro(StartTime, double);
vtkGetMacro(StartTime, double);
//@}
//@{
/**
* Get/Set the End time for this cue.
* When the current time is > EndTime, the Cue is in
* INACTIVE state. Whenever the cue leaves an ACTIVE state to enter
* INACTIVE state, the EndEvent is triggered.
* The End time is in seconds relative to the start of the
* container Scene (when in Relative time mode) or is normalized
* over the span of the container Scene (when in Normalized time mode).
*/
vtkSetMacro(EndTime, double);
vtkGetMacro(EndTime, double);
//@}
/**
* Indicates a tick or point in time in the animation.
* Triggers a Tick event if currenttime >= StartTime and
* currenttime <= EndTime.
* Whenever the state of the cue changes,
* either StartEvent or EndEvent is triggered depending upon
* whether the cue entered Active state or quit active state respectively.
* The current time is relative to the start of the container Scene
* (when in Relative time mode) or is normalized
* over the span of the container Scene (when in Normalized time mode).
* deltatime is the time since last call to Tick. deltatime also can be in seconds
* relative to the start of the container Scene or normalized depending upon the
* cue's Time mode.
* clocktime is the time from the scene i.e. it does not depend on the time
* mode for the cue.
* For the first call to Tick
* after a call to Initialize(), the deltatime is 0;
*/
virtual void Tick(double currenttime, double deltatime, double clocktime);
/**
* Called when the playing of the scene begins.
* This will set the Cue to UNINITIALIZED state.
*/
virtual void Initialize();
/**
* Called when the scene reaches the end.
* If the cue state is ACTIVE when this method is called, this will
* trigger a EndAnimationCueEvent.
*/
virtual void Finalize();
//@{
/**
* This is valid only in a AnimationCueTickEvent handler.
* Before firing the event the animation cue sets the AnimationTime to
* the time of the tick.
*/
vtkGetMacro(AnimationTime, double);
//@}
//@{
/**
* This is valid only in a AnimationCueTickEvent handler.
* Before firing the event the animation cue sets the DeltaTime
* to the difference in time between the current tick and the last tick.
*/
vtkGetMacro(DeltaTime, double);
//@}
//@{
/**
* This is valid only in a AnimationCueTickEvent handler.
* Before firing the event the animation cue sets the ClockTime to
* the time of the tick. ClockTime is directly the time from the animation
* scene neither normalized nor offsetted to the start of the scene.
*/
vtkGetMacro(ClockTime, double);
//@}
enum TimeCodes
{
TIMEMODE_NORMALIZED = 0,
TIMEMODE_RELATIVE = 1
};
protected:
vtkAnimationCue();
~vtkAnimationCue() override;
enum
{
UNINITIALIZED = 0,
INACTIVE,
ACTIVE
};
double StartTime;
double EndTime;
int TimeMode;
// These are set when the AnimationCueTickEvent event
// is fired. Thus giving access to the information in
// the AnimationCueInfo struct in wrapped languages.
double AnimationTime;
double DeltaTime;
double ClockTime;
/**
* Current state of the Cue.
*/
int CueState;
//@{
/**
* These are the internal methods that actually trigger they
* corresponding events. Subclasses can override these to
* do extra processing at start/end or on tick.
*/
virtual void StartCueInternal();
virtual void TickInternal(double currenttime, double deltatime, double clocktime);
virtual void EndCueInternal();
//@}
private:
vtkAnimationCue(const vtkAnimationCue&) = delete;
void operator=(const vtkAnimationCue&) = delete;
};
#endif