137 lines
4.5 KiB
C#
137 lines
4.5 KiB
C#
#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<Vector3> mInnerTmpCenters = new List<Vector3>();
|
|
protected List<Vector3> mTmpCenters = new List<Vector3>();
|
|
|
|
|
|
protected List<Vector3> mMultipliedPath = new List<Vector3>();
|
|
|
|
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; i++)
|
|
{
|
|
AddCenters(path[i],1f);
|
|
}
|
|
}
|
|
|
|
public void ModifyPath(Vector3[] path, bool closed)
|
|
{
|
|
if (path.Length <= 1)
|
|
return;
|
|
|
|
mInnerTmpCenters.Clear();
|
|
for (int i = 0; i <= path.Length; i++)
|
|
{
|
|
// bool closing = false;
|
|
if (i == 0 && closed == false)
|
|
{
|
|
mInnerTmpCenters.Add(path[0]);
|
|
continue;
|
|
}
|
|
if (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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|