예제 #1
0
        public void Init(VisualEffectControlTrack parentTrack, bool reinitWithBinding, bool reinitWithUnbinding)
        {
#if UNITY_EDITOR
            m_ParentTrack = parentTrack;
#endif
            m_ReinitWithBinding   = reinitWithBinding;
            m_ReinitWithUnbinding = reinitWithUnbinding;
        }
예제 #2
0
        public override void PrepareFrame(Playable playable, FrameData data)
        {
            if (m_Target == null)
            {
                return;
            }

            if (m_ScrubbingCacheHelper == null)
            {
                m_ScrubbingCacheHelper = new VisualEffectControlTrackController();

                VisualEffectControlTrack parentTrack = null;
#if UNITY_EDITOR
                parentTrack = m_ParentTrack;
#endif
                m_ScrubbingCacheHelper.Init(playable, m_Target, parentTrack);
            }

            var globalTime = playable.GetTime();
            var deltaTime  = data.deltaTime;
            m_ScrubbingCacheHelper.Update(globalTime, deltaTime);
        }
예제 #3
0
        public void Init(Playable playable, VisualEffect vfx, VisualEffectControlTrack parentTrack)
        {
            m_Target = vfx;
#if UNITY_EDITOR
            m_Director = playable.GetGraph().GetResolver() as PlayableDirector;
            m_Track    = parentTrack;
#endif
            m_BackupStartSeed    = m_Target.startSeed;
            m_BackupReseedOnPlay = m_Target.resetSeedOnPlay;

            var chunks     = new Stack <Chunk>();
            int inputCount = playable.GetInputCount();

            var playableBehaviors = new List <VisualEffectControlPlayableBehaviour>();
            for (int i = 0; i < inputCount; ++i)
            {
                var inputPlayable = playable.GetInput(i);
                if (inputPlayable.GetPlayableType() != typeof(VisualEffectControlPlayableBehaviour))
                {
                    continue;
                }

                var inputVFXPlayable = (ScriptPlayable <VisualEffectControlPlayableBehaviour>)inputPlayable;
                var inputBehavior    = inputVFXPlayable.GetBehaviour();
                if (inputBehavior != null)
                {
                    playableBehaviors.Add(inputBehavior);
                }
            }

            playableBehaviors.Sort(new VisualEffectControlPlayableBehaviourComparer());
            foreach (var inputBehavior in playableBehaviors)
            {
                if (!chunks.Any() ||
                    inputBehavior.clipStart > chunks.Peek().end ||
                    inputBehavior.scrubbing != chunks.Peek().scrubbing ||
                    (!inputBehavior.scrubbing && (inputBehavior.reinitEnter || chunks.Peek().reinitExit)) ||
                    inputBehavior.startSeed != chunks.Peek().startSeed ||
                    inputBehavior.prewarmStepCount != 0u)
                {
                    chunks.Push(new Chunk()
                    {
                        begin       = inputBehavior.clipStart,
                        events      = new Event[0],
                        clips       = new Clip[0],
                        scrubbing   = inputBehavior.scrubbing,
                        startSeed   = inputBehavior.startSeed,
                        reinitEnter = inputBehavior.reinitEnter,
                        reinitExit  = inputBehavior.reinitExit,

                        prewarmCount     = inputBehavior.prewarmStepCount,
                        prewarmDeltaTime = inputBehavior.prewarmDeltaTime,
                        prewarmEvent     = inputBehavior.prewarmEvent != null ? inputBehavior.prewarmEvent : 0,
                        prewarmOffset    = (double)inputBehavior.prewarmStepCount * inputBehavior.prewarmDeltaTime
                    });
                }

                var currentChunk = chunks.Peek();
                currentChunk.end = inputBehavior.clipEnd;
                var currentsEvents = ComputeRuntimeEvent(inputBehavior, vfx);

                if (!currentChunk.scrubbing)
                {
                    var sortedEventWithSourceIndex = currentsEvents.Select((e, i) =>
                    {
                        return(new
                        {
                            evt = e,
                            sourceIndex = i
                        });
                    }).OrderBy(o => o.evt.time)
                                                     .ToList();

                    var newClips  = new Clip[inputBehavior.clipEventsCount];
                    var newEvents = new List <Event>();
                    for (int actualIndex = 0; actualIndex < sortedEventWithSourceIndex.Count; actualIndex++)
                    {
                        var newEvent    = sortedEventWithSourceIndex[actualIndex].evt;
                        var sourceIndex = sortedEventWithSourceIndex[actualIndex].sourceIndex;
                        if (sourceIndex < inputBehavior.clipEventsCount * 2)
                        {
                            var actualSortedClipIndex = currentChunk.events.Length + actualIndex;
                            var localClipIndex        = sourceIndex / 2;
                            newEvent.clipIndex = localClipIndex + currentChunk.clips.Length;
                            if (sourceIndex % 2 == 0)
                            {
                                newEvent.clipType = Event.ClipType.Enter;
                                newClips[localClipIndex].enter = actualSortedClipIndex;
                            }
                            else
                            {
                                newEvent.clipType             = Event.ClipType.Exit;
                                newClips[localClipIndex].exit = actualSortedClipIndex;
                            }
                            newEvents.Add(newEvent);
                        }
                        else //Not a clip event
                        {
                            newEvents.Add(newEvent);
                        }
                    }
                    currentChunk.clips  = currentChunk.clips.Concat(newClips).ToArray();
                    currentChunk.events = currentChunk.events.Concat(newEvents).ToArray();
                }
                else
                {
#if UNITY_EDITOR
                    m_Scrubbing = true;
#endif

                    //No need to compute clip information
                    currentsEvents      = currentsEvents.OrderBy(o => o.time);
                    currentChunk.events = currentChunk.events.Concat(currentsEvents).ToArray();
                }


                chunks.Pop();
                chunks.Push(currentChunk);
            }
            m_Chunks = chunks.Reverse().ToArray();
#if UNITY_EDITOR
            VisualEffectControlErrorHelper.instance.RegisterControlTrack(this);
#endif
        }