using System;
using UnityEngine.Scripting.APIUpdating;
namespace UnityEngine.Rendering.Universal
{
///
/// Controls how the light texture is used when rendering Sprites and other 2D renderers.
///
[Serializable]
[MovedFrom("UnityEngine.Experimental.Rendering.Universal")]
public struct Light2DBlendStyle
{
internal enum TextureChannel
{
None = 0,
R = 1,
G = 2,
B = 3,
A = 4,
OneMinusR = 5,
OneMinusG = 6,
OneMinusB = 7,
OneMinusA = 8
}
internal struct MaskChannelFilter
{
public Vector4 mask { get; private set; }
public Vector4 inverted { get; private set; }
public MaskChannelFilter(Vector4 m, Vector4 i)
{
mask = m;
inverted = i;
}
}
internal enum BlendMode
{
Additive = 0,
Multiply = 1,
Subtractive = 2
}
[Serializable]
internal struct BlendFactors
{
public float multiplicative;
public float additive;
}
///
/// Returns the name of the blend style
///
public string name;
[SerializeField]
internal TextureChannel maskTextureChannel;
[SerializeField]
internal BlendMode blendMode;
internal Vector2 blendFactors
{
get
{
var result = new Vector2();
switch (blendMode)
{
case BlendMode.Additive:
result.x = 0.0f;
result.y = 1.0f;
break;
case BlendMode.Multiply:
result.x = 1.0f;
result.y = 0.0f;
break;
case BlendMode.Subtractive:
result.x = 0.0f;
result.y = -1.0f;
break;
default:
result.x = 1.0f;
result.y = 0.0f;
break;
}
return result;
}
}
internal MaskChannelFilter maskTextureChannelFilter
{
get
{
switch (maskTextureChannel)
{
case TextureChannel.R:
return new MaskChannelFilter(new Vector4(1, 0, 0, 0), new Vector4(0, 0, 0, 0));
case TextureChannel.OneMinusR:
return new MaskChannelFilter(new Vector4(1, 0, 0, 0), new Vector4(1, 0, 0, 0));
case TextureChannel.G:
return new MaskChannelFilter(new Vector4(0, 1, 0, 0), new Vector4(0, 0, 0, 0));
case TextureChannel.OneMinusG:
return new MaskChannelFilter(new Vector4(0, 1, 0, 0), new Vector4(0, 1, 0, 0));
case TextureChannel.B:
return new MaskChannelFilter(new Vector4(0, 0, 1, 0), new Vector4(0, 0, 0, 0));
case TextureChannel.OneMinusB:
return new MaskChannelFilter(new Vector4(0, 0, 1, 0), new Vector4(0, 0, 1, 0));
case TextureChannel.A:
return new MaskChannelFilter(new Vector4(0, 0, 0, 1), new Vector4(0, 0, 0, 0));
case TextureChannel.OneMinusA:
return new MaskChannelFilter(new Vector4(0, 0, 0, 1), new Vector4(0, 0, 0, 1));
case TextureChannel.None:
default:
return new MaskChannelFilter(Vector4.zero, Vector4.zero);
}
}
}
// Transient data
internal bool isDirty { get; set; }
internal bool hasRenderTarget { get; set; }
internal RenderTargetHandle renderTargetHandle;
}
}