Update SoftMaskAlpha with new "fix"

Patched UISelectableExtension from issue #47
Added new UI Polygon control

--HG--
branch : develop_5.2
release
Simon (darkside) Jackson 2015-12-15 22:43:35 +00:00
parent 077fbcbc51
commit 38650cc536
6 changed files with 234 additions and 195 deletions

View File

@ -30,6 +30,9 @@ namespace UnityEngine.UI.Extensions
[Tooltip("Flip the masks alpha value")] [Tooltip("Flip the masks alpha value")]
public bool FlipAlphaMask = false; public bool FlipAlphaMask = false;
[Tooltip("If Mask Scals Rect is given, and this value is true, the area around the mask will not be clipped")]
public bool DontClipMaskScalingRect = false;
Vector3[] worldCorners; Vector3[] worldCorners;
Vector2 AlphaUV; Vector2 AlphaUV;
@ -173,6 +176,8 @@ namespace UnityEngine.UI.Extensions
mat.SetTexture("_AlphaMask", AlphaMask); mat.SetTexture("_AlphaMask", AlphaMask);
mat.SetInt("_FlipAlphaMask", FlipAlphaMask ? 1 : 0); mat.SetInt("_FlipAlphaMask", FlipAlphaMask ? 1 : 0);
mat.SetInt("_NoOuterClip", DontClipMaskScalingRect && maskScalingRect != null ? 1 : 0);
if (!isText) // No mod needed for Text if (!isText) // No mod needed for Text
mat.SetVector("_AlphaUV", AlphaUV); mat.SetVector("_AlphaUV", AlphaUV);

View File

