internal override Vector3 GetPoint(float perc, Vector3[] wps, Path p, ControlPoint[] controlPoints) { if (perc <= 0) { p.linearWPIndex = 1; return wps[0]; } int startPIndex = 0; int endPIndex = 0; int count = p.timesTable.Length; for (int i = 1; i < count; i++) { if (p.timesTable[i] >= perc) { startPIndex = i - 1; endPIndex = i; break; } } float startPPerc = p.timesTable[startPIndex]; float partialPerc = perc - startPPerc; float partialLen = p.length * partialPerc; Vector3 wp0 = wps[startPIndex]; Vector3 wp1 = wps[endPIndex]; p.linearWPIndex = endPIndex; return wp0 + Vector3.ClampMagnitude(wp1 - wp0, partialLen); }
static public int constructor(IntPtr l) { try { DG.Tweening.Plugins.Core.PathCore.ControlPoint o; UnityEngine.Vector3 a1; checkType(l, 2, out a1); UnityEngine.Vector3 a2; checkType(l, 3, out a2); o = new DG.Tweening.Plugins.Core.PathCore.ControlPoint(a1, a2); pushValue(l, true); pushValue(l, o); return(2); } catch (Exception e) { return(error(l, e)); } }
// controlPoints as a separate parameter so we can pass custom ones from SetWaypointsLengths internal override Vector3 GetPoint(float perc, Vector3[] wps, Path p, ControlPoint[] controlPoints) { int numSections = wps.Length - 1; // Considering also control points int tSec = (int)Math.Floor(perc * numSections); int currPt = numSections - 1; if (currPt > tSec) currPt = tSec; float u = perc * numSections - currPt; Vector3 a = currPt == 0 ? controlPoints[0].a : wps[currPt - 1]; Vector3 b = wps[currPt]; Vector3 c = wps[currPt + 1]; Vector3 d = currPt + 2 > wps.Length - 1 ? controlPoints[1].a : wps[currPt + 2]; return .5f * ( (-a + 3f * b - 3f * c + d) * (u * u * u) + (2f * a - 5f * b + 4f * c - d) * (u * u) + (-a + c) * u + 2f * b ); }
internal void SetWaypointsLengths(Path p, int subdivisions) { // Create a relative path between each waypoint, // with its start and end control lines coinciding with the next/prev waypoints. int count = p.wps.Length; float[] wpLengths = new float[count]; wpLengths[0] = 0; ControlPoint[] partialControlPs = new ControlPoint[2]; Vector3[] partialWps = new Vector3[2]; for (int i = 1; i < count; ++i) { // Create partial path partialControlPs[0].a = i == 1 ? p.controlPoints[0].a : p.wps[i - 2]; partialWps[0] = p.wps[i - 1]; partialWps[1] = p.wps[i]; partialControlPs[1].a = i == count - 1 ? p.controlPoints[1].a : p.wps[i + 1]; // Calculate length of partial path float partialLen = 0; float incr = 1f / subdivisions; Vector3 prevP = GetPoint(0, partialWps, p, partialControlPs); for (int c = 1; c < subdivisions + 1; ++c) { float perc = incr * c; Vector3 currP = GetPoint(perc, partialWps, p, partialControlPs); partialLen += Vector3.Distance(currP, prevP); prevP = currP; } wpLengths[i] = partialLen; } // Assign p.wpLengths = wpLengths; }
// Clones this path with the given loop increment internal Path CloneIncremental(int loopIncrement) { if (_incrementalClone != null) { if (_incrementalIndex == loopIncrement) return _incrementalClone; _incrementalClone.Destroy(); } int wpsLen = wps.Length; Vector3 diff = wps[wpsLen - 1] - wps[0]; Vector3[] incrWps = new Vector3[wps.Length]; for (int i = 0; i < wpsLen; ++i) incrWps[i] = wps[i] + (diff * loopIncrement); int cpsLen = controlPoints.Length; ControlPoint[] incrCps = new ControlPoint[cpsLen]; for (int i = 0; i < cpsLen; ++i) incrCps[i] = controlPoints[i] + (diff * loopIncrement); Vector3[] incrNonLinearDrawWps = null; if (nonLinearDrawWps != null) { int nldLen = nonLinearDrawWps.Length; incrNonLinearDrawWps = new Vector3[nldLen]; for (int i = 0; i < nldLen; ++i) incrNonLinearDrawWps[i] = nonLinearDrawWps[i] + (diff * loopIncrement); } _incrementalClone = new Path(); _incrementalIndex = loopIncrement; _incrementalClone.type = type; _incrementalClone.subdivisionsXSegment = subdivisionsXSegment; _incrementalClone.subdivisions = subdivisions; _incrementalClone.wps = incrWps; _incrementalClone.controlPoints = incrCps; if (DOTween.isUnityEditor) DOTween.GizmosDelegates.Add(_incrementalClone.Draw); _incrementalClone.length = length; _incrementalClone.wpLengths = wpLengths; _incrementalClone.timesTable = timesTable; _incrementalClone.lengthsTable = lengthsTable; _incrementalClone._decoder = _decoder; _incrementalClone.nonLinearDrawWps = incrNonLinearDrawWps; _incrementalClone.targetPosition = targetPosition; _incrementalClone.lookAtPosition = lookAtPosition; _incrementalClone.isFinalized = true; return _incrementalClone; }
// Clones this path with the given loop increment internal Path CloneIncremental(int loopIncrement) { if (_incrementalClone != null) { if (_incrementalIndex == loopIncrement) { return(_incrementalClone); } _incrementalClone.Destroy(); } int wpsLen = wps.Length; Vector3 diff = wps[wpsLen - 1] - wps[0]; Vector3[] incrWps = new Vector3[wps.Length]; for (int i = 0; i < wpsLen; ++i) { incrWps[i] = wps[i] + (diff * loopIncrement); } int cpsLen = controlPoints.Length; ControlPoint[] incrCps = new ControlPoint[cpsLen]; for (int i = 0; i < cpsLen; ++i) { incrCps[i] = controlPoints[i] + (diff * loopIncrement); } Vector3[] incrNonLinearDrawWps = null; if (nonLinearDrawWps != null) { int nldLen = nonLinearDrawWps.Length; incrNonLinearDrawWps = new Vector3[nldLen]; for (int i = 0; i < nldLen; ++i) { incrNonLinearDrawWps[i] = nonLinearDrawWps[i] + (diff * loopIncrement); } } _incrementalClone = new Path(); _incrementalIndex = loopIncrement; _incrementalClone.type = type; _incrementalClone.subdivisionsXSegment = subdivisionsXSegment; _incrementalClone.subdivisions = subdivisions; _incrementalClone.wps = incrWps; _incrementalClone.controlPoints = incrCps; if (DOTween.isUnityEditor) { DOTween.GizmosDelegates.Add(_incrementalClone.Draw); } _incrementalClone.length = length; _incrementalClone.wpLengths = wpLengths; _incrementalClone.timesTable = timesTable; _incrementalClone.lengthsTable = lengthsTable; _incrementalClone._decoder = _decoder; _incrementalClone.nonLinearDrawWps = incrNonLinearDrawWps; _incrementalClone.targetPosition = targetPosition; _incrementalClone.lookAtPosition = lookAtPosition; _incrementalClone.isFinalized = true; return(_incrementalClone); }
// Gets a point on the path at the given percentage (0 to 1) internal abstract Vector3 GetPoint(float perc, Vector3[] wps, Path p, ControlPoint[] controlPoints);