protected void SetGeometry(Vector3[] vertices, Vector2[] uvs)
{
var sprite = Collection.spriteDefinitions[spriteId];
if (sprite.positions.Length == 4)
{
float colliderExtentZ = (sprite.colliderType == tk2dSpriteDefinition.ColliderType.Box)?(sprite.colliderVertices[1].z * _scale.z):0.1f;
if (legacyMode)
{
// in legacy mode, scale is used to determine the total size of the sliced sprite
float sx = _scale.x;
float sy = _scale.y;
Vector3[] srcVert = sprite.positions;
Vector3 dx = srcVert[1] - srcVert[0];
Vector3 dy = srcVert[2] - srcVert[0];
Vector2[] srcUv = sprite.uvs;
Vector2 duvx = sprite.uvs[1] - sprite.uvs[0];
Vector2 duvy = sprite.uvs[2] - sprite.uvs[0];
Vector3 origin = new Vector3(srcVert[0].x * sx, srcVert[0].y * sy, srcVert[0].z * _scale.z);
Vector3[] originPoints = new Vector3[4] {
origin,
origin + dy * borderBottom,
origin + dy * (sy - borderTop),
origin + dy * sy
};
Vector2[] originUvs = new Vector2[4] {
srcUv[0],
srcUv[0] + duvy * borderBottom,
srcUv[0] + duvy * (1 - borderTop),
srcUv[0] + duvy,
};
for (int i = 0; i < 4; ++i)
{
meshVertices[i * 4 + 0] = originPoints[i];
meshVertices[i * 4 + 1] = originPoints[i] + dx * borderLeft;
meshVertices[i * 4 + 2] = originPoints[i] + dx * (sx - borderRight);
meshVertices[i * 4 + 3] = originPoints[i] + dx * sx;
meshUvs[i * 4 + 0] = originUvs[i];
meshUvs[i * 4 + 1] = originUvs[i] + duvx * borderLeft;
meshUvs[i * 4 + 2] = originUvs[i] + duvx * (1 - borderRight);
meshUvs[i * 4 + 3] = originUvs[i] + duvx;
}
}
else
{
float sx = sprite.texelSize.x;
float sy = sprite.texelSize.y;
Vector3[] srcVert = sprite.positions;
float dx = (srcVert[1].x - srcVert[0].x);
float dy = (srcVert[2].y - srcVert[0].y);
float borderTopPixels = borderTop * dy;
float borderBottomPixels = borderBottom * dy;
float borderRightPixels = borderRight * dx;
float borderLeftPixels = borderLeft * dx;
float dimXPixels = dimensions.x * sx;
float dimYPixels = dimensions.y * sy;
float anchorOffsetX = 0.0f;
float anchorOffsetY = 0.0f;
switch (anchor)
{
case Anchor.LowerLeft: case Anchor.MiddleLeft: case Anchor.UpperLeft:
break;
case Anchor.LowerCenter: case Anchor.MiddleCenter: case Anchor.UpperCenter:
anchorOffsetX = -(int)(dimensions.x / 2.0f); break;
case Anchor.LowerRight: case Anchor.MiddleRight: case Anchor.UpperRight:
anchorOffsetX = -(int)(dimensions.x); break;
}
switch (anchor)
{
case Anchor.LowerLeft: case Anchor.LowerCenter: case Anchor.LowerRight:
break;
case Anchor.MiddleLeft: case Anchor.MiddleCenter: case Anchor.MiddleRight:
anchorOffsetY = -(int)(dimensions.y / 2.0f); break;
case Anchor.UpperLeft: case Anchor.UpperCenter: case Anchor.UpperRight:
anchorOffsetY = -(int)dimensions.y; break;
}
// scale back to sprite coordinates
// do it after the cast above, as we're trying to align to pixel
anchorOffsetX *= sx;
anchorOffsetY *= sy;
boundsCenter = new Vector3(dimXPixels / 2.0f + anchorOffsetX, dimYPixels / 2.0f + anchorOffsetY, 0);
boundsExtents = new Vector3(dimXPixels / 2.0f, dimYPixels / 2.0f, colliderExtentZ);
Vector2[] srcUv = sprite.uvs;
Vector2 duvx = sprite.uvs[1] - sprite.uvs[0];
Vector2 duvy = sprite.uvs[2] - sprite.uvs[0];
Vector3 origin = new Vector3(srcVert[0].x, srcVert[0].y, srcVert[0].z);
origin = new Vector3(anchorOffsetX, anchorOffsetY, 0);
Vector3[] originPoints = new Vector3[4] {
origin,
origin + new Vector3(0, borderBottomPixels, 0),
origin + new Vector3(0, dimYPixels - borderTopPixels, 0),
origin + new Vector3(0, dimYPixels, 0),
};
Vector2[] originUvs = new Vector2[4] {
srcUv[0],
srcUv[0] + duvy * borderBottom,
srcUv[0] + duvy * (1 - borderTop),
srcUv[0] + duvy,
};
for (int i = 0; i < 4; ++i)
{
meshVertices[i * 4 + 0] = originPoints[i];
meshVertices[i * 4 + 1] = originPoints[i] + new Vector3(borderLeftPixels, 0, 0);
meshVertices[i * 4 + 2] = originPoints[i] + new Vector3(dimXPixels - borderRightPixels, 0, 0);
meshVertices[i * 4 + 3] = originPoints[i] + new Vector3(dimXPixels, 0, 0);
for (int j = 0; j < 4; ++j)
{
Vector3 v = meshVertices[i * 4 + j];
v.x = v.x * _scale.x;
v.y = v.y * _scale.y;
v.z = v.z * _scale.z;
meshVertices[i * 4 + j] = v;
}
meshUvs[i * 4 + 0] = originUvs[i];
meshUvs[i * 4 + 1] = originUvs[i] + duvx * borderLeft;
meshUvs[i * 4 + 2] = originUvs[i] + duvx * (1 - borderRight);
meshUvs[i * 4 + 3] = originUvs[i] + duvx;
}
}
}
else
{
for (int i = 0; i < vertices.Length; ++i)
vertices[i] = Vector3.zero;
}
}