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

146 行
5.4 KiB

using UnityEngine;
namespace UnityEditor.VFXToolbox.ImageSequencer
{
class ResizeProcessor : GPUFrameProcessor<ResizeProcessorSettings>
{
public ResizeProcessor(FrameProcessorStack stack, ProcessorInfo info)
: base("Packages/com.unity.vfx-toolbox/ImageSequencer/Editor/Shaders/Resize.shader", stack,info)
{ }
protected override void UpdateOutputSize()
{
SetOutputSize(settings.Width, settings.Height);
}
public override string GetLabel()
{
return string.Format("{0} ({1}x{2})",GetName(), settings.Width,settings.Height);
}
public override string GetName()
{
return "Resize";
}
public override bool OnCanvasGUI(ImageSequencerCanvas canvas)
{
if (Event.current.type != EventType.Repaint)
return false;
Vector2 center = canvas.CanvasToScreen(Vector2.zero);
Vector2 topRight;
Vector2 bottomLeft;
topRight = canvas.CanvasToScreen(new Vector2(-canvas.currentFrame.texture.width/2 , canvas.currentFrame.texture.height/2 ));
bottomLeft = canvas.CanvasToScreen(new Vector2(canvas.currentFrame.texture.width/2 , -canvas.currentFrame.texture.height/2 ));
// Arrows
Handles.color = canvas.styles.green;
Handles.DrawLine(new Vector3(topRight.x, topRight.y - 16), new Vector3(bottomLeft.x, topRight.y - 16));
Handles.DrawLine(new Vector3(bottomLeft.x - 16, topRight.y), new Vector3(bottomLeft.x - 16, bottomLeft.y));
Handles.color = Color.white;
// Texts
GUI.color = Color.green;
GUI.Label(new Rect(center.x - 32 , topRight.y - 32 , 64, 16), settings.Width.ToString(), canvas.styles.miniLabelCenter);
VFXToolboxGUIUtility.GUIRotatedLabel(new Rect(bottomLeft.x - 48, center.y - 8, 64, 16), settings.Height.ToString(), -90.0f, canvas.styles.miniLabelCenter);
GUI.color = Color.white;
return false;
}
public override bool Process(int frame)
{
Texture texture = InputSequence.RequestFrame(frame).texture;
Vector4 kernelAndSize = new Vector4((float)texture.width / (float)settings.Width, (float)texture.height / (float)settings.Height, (float)settings.Width, (float)settings.Height);
m_Material.SetTexture("_MainTex", texture);
m_Material.SetVector("_KernelAndSize", kernelAndSize);
ExecuteShaderAndDump(frame, texture);
return true;
}
private void MenuSetWidth(object o)
{
m_SerializedObject.Update();
var width = m_SerializedObject.FindProperty("Width");
width.intValue = (int)o;
m_SerializedObject.ApplyModifiedProperties();
Invalidate();
UpdateOutputSize();
}
private void MenuSetHeight(object o)
{
m_SerializedObject.Update();
var height = m_SerializedObject.FindProperty("Height");
height.intValue = (int)o;
m_SerializedObject.ApplyModifiedProperties();
Invalidate();
UpdateOutputSize();
}
protected override bool DrawSidePanelContent(bool hasChanged)
{
var width = m_SerializedObject.FindProperty("Width");
var height = m_SerializedObject.FindProperty("Height");
EditorGUI.BeginChangeCheck();
using (new GUILayout.HorizontalScope())
{
int w = Mathf.Clamp(EditorGUILayout.IntField(VFXToolboxGUIUtility.Get("Width"), width.intValue), 1, 8192);
if(GUILayout.Button("",EditorStyles.popup,GUILayout.Width(16)))
{
GenericMenu menu = new GenericMenu();
for(int s = 8192; s >= 16; s /=2)
{
menu.AddItem(VFXToolboxGUIUtility.Get(s.ToString()), false, MenuSetWidth, s);
}
menu.ShowAsContext();
}
if (w != width.intValue)
{
width.intValue = w;
}
}
using (new GUILayout.HorizontalScope())
{
int h = Mathf.Clamp(EditorGUILayout.IntField(VFXToolboxGUIUtility.Get("Height"), height.intValue), 1, 8192);
if(GUILayout.Button("",EditorStyles.popup,GUILayout.Width(16)))
{
GenericMenu menu = new GenericMenu();
for(int s = 8192; s >= 16; s /=2)
{
menu.AddItem(VFXToolboxGUIUtility.Get(s.ToString()), false, MenuSetHeight, s);
}
menu.ShowAsContext();
}
if (h != height.intValue)
{
height.intValue = h;
}
}
if(Mathf.Log(height.intValue,2)% 1.0f != 0 || Mathf.Log(width.intValue,2)% 1.0f != 0 )
{
EditorGUILayout.HelpBox("Warning: your resize resolution is not a power of two.", MessageType.Warning);
}
if(EditorGUI.EndChangeCheck())
{
UpdateOutputSize();
Invalidate();
hasChanged = true;
}
return hasChanged;
}
}
}