コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }