using System; using System.Linq; using System.Collections.Generic; using UnityEngine; using UnityEngine.VFX; namespace UnityEditor.VFX.Operator { class SampleMeshIndexCountProvider : SampleMeshProvider { protected override string nameTemplate { get; } = "Get {0} Index Count"; protected override Type operatorType { get; } = typeof(MeshIndexCount); } [VFXHelpURL("Operator-MeshIndexCount")] [VFXInfo(variantProvider = typeof(SampleMeshIndexCountProvider))] class MeshIndexCount : VFXOperator { override public string name { get { if (source == SampleMesh.SourceType.Mesh) return "Get Mesh Index Count"; else return "Get Skinned Mesh Index Count"; } } public class InputPropertiesMesh { [Tooltip("Specifies the Mesh to sample from.")] public Mesh mesh = VFXResources.defaultResources.mesh; } public class InputPropertiesSkinnedMeshRenderer { [Tooltip("Specifies the Skinned Mesh Renderer component to sample from. The Skinned Mesh Renderer has to be an exposed entry.")] public SkinnedMeshRenderer skinnedMesh = null; } public class OutputProperties { [Tooltip("The number of indices in this mesh")] public uint count; } [VFXSetting(VFXSettingAttribute.VisibleFlags.InInspector), SerializeField, Tooltip("Specifies the kind of geometry to sample from.")] private SampleMesh.SourceType source = SampleMesh.SourceType.Mesh; protected sealed override IEnumerable inputProperties { get { var props = base.inputProperties; if (source == SampleMesh.SourceType.Mesh) props = props.Concat(PropertiesFromType(nameof(InputPropertiesMesh))); else if (source == SampleMesh.SourceType.SkinnedMeshRenderer) props = props.Concat(PropertiesFromType(nameof(InputPropertiesSkinnedMeshRenderer))); else throw new InvalidOperationException("Unexpected source type : " + source); return props; } } protected override sealed VFXExpression[] BuildExpression(VFXExpression[] inputExpression) { var mesh = inputExpression[0].valueType == VFXValueType.Mesh ? inputExpression[0] : new VFXExpressionMeshFromSkinnedMeshRenderer(inputExpression[0]); var meshIndexCount = new VFXExpressionMeshIndexCount(mesh); return new VFXExpression[] { meshIndexCount }; } } }