Vector3 getPointAtT(float t)
    {
        int i0 = 0, i1 = 0, i2 = 0, i3 = 0;  // indices

        if (closed)
        {
            i0 = ((int)t) % points.Count;

            int add = (int)t;
            if (curveType == CurveType.Bezier && add >= 1)
            {
                // i0, i1, i2, i3  // t = 0
                // i3, i0, i1, i2  // t = 1
                // i2, i3, i0, i1  // t = 2
                // i1, i2, i3, i0  // t = 3
                i0 = (3 * add) % points.Count;
            }

            i1 = (i0 + 1) % points.Count;
            i2 = (i1 + 1) % points.Count;
            i3 = (i2 + 1) % points.Count;
        }
        else
        {
            i0 = 0;
            i1 = 1;
            i2 = 2;
            i3 = 3;
        }
        // Debug.Log("i0 " + i0 + ", i1 " + i1 + ", i2 " + i2 + ", i3 " + i3);

        CurveSegment csX = new CurveSegment(curveType, points[i0].position.x, points[i1].position.x, points[i2].position.x, points[i3].position.x);
        CurveSegment csY = new CurveSegment(curveType, points[i0].position.y, points[i1].position.y, points[i2].position.y, points[i3].position.y);
        //CurveSegment csZ = new CurveSegment(curveType, points[i0].position.z, points[i1].position.z, points[i2].position.z, points[i3].position.z);

        float x = csX.Evaluate(t);
        float y = csY.Evaluate(t);
        //float z = csZ.Evaluate(t);
        //Vector3 p = new Vector3(x, y, z);
        Vector3 p = new Vector3(x, y, 0f);

        return(p);
    }