#define Graph_And_Chart_PRO using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; namespace ChartAndGraph { partial class PathMultiplier { public int JointSmoothing = 2; public float JointSize = 0.1f; private List mInnerTmpCenters = new List(); protected List mTmpCenters = new List(); protected List mMultipliedPath = new List(); protected Quaternion LookRotation(Vector3 diff) { Vector3 up = new Vector3(diff.y, -diff.x, 0f).normalized; return Quaternion.LookRotation(diff, up); } void AddJointSegments(Vector3 from, Vector3 curr, Vector3 to) { if (JointSmoothing <= 0) { mInnerTmpCenters.Add(curr); return; } for (int i = 0; i < JointSmoothing; i++) { float t = ((float)(i + 1)) / (float)(JointSmoothing + 1); float invT = 1f - t; Vector3 point = Vector3.zero; /* if (t < 0.5f) point = Vector3.Lerp(from, curr, t / 0.5f); else point = Vector3.Lerp(curr, to, (t - 0.5f) / 0.5f);*/ point = (invT * invT * from) + (2 * invT * t * curr) + (t * t * to); mInnerTmpCenters.Add(point); } } void AddCenters(Vector3 translation,float scale) { for(int i=0; i< mTmpCenters.Count; i++) { mMultipliedPath.Add((mTmpCenters[i] * scale) + translation); } } public void ApplyToMesh(WorldSpaceChartMesh mesh) { } public void MultiplyPath(Vector3[] path) { mMultipliedPath.Clear(); for(int i=0; i= path.Length - 1) { if (closed == false) continue; } int prevIndex = i - 1; if (prevIndex < 0) prevIndex = path.Length - 1; Vector3 prev = path[prevIndex]; // int currIndex = i; Vector3 curr = path[i % path.Length]; int nextIndex = i + 1; Vector3 next = path[nextIndex % path.Length]; Vector3 dir1 = (curr - prev); Vector3 dir2 = (next - curr); float dirMag1 = dir1.magnitude; float dirMag2 = dir2.magnitude; dir1.Normalize(); dir2.Normalize(); float fromSize = Math.Min(JointSize, dirMag1 * 0.5f); float toSize = Math.Min(JointSize, dirMag2 * 0.5f); Vector3 from = curr - dir1 * fromSize; Vector3 to = curr + dir2 * toSize; Vector3 innerFrom = curr - dir1 * fromSize * 0.7f; Vector3 innerTo = curr + dir2 * toSize * 0.7f; if (i > 0) { mInnerTmpCenters.Add(from); mInnerTmpCenters.Add(innerFrom); AddJointSegments(innerFrom, curr, innerTo); mInnerTmpCenters.Add(innerTo); } mInnerTmpCenters.Add(to); } if (closed == false) mInnerTmpCenters.Add(path[path.Length - 1]); // else // mInnerTmpCenters.Add(path[0]); mTmpCenters.Clear(); mTmpCenters.Add(mInnerTmpCenters[0]); for (int i = 1; i < mInnerTmpCenters.Count; i++) { Vector3 prev = mInnerTmpCenters[i - 1]; Vector3 curr = mInnerTmpCenters[i]; if ((curr - prev).sqrMagnitude < 0.000001) continue; mTmpCenters.Add(curr); } } } }