107 lines
3.2 KiB
C#
107 lines
3.2 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
|
|
{
|
|
/// <summary>
|
|
/// generates a pie mesh for use with canvas charts
|
|
/// </summary>
|
|
public class PieCanvasGenerator : Image, IPieGenerator, ICanvasRaycastFilter
|
|
{
|
|
bool mPopulated = false;
|
|
float mStartAngle;
|
|
float mAngleSpan;
|
|
float mRadius;
|
|
float mInnerRadius;
|
|
int mSegements;
|
|
|
|
#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)
|
|
{
|
|
PieMesh.Generate2dMesh(mesh, mStartAngle, mAngleSpan, mRadius, mInnerRadius, mSegements);
|
|
}
|
|
|
|
public void Generate(float startAngle, float angleSpan, float radius, float innerRadius, int segments, float outerdepth,float innerdepth)
|
|
{
|
|
float maxRad = Mathf.Max(radius, innerRadius)*2f;
|
|
rectTransform.sizeDelta = new Vector2(maxRad,maxRad);
|
|
mPopulated = true;
|
|
mStartAngle = startAngle;
|
|
mAngleSpan = angleSpan;
|
|
mRadius = radius;
|
|
mInnerRadius = innerRadius;
|
|
mSegements = segments;
|
|
SetAllDirty();
|
|
Rebuild(CanvasUpdate.PreRender);
|
|
}
|
|
|
|
public override bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
|
|
{
|
|
Vector2 localPoint;
|
|
RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, sp, eventCamera, out localPoint);
|
|
|
|
float sqrMag =localPoint.sqrMagnitude;
|
|
float maxRad = mRadius;
|
|
float minRad = mInnerRadius;
|
|
|
|
if(mRadius < mInnerRadius)
|
|
{
|
|
maxRad = mInnerRadius;
|
|
minRad = mRadius;
|
|
}
|
|
|
|
if (sqrMag > maxRad * maxRad)
|
|
return false;
|
|
if (sqrMag < minRad * minRad)
|
|
return false;
|
|
float angle = Mathf.Atan2(localPoint.y, localPoint.x);
|
|
float delta = (angle - mStartAngle);
|
|
delta -= Mathf.Floor(delta / (Mathf.PI * 2f)) *Mathf.PI*2f;
|
|
if (delta > mAngleSpan)
|
|
return false;
|
|
return true;
|
|
}
|
|
}
|
|
}
|