Files
crtr/Assets/Cryville/Crtr/SpriteFrame.cs

79 lines
1.8 KiB
C#

using System;
using UnityEngine;
namespace Cryville.Crtr {
public class SpriteFrame {
Rect m_frame;
public Rect Frame {
get { return m_frame; }
set { m_frame = value; }
}
bool m_rotated = false;
public bool Rotated {
get { return m_rotated; }
set { m_rotated = value; }
}
private Rect _uv;
private Vector2[] cuv;
public Rect UV {
get {
return _uv;
}
private set {
_uv = value;
float x0 = Mathf.Min(_uv.xMin, _uv.xMax);
float x1 = Mathf.Max(_uv.xMin, _uv.xMax);
float y0 = Mathf.Min(_uv.yMin, _uv.yMax);
float y1 = Mathf.Max(_uv.yMin, _uv.yMax);
if (m_rotated) cuv = new Vector2[]{
new(x0, y1),
new(x1, y0),
new(x0, y0),
new(x1, y1),
};
else cuv = new Vector2[]{
new(x0, y0),
new(x1, y1),
new(x1, y0),
new(x0, y1),
};
}
}
public Vector2 GetUV(Vector2 uv) {
return GetUV(uv.x, uv.y);
}
public Vector2 GetUV(float u, float v) {
Vector2 uv00 = cuv[0], uv11 = cuv[1],
uv10 = cuv[2], uv01 = cuv[3];
return (1 - u - v) * uv00
+ u * uv10
+ v * uv01
+ u * v * (uv00 + uv11 - uv10 - uv01);
}
public Texture2D Texture {
get;
private set;
}
public Vector2 Size {
get {
return new Vector2(Texture.width, Texture.height);
}
}
public SpriteFrame(Texture2D tex) {
if (tex == null) throw new ArgumentNullException("tex");
Texture = tex;
m_frame = new Rect(Vector2.zero, Size);
var w = m_frame.width;
var h = m_frame.height;
float x = m_frame.x / w;
float y = 1 - m_frame.y / h;
float tw = (m_rotated ? m_frame.height : m_frame.width) / w;
float th = (m_rotated ? m_frame.width : m_frame.height) / h;
if (m_rotated) UV = new Rect(x, y, tw, -th);
else UV = new Rect(x, y, tw, -th);
}
}
}