summaryrefslogtreecommitdiff
path: root/public/movieobjects/dmetrack.h
blob: b7afd96d3bcf5ab3179f383abed915478b5fa47d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
//========= 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