Singularity/Library/PackageCache/com.unity.render-pipelines..../Editor/2D/ShaderGraph/Targets/UniversalSpriteUnlitSubTarg...
2024-05-06 11:45:45 -07:00

245 lines
9.3 KiB
C#

using System;
using System.Linq;
using System.Collections.Generic;
using UnityEditor.ShaderGraph;
using UnityEditor.ShaderGraph.Legacy;
using UnityEditor.UIElements;
namespace UnityEditor.Rendering.Universal.ShaderGraph
{
sealed class UniversalSpriteUnlitSubTarget : SubTarget<UniversalTarget>, ILegacyTarget
{
static readonly GUID kSourceCodeGuid = new GUID("ed7c0aacec26e9646b45c96fb318e5a3"); // UniversalSpriteUnlitSubTarget.cs
public UniversalSpriteUnlitSubTarget()
{
displayName = "Sprite Unlit";
}
public override bool IsActive() => true;
public override void Setup(ref TargetSetupContext context)
{
context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency);
context.AddSubShader(SubShaders.SpriteUnlit(target));
}
public override void GetFields(ref TargetFieldContext context)
{
var descs = context.blocks.Select(x => x.descriptor);
// Only support SpriteColor legacy block if BaseColor/Alpha are not active
bool useLegacyBlocks = !descs.Contains(BlockFields.SurfaceDescription.BaseColor) && !descs.Contains(BlockFields.SurfaceDescription.Alpha);
context.AddField(CoreFields.UseLegacySpriteBlocks, useLegacyBlocks);
// Surface Type
context.AddField(UniversalFields.SurfaceTransparent);
context.AddField(Fields.DoubleSided);
// Blend Mode
switch (target.alphaMode)
{
case AlphaMode.Premultiply:
context.AddField(UniversalFields.BlendPremultiply);
break;
case AlphaMode.Additive:
context.AddField(UniversalFields.BlendAdd);
break;
case AlphaMode.Multiply:
context.AddField(UniversalFields.BlendMultiply);
break;
default:
context.AddField(Fields.BlendAlpha);
break;
}
}
public override void GetActiveBlocks(ref TargetActiveBlockContext context)
{
// Only support SpriteColor legacy block if BaseColor/Alpha are not active
bool useLegacyBlocks = !context.currentBlocks.Contains(BlockFields.SurfaceDescription.BaseColor) && !context.currentBlocks.Contains(BlockFields.SurfaceDescription.Alpha);
context.AddBlock(BlockFields.SurfaceDescriptionLegacy.SpriteColor, useLegacyBlocks);
context.AddBlock(BlockFields.SurfaceDescription.Alpha);
}
public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action<String> registerUndo)
{
context.AddProperty("Blending Mode", new EnumField(AlphaMode.Alpha) { value = target.alphaMode }, (evt) =>
{
if (Equals(target.alphaMode, evt.newValue))
return;
registerUndo("Change Blend");
target.alphaMode = (AlphaMode)evt.newValue;
onChange();
});
}
public bool TryUpgradeFromMasterNode(IMasterNode1 masterNode, out Dictionary<BlockFieldDescriptor, int> blockMap)
{
blockMap = null;
if (!(masterNode is SpriteUnlitMasterNode1 spriteUnlitMasterNode))
return false;
// Set blockmap
blockMap = new Dictionary<BlockFieldDescriptor, int>()
{
{ BlockFields.VertexDescription.Position, 9 },
{ BlockFields.VertexDescription.Normal, 10 },
{ BlockFields.VertexDescription.Tangent, 11 },
{ BlockFields.SurfaceDescriptionLegacy.SpriteColor, 0 },
};
return true;
}
#region SubShader
static class SubShaders
{
public static SubShaderDescriptor SpriteUnlit(UniversalTarget target)
{
SubShaderDescriptor result = new SubShaderDescriptor()
{
pipelineTag = UniversalTarget.kPipelineTag,
customTags = UniversalTarget.kUnlitMaterialTypeTag,
renderType = $"{RenderType.Transparent}",
renderQueue = $"{UnityEditor.ShaderGraph.RenderQueue.Transparent}",
generatesPreview = true,
passes = new PassCollection
{
{ SpriteUnlitPasses.Unlit },
// Currently neither of these passes (selection/picking) can be last for the game view for
// UI shaders to render correctly. Verify [1352225] before changing this order.
{ CorePasses._2DSceneSelection(target) },
{ CorePasses._2DScenePicking(target) },
{ SpriteUnlitPasses.Forward },
},
};
return result;
}
}
#endregion
#region Passes
static class SpriteUnlitPasses
{
public static PassDescriptor Unlit = new PassDescriptor
{
// Definition
displayName = "Sprite Unlit",
referenceName = "SHADERPASS_SPRITEUNLIT",
lightMode = "Universal2D",
useInPreview = true,
// Template
passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"),
sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
// Port Mask
validVertexBlocks = CoreBlockMasks.Vertex,
validPixelBlocks = SpriteUnlitBlockMasks.Fragment,
// Fields
structs = CoreStructCollections.Default,
requiredFields = SpriteUnlitRequiredFields.Unlit,
fieldDependencies = CoreFieldDependencies.Default,
// Conditional State
renderStates = CoreRenderStates.Default,
pragmas = CorePragmas._2DDefault,
keywords = SpriteUnlitKeywords.Unlit,
includes = SpriteUnlitIncludes.Unlit,
// Custom Interpolator Support
customInterpolators = CoreCustomInterpDescriptors.Common
};
public static PassDescriptor Forward = new PassDescriptor
{
// Definition
displayName = "Sprite Unlit",
referenceName = "SHADERPASS_SPRITEFORWARD",
lightMode = "UniversalForward",
useInPreview = true,
// Template
passTemplatePath = GenerationUtils.GetDefaultTemplatePath("PassMesh.template"),
sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
// Port Mask
validVertexBlocks = CoreBlockMasks.Vertex,
validPixelBlocks = SpriteUnlitBlockMasks.Fragment,
// Fields
structs = CoreStructCollections.Default,
requiredFields = SpriteUnlitRequiredFields.Unlit,
fieldDependencies = CoreFieldDependencies.Default,
// Conditional State
renderStates = CoreRenderStates.Default,
pragmas = CorePragmas._2DDefault,
keywords = SpriteUnlitKeywords.Unlit,
includes = SpriteUnlitIncludes.Unlit,
// Custom Interpolator Support
customInterpolators = CoreCustomInterpDescriptors.Common
};
}
#endregion
#region PortMasks
static class SpriteUnlitBlockMasks
{
public static BlockFieldDescriptor[] Fragment = new BlockFieldDescriptor[]
{
BlockFields.SurfaceDescription.BaseColor,
BlockFields.SurfaceDescriptionLegacy.SpriteColor,
BlockFields.SurfaceDescription.Alpha,
};
}
#endregion
#region RequiredFields
static class SpriteUnlitRequiredFields
{
public static FieldCollection Unlit = new FieldCollection()
{
StructFields.Attributes.color,
StructFields.Attributes.uv0,
StructFields.Varyings.positionWS,
StructFields.Varyings.color,
StructFields.Varyings.texCoord0,
};
}
#endregion
#region Keywords
static class SpriteUnlitKeywords
{
public static KeywordCollection Unlit = new KeywordCollection
{
{ CoreKeywordDescriptors.DebugDisplay },
};
}
#endregion
#region Includes
static class SpriteUnlitIncludes
{
const string kSpriteUnlitPass = "Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/SpriteUnlitPass.hlsl";
public static IncludeCollection Unlit = new IncludeCollection
{
// Pre-graph
{ CoreIncludes.CorePregraph },
{ CoreIncludes.ShaderGraphPregraph },
// Post-graph
{ CoreIncludes.CorePostgraph },
{ kSpriteUnlitPass, IncludeLocation.Postgraph },
};
}
#endregion
}
}