84 lines
3.1 KiB
C#
84 lines
3.1 KiB
C#
using System;
|
|
|
|
namespace UnityEngine.Timeline
|
|
{
|
|
static class BlendUtility
|
|
{
|
|
static readonly double kMinOverlapTime = TimeUtility.kTimeEpsilon * 1000;
|
|
|
|
static bool Overlaps(TimelineClip blendOut, TimelineClip blendIn)
|
|
{
|
|
if (blendIn == blendOut)
|
|
return false;
|
|
|
|
if (Math.Abs(blendIn.start - blendOut.start) < TimeUtility.kTimeEpsilon)
|
|
{
|
|
return blendIn.duration >= blendOut.duration;
|
|
}
|
|
|
|
return blendIn.start >= blendOut.start && blendIn.start < blendOut.end;
|
|
}
|
|
|
|
public static void ComputeBlendsFromOverlaps(TimelineClip[] clips)
|
|
{
|
|
foreach (var clip in clips)
|
|
{
|
|
clip.blendInDuration = -1;
|
|
clip.blendOutDuration = -1;
|
|
}
|
|
|
|
Array.Sort(clips, (c1, c2) =>
|
|
Math.Abs(c1.start - c2.start) < TimeUtility.kTimeEpsilon ? c1.duration.CompareTo(c2.duration) : c1.start.CompareTo(c2.start));
|
|
|
|
for (var i = 0; i < clips.Length; i++)
|
|
{
|
|
var clip = clips[i];
|
|
if (!clip.SupportsBlending())
|
|
continue;
|
|
var blendIn = clip;
|
|
TimelineClip blendOut = null;
|
|
|
|
var blendOutCandidate = clips[Math.Max(i - 1, 0)];
|
|
if (Overlaps(blendOutCandidate, blendIn))
|
|
blendOut = blendOutCandidate;
|
|
|
|
if (blendOut != null)
|
|
{
|
|
UpdateClipIntersection(blendOut, blendIn);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void UpdateClipIntersection(TimelineClip blendOutClip, TimelineClip blendInClip)
|
|
{
|
|
if (!blendOutClip.SupportsBlending() || !blendInClip.SupportsBlending())
|
|
return;
|
|
|
|
if (blendInClip.start - blendOutClip.start < blendOutClip.duration - blendInClip.duration)
|
|
return;
|
|
|
|
double duration = Math.Max(0, blendOutClip.start + blendOutClip.duration - blendInClip.start);
|
|
duration = duration <= kMinOverlapTime ? 0 : duration;
|
|
blendOutClip.blendOutDuration = duration;
|
|
blendInClip.blendInDuration = duration;
|
|
|
|
var blendInMode = blendInClip.blendInCurveMode;
|
|
var blendOutMode = blendOutClip.blendOutCurveMode;
|
|
|
|
if (blendInMode == TimelineClip.BlendCurveMode.Manual && blendOutMode == TimelineClip.BlendCurveMode.Auto)
|
|
{
|
|
blendOutClip.mixOutCurve = CurveEditUtility.CreateMatchingCurve(blendInClip.mixInCurve);
|
|
}
|
|
else if (blendInMode == TimelineClip.BlendCurveMode.Auto && blendOutMode == TimelineClip.BlendCurveMode.Manual)
|
|
{
|
|
blendInClip.mixInCurve = CurveEditUtility.CreateMatchingCurve(blendOutClip.mixOutCurve);
|
|
}
|
|
else if (blendInMode == TimelineClip.BlendCurveMode.Auto && blendOutMode == TimelineClip.BlendCurveMode.Auto)
|
|
{
|
|
blendInClip.mixInCurve = null; // resets to default curves
|
|
blendOutClip.mixOutCurve = null;
|
|
}
|
|
}
|
|
}
|
|
}
|