IntervalTree <MetricRange> BuildIntervalTree(TaggedAnimationClip clip) { List <TagAnnotation> tags = clip.Tags; Profiler.BeginSample("MetricsTrack.BuildIntervalTree"); IntervalTree <MetricRange> intervalTree = new IntervalTree <MetricRange>(); for (var i = 0; i < tags.Count; i++) { var tag = tags[i]; int metricIndex = clip.GetMetricIndexCoveringTimeOnTag(tag); if (metricIndex < 0 || metricIndex >= TargetAsset.Metrics.Count) { continue; } string metricName = TargetAsset.GetMetric(metricIndex).name; intervalTree.Add(new MetricRange { intervalStart = tag.startTime, intervalEnd = tag.EndTime, name = metricName, priority = i }); } Profiler.EndSample(); return(intervalTree); }
List <Segment> ComputeSegments(TaggedAnimationClip clip, Asset asset) { List <Segment> segments = new List <Segment>(); foreach (TagAnnotation tag in clip.Tags) { if (clip.GetMetricIndexCoveringTimeOnTag(tag) < 0) { continue; } segments.Add(new Segment ( clip, asset, Mathf.Max(0.0f, tag.startTime), Mathf.Min(clip.DurationInSeconds, tag.EndTime) ) ); } segments.Sort((x, y) => x.startTime.CompareTo(y.startTime)); // merge overlapping segments for (int i = 0; i < segments.Count - 1;) { if (segments[i + 1].startTime > segments[i].endTime) { ++i; continue; } segments[i] = new Segment { clip = clip, asset = asset, startTime = segments[i].startTime, endTime = Mathf.Max(segments[i].endTime, segments[i + 1].endTime), tags = segments[i].tags }; segments[i].tags.AddRange(segments[i + 1].tags); segments.RemoveAt(i + 1); } return(segments); }