Beispiel #1
0
        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);
        }
Beispiel #2
0
 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();
         }
     }
 }