#define Graph_And_Chart_PRO using ChartAndGraph; using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; namespace ChartAndGraph { [RequireComponent(typeof(MeshRenderer))] [RequireComponent(typeof(MeshFilter))] public partial class CylinderPathGenerator : SmoothPathGenerator { public int CircleVertices = 10; [Range(0.01f,10.0f)] public float HeightRatio = 1f; Vector3[] mCircleTemp; Vector3[] mCurrentCircle; List mTmpTringle = new List(); List mTmpUv = new List(); List mVertices = new List(); void EnsureCirlce() { if(mCircleTemp == null || mCircleTemp.Length !=CircleVertices) { mCircleTemp = new Vector3[CircleVertices]; for(int i=0; i tringles, int from, int to) { if (CircleVertices <= 1) return; for (int i = 0; i < CircleVertices; i++) { int prev = i - 1; if (prev < 0) prev = CircleVertices - 1; int fromPrev = from + prev; int toPrev = to + prev; int fromCurr = from + i; int toCurr = to + i; tringles.Add(fromPrev); tringles.Add(fromCurr); tringles.Add(toCurr); tringles.Add(toCurr); tringles.Add(toPrev); tringles.Add(fromPrev); } } public override void Generator(Vector3[] path, float thickness, bool closed) { if (EnsureMeshFilter() == false) // No mesh filter attached return; Clear(); if (path.Length <= 1) return; mTmpTringle.Clear(); mTmpUv.Clear(); mVertices.Clear(); ModifyPath(path, closed); if (mTmpCenters.Count <= 1) return; float currentU = 0f; int prevCircleIndex = WriteCircle(thickness, LookRotation(mTmpCenters[1] - mTmpCenters[0]), mTmpCenters[0], currentU); if (closed == false) { int circle = WriteCircle(thickness, LookRotation(mTmpCenters[1] - mTmpCenters[0]), mTmpCenters[0], currentU); mVertices.Add(mTmpCenters[0]); mTmpUv.Add(new Vector2(0f, 0.5f)); for (int i = 0; i < CircleVertices; i++) { int next = (i + 1) % CircleVertices; mTmpTringle.Add(circle + CircleVertices); mTmpTringle.Add(circle + next); mTmpTringle.Add(circle + i); } } Vector3 curr = Vector3.zero; Quaternion rotation = Quaternion.identity; for (int i=1; i