133 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			133 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using System.Linq; | ||
|  | using UnityEngine; | ||
|  | 
 | ||
|  | namespace UnityEditor.Timeline | ||
|  | { | ||
|  |     partial class TimelineWindow | ||
|  |     { | ||
|  |         TimeAreaItem m_PlayRangeEnd; | ||
|  |         TimeAreaItem m_PlayRangeStart; | ||
|  | 
 | ||
|  |         void PlayRangeGUI(TimelineItemArea area) | ||
|  |         { | ||
|  |             if (!currentMode.ShouldShowPlayRange(state) || treeView == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             if (state.masterSequence.asset != null && !state.masterSequence.asset.GetRootTracks().Any()) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             // left Time Cursor | ||
|  |             if (m_PlayRangeStart == null || m_PlayRangeStart.style != styles.playTimeRangeStart) | ||
|  |             { | ||
|  |                 m_PlayRangeStart = new TimeAreaItem(styles.playTimeRangeStart, OnTrackHeadMinSelectDrag); | ||
|  |                 Vector2 offset = new Vector2(-2.0f, 0); | ||
|  |                 m_PlayRangeStart.boundOffset = offset; | ||
|  |             } | ||
|  | 
 | ||
|  |             // right Time Cursor | ||
|  |             if (m_PlayRangeEnd == null || m_PlayRangeEnd.style != styles.playTimeRangeEnd) | ||
|  |             { | ||
|  |                 m_PlayRangeEnd = new TimeAreaItem(styles.playTimeRangeEnd, OnTrackHeadMaxSelectDrag); | ||
|  |                 Vector2 offset = new Vector2(2.0f, 0); | ||
|  |                 m_PlayRangeEnd.boundOffset = offset; | ||
|  |             } | ||
|  | 
 | ||
|  |             if (area == TimelineItemArea.Header) | ||
|  |                 DrawPlayRange(true, false); | ||
|  |             else if (area == TimelineItemArea.Lines) | ||
|  |                 DrawPlayRange(false, true); | ||
|  |         } | ||
|  | 
 | ||
|  |         void DrawPlayRange(bool drawHeads, bool drawLines) | ||
|  |         { | ||
|  |             Rect timeCursorRect = state.timeAreaRect; | ||
|  |             timeCursorRect.height = clientArea.height; | ||
|  | 
 | ||
|  |             m_PlayRangeEnd.HandleManipulatorsEvents(state); | ||
|  |             m_PlayRangeStart.HandleManipulatorsEvents(state); | ||
|  | 
 | ||
|  |             // The first time a user enable the play range, we put the play range 75% around the current time... | ||
|  |             if (state.playRange == TimelineAssetViewModel.NoPlayRangeSet) | ||
|  |             { | ||
|  |                 double minimumPlayRangeTime = 0.01; | ||
|  |                 double t0 = Math.Max(0.0f, state.PixelToTime(state.timeAreaRect.xMin)); | ||
|  |                 double t1 = Math.Min(state.masterSequence.duration, state.PixelToTime(state.timeAreaRect.xMax)); | ||
|  | 
 | ||
|  |                 if (Math.Abs(t1 - t0) <= minimumPlayRangeTime) | ||
|  |                 { | ||
|  |                     state.playRange = new PlayRange(t0, t1); | ||
|  |                     return; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 double deltaT = (t1 - t0) * 0.25 / 2.0; | ||
|  | 
 | ||
|  |                 t0 += deltaT; | ||
|  |                 t1 -= deltaT; | ||
|  | 
 | ||
|  |                 if (t1 < t0) | ||
|  |                 { | ||
|  |                     double temp = t0; | ||
|  |                     t0 = t1; | ||
|  |                     t1 = temp; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 if (Math.Abs(t1 - t0) < minimumPlayRangeTime) | ||
|  |                 { | ||
|  |                     if (t0 - minimumPlayRangeTime > 0.0f) | ||
|  |                         t0 -= minimumPlayRangeTime; | ||
|  |                     else if (t1 + minimumPlayRangeTime < state.masterSequence.duration) | ||
|  |                         t1 += minimumPlayRangeTime; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 state.playRange = new PlayRange(t0, t1); | ||
|  |             } | ||
|  | 
 | ||
|  |             // Draw the head or the lines according to the parameters.. | ||
|  |             m_PlayRangeStart.drawHead = drawHeads; | ||
|  |             m_PlayRangeStart.drawLine = drawLines; | ||
|  | 
 | ||
|  |             m_PlayRangeEnd.drawHead = drawHeads; | ||
|  |             m_PlayRangeEnd.drawLine = drawLines; | ||
|  | 
 | ||
|  |             var playRangeTime = state.playRange; | ||
|  |             m_PlayRangeStart.Draw(sequenceContentRect, state, playRangeTime.start); | ||
|  |             m_PlayRangeEnd.Draw(sequenceContentRect, state, playRangeTime.end); | ||
|  | 
 | ||
|  |             // Draw Time Range Box from Start to End... | ||
|  |             if (state.playRangeEnabled && m_PlayHead != null) | ||
|  |             { | ||
|  |                 Rect rect = | ||
|  |                     Rect.MinMaxRect( | ||
|  |                         Mathf.Clamp(state.TimeToPixel(playRangeTime.start), state.timeAreaRect.xMin, state.timeAreaRect.xMax), | ||
|  |                         m_PlayHead.bounds.yMax, | ||
|  |                         Mathf.Clamp(state.TimeToPixel(playRangeTime.end), state.timeAreaRect.xMin, state.timeAreaRect.xMax), | ||
|  |                         sequenceContentRect.height + state.timeAreaRect.height + timeCursorRect.y | ||
|  |                     ); | ||
|  | 
 | ||
|  | 
 | ||
|  |                 EditorGUI.DrawRect(rect, DirectorStyles.Instance.customSkin.colorRange); | ||
|  | 
 | ||
|  |                 rect.height = 3f; | ||
|  |                 EditorGUI.DrawRect(rect, Color.white); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         void OnTrackHeadMinSelectDrag(double newTime) | ||
|  |         { | ||
|  |             PlayRange range = state.playRange; | ||
|  |             range.start = newTime; | ||
|  |             state.playRange = range; | ||
|  |             m_PlayRangeStart.showTooltip = true; | ||
|  |         } | ||
|  | 
 | ||
|  |         void OnTrackHeadMaxSelectDrag(double newTime) | ||
|  |         { | ||
|  |             PlayRange range = state.playRange; | ||
|  |             range.end = newTime; | ||
|  |             state.playRange = range; | ||
|  |             m_PlayRangeEnd.showTooltip = true; | ||
|  |         } | ||
|  |     } | ||
|  | } |