Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

135 行
4.8 KiB

using System;
using System.Collections.Generic;
using UnityEditor.Graphing;
namespace UnityEditor.ShaderGraph
{
[Serializable]
enum SlotValueType
{
SamplerState,
DynamicMatrix,
Matrix4,
Matrix3,
Matrix2,
Texture2D,
Texture2DArray,
Texture3D,
Cubemap,
Gradient,
DynamicVector,
Vector4,
Vector3,
Vector2,
Vector1,
Dynamic,
Boolean
}
enum ConcreteSlotValueType
{
SamplerState,
Matrix4,
Matrix3,
Matrix2,
Texture2D,
Texture2DArray,
Texture3D,
Cubemap,
Gradient,
Vector4,
Vector3,
Vector2,
Vector1,
Boolean
}
static class SlotValueHelper
{
public static int GetChannelCount(this ConcreteSlotValueType type)
{
switch (type)
{
case ConcreteSlotValueType.Vector4:
return 4;
case ConcreteSlotValueType.Vector3:
return 3;
case ConcreteSlotValueType.Vector2:
return 2;
case ConcreteSlotValueType.Vector1:
return 1;
default:
return 0;
}
}
public static int GetMatrixDimension(ConcreteSlotValueType type)
{
switch (type)
{
case ConcreteSlotValueType.Matrix4:
return 4;
case ConcreteSlotValueType.Matrix3:
return 3;
case ConcreteSlotValueType.Matrix2:
return 2;
default:
return 0;
}
}
public static ConcreteSlotValueType ConvertMatrixToVectorType(ConcreteSlotValueType matrixType)
{
switch (matrixType)
{
case ConcreteSlotValueType.Matrix4:
return ConcreteSlotValueType.Vector4;
case ConcreteSlotValueType.Matrix3:
return ConcreteSlotValueType.Vector3;
default:
return ConcreteSlotValueType.Vector2;
}
}
static Dictionary<ConcreteSlotValueType, List<SlotValueType>> s_ValidConversions;
static List<SlotValueType> s_ValidSlotTypes;
public static bool AreCompatible(SlotValueType inputType, ConcreteSlotValueType outputType)
{
if (s_ValidConversions == null)
{
var validVectors = new List<SlotValueType>()
{
SlotValueType.Dynamic, SlotValueType.DynamicVector,
SlotValueType.Vector1, SlotValueType.Vector2, SlotValueType.Vector3, SlotValueType.Vector4
};
s_ValidConversions = new Dictionary<ConcreteSlotValueType, List<SlotValueType>>()
{
{ConcreteSlotValueType.Boolean, new List<SlotValueType>() {SlotValueType.Boolean}},
{ConcreteSlotValueType.Vector1, validVectors},
{ConcreteSlotValueType.Vector2, validVectors},
{ConcreteSlotValueType.Vector3, validVectors},
{ConcreteSlotValueType.Vector4, validVectors},
{ConcreteSlotValueType.Matrix2, new List<SlotValueType>()
{SlotValueType.Dynamic, SlotValueType.DynamicMatrix, SlotValueType.Matrix2}},
{ConcreteSlotValueType.Matrix3, new List<SlotValueType>()
{SlotValueType.Dynamic, SlotValueType.DynamicMatrix, SlotValueType.Matrix2, SlotValueType.Matrix3}},
{ConcreteSlotValueType.Matrix4, new List<SlotValueType>()
{SlotValueType.Dynamic, SlotValueType.DynamicMatrix, SlotValueType.Matrix2, SlotValueType.Matrix3, SlotValueType.Matrix4}},
{ConcreteSlotValueType.Texture2D, new List<SlotValueType>() {SlotValueType.Texture2D}},
{ConcreteSlotValueType.Texture3D, new List<SlotValueType>() {SlotValueType.Texture3D}},
{ConcreteSlotValueType.Texture2DArray, new List<SlotValueType>() {SlotValueType.Texture2DArray}},
{ConcreteSlotValueType.Cubemap, new List<SlotValueType>() {SlotValueType.Cubemap}},
{ConcreteSlotValueType.SamplerState, new List<SlotValueType>() {SlotValueType.SamplerState}},
{ConcreteSlotValueType.Gradient, new List<SlotValueType>() {SlotValueType.Gradient}},
};
}
if(s_ValidConversions.TryGetValue(outputType, out s_ValidSlotTypes))
{
return s_ValidSlotTypes.Contains(inputType);
}
throw new ArgumentOutOfRangeException("Unknown Concrete Slot Type: " + outputType);
}
}
}