설명 없음
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

VFXURPLitPlanarPrimitiveOutput.cs 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #if HAS_VFX_GRAPH
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using UnityEngine;
  6. namespace UnityEditor.VFX.URP
  7. {
  8. class VFXURPPlanarPrimitiveOutputSubVariantProvider : VariantProvider
  9. {
  10. private readonly VFXPrimitiveType mainVariantType;
  11. public VFXURPPlanarPrimitiveOutputSubVariantProvider(VFXPrimitiveType type)
  12. {
  13. this.mainVariantType = type;
  14. }
  15. public override IEnumerable<Variant> GetVariants()
  16. {
  17. foreach (var primitive in Enum.GetValues(typeof(VFXPrimitiveType)).Cast<VFXPrimitiveType>())
  18. {
  19. if (primitive == this.mainVariantType)
  20. continue;
  21. yield return new Variant(
  22. "Output Particle".AppendLabel("URP Lit", false).AppendLabel(primitive.ToString()),
  23. null,
  24. typeof(VFXURPLitPlanarPrimitiveOutput),
  25. new[] {new KeyValuePair<string, object>("primitiveType", primitive)});
  26. }
  27. }
  28. }
  29. class VFXURPPlanarPrimitiveOutputProvider : VariantProvider
  30. {
  31. public override IEnumerable<Variant> GetVariants()
  32. {
  33. yield return new Variant(
  34. "Output Particle".AppendLabel("URP Lit", false).AppendLabel("Quad", false),
  35. VFXLibraryStringHelper.Separator("Output Basic", 2),
  36. typeof(VFXURPLitPlanarPrimitiveOutput),
  37. new[] {new KeyValuePair<string, object>("primitiveType", VFXPrimitiveType.Quad)},
  38. () => new VFXURPPlanarPrimitiveOutputSubVariantProvider(VFXPrimitiveType.Quad));
  39. }
  40. }
  41. [VFXHelpURL("Context-OutputPrimitive")]
  42. [VFXInfo(variantProvider = typeof(VFXURPPlanarPrimitiveOutputProvider))]
  43. class VFXURPLitPlanarPrimitiveOutput : VFXAbstractParticleURPLitOutput
  44. {
  45. public override string name => "Output Particle".AppendLabel("URP Lit").AppendLabel(primitiveType.ToString());
  46. public override string codeGeneratorTemplate { get { return RenderPipeTemplate("VFXParticleLitPlanarPrimitive"); } }
  47. public override VFXTaskType taskType { get { return VFXPlanarPrimitiveHelper.GetTaskType(primitiveType); } }
  48. public override bool supportsUV { get { return GetOrRefreshShaderGraphObject() == null; } }
  49. public sealed override bool implementsMotionVector { get { return true; } }
  50. [VFXSetting(VFXSettingAttribute.VisibleFlags.InInspector), SerializeField, Tooltip("Specifies what primitive type to use for this output. Triangle outputs have fewer vertices, octagons can be used to conform the geometry closer to the texture to avoid overdraw, and quads are a good middle ground.")]
  51. protected VFXPrimitiveType primitiveType = VFXPrimitiveType.Quad;
  52. [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.")]
  53. protected bool normalBending = false;
  54. public class NormalBendingProperties
  55. {
  56. [Range(0, 1), Tooltip("Controls the amount by which the normals will be bent, creating a rounder look.")]
  57. public float normalBendingFactor = 0.1f;
  58. }
  59. protected override IEnumerable<VFXPropertyWithValue> inputProperties
  60. {
  61. get
  62. {
  63. var properties = base.inputProperties;
  64. if (normalBending)
  65. properties = properties.Concat(PropertiesFromType("NormalBendingProperties"));
  66. if (primitiveType == VFXPrimitiveType.Octagon)
  67. properties = properties.Concat(PropertiesFromType(typeof(VFXPlanarPrimitiveHelper.OctagonInputProperties)));
  68. return properties;
  69. }
  70. }
  71. protected override IEnumerable<VFXNamedExpression> CollectGPUExpressions(IEnumerable<VFXNamedExpression> slotExpressions)
  72. {
  73. foreach (var exp in base.CollectGPUExpressions(slotExpressions))
  74. yield return exp;
  75. if (normalBending)
  76. yield return slotExpressions.First(o => o.name == nameof(NormalBendingProperties.normalBendingFactor));
  77. if (primitiveType == VFXPrimitiveType.Octagon)
  78. yield return slotExpressions.First(o => o.name == nameof(VFXPlanarPrimitiveHelper.OctagonInputProperties.cropFactor));
  79. }
  80. public override IEnumerable<string> additionalDefines
  81. {
  82. get
  83. {
  84. foreach (var d in base.additionalDefines)
  85. yield return d;
  86. if (normalBending)
  87. yield return "USE_NORMAL_BENDING";
  88. yield return "FORCE_NORMAL_VARYING"; // To avoid discrepancy between depth and color pass which could cause glitch with ztest
  89. yield return VFXPlanarPrimitiveHelper.GetShaderDefine(primitiveType);
  90. }
  91. }
  92. }
  93. }
  94. #endif