66 lines
2.0 KiB
C#
66 lines
2.0 KiB
C#
|
using UnityEngine;
|
|||
|
|
|||
|
namespace Unity.PlasticSCM.Editor.UI.Avatar
|
|||
|
{
|
|||
|
internal static class ApplyCircleMask
|
|||
|
{
|
|||
|
internal static Texture2D For(Texture2D sourceImage)
|
|||
|
{
|
|||
|
int centerx = sourceImage.width / 2;
|
|||
|
int centery = sourceImage.height / 2;
|
|||
|
|
|||
|
int radius = sourceImage.width / 2;
|
|||
|
|
|||
|
Texture2D result = Images.GetNewTextureFromTexture(sourceImage);
|
|||
|
|
|||
|
for (int i = (centerx - radius); i < centerx + radius; i++)
|
|||
|
{
|
|||
|
for (int j = (centery - radius); j < centery + radius; j++)
|
|||
|
{
|
|||
|
float dx = i - centerx;
|
|||
|
float dy = j - centery;
|
|||
|
|
|||
|
float d = Mathf.Sqrt(dx * dx + dy * dy);
|
|||
|
|
|||
|
float borderSize = 1f;
|
|||
|
|
|||
|
if (d <= (radius - borderSize))
|
|||
|
{
|
|||
|
result.SetPixel(
|
|||
|
i - (centerx - radius),
|
|||
|
j - (centery - radius),
|
|||
|
sourceImage.GetPixel(i, j));
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
Color color = sourceImage.GetPixel(i, j);
|
|||
|
|
|||
|
result.SetPixel(
|
|||
|
i - (centerx - radius),
|
|||
|
j - (centery - radius),
|
|||
|
Color.Lerp(Color.clear, color,
|
|||
|
GetAntialiasAlpha(radius, d, borderSize)));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
result.Apply();
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
static float GetAntialiasAlpha(float radius, float d, float borderSize)
|
|||
|
{
|
|||
|
if (d >= (radius + borderSize))
|
|||
|
return 0f;
|
|||
|
|
|||
|
if (d - radius - borderSize == 0)
|
|||
|
return 0;
|
|||
|
|
|||
|
float proportion =
|
|||
|
Mathf.Abs(d - radius - borderSize) /
|
|||
|
(radius + borderSize) - (radius - borderSize);
|
|||
|
|
|||
|
return Mathf.Max(0, 1.0f - proportion);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|