@ -1,136 +1,143 @@
/// Credit CiaccoDavide /// Credit CiaccoDavide
/// Sourced from - http://ciaccodavi.de/unity/UIPolygon /// Sourced from - http://ciaccodavi.de/unity/UIPolygon
using System.Collections.Generic; using System.Collections.Generic;
namespace UnityEngine.UI.Extensions namespace UnityEngine.UI.Extensions
{ {
[AddComponentMenu("UI/Extensions/Primitives/UI Polygon")] [AddComponentMenu("UI/Extensions/Primitives/UI Polygon")]
public class UIPolygon : MaskableGraphic public class UIPolygon : MaskableGraphic
{ {
[SerializeField] [SerializeField]
Texture m_Texture; Texture m_Texture;
public bool fill = true; public bool fill = true;
public float thickness = 5; public float thickness = 5;
[Range(3, 360)] [Range(3, 360)]
public int sides = 3; public int sides = 3;
[Range(0, 360)] [Range(0, 360)]
public float rotation = 0; public float rotation = 0;
[Range(0, 1)] [Range(0, 1)]
public float[] VerticesDistances = new float[3]; public float[] VerticesDistances = new float[3];
private float size = 0; private float size = 0;
public override Texture mainTexture public override Texture mainTexture
{ {
get get
{ {
return m_Texture == null ? s_WhiteTexture : m_Texture; return m_Texture == null ? s_WhiteTexture : m_Texture;
} }
} }
public Texture texture public Texture texture
{ {
get get
{ {
return m_Texture; return m_Texture;
} }
set set
{ {
if (m_Texture == value) return; if (m_Texture == value) return;
m_Texture = value; m_Texture = value;
SetVerticesDirty(); SetVerticesDirty();
SetMaterialDirty(); SetMaterialDirty();
} }
} }
public void DrawPolygon(int _sides) public void DrawPolygon(int _sides)
{ {
sides = _sides; sides = _sides;
VerticesDistances = new float[_sides + 1]; VerticesDistances = new float[_sides + 1];
for (int i = 0; i < _sides; i++) VerticesDistances[i] = 1; ; for (int i = 0; i < _sides; i++) VerticesDistances[i] = 1; ;
rotation = 0; rotation = 0;
} }
public void DrawPolygon(int _sides, float[] _VerticesDistances) public void DrawPolygon(int _sides, float[] _VerticesDistances)
{ {
sides = _sides; sides = _sides;
VerticesDistances = _VerticesDistances; VerticesDistances = _VerticesDistances;
rotation = 0; rotation = 0;
} }
public void DrawPolygon(int _sides, float[] _VerticesDistances, float _rotation) public void DrawPolygon(int _sides, float[] _VerticesDistances, float _rotation)
{ {
sides = _sides; sides = _sides;
VerticesDistances = _VerticesDistances; VerticesDistances = _VerticesDistances;
rotation = _rotation; rotation = _rotation;
} }
void Update() void Update()
{ {
size = rectTransform.rect.width; size = rectTransform.rect.width;
if (rectTransform.rect.width > rectTransform.rect.height) if (rectTransform.rect.width > rectTransform.rect.height)
size = rectTransform.rect.height; size = rectTransform.rect.height;
else else
size = rectTransform.rect.width; size = rectTransform.rect.width;
thickness = (float)Mathf.Clamp(thickness, 0, size / 2); thickness = (float)Mathf.Clamp(thickness, 0, size / 2);
} }
protected UIVertex[] SetVbo(Vector2[] vertices, Vector2[] uvs) protected UIVertex[] SetVbo(Vector2[] vertices, Vector2[] uvs)
{ {
UIVertex[] vbo = new UIVertex[4]; UIVertex[] vbo = new UIVertex[4];
for (int i = 0; i < vertices.Length; i++) for (int i = 0; i < vertices.Length; i++)
{ {
var vert = UIVertex.simpleVert; var vert = UIVertex.simpleVert;
vert.color = color; vert.color = color;
vert.position = vertices[i]; vert.position = vertices[i];
vert.uv0 = uvs[i]; vert.uv0 = uvs[i];
vbo[i] = vert; vbo[i] = vert;
} }
return vbo; return vbo;
} }
protected override void OnPopulateMesh(VertexHelper vh) protected override void OnPopulateMesh(Mesh toFill)
{ {
vh.Clear(); toFill.Clear();
Vector2 prevX = Vector2.zero; var vbo = new VertexHelper(toFill);
Vector2 prevY = Vector2.zero;
Vector2 uv0 = new Vector2(0, 0); Vector2 prevX = Vector2.zero;
Vector2 uv1 = new Vector2(0, 1); Vector2 prevY = Vector2.zero;
Vector2 uv2 = new Vector2(1, 1); Vector2 uv0 = new Vector2(0, 0);
Vector2 uv3 = new Vector2(1, 0); Vector2 uv1 = new Vector2(0, 1);
Vector2 pos0; Vector2 uv2 = new Vector2(1, 1);
Vector2 pos1; Vector2 uv3 = new Vector2(1, 0);
Vector2 pos2; Vector2 pos0;
Vector2 pos3; Vector2 pos1;
float degrees = 360f / sides; Vector2 pos2;
int vertices = sides + 1; Vector2 pos3;
if (VerticesDistances.Length != vertices) float degrees = 360f / sides;
{ int vertices = sides + 1;
VerticesDistances = new float[vertices]; if (VerticesDistances.Length != vertices)
for (int i = 0; i < vertices - 1; i++) VerticesDistances[i] = 1; {
} VerticesDistances = new float[vertices];
// last vertex is also the first! for (int i = 0; i < vertices - 1; i++) VerticesDistances[i] = 1;
VerticesDistances[vertices - 1] = VerticesDistances[0]; }
for (int i = 0; i < vertices; i++) // last vertex is also the first!
{ VerticesDistances[vertices - 1] = VerticesDistances[0];
float outer = -rectTransform.pivot.x * size * VerticesDistances[i]; for (int i = 0; i < vertices; i++)
float inner = -rectTransform.pivot.x * size * VerticesDistances[i] + thickness; {
float rad = Mathf.Deg2Rad * (i * degrees + rotation); float outer = -rectTransform.pivot.x * size * VerticesDistances[i];
float c = Mathf.Cos(rad); float inner = -rectTransform.pivot.x * size * VerticesDistances[i] + thickness;
float s = Mathf.Sin(rad); float rad = Mathf.Deg2Rad * (i * degrees + rotation);
uv0 = new Vector2(0, 1); float c = Mathf.Cos(rad);
uv1 = new Vector2(1, 1); float s = Mathf.Sin(rad);
uv2 = new Vector2(1, 0); uv0 = new Vector2(0, 1);
uv3 = new Vector2(0, 0); uv1 = new Vector2(1, 1);
pos0 = prevX; uv2 = new Vector2(1, 0);
pos1 = new Vector2(outer * c, outer * s); uv3 = new Vector2(0, 0);
if (fill) pos0 = prevX;
{ pos1 = new Vector2(outer * c, outer * s);
pos2 = Vector2.zero; if (fill)
pos3 = Vector2.zero; {
} pos2 = Vector2.zero;
else pos3 = Vector2.zero;
{ }
pos2 = new Vector2(inner * c, inner * s); else
pos3 = prevY; {
} pos2 = new Vector2(inner * c, inner * s);
prevX = pos1; pos3 = prevY;
prevY = pos2; }
vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 })); prevX = pos1;
} prevY = pos2;
} vbo.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));
} }
if (vbo.currentVertCount > 3)
{
vbo.FillMesh(toFill);
}
}
}
} }

