#define Graph_And_Chart_PRO using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; using UnityEngine.UI; namespace ChartAndGraph { /// /// base class for all chart mesh generators /// abstract class ChartMeshBase : IChartMesh { List mText = new List(); List mCurrentTexts = new List(); Dictionary mRecycled = new Dictionary(); List mCached = new List(); float innerTile = 1f; public ChartOrientation Orientation { get; set; } public float Tile { get { return innerTile; } set { innerTile = value; } } public float Offset { get; set; } public float Length { get; set; } public bool RecycleText { get; set; } public ChartMeshBase() { Orientation = ChartOrientation.Vertical; } public virtual List CurrentTextObjects { get { return mCurrentTexts; } } public virtual List TextObjects { get { return mText; } } Vector2[][] mUvs = new Vector2[2][] { new Vector2[]{ new Vector2(0f,0f),new Vector2(1f,0f),new Vector2(0f,1f), new Vector2(1f,1f)}, new Vector2[]{ new Vector2(0f,1f),new Vector2(0f,0f),new Vector2(1f,1f), new Vector2(1f,0f)} }; Vector2[] mTmpUv = new Vector2[4]; protected Vector2[] GetUvs(Rect rect) { return GetUvs(rect, Orientation); } public virtual void Clear() { if (RecycleText) { for (int i = 0; i < mCurrentTexts.Count; i++) { string key = ChartCommon.GetText(mCurrentTexts[i].UIText); mCurrentTexts[i].SetVisible(false); mCurrentTexts[i].Recycled = true; if (key == null || mRecycled.ContainsKey(key)) { mCached.Add(mCurrentTexts[i]); continue; } mRecycled[key] = mCurrentTexts[i]; } } mText.Clear(); mCurrentTexts.Clear(); } protected Vector2[] GetUvs(Rect rect, ChartOrientation orientaion) { Vector2[] arr; if (Orientation == ChartOrientation.Vertical) arr = mUvs[0]; else arr = mUvs[1]; if (Tile <= 0f) { for (int i = 0; i < 4; i++) { Vector2 uv = arr[i]; mTmpUv[i] = new Vector2(Offset + uv.x * Length, uv.y); } return mTmpUv; } float length = rect.width; if (orientaion == ChartOrientation.Horizontal) length = rect.height; length /= Math.Abs(Length); for (int i = 0; i < 4; i++) { Vector2 uv = arr[i]; mTmpUv[i] = new Vector2((Offset + uv.x * Length) * length / Tile, uv.y); } return mTmpUv; } void DestoryBillboard(BillboardText t) { t.Recycled = false; GameObject uiText = t.UIText; TextDirection d = t.Direction; if (uiText != null && uiText.gameObject != null) ChartCommon.SafeDestroy(uiText.gameObject); if (d != null && d.gameObject != null) ChartCommon.SafeDestroy(d.gameObject); if (t != null) ChartCommon.SafeDestroy(t.gameObject); } public void DestoryRecycled() { foreach (BillboardText t in mRecycled.Values) { mCached.Add(t); // DestoryBillboard(t); } mRecycled.Clear(); } public virtual BillboardText AddText(AnyChart chart, MonoBehaviour prefab, Transform parentTransform, int fontSize, float fontSharpness, string text, float x, float y, float z, float angle, object userData) { BillboardText recycled = null; if (RecycleText == true) { if (mRecycled.TryGetValue(text, out recycled)) { recycled.SetVisible(true); recycled.Recycled = false; mRecycled.Remove(text); } else { if (mCached.Count > 0) { recycled = mCached[mCached.Count - 1]; recycled.SetVisible(true); recycled.Recycled = false; mCached.RemoveAt(mCached.Count - 1); } else { recycled = null; } } } BillboardText billboardText = ChartCommon.CreateBillboardText(recycled, prefab, parentTransform, text, x, y, z, angle, null, ((IInternalUse)chart).HideHierarchy, fontSize, fontSharpness); if (billboardText == null) return null; billboardText.Recycled = false; billboardText.UserData = userData; if (recycled == null) mText.Add(billboardText); mCurrentTexts.Add(billboardText); return billboardText; } public abstract void AddQuad(UIVertex vLeftTop, UIVertex vRightTop, UIVertex vLeftBottom, UIVertex vRightBottom); public abstract void AddXYRect(Rect rect, int subMeshGroup, float depth); public abstract void AddXZRect(Rect rect, int subMeshGroup, float yPosition); public abstract void AddYZRect(Rect rect, int subMeshGroup, float xPosition); } }