132 lines
4.8 KiB
C#
132 lines
4.8 KiB
C#
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)
|
|
{
|
|
float minimumPlayRangeTime = 0.01f;
|
|
float t0 = Mathf.Max(0.0f, state.PixelToTime(state.timeAreaRect.xMin));
|
|
float t1 = Mathf.Min((float)state.masterSequence.duration, state.PixelToTime(state.timeAreaRect.xMax));
|
|
|
|
if (Mathf.Abs(t1 - t0) <= minimumPlayRangeTime)
|
|
{
|
|
state.playRange = new Vector2(t0, t1);
|
|
return;
|
|
}
|
|
|
|
float deltaT = (t1 - t0) * 0.25f / 2.0f;
|
|
|
|
t0 += deltaT;
|
|
t1 -= deltaT;
|
|
|
|
if (t1 < t0)
|
|
{
|
|
float temp = t0;
|
|
t0 = t1;
|
|
t1 = temp;
|
|
}
|
|
|
|
if (Mathf.Abs(t1 - t0) < minimumPlayRangeTime)
|
|
{
|
|
if (t0 - minimumPlayRangeTime > 0.0f)
|
|
t0 -= minimumPlayRangeTime;
|
|
else if (t1 + minimumPlayRangeTime < state.masterSequence.duration)
|
|
t1 += minimumPlayRangeTime;
|
|
}
|
|
|
|
state.playRange = new Vector2(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.x);
|
|
m_PlayRangeEnd.Draw(sequenceContentRect, state, playRangeTime.y);
|
|
|
|
// Draw Time Range Box from Start to End...
|
|
if (state.playRangeEnabled && m_PlayHead != null)
|
|
{
|
|
Rect rect =
|
|
Rect.MinMaxRect(
|
|
Mathf.Clamp(state.TimeToPixel(playRangeTime.x), state.timeAreaRect.xMin, state.timeAreaRect.xMax),
|
|
m_PlayHead.bounds.yMax,
|
|
Mathf.Clamp(state.TimeToPixel(playRangeTime.y), 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)
|
|
{
|
|
Vector2 range = state.playRange;
|
|
range.x = (float)newTime;
|
|
state.playRange = range;
|
|
m_PlayRangeStart.showTooltip = true;
|
|
}
|
|
|
|
void OnTrackHeadMaxSelectDrag(double newTime)
|
|
{
|
|
Vector2 range = state.playRange;
|
|
range.y = (float)newTime;
|
|
state.playRange = range;
|
|
m_PlayRangeEnd.showTooltip = true;
|
|
}
|
|
}
|
|
}
|