示例#1
0
        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));
     }
 }
示例#3
0
        // 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
            );
        }
示例#4
0
        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;
        }
示例#5
0
文件: Path.cs 项目: SylarLi/Puzzle1
        // 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;
        }
示例#6
0
文件: Path.cs 项目: zwong91/Titan
        // 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);
        }
示例#7
0
 // 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);