using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.Timeline; namespace UnityEditor.Timeline { class ClipInspectorSelectionInfo { public double start, end, duration; public double multipleClipStart, multipleClipEnd; public double smallestDuration; public bool hasMultipleStartValues, hasMultipleEndValues, hasMultipleDurationValues; public bool supportsExtrapolation, supportsClipIn, supportsSpeedMultiplier, supportsBlending; public bool hasBlendIn, hasBlendOut; public double maxMixIn, maxMixOut; public bool selectedAssetTypesAreHomogeneous; public bool containsAtLeastTwoClipsOnTheSameTrack; public HashSet uniqueParentTracks = new HashSet(); public ICollection clips { get; private set; } public ClipInspectorSelectionInfo(ICollection selectedClips) { supportsBlending = supportsClipIn = supportsExtrapolation = supportsSpeedMultiplier = true; hasBlendIn = hasBlendOut = true; maxMixIn = maxMixOut = TimelineClip.kMaxTimeValue; selectedAssetTypesAreHomogeneous = true; smallestDuration = TimelineClip.kMaxTimeValue; start = end = duration = 0; multipleClipStart = multipleClipEnd = 0; hasMultipleStartValues = hasMultipleEndValues = hasMultipleDurationValues = false; containsAtLeastTwoClipsOnTheSameTrack = false; clips = selectedClips; Build(); } void Build() { if (!clips.Any()) return; var firstSelectedClip = clips.First(); if (firstSelectedClip == null) return; var firstSelectedClipAssetType = firstSelectedClip.asset != null ? firstSelectedClip.asset.GetType() : null; smallestDuration = TimelineClip.kMaxTimeValue; InitSelectionBounds(firstSelectedClip); InitMultipleClipBounds(firstSelectedClip); foreach (var clip in clips) { if (clip == null) continue; uniqueParentTracks.Add(clip.GetParentTrack()); selectedAssetTypesAreHomogeneous &= clip.asset.GetType() == firstSelectedClipAssetType; UpdateClipCaps(clip); UpdateBlends(clip); UpdateMixMaximums(clip); UpdateSmallestDuration(clip); UpdateMultipleValues(clip); UpdateMultipleValues(clip); } containsAtLeastTwoClipsOnTheSameTrack = uniqueParentTracks.Count != clips.Count; } public void Update() { var firstSelectedClip = clips.First(); if (firstSelectedClip == null) return; hasBlendIn = hasBlendOut = true; maxMixIn = maxMixOut = TimelineClip.kMaxTimeValue; hasMultipleStartValues = hasMultipleDurationValues = hasMultipleEndValues = false; smallestDuration = TimelineClip.kMaxTimeValue; InitSelectionBounds(firstSelectedClip); InitMultipleClipBounds(firstSelectedClip); foreach (var clip in clips) { if (clip == null) continue; UpdateBlends(clip); UpdateMixMaximums(clip); UpdateSmallestDuration(clip); UpdateMultipleValues(clip); } } void InitSelectionBounds(TimelineClip clip) { start = clip.start; duration = clip.duration; end = clip.start + clip.duration; } void InitMultipleClipBounds(TimelineClip firstSelectedClip) { multipleClipStart = firstSelectedClip.start; multipleClipEnd = end; } void UpdateSmallestDuration(TimelineClip clip) { smallestDuration = Math.Min(smallestDuration, clip.duration); } void UpdateClipCaps(TimelineClip clip) { supportsBlending &= clip.SupportsBlending(); supportsClipIn &= clip.SupportsClipIn(); supportsExtrapolation &= clip.SupportsExtrapolation(); supportsSpeedMultiplier &= clip.SupportsSpeedMultiplier(); } void UpdateMultipleValues(TimelineClip clip) { hasMultipleStartValues |= !Mathf.Approximately((float)clip.start, (float)start); hasMultipleDurationValues |= !Mathf.Approximately((float)clip.duration, (float)duration); var clipEnd = clip.start + clip.duration; hasMultipleEndValues |= !Mathf.Approximately((float)clipEnd, (float)end); multipleClipStart = Math.Min(multipleClipStart, clip.start); multipleClipEnd = Math.Max(multipleClipEnd, clip.end); } void UpdateBlends(TimelineClip clip) { hasBlendIn &= clip.hasBlendIn; hasBlendOut &= clip.hasBlendOut; } void UpdateMixMaximums(TimelineClip clip) { var clipMaxMixIn = Math.Max(0.0, clip.duration - clip.mixOutDuration); var clipMaxMixOut = Math.Max(0.0, clip.duration - clip.mixInDuration); maxMixIn = Math.Min(maxMixIn, clipMaxMixIn); maxMixOut = Math.Min(maxMixOut, clipMaxMixOut); } } }