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
|