203 lines
6.7 KiB
C#
203 lines
6.7 KiB
C#
|
|
#define Graph_And_Chart_PRO
|
||
|
|
using System;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.Linq;
|
||
|
|
using System.Text;
|
||
|
|
using UnityEngine;
|
||
|
|
using UnityEngine.UI;
|
||
|
|
|
||
|
|
namespace ChartAndGraph
|
||
|
|
{
|
||
|
|
[Serializable]
|
||
|
|
public class PyramidCanvasGenerator : MaskableGraphic, IPyramidGenerator
|
||
|
|
{
|
||
|
|
|
||
|
|
public RectTransform Container;
|
||
|
|
public Text Title;
|
||
|
|
public Text Info;
|
||
|
|
public Image Sprite;
|
||
|
|
|
||
|
|
bool mPopulated = false;
|
||
|
|
float mBaseX1;
|
||
|
|
float mBaseX2;
|
||
|
|
float mBaseSize;
|
||
|
|
float mSlopLeft;
|
||
|
|
float mSlopeRight;
|
||
|
|
float mHeight;
|
||
|
|
float mInset;
|
||
|
|
float mStartV;
|
||
|
|
float mEndV;
|
||
|
|
CanvasGroup mGroup;
|
||
|
|
UIVertex[] vertices = new UIVertex[4];
|
||
|
|
Vector2[] normals = new Vector2[4];
|
||
|
|
|
||
|
|
protected override void Start()
|
||
|
|
{
|
||
|
|
base.Start();
|
||
|
|
mGroup = ChartCommon.EnsureComponent<CanvasGroup>(gameObject);
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
public GameObject ContainerObject {
|
||
|
|
get {
|
||
|
|
if (Container == null)
|
||
|
|
return null;
|
||
|
|
return Container.gameObject;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void SetAlpha(float alpha)
|
||
|
|
{
|
||
|
|
if(mGroup != null)
|
||
|
|
mGroup.alpha = alpha;
|
||
|
|
}
|
||
|
|
public override Texture mainTexture
|
||
|
|
{
|
||
|
|
get { return material.mainTexture; }
|
||
|
|
}
|
||
|
|
public void ApplyInfo(string title, string text, Sprite image,float scale)
|
||
|
|
{
|
||
|
|
if(Container != null)
|
||
|
|
{
|
||
|
|
Vector3 centtroid = vertices[0].position + vertices[1].position + vertices[2].position + vertices[3].position;
|
||
|
|
centtroid *= 0.25f;
|
||
|
|
float upperSize = Math.Abs(vertices[2].position.x - vertices[3].position.x);
|
||
|
|
float downSize = Math.Abs(vertices[0].position.x - vertices[1].position.x);
|
||
|
|
float total = upperSize + downSize;
|
||
|
|
float weight = (downSize - upperSize) / total;
|
||
|
|
weight = -weight * 0.5f + 0.5f;
|
||
|
|
weight = Mathf.Lerp(0.3f, 0.7f, weight);
|
||
|
|
centtroid.y = Mathf.Lerp(vertices[0].position.y, vertices[2].position.y, weight);
|
||
|
|
centtroid = new Vector3(centtroid.x / rectTransform.rect.width, centtroid.y / rectTransform.rect.height);
|
||
|
|
centtroid += new Vector3(0.5f, 0.5f, 0f);
|
||
|
|
Container.anchorMax = centtroid;
|
||
|
|
Container.anchorMin = centtroid;
|
||
|
|
Container.anchoredPosition = new Vector2();
|
||
|
|
Container.sizeDelta = new Vector2(Mathf.Abs(mBaseX1 - mBaseX2) - mInset*4, mHeight - mInset*2);
|
||
|
|
Container.localScale = new Vector3(scale, scale, scale);
|
||
|
|
}
|
||
|
|
if (Title != null)
|
||
|
|
Title.text = title;
|
||
|
|
if (Info != null)
|
||
|
|
Info.text = text;
|
||
|
|
if (Sprite != null)
|
||
|
|
Sprite.sprite = image;
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Generate()
|
||
|
|
{
|
||
|
|
SetAllDirty();
|
||
|
|
Rebuild(CanvasUpdate.PreRender);
|
||
|
|
}
|
||
|
|
|
||
|
|
public Vector3 GetTextPosition(PyramidChart.JustificationType justification, bool isBase)
|
||
|
|
{
|
||
|
|
Vector3 res = new Vector3();
|
||
|
|
switch(justification)
|
||
|
|
{
|
||
|
|
case PyramidChart.JustificationType.LeftAligned:
|
||
|
|
if (isBase)
|
||
|
|
res = vertices[0].position;
|
||
|
|
else
|
||
|
|
res = (vertices[0].position + vertices[2].position) * 0.5f;
|
||
|
|
break;
|
||
|
|
case PyramidChart.JustificationType.RightAligned:
|
||
|
|
if (isBase)
|
||
|
|
res = vertices[1].position;
|
||
|
|
else
|
||
|
|
res = (vertices[1].position + vertices[3].position) * 0.5f;
|
||
|
|
break;
|
||
|
|
case PyramidChart.JustificationType.CenterAligned:
|
||
|
|
if (isBase)
|
||
|
|
res = (vertices[0].position + vertices[1].position) * 0.5f;
|
||
|
|
else
|
||
|
|
res = (vertices[0].position + vertices[1].position +vertices[2].position + vertices[3].position) * 0.25f;
|
||
|
|
break;
|
||
|
|
|
||
|
|
}
|
||
|
|
return res;
|
||
|
|
}
|
||
|
|
|
||
|
|
public void GetUpperBase(out float baseX1, out float baseX2)
|
||
|
|
{
|
||
|
|
baseX1 = vertices[2].position.x + mBaseSize * 0.5f;
|
||
|
|
baseX2 = vertices[3].position.x + mBaseSize * 0.5f;
|
||
|
|
}
|
||
|
|
|
||
|
|
public void SetParams(float baseX1, float baseX2, float baseSize, float slopLeft, float slopeRight, float height, float inset, float startV, float endV)
|
||
|
|
{
|
||
|
|
mPopulated = true;
|
||
|
|
mBaseX1 = baseX1;
|
||
|
|
mBaseX2 = baseX2;
|
||
|
|
mBaseSize = baseSize;
|
||
|
|
mSlopLeft = slopLeft;
|
||
|
|
mSlopeRight = slopeRight;
|
||
|
|
mHeight = height;
|
||
|
|
mInset = inset;
|
||
|
|
mStartV = startV;
|
||
|
|
mEndV = endV;
|
||
|
|
PyramidMesh.Generate2dMesh(vertices, normals, mBaseX1, mBaseX2, mBaseSize, mSlopLeft, mSlopeRight, mHeight,mStartV,mEndV);
|
||
|
|
}
|
||
|
|
|
||
|
|
#pragma warning disable 0672
|
||
|
|
|
||
|
|
protected override void OnFillVBO(List<UIVertex> vbo)
|
||
|
|
{
|
||
|
|
vbo.Clear();
|
||
|
|
if (mPopulated == false)
|
||
|
|
return;
|
||
|
|
CanvasChartMesh mesh = new CanvasChartMesh(vbo);
|
||
|
|
FillChartMesh(mesh);
|
||
|
|
}
|
||
|
|
|
||
|
|
#pragma warning restore 0672
|
||
|
|
|
||
|
|
#if (!UNITY_5_2_0) && (!UNITY_5_2_1)
|
||
|
|
protected override void OnPopulateMesh(VertexHelper vh)
|
||
|
|
{
|
||
|
|
vh.Clear();
|
||
|
|
if (mPopulated == false)
|
||
|
|
return;
|
||
|
|
CanvasChartMesh mesh = new CanvasChartMesh(vh);
|
||
|
|
FillChartMesh(mesh);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
#pragma warning disable 0672
|
||
|
|
#if !UNITY_2017_1_OR_NEWER
|
||
|
|
protected override void OnPopulateMesh(Mesh m)
|
||
|
|
{
|
||
|
|
m.Clear();
|
||
|
|
if (mPopulated == false)
|
||
|
|
return;
|
||
|
|
WorldSpaceChartMesh chartmesh = new WorldSpaceChartMesh(true);
|
||
|
|
FillChartMesh(chartmesh);
|
||
|
|
chartmesh.ApplyToMesh(m);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
#pragma warning restore 0672
|
||
|
|
|
||
|
|
void FillChartMesh(IChartMesh mesh)
|
||
|
|
{
|
||
|
|
UIVertex v1 = vertices[0];
|
||
|
|
UIVertex v2 = vertices[1];
|
||
|
|
UIVertex v3 = vertices[2];
|
||
|
|
UIVertex v4 = vertices[3];
|
||
|
|
|
||
|
|
v1.position += (Vector3)(normals[0] * mInset);
|
||
|
|
v2.position += (Vector3)(normals[1] * mInset);
|
||
|
|
v3.position += (Vector3)(normals[2] * mInset);
|
||
|
|
v4.position += (Vector3)(normals[3] * mInset);
|
||
|
|
|
||
|
|
Vector2 inter;
|
||
|
|
if(ChartCommon.SegmentIntersection(v1.position,v3.position,v2.position,v4.position,out inter))
|
||
|
|
{
|
||
|
|
v3.position = inter;
|
||
|
|
v4.position = inter;
|
||
|
|
}
|
||
|
|
|
||
|
|
mesh.AddQuad(v1, v2, v3, v4);
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|