source-engine/public/movieobjects/dmetrack.h

192 lines
6.1 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef DMETRACK_H
#define DMETRACK_H
#ifdef _WIN32
#pragma once
#endif
#include "tier1/utlflags.h"
#include "datamodel/dmelement.h"
#include "datamodel/dmehandle.h"
#include "movieobjects/dmeclip.h"
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class CDmeClip;
enum DmeClipType_t;
//-----------------------------------------------------------------------------
// Default track name
//-----------------------------------------------------------------------------
#define DMETRACK_DEFAULT_NAME "default"
//-----------------------------------------------------------------------------
// Constructor, destructor
//-----------------------------------------------------------------------------
class CDmeTrack : public CDmElement
{
DEFINE_ELEMENT( CDmeTrack, CDmElement );
public:
// Methods of IDmElement
virtual void OnAttributeChanged( CDmAttribute *pAttribute );
void SetCollapsed( bool state );
bool IsCollapsed() const;
void SetVolume( float state );
float GetVolume() const;
void SetMute( bool state );
bool IsMute( bool bCheckSoloing = true ) const;
// Is this track synched to the film track?
void SetSynched( bool bState );
bool IsSynched() const;
int GetClipCount() const;
CDmeClip *GetClip( int i ) const;
const CUtlVector< DmElementHandle_t > &GetClips( ) const;
void AddClip( CDmeClip *clip );
bool RemoveClip( CDmeClip *clip );
void RemoveClip( int i );
void RemoveAllClips();
int FindClip( CDmeClip *clip );
CDmeClip *FindNamedClip( const char *name );
DmeClipType_t GetClipType() const;
void SetClipType( DmeClipType_t type );
// Find clips at, intersecting or within a particular time interval
void FindClipsAtTime( DmeTime_t time, DmeClipSkipFlag_t flags, CUtlVector< CDmeClip * >& clips ) const;
void FindClipsIntersectingTime( DmeTime_t startTime, DmeTime_t endTime, DmeClipSkipFlag_t flags, CUtlVector< CDmeClip * >& clips ) const;
void FindClipsWithinTime( DmeTime_t startTime, DmeTime_t endTime, DmeClipSkipFlag_t flags, CUtlVector< CDmeClip * >& clips ) const;
// Methods to shift clips around
// These methods shift clips that straddle the start/end time (NOTE: time is measured in local time)
// NOTE: bTestStartingTime true means if the starting time is after the start time, then shift
// Setting it to false means if the clip intersects the time at all, then shift
void ShiftAllClipsAfter ( DmeTime_t startTime, DmeTime_t dt, bool bTestStartingTime = true );
void ShiftAllClipsBefore( DmeTime_t endTime, DmeTime_t dt, bool bTestEndingTime = true );
void ShiftAllClips( DmeTime_t dt );
// A version that works only on film clips
void ShiftAllFilmClipsAfter ( CDmeClip *pClip, DmeTime_t dt, bool bShiftClip = false );
void ShiftAllFilmClipsBefore( CDmeClip *pClip, DmeTime_t dt, bool bShiftClip = false );
// Sorts all children so they ascend in time
void SortClipsByStartTime( );
// Shifts all clips to be non-overlapping
void FixOverlaps();
// Can this track contain clips that overlap in time?
// NOTE: Non-overlapping clips will be
bool IsNonoverlapping() const;
// Is this a film track?
bool IsFilmTrack() const;
// Returns the next/previous clip in a film track
CDmeClip* FindPrevFilmClip( CDmeClip *pClip );
CDmeClip* FindNextFilmClip( CDmeClip *pClip );
void FindAdjacentFilmClips( CDmeClip *pClip, CDmeClip *&pPrevClip, CDmeClip *&pNextClip );
void FindAdjacentFilmClips( DmeTime_t localTime, CDmeClip *&pPrevClip, CDmeClip *&pNextClip );
// Finds a clip at a particular time
CDmeClip* FindFilmClipAtTime( DmeTime_t localTime );
// Find first clip that intersects a specific time range
CDmeClip* FindFirstFilmClipIntesectingTime( DmeTime_t localStartTime, DmeTime_t localEndTime );
// Inserts space in a film track for a film clip
void InsertSpaceInFilmTrack( DmeTime_t localStartTime, DmeTime_t localEndTime );
// Singleton solo track (of the same clip type that this track is)
CDmeTrack *GetSoloTrack( ) const;
void SetSoloTrack( );
bool IsSoloTrack() const;
static CDmeTrack *GetSoloTrack( DmeClipType_t clipType );
static void SetSoloTrack( DmeClipType_t clipType, CDmeTrack *pTrack );
// Fills all gaps in a film track with slugs
void FillAllGapsWithSlugs( const char *pSlugName, DmeTime_t startTime, DmeTime_t endTime );
private:
class CSuppressAutoFixup
{
public:
CSuppressAutoFixup( CDmeTrack *pTrack, int nFlags ) : m_pTrack( pTrack ), m_nFlags( nFlags )
{
m_pTrack->m_Flags.SetFlag( m_nFlags );
}
~CSuppressAutoFixup()
{
m_pTrack->m_Flags.ClearFlag( m_nFlags );
}
private:
CDmeTrack *m_pTrack;
int m_nFlags;
};
enum
{
IS_SORTED = 0x1,
SUPPRESS_OVERLAP_FIXUP = 0x2,
SUPPRESS_DIRTY_ORDERING = 0x4,
};
CDmaElementArray< CDmeClip > m_Clips;
CDmaVar< float > m_Volume;
CDmaVar< bool > m_Collapsed;
CDmaVar< bool > m_Mute;
CDmaVar< bool > m_Synched;
CDmaVar< int > m_ClipType;
CUtlFlags< unsigned char > m_Flags;
DmElementHandle_t m_hOwner;
static DmElementHandle_t m_hSoloTrack[DMECLIP_TYPE_COUNT];
friend class CSuppressAutoFixup;
};
//-----------------------------------------------------------------------------
// Indicates whether tracks contain clips that are non-overlapping in time
//-----------------------------------------------------------------------------
inline bool CDmeTrack::IsNonoverlapping() const
{
return m_ClipType == DMECLIP_FILM;
}
//-----------------------------------------------------------------------------
// Is this a film track?
//-----------------------------------------------------------------------------
inline bool CDmeTrack::IsFilmTrack() const
{
return m_ClipType == DMECLIP_FILM;
}
//-----------------------------------------------------------------------------
// helper methods
//-----------------------------------------------------------------------------
CDmeTrackGroup *GetParentTrackGroup( CDmeTrack *pTrack );
#endif // DMETRACK_H