Files
tianrunCRM/Assets/CoolapeFrame/Scripts/ui/NguiExtend/UISlicedSprite.cs
2020-07-04 14:41:25 +08:00

144 lines
3.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
********************************************************************************
*Copyright(C),coolae.net
*Author: wangkaiyuan
*Version: 2.0
*Date: 2017-01-09
*Description: 正常的九宫格sprite是四个角保持不变拉伸中间。
* 而该脚本正好反过来的效果,九宫格中间不变,四边接伸。
* 可以达到很完善的遮罩效果.
*Others:
*History:
*********************************************************************************
*/
using UnityEngine;
namespace Coolape
{
public class UISlicedSprite : UISprite
{
[ContextMenu("Execute")]
public void refreshCenter() {
mChanged = true;
MarkAsChanged();
}
// Type --> Sliced
[SerializeField]
public UIWidget mCenter = null;
/// <summary>
/// Virtual function called by the UIPanel that fills the buffers.
/// </summary>
protected override void SlicedFill (BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols)
{
Vector4 br = border * pixelSize;
if (br.x == 0f && br.y == 0f && br.z == 0f && br.w == 0f) {
SimpleFill (verts, uvs, cols);
return;
}
Color32 c = drawingColor;
Vector4 v = drawingDimensions;
if (mCenter != null) {
Vector4 h = mCenter.drawingDimensions;
/// X = left, Y = bottom, Z = right, W = top.
Vector3 offset = mCenter.transform.localPosition;
// print ("center pos = " + offset );
h.x += offset.x;
h.y += offset.y;
h.z += offset.x;
h.w += offset.y;
// print ("h = " + h );
// print ("v = " + v );
br.x = -(v.x - h.x);
br.y = -(v.y - h.y);
br.z = (v.z - h.z);
br.w = (v.w - h.w);
// print ("br = " + br );
// print ("br w= " + (br.z - br.x).ToString() );
// print ("br h= " + (br.w - br.y).ToString() );
if (br.x < 0f)
br.x = 0f;
if (br.y < 0f)
br.y = 0f;
if (br.z < 0f)
br.z = 0f;
if (br.w < 0f)
br.w = 0f;
}
mTempPos [0].x = v.x;
mTempPos [0].y = v.y;
mTempPos [3].x = v.z;
mTempPos [3].y = v.w;
if (mFlip == Flip.Horizontally || mFlip == Flip.Both) {
mTempPos [1].x = mTempPos [0].x + br.z;
mTempPos [2].x = mTempPos [3].x - br.x;
mTempUVs [3].x = mOuterUV.xMin;
mTempUVs [2].x = mInnerUV.xMin;
mTempUVs [1].x = mInnerUV.xMax;
mTempUVs [0].x = mOuterUV.xMax;
} else {
mTempPos [1].x = mTempPos [0].x + br.x;
mTempPos [2].x = mTempPos [3].x - br.z;
mTempUVs [0].x = mOuterUV.xMin;
mTempUVs [1].x = mInnerUV.xMin;
mTempUVs [2].x = mInnerUV.xMax;
mTempUVs [3].x = mOuterUV.xMax;
}
if (mFlip == Flip.Vertically || mFlip == Flip.Both) {
mTempPos [1].y = mTempPos [0].y + br.w;
mTempPos [2].y = mTempPos [3].y - br.y;
mTempUVs [3].y = mOuterUV.yMin;
mTempUVs [2].y = mInnerUV.yMin;
mTempUVs [1].y = mInnerUV.yMax;
mTempUVs [0].y = mOuterUV.yMax;
} else {
mTempPos [1].y = mTempPos [0].y + br.y;
mTempPos [2].y = mTempPos [3].y - br.w;
mTempUVs [0].y = mOuterUV.yMin;
mTempUVs [1].y = mInnerUV.yMin;
mTempUVs [2].y = mInnerUV.yMax;
mTempUVs [3].y = mOuterUV.yMax;
}
for (int x = 0; x < 3; ++x) {
int x2 = x + 1;
for (int y = 0; y < 3; ++y) {
if (centerType == AdvancedType.Invisible && x == 1 && y == 1)
continue;
int y2 = y + 1;
verts.Add (new Vector3 (mTempPos [x].x, mTempPos [y].y));
verts.Add (new Vector3 (mTempPos [x].x, mTempPos [y2].y));
verts.Add (new Vector3 (mTempPos [x2].x, mTempPos [y2].y));
verts.Add (new Vector3 (mTempPos [x2].x, mTempPos [y].y));
uvs.Add (new Vector2 (mTempUVs [x].x, mTempUVs [y].y));
uvs.Add (new Vector2 (mTempUVs [x].x, mTempUVs [y2].y));
uvs.Add (new Vector2 (mTempUVs [x2].x, mTempUVs [y2].y));
uvs.Add (new Vector2 (mTempUVs [x2].x, mTempUVs [y].y));
cols.Add (c);
cols.Add (c);
cols.Add (c);
cols.Add (c);
}
}
}
}
}