diff options
Diffstat (limited to 'movieobjects/dmetimeframe.cpp')
| -rw-r--r-- | movieobjects/dmetimeframe.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/movieobjects/dmetimeframe.cpp b/movieobjects/dmetimeframe.cpp new file mode 100644 index 0000000..4dff9f1 --- /dev/null +++ b/movieobjects/dmetimeframe.cpp @@ -0,0 +1,95 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= +#include "movieobjects/dmetimeframe.h" +#include "tier0/dbg.h" +#include "datamodel/dmelementfactoryhelper.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + + +//----------------------------------------------------------------------------- +// Class factory +//----------------------------------------------------------------------------- +IMPLEMENT_ELEMENT_FACTORY( DmeTimeFrame, CDmeTimeFrame ); + + +//----------------------------------------------------------------------------- +// Constructor, destructor +//----------------------------------------------------------------------------- +void CDmeTimeFrame::OnConstruction() +{ + m_Start .InitAndSet( this, "startTime", 0, FATTRIB_HAS_CALLBACK ); + m_Duration.InitAndSet( this, "durationTime", 0, FATTRIB_HAS_CALLBACK ); + m_Offset .InitAndSet( this, "offsetTime", 0 ); + m_Scale .InitAndSet( this, "scale", 1.0f ); +} + +void CDmeTimeFrame::OnDestruction() +{ +} + + +void CDmeTimeFrame::OnAttributeChanged( CDmAttribute *pAttribute ) +{ + BaseClass::OnAttributeChanged( pAttribute ); + + // notify parent clip that the time has changed + if ( pAttribute == m_Start.GetAttribute() || pAttribute == m_Duration.GetAttribute() ) + { + InvokeOnAttributeChangedOnReferrers( GetHandle(), pAttribute ); + } +} + +void CDmeTimeFrame::SetEndTime( DmeTime_t endTime, bool bChangeDuration ) +{ + if ( bChangeDuration ) + { + m_Duration = endTime.GetTenthsOfMS() - m_Start; + } + else + { + m_Start = endTime.GetTenthsOfMS() - m_Duration; + } +} + +void CDmeTimeFrame::SetTimeScale( float flScale, DmeTime_t scaleCenter, bool bChangeDuration ) +{ +#ifdef _DEBUG + DmeTime_t preCenterTime = ToChildMediaTime( scaleCenter, false ); +#endif + + float ratio = m_Scale / flScale; + int t = scaleCenter.GetTenthsOfMS() - m_Start; + + if ( bChangeDuration ) + { + int newDuration = int( m_Duration * ratio ); + + if ( scaleCenter.GetTenthsOfMS() != m_Start ) + { + int newStart = int( ( m_Start - scaleCenter.GetTenthsOfMS() ) * ratio + scaleCenter.GetTenthsOfMS() ); + SetStartTime( DmeTime_t( newStart ) ); + } + + int newStart = m_Start; + int newOffset = int( ( t + m_Offset ) * ratio + newStart - scaleCenter.GetTenthsOfMS() ); + SetTimeOffset( DmeTime_t( newOffset ) ); + SetDuration( DmeTime_t( newDuration ) ); + } + else + { + int newOffset = int( ( t + m_Offset ) * ratio - t ); + SetTimeOffset( DmeTime_t( newOffset ) ); + } + + SetTimeScale( flScale ); + +#ifdef _DEBUG + DmeTime_t postCenterTime = ToChildMediaTime( scaleCenter, false ); + Assert( abs( preCenterTime - postCenterTime ) <= DMETIME_MINDELTA ); +#endif +} |