Esempio n. 1
0
        /// <summary>
        /// Optimized using parallel for loops.
        /// Using Unity jobs is probably better for multithreading than parallelized loops.
        /// </summary>
        /// <param name="controlPoints"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="resolutionWidth"></param>
        /// <param name="resolutionHeight"></param>
        /// <returns></returns>
        internal static Vector3[] GenerateVerticesOfPatch_Parallel(List <Vector3> controlPoints, int width, int height, int resolutionWidth, int resolutionHeight)
        {
            //create horizontal splines through the control points
            List <Vector3>[] horizontalPoints = new List <Vector3> [height];
            Parallel.For(0, height, (i) =>
            {
                KochanekBartelsSpline horizontalSpline = new KochanekBartelsSpline(resolutionWidth);
                horizontalSpline.SetControlPoints(controlPoints.GetRange(i * width, width).ToArray());
                horizontalPoints[i] = new List <Vector3>(horizontalSpline.InterpolatedPoints);
            });

            //create vertical splines through the generated interpolated points of the horizontal splines
            List <Vector3> vertices = new List <Vector3>();

            List <Vector3>[] verticesLists = new List <Vector3> [(width - 1) * (resolutionWidth)];
            Parallel.For(0, (width - 1) * (resolutionWidth), (i) => {
                KochanekBartelsSpline verticalSpline = new KochanekBartelsSpline(resolutionHeight);
                List <Vector3> verticalControlPoints = new List <Vector3>();
                foreach (List <Vector3> horizontalPointList in horizontalPoints)
                {
                    verticalControlPoints.Add(horizontalPointList[i]);
                }
                verticalSpline.SetControlPoints(verticalControlPoints.ToArray());

                verticesLists[i] = new List <Vector3>(verticalSpline.InterpolatedPoints);
            });

            foreach (var verticesList in verticesLists)
            {
                vertices.AddRange(verticesList);
            }

            return(vertices.ToArray());
        }
Esempio n. 2
0
        /// <summary>
        /// Optimized version.
        /// </summary>
        /// <param name="controlPoints"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="resolutionWidth"></param>
        /// <param name="resolutionHeight"></param>
        /// <returns></returns>
        internal static Vector3[] GenerateVerticesOfPatch_Optimized(List <Vector3> controlPoints, int width, int height, int resolutionWidth, int resolutionHeight)
        {
            //create horizontal splines through the control points
            List <List <Vector3> > horizontalPoints = new List <List <Vector3> >();
            KochanekBartelsSpline  horizontalSpline = new KochanekBartelsSpline(resolutionWidth);

            for (int i = 0; i < height; i++)
            {
                horizontalSpline.SetControlPoints(controlPoints.GetRange(i * width, width).ToArray());
                horizontalPoints.Add(new List <Vector3>(horizontalSpline.InterpolatedPoints));
            }

            //create vertical splines through the generated interpolated points of the horizontal splines
            KochanekBartelsSpline verticalSpline = new KochanekBartelsSpline(resolutionHeight);
            List <Vector3>        vertices       = new List <Vector3>();

            for (int i = 0; i < (width - 1) * (resolutionWidth); i++)
            {
                List <Vector3> verticalControlPoints = new List <Vector3>();
                foreach (List <Vector3> horizontalPointList in horizontalPoints)
                {
                    verticalControlPoints.Add(horizontalPointList[i]);
                }
                verticalSpline.SetControlPoints(verticalControlPoints.ToArray());
                vertices.AddRange(verticalSpline.InterpolatedPoints);
            }

            return(vertices.ToArray());
        }
    private void Start()
    {
        kochanekBartelsSpline = new KochanekBartelsSpline();

        ControlPoints = new Vector3[ControlPointObjects.Length];
        for (int i = 0; i < ControlPointObjects.Length; i++)
        {
            ControlPoints[i] = ControlPointObjects[i].transform.position;
        }

        InterpolatedPoints = kochanekBartelsSpline.InterpolatedPoints;
        kochanekBartelsSpline.SetControlPoints(ControlPoints);
        //kochanekBartelsSpline.insertControlPoint(0, extraControlPoint.transform.position);
        kochanekBartelsSpline.AddControlPoint(extraControlPoint.transform.position);
        kochanekBartelsSpline.DeleteControlPoint(9);
    }