private static void GenerateTrack(GameObject segmentObject, RailPathPoint p1, RailPathPoint p2, RailSettings settings, Vector3 fromVectorPpc, Vector3 toVectorPpc, float offset)
    {
        GameObject trackObject = new GameObject("Track");

        trackObject.layer = LayerMask.NameToLayer("Ground");
        trackObject.transform.SetParent(segmentObject.transform);
        MeshFilter   meshFilter   = trackObject.AddComponent <MeshFilter>();
        MeshRenderer meshRenderer = trackObject.AddComponent <MeshRenderer>();

        Vector3[] vertices  = new Vector3[0];
        int[]     triangles = new int[0];

        Vector3 heightOffsetUpper = new Vector3(0f, settings.TrackHeight + settings.PlankHeight, 0f);
        Vector3 heightOffsetLower = new Vector3(0f, settings.PlankHeight, 0f);

        // Left Side
        List <Vector3> leftSide = new List <Vector3>()
        {
            p2.Position + (toVectorPpc * offset) + heightOffsetUpper,
            p1.Position + (fromVectorPpc * offset) + heightOffsetUpper,
            p1.Position + (fromVectorPpc * offset) + heightOffsetLower,
            p2.Position + (toVectorPpc * offset) + heightOffsetLower,
        };

        MeshGenerator.AddPlane(ref vertices, ref triangles, leftSide);

        // Right Side
        List <Vector3> rightSide = new List <Vector3>()
        {
            p1.Position + (fromVectorPpc * (offset + settings.TrackWidth)) + heightOffsetUpper,
            p2.Position + (toVectorPpc * (offset + settings.TrackWidth)) + heightOffsetUpper,
            p2.Position + (toVectorPpc * (offset + settings.TrackWidth)) + heightOffsetLower,
            p1.Position + (fromVectorPpc * (offset + settings.TrackWidth)) + heightOffsetLower,
        };

        MeshGenerator.AddPlane(ref vertices, ref triangles, rightSide);

        // Top Side
        List <Vector3> topSide = new List <Vector3>()
        {
            p1.Position + (fromVectorPpc * offset) + heightOffsetUpper,
            p2.Position + (toVectorPpc * offset) + heightOffsetUpper,
            p2.Position + (toVectorPpc * (offset + settings.TrackWidth)) + heightOffsetUpper,
            p1.Position + (fromVectorPpc * (offset + settings.TrackWidth)) + heightOffsetUpper,
        };

        MeshGenerator.AddPlane(ref vertices, ref triangles, topSide);


        meshFilter.mesh.vertices  = vertices;
        meshFilter.mesh.triangles = triangles;
        meshFilter.mesh.RecalculateNormals();
        meshRenderer.material       = MaterialHandler.Instance.DefaultMaterial;
        meshRenderer.material.color = MaterialHandler.Instance.RailTrackColor;
        trackObject.AddComponent <MeshCollider>();
    }