144 lines
No EOL
2.6 KiB
C#
144 lines
No EOL
2.6 KiB
C#
using Trive.Assets.Scripts.Utils.Extensions;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace Assets.Scripts.UI
|
|
{
|
|
public class SpriteImage : MaskableGraphic
|
|
{
|
|
protected static Material s_ETC1DefaultUI;
|
|
|
|
[SerializeField] private Sprite m_Sprite;
|
|
|
|
public static Material defaultETC1GraphicMaterial
|
|
{
|
|
get
|
|
{
|
|
if (s_ETC1DefaultUI == null)
|
|
{
|
|
s_ETC1DefaultUI = Canvas.GetETC1SupportedCanvasMaterial();
|
|
}
|
|
return s_ETC1DefaultUI;
|
|
}
|
|
}
|
|
|
|
public Sprite sprite
|
|
{
|
|
get => m_Sprite;
|
|
set
|
|
{
|
|
if (m_Sprite != value)
|
|
{
|
|
m_Sprite = value;
|
|
SetAllDirty();
|
|
}
|
|
}
|
|
}
|
|
|
|
public float pixelsPerUnit
|
|
{
|
|
get
|
|
{
|
|
float spritePixelsPerUnit = 100;
|
|
if (sprite)
|
|
{
|
|
spritePixelsPerUnit = sprite.pixelsPerUnit;
|
|
}
|
|
|
|
float referencePixelsPerUnit = 100;
|
|
if (canvas)
|
|
{
|
|
referencePixelsPerUnit = canvas.referencePixelsPerUnit;
|
|
}
|
|
|
|
return spritePixelsPerUnit / referencePixelsPerUnit;
|
|
}
|
|
}
|
|
|
|
public override Texture mainTexture
|
|
{
|
|
get
|
|
{
|
|
if (sprite == null)
|
|
{
|
|
if (material != null && material.mainTexture != null)
|
|
{
|
|
return material.mainTexture;
|
|
}
|
|
return s_WhiteTexture;
|
|
}
|
|
|
|
return sprite.texture;
|
|
}
|
|
}
|
|
|
|
public override Material material
|
|
{
|
|
get
|
|
{
|
|
if (m_Material != null)
|
|
{
|
|
return m_Material;
|
|
}
|
|
#if UNITY_EDITOR
|
|
if (Application.isPlaying && sprite && sprite.associatedAlphaSplitTexture != null)
|
|
{
|
|
return defaultETC1GraphicMaterial;
|
|
}
|
|
#else
|
|
if (sprite && sprite.associatedAlphaSplitTexture != null)
|
|
return defaultETC1GraphicMaterial;
|
|
#endif
|
|
|
|
return defaultMaterial;
|
|
}
|
|
|
|
set { base.material = value; }
|
|
}
|
|
|
|
protected override void OnPopulateMesh(VertexHelper toFill)
|
|
{
|
|
if (sprite == null)
|
|
{
|
|
base.OnPopulateMesh(toFill);
|
|
return;
|
|
}
|
|
|
|
toFill.Clear();
|
|
var rect = GetPixelAdjustedRect();
|
|
var vertecies = sprite.vertices;
|
|
|
|
if (vertecies.Length <= 0)
|
|
{
|
|
base.OnPopulateMesh(toFill);
|
|
return;
|
|
}
|
|
|
|
var bounds = new Rect(vertecies[0], Vector2.zero);
|
|
for (var i = 1; i < vertecies.Length; i++)
|
|
{
|
|
bounds = bounds.Encapculate(vertecies[i]);
|
|
}
|
|
|
|
var maxDist = Mathf.Max(bounds.width, bounds.height) * 0.5f;
|
|
var triangles = sprite.triangles;
|
|
var uv = sprite.uv;
|
|
|
|
for (var i = 0; i < vertecies.Length; i++)
|
|
{
|
|
toFill.AddVert(
|
|
new UIVertex
|
|
{
|
|
position = (vertecies[i] - bounds.center) / maxDist * Mathf.Min(rect.width, rect.height) * 0.5f,
|
|
color = color,
|
|
uv0 = uv[i]
|
|
});
|
|
}
|
|
|
|
for (var i = 0; i < triangles.Length; i += 3)
|
|
{
|
|
toFill.AddTriangle(triangles[i], triangles[i + 1], triangles[i + 2]);
|
|
}
|
|
}
|
|
}
|
|
} |