public void Init(VisualEffectControlTrack parentTrack, bool reinitWithBinding, bool reinitWithUnbinding) { #if UNITY_EDITOR m_ParentTrack = parentTrack; #endif m_ReinitWithBinding = reinitWithBinding; m_ReinitWithUnbinding = reinitWithUnbinding; }
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); }
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 }