123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- 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;
- }
- }
- }
|