您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

278 行
7.9 KiB

using UnityEngine;
namespace UnityEditor.VFXToolbox.ImageSequencer
{
public abstract class FrameProcessor
{
public int OutputWidth
{
get {
if (Enabled)
return GetOutputWidth();
else
return
InputSequence.width;
}
}
public int OutputHeight
{
get
{
if (Enabled)
return GetOutputHeight();
else
return
InputSequence.width;
}
}
public int NumU
{
get {
if (Enabled)
return GetNumU();
else
return InputSequence.numU;
}
}
public int NumV
{
get {
if (Enabled)
return GetNumV();
else
return InputSequence.numV;
}
}
public bool GenerateMipMaps;
public bool Linear;
public bool Enabled { get{ return m_bEnabled; } set {SetEnabled(value); } }
public ProcessingFrameSequence InputSequence
{
get { return m_ProcessorStack.GetInputSequence(this); }
}
public ProcessingFrameSequence OutputSequence
{
get { if (m_bEnabled) return m_OutputSequence; else return InputSequence; }
}
public ProcessorInfo ProcessorInfo
{
get { return m_ProcessorInfo; }
}
protected FrameProcessorStack m_ProcessorStack;
protected ProcessingFrameSequence m_OutputSequence;
protected bool m_bEnabled;
protected int m_OutputWidth;
protected int m_OutputHeight;
protected ProcessorInfo m_ProcessorInfo;
public FrameProcessor(FrameProcessorStack processorStack, ProcessorInfo info)
{
m_ProcessorInfo = info;
m_ProcessorInfo.ProcessorName = GetName();
m_bEnabled = m_ProcessorInfo.Enabled;
m_ProcessorStack = processorStack;
m_OutputSequence = new ProcessingFrameSequence(this);
Linear = true;
GenerateMipMaps = true;
}
public void SetEnabled(bool value)
{
m_bEnabled = value;
var info = new SerializedObject(m_ProcessorInfo);
info.Update();
info.FindProperty("Enabled").boolValue = value;
info.ApplyModifiedProperties();
}
public virtual void Dispose()
{
m_OutputSequence.Dispose();
}
public void Refresh()
{
if(Enabled != m_ProcessorInfo.Enabled)
Enabled = m_ProcessorInfo.Enabled;
UpdateSequenceLength();
UpdateOutputSize();
}
protected virtual void UpdateOutputSize()
{
SetOutputSize(InputSequence.width, InputSequence.height);
}
protected virtual int GetOutputWidth()
{
UpdateOutputSize();
return m_OutputWidth;
}
protected virtual int GetOutputHeight()
{
UpdateOutputSize();
return m_OutputHeight;
}
public void SetOutputSize(int width, int height)
{
if(m_OutputWidth != width || m_OutputHeight != height)
{
m_OutputWidth = Mathf.Clamp(width,1,8192);
m_OutputHeight = Mathf.Clamp(height,1,8192);
}
}
protected abstract int GetNumU();
protected abstract int GetNumV();
protected bool DrawSidePanelHeader()
{
bool bHasChanged = false;
bool previousEnabled = Enabled;
Enabled = VFXToolboxGUIUtility.ToggleableHeader(Enabled, false, GetName());
if(previousEnabled != Enabled)
{
SerializedObject o = new SerializedObject(m_ProcessorInfo);
o.FindProperty("Enabled").boolValue = Enabled;
o.ApplyModifiedProperties();
m_ProcessorStack.Invalidate(this);
bHasChanged = true;
}
return bHasChanged;
}
protected abstract bool DrawSidePanelContent(bool hasChanged);
public abstract bool OnSidePanelGUI(ImageSequence asset, int ProcessorIndex);
public abstract bool OnCanvasGUI(ImageSequencerCanvas canvas);
public virtual void RequestProcessOneFrame(int currentFrame)
{
int length = OutputSequence.length;
int i = (currentFrame + 1) % length;
while (i != currentFrame)
{
bool advance = false;
if(OutputSequence.frames[i].dirty)
{
advance = OutputSequence.Process(i);
if(advance) return;
}
i = (i + 1);
i %= length;
}
}
public abstract bool Process(int frame);
public virtual int GetProcessorSequenceLength()
{
return InputSequence.length;
}
public bool Process(ProcessingFrame frame)
{
return Process(OutputSequence.frames.IndexOf(frame));
}
public void UpdateSequenceLength()
{
int currentCount = m_OutputSequence.frames.Count;
int requiredCount = GetProcessorSequenceLength();
if (currentCount == requiredCount)
return;
if(currentCount > requiredCount)
{
for(int i = requiredCount - 1; i < currentCount - 1; i++)
{
m_OutputSequence.frames[i].Dispose();
}
m_OutputSequence.frames.RemoveRange(requiredCount - 1, currentCount - requiredCount);
}
else
{
for(int i = 0; i < requiredCount - currentCount; i++)
{
m_OutputSequence.frames.Add(new ProcessingFrame(this));
}
}
}
public virtual void Invalidate()
{
UpdateSequenceLength();
SetOutputSize(GetOutputWidth(), GetOutputHeight());
m_OutputSequence.InvalidateAll();
FrameProcessor next = m_ProcessorStack.GetNextProcessor(this);
if(next != null)
next.Invalidate();
}
public abstract string GetName();
public virtual string GetLabel()
{
return GetName();
}
public override string ToString()
{
return GetLabel() + (Enabled ? "" : " (Disabled)");
}
public abstract ProcessorSettingsBase GetSettingsAbstract();
}
public abstract class FrameProcessor<T> : FrameProcessor where T : ProcessorSettingsBase
{
public T settings { get { return m_Settings; } private set { m_Settings = value; m_SerializedObject = new SerializedObject(m_Settings); } }
private T m_Settings;
protected SerializedObject m_SerializedObject;
public FrameProcessor(FrameProcessorStack stack, ProcessorInfo info) : base(stack, info)
{
m_ProcessorInfo = info;
settings = (T)m_ProcessorInfo.Settings;
}
public override bool OnSidePanelGUI(ImageSequence asset, int ProcessorIndex)
{
bool bHasChanged = DrawSidePanelHeader();
using (new EditorGUI.DisabledScope(!Enabled))
{
m_SerializedObject.Update();
bHasChanged = DrawSidePanelContent(bHasChanged);
m_SerializedObject.ApplyModifiedProperties();
}
return bHasChanged;
}
public sealed override ProcessorSettingsBase GetSettingsAbstract()
{
return settings;
}
}
}