UnityGame/Library/PackageCache/com.unity.render-pipelines.universal/Editor/VFXGraph/VFXURPLitQuadStripOutput.cs
2024-10-27 10:53:47 +03:00

115 lines
5.3 KiB
C#

#if HAS_VFX_GRAPH
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace UnityEditor.VFX.URP
{
[VFXHelpURL("Context-OutputPrimitive")]
[VFXInfo(name = "Output ParticleStrip|URP Lit|Quad", category = "#3Output Strip", experimental = true)]
class VFXURPLitQuadStripOutput : VFXAbstractParticleURPLitOutput
{
protected VFXURPLitQuadStripOutput() : base(true) {} // strips
public override string name => "Output ParticleStrip".AppendLabel("URP Lit").AppendLabel("Quad");
public override string codeGeneratorTemplate => RenderPipeTemplate("VFXParticleLitPlanarPrimitive");
public override VFXTaskType taskType => VFXTaskType.ParticleQuadOutput;
public override bool supportsUV => true;
[VFXSetting(VFXSettingAttribute.VisibleFlags.InInspector), SerializeField, Tooltip("When enabled, a Normal Bending Factor slider becomes available in the output which can be used to adjust the curvature of the normals.")]
protected bool normalBending = false;
[VFXSetting, SerializeField, Tooltip("Specifies the way the UVs are interpolated along the strip. They can either be stretched or repeated per segment.")]
private StripTilingMode tilingMode = StripTilingMode.Stretch;
[VFXSetting, SerializeField, Tooltip("When enabled, uvs for the strips are swapped.")]
protected bool swapUV = false;
public class NormalBendingProperties
{
[Range(0, 1), Tooltip("Controls the amount by which the normals will be bent, creating a rounder look.")]
public float normalBendingFactor = 0.1f;
}
public class CustomUVInputProperties
{
[Tooltip("Specifies the texture coordinate value (u or v depending on swap UV being enabled) used along the strip.")]
public float texCoord = 0.0f;
}
protected override IEnumerable<VFXPropertyWithValue> inputProperties
{
get
{
var properties = base.inputProperties;
if (normalBending)
properties = properties.Concat(PropertiesFromType(nameof(NormalBendingProperties)));
if (tilingMode == StripTilingMode.Custom)
properties = properties.Concat(PropertiesFromType(nameof(CustomUVInputProperties)));
return properties;
}
}
public override IEnumerable<VFXAttributeInfo> attributes
{
get
{
yield return new VFXAttributeInfo(VFXAttribute.Position, VFXAttributeMode.Read);
if (colorMode != ColorMode.None)
yield return new VFXAttributeInfo(VFXAttribute.Color, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.Alpha, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.AxisX, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.AxisY, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.AxisZ, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.AngleX, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.AngleY, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.AngleZ, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.PivotX, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.PivotY, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.PivotZ, VFXAttributeMode.Read);
yield return new VFXAttributeInfo(VFXAttribute.Size, VFXAttributeMode.Read);
foreach (var attribute in flipbookAttributes)
yield return attribute;
}
}
protected override IEnumerable<VFXNamedExpression> CollectGPUExpressions(IEnumerable<VFXNamedExpression> slotExpressions)
{
foreach (var exp in base.CollectGPUExpressions(slotExpressions))
yield return exp;
if (normalBending)
yield return slotExpressions.First(o => o.name == nameof(NormalBendingProperties.normalBendingFactor));
if (tilingMode == StripTilingMode.Custom)
yield return slotExpressions.First(o => o.name == nameof(CustomUVInputProperties.texCoord));
}
public override IEnumerable<string> additionalDefines
{
get
{
foreach (var d in base.additionalDefines)
yield return d;
if (normalBending)
yield return "USE_NORMAL_BENDING";
if (tilingMode == StripTilingMode.Stretch)
yield return "VFX_STRIPS_UV_STRECHED";
else if (tilingMode == StripTilingMode.RepeatPerSegment)
yield return "VFX_STRIPS_UV_PER_SEGMENT";
if (swapUV)
yield return "VFX_STRIPS_SWAP_UV";
yield return "FORCE_NORMAL_VARYING"; // To avoid discrepancy between depth and color pass which could cause glitch with ztest
yield return VFXPlanarPrimitiveHelper.GetShaderDefine(VFXPrimitiveType.Quad);
}
}
}
}
#endif