private GenMath.BezierCubicControls GenerateBezierControls(List <IntVec3> path, int pathStartIndex, int pathEndIndex) { int index = Mathf.Max(0, pathStartIndex - (pathEndIndex - pathStartIndex)); int index2 = Mathf.Min(path.Count - 1, pathEndIndex - (pathStartIndex - pathEndIndex)); GenMath.BezierCubicControls result = default(GenMath.BezierCubicControls); result.w0 = path[pathStartIndex].ToVector3Shifted(); result.w1 = path[pathStartIndex].ToVector3Shifted() + (path[pathEndIndex] - path[index]).ToVector3().normalized * 4f; result.w2 = path[pathEndIndex].ToVector3Shifted() + (path[pathStartIndex] - path[index2]).ToVector3().normalized * 4f; result.w3 = path[pathEndIndex].ToVector3Shifted(); return(result); }
private void DrawCurveSegment(DistanceElement[,] distance, List <IntVec3> path, int pathStartIndex, int pathEndIndex, RoadPathingDef pathing, Map map, int centerpointIndex, ref IntVec3 centerpoint) { if (pathStartIndex == pathEndIndex) { Log.ErrorOnce("Zero-length segment drawn in road routine", 78187971); } else { GenMath.BezierCubicControls bcc = GenerateBezierControls(path, pathStartIndex, pathEndIndex); List <Vector3> list = new List <Vector3>(); int num = (pathEndIndex - pathStartIndex) * 4; for (int i = 0; i <= num; i++) { list.Add(GenMath.BezierCubicEvaluate((float)i / (float)num, bcc)); } int num2 = 0; for (int j = pathStartIndex; j <= pathEndIndex; j++) { if (j > 0 && j < path.Count && path[j].InBounds(map) && path[j].GetTerrain(map).IsWater) { num2++; } } if (pathStartIndex + 1 < pathEndIndex) { for (int k = 0; k < list.Count; k++) { IntVec3 intVec = list[k].ToIntVec3(); bool flag = intVec.InBounds(map) && intVec.Impassable(map); int num3 = 0; for (int l = 0; l < GenAdj.CardinalDirections.Length; l++) { if (flag) { break; } IntVec3 c = intVec + GenAdj.CardinalDirections[l]; if (c.InBounds(map)) { flag |= (pathing == RoadPathingDefOf.Avoid && c.Impassable(map)); if (c.GetTerrain(map).IsWater) { num3++; } if (flag) { break; } } } if (flag || (float)num3 > (float)num2 * 1.5f + 2f) { DrawCurveSegment(distance, path, pathStartIndex, (pathStartIndex + pathEndIndex) / 2, pathing, map, centerpointIndex, ref centerpoint); DrawCurveSegment(distance, path, (pathStartIndex + pathEndIndex) / 2, pathEndIndex, pathing, map, centerpointIndex, ref centerpoint); return; } } } for (int m = 0; m < list.Count; m++) { Vector3 vector = list[m]; float x = vector.x; Vector3 vector2 = list[m]; FillDistanceField(distance, x, vector2.z, GenMath.LerpDouble(0f, (float)(list.Count - 1), (float)pathStartIndex, (float)pathEndIndex, (float)m), 10f, map); } if (centerpointIndex >= pathStartIndex && centerpointIndex < pathEndIndex) { centerpointIndex = Mathf.Clamp(Mathf.RoundToInt(GenMath.LerpDouble((float)pathStartIndex, (float)pathEndIndex, 0f, (float)list.Count, (float)centerpointIndex)), 0, list.Count - 1); centerpoint = list[centerpointIndex].ToIntVec3(); } } }