View File

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: fcd1b8078a416f844b695454a4358409
timeCreated: 1450200166
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -2,6 +2,7 @@
/// Sourced from - http://forum.unity3d.com/threads/scripts-useful-4-6-scripts-collection.264161/page-2#post-1796783 /// Sourced from - http://forum.unity3d.com/threads/scripts-useful-4-6-scripts-collection.264161/page-2#post-1796783
/// Extended to include a HELD state that continually fires while the button is held down. /// Extended to include a HELD state that continually fires while the button is held down.
/// Refactored so it can be added to any button and expose the events in the editor. /// Refactored so it can be added to any button and expose the events in the editor.
/// Unselect fix by @Sfyne
using UnityEngine.Events; using UnityEngine.Events;
using UnityEngine.EventSystems; using UnityEngine.EventSystems;
@ -21,27 +22,27 @@ namespace UnityEngine.UI.Extensions
#endregion #endregion
#region Events #region Events
[Tooltip("Event that fires when a button is initially pressed down")] [Tooltip("Event that fires when a button is initially pressed down")]
public UIButtonEvent OnButtonPress; public UIButtonEvent OnButtonPress;
[Tooltip("Event that fires when a button is released")] [Tooltip("Event that fires when a button is released")]
public UIButtonEvent OnButtonRelease; public UIButtonEvent OnButtonRelease;
[Tooltip("Event that continually fires while a button is held down")] [Tooltip("Event that continually fires while a button is held down")]
public UIButtonEvent OnButtonHeld; public UIButtonEvent OnButtonHeld;
#endregion #endregion
private bool _pressed; private bool _pressed;
private PointerEventData _heldEventData; private PointerEventData _heldEventData;
void IPointerDownHandler.OnPointerDown(PointerEventData eventData) void IPointerDownHandler.OnPointerDown(PointerEventData eventData)
{ {
//Can't set the state as it's too locked down. //Can't set the state as it's too locked down.
//DoStateTransition(SelectionState.Pressed, false); //DoStateTransition(SelectionState.Pressed, false);
if (OnButtonPress != null) if (OnButtonPress != null)
{ {
OnButtonPress.Invoke(eventData.button); OnButtonPress.Invoke(eventData.button);
} }
_pressed = true; _pressed = true;
_heldEventData = eventData; _heldEventData = eventData;
} }
@ -54,59 +55,65 @@ namespace UnityEngine.UI.Extensions
{ {
OnButtonRelease.Invoke(eventData.button); OnButtonRelease.Invoke(eventData.button);
} }
_pressed = false; _pressed = false;
_heldEventData = null; _heldEventData = null;
} }
void Update() void Update()
{ {
if (!_pressed) if (!_pressed)
return; return;
if (OnButtonHeld != null) if (OnButtonHeld != null)
{ {
OnButtonHeld.Invoke(_heldEventData.button); OnButtonHeld.Invoke(_heldEventData.button);
} }
} }
/// <summary> /// <summary>
/// Test method to verify a control has been clicked /// Test method to verify a control has been clicked
/// </summary> /// </summary>
public void TestClicked() public void TestClicked()
{ {
#if DEBUG || UNITY_EDITOR #if DEBUG || UNITY_EDITOR
Debug.Log("Control Clicked"); Debug.Log("Control Clicked");
#endif #endif
} }
/// <summary> /// <summary>
/// Test method to verify a controll is pressed /// Test method to verify a controll is pressed
/// </summary> /// </summary>
public void TestPressed() public void TestPressed()
{ {
#if DEBUG || UNITY_EDITOR #if DEBUG || UNITY_EDITOR
Debug.Log("Control Pressed"); Debug.Log("Control Pressed");
#endif #endif
} }
/// <summary> /// <summary>
/// est method to verify if a control is released /// est method to verify if a control is released
/// </summary> /// </summary>
public void TestReleased() public void TestReleased()
{ {
#if DEBUG || UNITY_EDITOR #if DEBUG || UNITY_EDITOR
Debug.Log("Control Released"); Debug.Log("Control Released");
#endif #endif
} }
/// <summary> /// <summary>
/// est method to verify if a control is being held /// est method to verify if a control is being held
/// </summary> /// </summary>
public void TestHold() public void TestHold()
{ {
#if DEBUG || UNITY_EDITOR #if DEBUG || UNITY_EDITOR
Debug.Log("Control Held"); Debug.Log("Control Held");
#endif #endif
} }
//Fixed UISelectableExtension inactive bug (if gameObject becomes inactive while button is held down it never goes back to _pressed = false)
void OnDisable ()
{
_pressed = false;
}
} }
} }

