/// <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()); }
/// <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); }