Unity-jump-proj
This commit is contained in:
@ -0,0 +1,126 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEditorInternal;
|
||||
using UnityEngine;
|
||||
|
||||
namespace UnityEditor.Timeline
|
||||
{
|
||||
class TimelineClipUnion
|
||||
{
|
||||
List<TimelineClipGUI> m_Members = new List<TimelineClipGUI>();
|
||||
Rect m_BoundingRect;
|
||||
Rect m_Union;
|
||||
double m_Start;
|
||||
double m_Duration;
|
||||
bool m_InitUnionRect = true;
|
||||
|
||||
void Add(TimelineClipGUI clip)
|
||||
{
|
||||
m_Members.Add(clip);
|
||||
if (m_Members.Count == 1)
|
||||
{
|
||||
m_BoundingRect = clip.clippedRect;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_BoundingRect = Encompass(m_BoundingRect, clip.rect);
|
||||
}
|
||||
}
|
||||
|
||||
public void Draw(Rect parentRect, WindowState state)
|
||||
{
|
||||
if (m_InitUnionRect)
|
||||
{
|
||||
m_Start = m_Members.OrderBy(c => c.clip.start).First().clip.start;
|
||||
m_Duration = m_Members.Sum(c => c.clip.duration);
|
||||
m_InitUnionRect = false;
|
||||
}
|
||||
|
||||
m_Union = new Rect((float)(m_Start) * state.timeAreaScale.x, 0, (float)m_Duration * state.timeAreaScale.x, 0);
|
||||
|
||||
// transform clipRect into pixel-space
|
||||
m_Union.xMin += state.timeAreaTranslation.x + parentRect.x;
|
||||
m_Union.xMax += state.timeAreaTranslation.x + parentRect.x;
|
||||
m_Union.y = parentRect.y + 4.0f;
|
||||
m_Union.height = parentRect.height - 8.0f;
|
||||
|
||||
// calculate clipped rect
|
||||
if (m_Union.x < parentRect.xMin)
|
||||
{
|
||||
var overflow = parentRect.xMin - m_Union.x;
|
||||
m_Union.x = parentRect.xMin;
|
||||
m_Union.width -= overflow;
|
||||
}
|
||||
|
||||
// bail out if completely clipped
|
||||
if (m_Union.xMax < parentRect.xMin)
|
||||
return;
|
||||
if (m_Union.xMin > parentRect.xMax)
|
||||
return;
|
||||
|
||||
EditorGUI.DrawRect(m_Union, DirectorStyles.Instance.customSkin.colorClipUnion);
|
||||
}
|
||||
|
||||
public static List<TimelineClipUnion> Build(List<TimelineClipGUI> clips)
|
||||
{
|
||||
var unions = new List<TimelineClipUnion>();
|
||||
if (clips == null)
|
||||
return unions;
|
||||
|
||||
TimelineClipUnion currentUnion = null;
|
||||
foreach (var c in clips)
|
||||
{
|
||||
if (currentUnion == null)
|
||||
{
|
||||
currentUnion = new TimelineClipUnion();
|
||||
currentUnion.Add(c);
|
||||
unions.Add(currentUnion);
|
||||
}
|
||||
else
|
||||
{
|
||||
Rect result;
|
||||
if (Intersection(c.rect, currentUnion.m_BoundingRect, out result))
|
||||
{
|
||||
currentUnion.Add(c);
|
||||
}
|
||||
else
|
||||
{
|
||||
currentUnion = new TimelineClipUnion();
|
||||
currentUnion.Add(c);
|
||||
unions.Add(currentUnion);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return unions;
|
||||
}
|
||||
|
||||
public static Rect Encompass(Rect a, Rect b)
|
||||
{
|
||||
Rect newRect = a;
|
||||
newRect.xMin = Mathf.Min(a.xMin, b.xMin);
|
||||
newRect.yMin = Mathf.Min(a.yMin, b.yMin);
|
||||
newRect.xMax = Mathf.Max(a.xMax, b.xMax);
|
||||
newRect.yMax = Mathf.Max(a.yMax, b.yMax);
|
||||
return newRect;
|
||||
}
|
||||
|
||||
public static bool Intersection(Rect r1, Rect r2, out Rect intersection)
|
||||
{
|
||||
if (!r1.Overlaps(r2) && !r2.Overlaps(r1))
|
||||
{
|
||||
intersection = new Rect(0, 0, 0, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
float left = Mathf.Max(r1.xMin, r2.xMin);
|
||||
float top = Mathf.Max(r1.yMin, r2.yMin);
|
||||
|
||||
float right = Mathf.Min(r1.xMax, r2.xMax);
|
||||
float bottom = Mathf.Min(r1.yMax, r2.yMax);
|
||||
|
||||
intersection = new Rect(left, top, right - left, bottom - top);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user