View File

@ -21,6 +21,7 @@
[MaterialToggle] [MaterialToggle]
_HardBlend("HardBlend",Float) = 0 _HardBlend("HardBlend",Float) = 0
_FlipAlphaMask("Flip Alpha Mask",int) = 0 _FlipAlphaMask("Flip Alpha Mask",int) = 0
_NoOuterClip("Outer Clip",int) = 0
} }
SubShader SubShader
@ -43,6 +44,8 @@
WriteMask[_StencilWriteMask] WriteMask[_StencilWriteMask]
} }
LOD 0
Cull Off Cull Off
Lighting Off Lighting Off
ZWrite Off ZWrite Off
@ -120,13 +123,14 @@
float _CutOff; float _CutOff;
bool _HardBlend = false; bool _HardBlend = false;
bool _NoOuterClip = false;
fixed4 frag(v2f IN) : SV_Target fixed4 frag(v2f IN) : SV_Target
{ {
half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color; half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
// Do we want to clip the image to the Mask Rectangle? // Do we want to clip the image to the Mask Rectangle?
if (IN.texcoord.x < _Min.x || IN.texcoord.x > _Max.x || IN.texcoord.y < _Min.y || IN.texcoord.y > _Max.y) // Yes we do if (!_NoOuterClip && (IN.texcoord.x < _Min.x || IN.texcoord.x > _Max.x || IN.texcoord.y < _Min.y || IN.texcoord.y > _Max.y)) // Yes we do
color.a = 0; color.a = 0;
else // It's in the mask rectangle, so apply the alpha of the mask provided. else // It's in the mask rectangle, so apply the alpha of the mask provided.
{ {
@ -143,7 +147,8 @@
if (_FlipAlphaMask == 1) if (_FlipAlphaMask == 1)
a = 1 - a; a = 1 - a;
color.a = a; if(!(IN.texcoord.x < _Min.x || IN.texcoord.x > _Max.x || IN.texcoord.y < _Min.y || IN.texcoord.y > _Max.y))
color.a *= a;
} }
if (_UseClipRect) if (_UseClipRect)

View File

@ -91,7 +91,7 @@
float _Value; float _Value;
int _LeftToRight; int _LeftToRight;
bool _HardBlend = false; int _HardBlend = false;
int _FlipAlphaMask = 0; int _FlipAlphaMask = 0;
@ -122,6 +122,7 @@
float2 _Mul; float2 _Mul;
float _CutOff; float _CutOff;
int _NoOuterClip;
fixed4 frag(v2f IN) : SV_Target fixed4 frag(v2f IN) : SV_Target
{ {
@ -134,6 +135,7 @@
else // It's in the mask rectangle, so apply the alpha of the mask provided. else // It's in the mask rectangle, so apply the alpha of the mask provided.
{ {
float a = tex2D(_AlphaMask, (IN.worldPosition2.xy - _Max) / (_Max-_Min)).a; float a = tex2D(_AlphaMask, (IN.worldPosition2.xy - _Max) / (_Max-_Min)).a;
if (a <= _CutOff) if (a <= _CutOff)
a = 0; a = 0;
else else
@ -145,7 +147,8 @@
if (_FlipAlphaMask == 1) if (_FlipAlphaMask == 1)
a = 1 - a; a = 1 - a;
color.a = a * color.a; if(!(IN.worldPosition2.x <= _Min.x || IN.worldPosition2.x >= _Max.x || IN.worldPosition2.y <= _Min.y || IN.worldPosition2.y >= _Max.y))
color *= a;
} }
if (_UseClipRect) if (_UseClipRect)