123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- #if HAS_VFX_GRAPH
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- namespace UnityEditor.VFX.URP
- {
- [VFXInfo]
- class VFXURPLitMeshOutput : VFXAbstractParticleURPLitOutput, IVFXMultiMeshOutput
- {
- public override string name
- {
- get
- {
- return !string.IsNullOrEmpty(shaderName)
- ? $"Output Particle {shaderName} Mesh"
- : "Output Particle URP Lit Mesh";
- }
- }
- public override string codeGeneratorTemplate { get { return RenderPipeTemplate("VFXParticleLitMesh"); } }
- public override VFXTaskType taskType { get { return VFXTaskType.ParticleMeshOutput; } }
- public override bool supportsUV { get { return GetOrRefreshShaderGraphObject() == null; } }
- public override bool implementsMotionVector { get { return true; } }
- public override CullMode defaultCullMode { get { return CullMode.Back; } }
- [VFXSetting(VFXSettingAttribute.VisibleFlags.InInspector), Range(1, 4), Tooltip("Specifies the number of different meshes (up to 4). Mesh per particle can be specified with the meshIndex attribute."), SerializeField]
- private uint MeshCount = 1;
- [VFXSetting(VFXSettingAttribute.VisibleFlags.InInspector), Tooltip("When enabled, screen space LOD is used to determine with meshIndex to use per particle."), SerializeField]
- private bool lod = false;
- public uint meshCount => HasStrips(true) ? 1 : MeshCount;
- public override VFXOutputUpdate.Features outputUpdateFeatures
- {
- get
- {
- VFXOutputUpdate.Features features = base.outputUpdateFeatures;
- if (!HasStrips(true)) // TODO make it compatible with strips
- {
- if (MeshCount > 1)
- features |= VFXOutputUpdate.Features.MultiMesh;
- if (lod)
- features |= VFXOutputUpdate.Features.LOD;
- if (HasSorting() && VFXOutputUpdate.HasFeature(features, VFXOutputUpdate.Features.IndirectDraw))
- features |= VFXOutputUpdate.Features.Sort;
- }
- return features;
- }
- }
- 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.Alive, 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);
- yield return new VFXAttributeInfo(VFXAttribute.ScaleX, VFXAttributeMode.Read);
- yield return new VFXAttributeInfo(VFXAttribute.ScaleY, VFXAttributeMode.Read);
- yield return new VFXAttributeInfo(VFXAttribute.ScaleZ, VFXAttributeMode.Read);
- if (usesFlipbook)
- yield return new VFXAttributeInfo(VFXAttribute.TexIndex, VFXAttributeMode.Read);
- }
- }
- protected override IEnumerable<VFXPropertyWithValue> inputProperties
- {
- get
- {
- foreach (var property in base.inputProperties)
- yield return property;
- foreach (var property in VFXMultiMeshHelper.GetInputProperties(MeshCount, outputUpdateFeatures))
- yield return property;
- }
- }
- protected override IEnumerable<string> filteredOutSettings
- {
- get
- {
- foreach (var s in base.filteredOutSettings)
- yield return s;
- // TODO Add a experimental bool to setting attribute
- if (!VFXViewPreference.displayExperimentalOperator)
- {
- yield return "MeshCount";
- yield return "lod";
- }
- }
- }
- public override VFXExpressionMapper GetExpressionMapper(VFXDeviceTarget target)
- {
- var mapper = base.GetExpressionMapper(target);
- switch (target)
- {
- case VFXDeviceTarget.CPU:
- {
- foreach (var name in VFXMultiMeshHelper.GetCPUExpressionNames(MeshCount))
- mapper.AddExpression(inputSlots.First(s => s.name == name).GetExpression(), name, -1);
- break;
- }
- default:
- {
- break;
- }
- }
- return mapper;
- }
- }
- }
- #endif
|