Files
FC1/Editor/AnimationContext.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

338 lines
7.9 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: animationcontext.cpp
// Version: v1.00
// Created: 7/5/2002 by Timur.
// Compilers: Visual Studio.NET
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "AnimationContext.h"
#include "IMovieSystem.h"
#include "ITimer.h"
#include "GameEngine.h"
#include "Objects\SelectionGroup.h"
#include "IObjectManager.h"
#include "Viewport.h"
#include "ViewManager.h"
//using namespace std;
//////////////////////////////////////////////////////////////////////////
CAnimationContext::CAnimationContext()
{
m_paused = 0;
m_playing = false;
m_recording = false;
m_timeRange.Set(0,0);
m_timeMarker.Set(0,0);
m_currTime = 0;
m_fTimeScale = 1.0f;
m_sequence = 0;
m_bLooping = false;
m_bAutoRecording = false;
m_fRecordingTimeStep = 0;
m_bEncodeAVI = false;
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::SetSequence( IAnimSequence *seq )
{
if (m_sequence)
{
SetTime(0);
m_sequence->Deactivate();
}
m_sequence = seq;
if (m_sequence)
{
m_timeRange = m_sequence->GetTimeRange();
m_timeMarker=m_timeRange;
m_sequence->Activate();
ForceAnimation();
}
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::SetTime( float t )
{
if (t < m_timeRange.start)
t = m_timeRange.start;
if (t > m_timeRange.end)
t = m_timeRange.end;
if (fabs(m_currTime-t) < 0.001f)
return;
m_currTime = t;
m_fRecordingCurrTime = t;
ForceAnimation();
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::Pause()
{
assert( m_paused >= 0 );
m_paused++;
if (m_recording)
GetIEditor()->GetMovieSystem()->SetRecording(false);
GetIEditor()->GetMovieSystem()->Pause();
if (m_sequence)
m_sequence->Pause();
if (m_bEncodeAVI)
PauseAVIEncoding(true);
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::Resume()
{
assert( m_paused > 0 );
m_paused--;
if (m_recording && m_paused == 0)
GetIEditor()->GetMovieSystem()->SetRecording(true);
GetIEditor()->GetMovieSystem()->Resume();
if (m_sequence)
m_sequence->Resume();
if (m_bEncodeAVI)
PauseAVIEncoding(false);
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::SetRecording( bool recording )
{
if (recording == m_recording)
return;
m_paused = 0;
m_recording = recording;
m_playing = false;
if (!recording && m_fRecordingTimeStep != 0)
SetAutoRecording( false,0 );
// If started recording, assume we have modified the document.
GetIEditor()->SetModifiedFlag();
GetIEditor()->GetMovieSystem()->SetRecording(recording);
if (m_bEncodeAVI)
StopAVIEncoding();
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::SetPlaying( bool playing )
{
if (playing == m_playing)
return;
m_paused = 0;
m_playing = playing;
m_recording = false;
GetIEditor()->GetMovieSystem()->SetRecording(false);
if (playing)
{
GetIEditor()->GetMovieSystem()->Resume();
if (m_sequence)
m_sequence->Resume();
if (m_bEncodeAVI)
StartAVIEncoding();
}
else
{
GetIEditor()->GetMovieSystem()->Pause();
GetIEditor()->GetMovieSystem()->SetSequenceStopBehavior( IMovieSystem::ONSTOP_GOTO_START_TIME );
GetIEditor()->GetMovieSystem()->StopAllSequences();
GetIEditor()->GetMovieSystem()->SetSequenceStopBehavior( IMovieSystem::ONSTOP_GOTO_END_TIME );
if (m_sequence)
m_sequence->Pause();
if (m_bEncodeAVI)
StopAVIEncoding();
}
/*
if (!playing && m_sequence != 0)
m_sequence->Reset();
*/
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::Update()
{
if (m_paused > 0 || !(m_playing || m_bAutoRecording))
return;
ITimer *pTimer = GetIEditor()->GetSystem()->GetITimer();
if (!m_bAutoRecording)
{
if (m_sequence != NULL)
{
SAnimContext ac;
ac.dt = 0;
ac.fps = pTimer->GetFrameRate();
ac.time = m_currTime;
ac.bSingleFrame = (!m_playing) || (m_fTimeScale!=1.0f);
m_sequence->Animate( ac );
}
float dt = pTimer->GetFrameTime();
m_currTime += dt * m_fTimeScale;
if (!m_recording)
GetIEditor()->GetMovieSystem()->Update(dt);
}
else
{
float dt = pTimer->GetFrameTime();
m_fRecordingCurrTime += dt*m_fTimeScale;
if (fabs(m_fRecordingCurrTime-m_currTime) > m_fRecordingTimeStep)
m_currTime += m_fRecordingTimeStep;
}
if (m_currTime > m_timeMarker.end)
{
if (m_bAutoRecording)
{
SetAutoRecording(false,0);
}
else
{
if (m_bLooping)
m_currTime = m_timeMarker.start;
else
SetPlaying(false);
}
}
if (m_bAutoRecording)
{
// This is auto recording mode.
// Send sync with physics event to all selected entities.
GetIEditor()->GetSelection()->SendEvent( EVENT_PHYSICS_GETSTATE );
}
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::ForceAnimation()
{
// Before animating node, pause recording.
Pause();
if (m_sequence)
{
SAnimContext ac;
ac.dt = 0;
ac.fps = GetIEditor()->GetSystem()->GetITimer()->GetFrameRate();
ac.time = m_currTime;
ac.bSingleFrame = true;
m_sequence->Animate( ac );
}
Resume();
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::ResetAnimations( bool bPlayOnLoad )
{
if (m_sequence)
{
SetTime(0);
}
GetIEditor()->GetMovieSystem()->Reset(bPlayOnLoad);
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::SetAutoRecording( bool bEnable,float fTimeStep )
{
if (bEnable)
{
m_bAutoRecording = true;
m_fRecordingTimeStep = fTimeStep;
// Turn on fixed time step.
ICVar *fixed_time_step = GetIEditor()->GetSystem()->GetIConsole()->GetCVar( "fixed_time_step" );
if (fixed_time_step)
{
//fixed_time_step->Set( m_fRecordingTimeStep );
}
// Enables physics/ai.
GetIEditor()->GetGameEngine()->SetSimulationMode(true);
SetRecording(bEnable);
}
else
{
m_bAutoRecording = false;
m_fRecordingTimeStep = 0;
// Turn off fixed time step.
ICVar *fixed_time_step = GetIEditor()->GetSystem()->GetIConsole()->GetCVar( "fixed_time_step" );
if (fixed_time_step)
{
//fixed_time_step->Set( 0 );
}
// Disables physics/ai.
GetIEditor()->GetGameEngine()->SetSimulationMode(false);
}
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::PlayToAVI( bool bEnable,const char *aviFilename )
{
if (bEnable && aviFilename)
{
m_bEncodeAVI = true;
m_aviFilename = aviFilename;
}
else
{
m_bEncodeAVI = false;
}
}
//////////////////////////////////////////////////////////////////////////
bool CAnimationContext::IsPlayingToAVI() const
{
return m_bEncodeAVI;
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::StartAVIEncoding()
{
CViewport* pViewport = GetIEditor()->GetViewManager()->GetActiveViewport();
if (pViewport)
{
pViewport->StartAVIRecording( m_aviFilename );
}
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::StopAVIEncoding()
{
CViewport* pViewport = GetIEditor()->GetViewManager()->GetActiveViewport();
if (pViewport)
{
pViewport->StopAVIRecording();
}
}
//////////////////////////////////////////////////////////////////////////
void CAnimationContext::PauseAVIEncoding( bool bPause )
{
CViewport* pViewport = GetIEditor()->GetViewManager()->GetActiveViewport();
if (pViewport)
{
pViewport->PauseAVIRecording( bPause );
}
}