123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- 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,
- VirtualTexture,
- PropertyConnectionState,
- }
-
- enum ConcreteSlotValueType
- {
- SamplerState,
- Matrix4,
- Matrix3,
- Matrix2,
- Texture2D,
- Texture2DArray,
- Texture3D,
- Cubemap,
- Gradient,
- Vector4,
- Vector3,
- Vector2,
- Vector1,
- Boolean,
- VirtualTexture,
- PropertyConnectionState
- }
-
- // This enum must match ConcreteSlotValueType enum and is used to give friendly name in the enum popup used for custom function
- enum ConcreteSlotValueTypePopupName
- {
- SamplerState = ConcreteSlotValueType.SamplerState,
- Matrix4 = ConcreteSlotValueType.Matrix4,
- Matrix3 = ConcreteSlotValueType.Matrix3,
- Matrix2 = ConcreteSlotValueType.Matrix2,
- Texture2D = ConcreteSlotValueType.Texture2D,
- Texture2DArray = ConcreteSlotValueType.Texture2DArray,
- Texture3D = ConcreteSlotValueType.Texture3D,
- Cubemap = ConcreteSlotValueType.Cubemap,
- Gradient = ConcreteSlotValueType.Gradient,
- Vector4 = ConcreteSlotValueType.Vector4,
- Vector3 = ConcreteSlotValueType.Vector3,
- Vector2 = ConcreteSlotValueType.Vector2,
- Float = ConcreteSlotValueType.Vector1, // This is currently the only renaming we need - rename Vector1 to Float
- Boolean = ConcreteSlotValueType.Boolean,
- VirtualTexture = ConcreteSlotValueType.VirtualTexture,
- PropertyConnectionState = ConcreteSlotValueType.PropertyConnectionState,
-
- // These allow the user to choose 'bare' types for custom function nodes
- // they are treated specially in the conversion functions below
- BareSamplerState = 1000 + ConcreteSlotValueType.SamplerState,
- BareTexture2D = 1000 + ConcreteSlotValueType.Texture2D,
- BareTexture2DArray = 1000 + ConcreteSlotValueType.Texture2DArray,
- BareTexture3D = 1000 + ConcreteSlotValueType.Texture3D,
- BareCubemap = 1000 + ConcreteSlotValueType.Cubemap,
- }
-
- static class SlotValueHelper
- {
- public static ConcreteSlotValueTypePopupName ToConcreteSlotValueTypePopupName(this ConcreteSlotValueType slotType, bool isBareResource)
- {
- ConcreteSlotValueTypePopupName result = (ConcreteSlotValueTypePopupName)slotType;
- switch (slotType)
- {
- case ConcreteSlotValueType.SamplerState:
- if (isBareResource)
- result = ConcreteSlotValueTypePopupName.BareSamplerState;
- break;
- case ConcreteSlotValueType.Texture2D:
- if (isBareResource)
- result = ConcreteSlotValueTypePopupName.BareTexture2D;
- break;
- case ConcreteSlotValueType.Texture2DArray:
- if (isBareResource)
- result = ConcreteSlotValueTypePopupName.BareTexture2DArray;
- break;
- case ConcreteSlotValueType.Texture3D:
- if (isBareResource)
- result = ConcreteSlotValueTypePopupName.BareTexture3D;
- break;
- case ConcreteSlotValueType.Cubemap:
- if (isBareResource)
- result = ConcreteSlotValueTypePopupName.BareCubemap;
- break;
- }
- return result;
- }
-
- public static ConcreteSlotValueType ToConcreteSlotValueType(this ConcreteSlotValueTypePopupName popup, out bool isBareResource)
- {
- switch (popup)
- {
- case ConcreteSlotValueTypePopupName.BareSamplerState:
- isBareResource = true;
- return ConcreteSlotValueType.SamplerState;
- case ConcreteSlotValueTypePopupName.BareTexture2D:
- isBareResource = true;
- return ConcreteSlotValueType.Texture2D;
- case ConcreteSlotValueTypePopupName.BareTexture2DArray:
- isBareResource = true;
- return ConcreteSlotValueType.Texture2DArray;
- case ConcreteSlotValueTypePopupName.BareTexture3D:
- isBareResource = true;
- return ConcreteSlotValueType.Texture3D;
- case ConcreteSlotValueTypePopupName.BareCubemap:
- isBareResource = true;
- return ConcreteSlotValueType.Cubemap;
- }
- ;
-
- isBareResource = false;
- return (ConcreteSlotValueType)popup;
- }
-
- public static bool AllowedAsSubgraphOutput(this ConcreteSlotValueTypePopupName type)
- {
- // virtual textures and bare types disallowed
- return (type < ConcreteSlotValueTypePopupName.VirtualTexture);
- }
-
- 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, bool outputTypeIsConnectionTestable = false)
- {
- if (s_ValidConversions == null)
- {
- var validVectors = new List<SlotValueType>()
- {
- SlotValueType.Dynamic, SlotValueType.DynamicVector,
- SlotValueType.Vector1, SlotValueType.Vector2, SlotValueType.Vector3, SlotValueType.Vector4,
- SlotValueType.Boolean
- };
-
- s_ValidConversions = new Dictionary<ConcreteSlotValueType, List<SlotValueType>>()
- {
- {ConcreteSlotValueType.Boolean, new List<SlotValueType>() {SlotValueType.Boolean, SlotValueType.Dynamic, SlotValueType.DynamicVector, SlotValueType.Vector1, SlotValueType.Vector2, SlotValueType.Vector3, SlotValueType.Vector4}},
- {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}},
- {ConcreteSlotValueType.VirtualTexture, new List<SlotValueType>() {SlotValueType.VirtualTexture}},
- };
- }
-
- if (inputType == SlotValueType.PropertyConnectionState)
- {
- return outputTypeIsConnectionTestable;
- }
-
- if (s_ValidConversions.TryGetValue(outputType, out s_ValidSlotTypes))
- {
- return s_ValidSlotTypes.Contains(inputType);
- }
- throw new ArgumentOutOfRangeException("Unknown Concrete Slot Type: " + outputType);
- }
- }
- }
|