using System; using System.Linq; using System.Runtime.CompilerServices; using UnityEngine; using UnityEngine.VFX; namespace UnityEditor.VFX { class VFXExpressionTextureWidth : VFXExpression { public VFXExpressionTextureWidth() : this(VFXTexture2DValue.Default) { } public VFXExpressionTextureWidth(VFXExpression texture) : base(Flags.InvalidOnGPU, new VFXExpression[1] { texture }) { } sealed public override VFXExpressionOperation operation { get { return VFXExpressionOperation.TextureWidth; } } sealed public override VFXValueType valueType { get { return VFXValueType.Uint32; } } sealed protected override VFXExpression Evaluate(VFXExpression[] constParents) { var tex = constParents[0].Get(); return VFXValue.Constant(tex ? (uint)tex.width : 0u); } } class VFXExpressionTextureHeight : VFXExpression { public VFXExpressionTextureHeight() : this(VFXTexture2DValue.Default) { } public VFXExpressionTextureHeight(VFXExpression texture) : base(Flags.InvalidOnGPU, new VFXExpression[1] { texture }) { } sealed public override VFXExpressionOperation operation { get { return VFXExpressionOperation.TextureHeight; } } sealed public override VFXValueType valueType { get { return VFXValueType.Uint32; } } sealed protected override VFXExpression Evaluate(VFXExpression[] constParents) { var tex = constParents[0].Get(); return VFXValue.Constant(tex ? (uint)tex.height : 0u); } } class VFXExpressionTextureDepth : VFXExpression { public VFXExpressionTextureDepth() : this(VFXTexture2DValue.Default) { } public VFXExpressionTextureDepth(VFXExpression texture) : base(Flags.InvalidOnGPU, new VFXExpression[1] { texture }) { } sealed public override VFXExpressionOperation operation { get { return VFXExpressionOperation.TextureDepth; } } sealed public override VFXValueType valueType { get { return VFXValueType.Uint32; } } sealed protected override VFXExpression Evaluate(VFXExpression[] constParents) { var tex = constParents[0].Get(); uint depth = 0u; if (tex != null) { if (tex is Texture3D) depth = (uint)((Texture3D)tex).depth; else if (tex is Texture2DArray) depth = (uint)((Texture2DArray)tex).depth; else if (tex is CubemapArray) depth = (uint)((CubemapArray)tex).cubemapCount; else depth = 1u; } return VFXValue.Constant(depth); } } class VFXExpressionTextureFormat : VFXExpression { public VFXExpressionTextureFormat() : this(VFXTexture2DValue.Default) { } public VFXExpressionTextureFormat(VFXExpression texture) : base(Flags.InvalidOnGPU, new [] { texture }) { } public sealed override VFXExpressionOperation operation { get { return VFXExpressionOperation.TextureFormat; } } public sealed override VFXValueType valueType { get { return VFXValueType.Uint32; } } protected sealed override VFXExpression Evaluate(VFXExpression[] constParents) { var texture = constParents[0].Get(); return VFXValue.Constant((uint)VFXExpressionTexture.GetTextureFormat(texture)); } } }