public Vector3 InterpolateScale(float interpolationFactor)
    {
        Shape2DExtrudeControlPoint startControlPoint = _controlPoints[Mathf.FloorToInt(interpolationFactor)];
        Shape2DExtrudeControlPoint endControlPoint   = _controlPoints[Mathf.CeilToInt(interpolationFactor)];
        float lerpFactor = interpolationFactor - Mathf.Floor(interpolationFactor);

        return(Vector3.Lerp(startControlPoint.GetScale(), endControlPoint.GetScale(), lerpFactor));
    }
    public Quaternion InterpolateRotation(float interpolationFactor)
    {
        Shape2DExtrudeControlPoint startControlPoint = _controlPoints[Mathf.FloorToInt(interpolationFactor)];
        Shape2DExtrudeControlPoint endControlPoint   = _controlPoints[Mathf.CeilToInt(interpolationFactor)];
        float lerpFactor = interpolationFactor - Mathf.Floor(interpolationFactor);

        return(Quaternion.Lerp(startControlPoint.GetRotation(), endControlPoint.GetRotation(), lerpFactor));
    }
 private Vector3[] VerticesFromShape(Shape2D shape, Vector3 position, Quaternion rotation, Vector3 scale)
 {
     Vector3[] vertices = new Vector3[shape.points.Length];
     for (int shapePointIndex = 0; shapePointIndex < shape.points.Length; shapePointIndex++)
     {
         vertices[shapePointIndex] = Shape2DExtrudeControlPoint.TransformPoint(shape.points[shapePointIndex], position, rotation, scale);
     }
     return(vertices);
 }
    public Vector3 InterpolatePosition(float interpolationFactor)
    {
        Shape2DExtrudeControlPoint startControlPoint = _controlPoints[Mathf.FloorToInt(interpolationFactor)];
        Shape2DExtrudeControlPoint endControlPoint   = _controlPoints[Mathf.CeilToInt(interpolationFactor)];
        float lerpFactor = interpolationFactor - Mathf.Floor(interpolationFactor);

        switch (interpolationMethod)
        {
        case InterpolationMethod.Linear:
            return(Vector3.Lerp(startControlPoint.GetPosition(), endControlPoint.GetPosition(), lerpFactor));

        case InterpolationMethod.Bezier:
            return(BezierCurve.BezierPosition(startControlPoint.GetPosition(), startControlPoint.GetForwardHandlePosition(), endControlPoint.GetPosition(), endControlPoint.GetBackwardHandlePosition(), lerpFactor));

        default:
            throw new InvalidOperationException("The current interpolation method is not supported: " + interpolationMethod);
        }
    }
    private Vector3[] CreateNormals(Shape2D shape)
    {
        // Creates the normals
        Vector3[] meshNormals = new Vector3[(resolution * (_controlPoints.Length - 1) + 1) * shape.normals.Length];

        // For each control point...
        for (int controlPointIndex = 0; controlPointIndex < _controlPoints.Length; controlPointIndex++)
        {
            // For each resolution pass...
            for (int resolutionPass = 0; resolutionPass < resolution; resolutionPass++)
            {
                // Calculates the interpolated values
                float      lerpFactor           = controlPointIndex + (float)resolutionPass / resolution;
                Quaternion interpolatedRotation = InterpolateRotation(lerpFactor);

                // Caches some values
                int meshNormalBaseIndex = (controlPointIndex * resolution + resolutionPass) * shape.normals.Length;

                // For each normal in the shape...
                for (int shapeNormalIndex = 0; shapeNormalIndex < shape.normals.Length; shapeNormalIndex++)
                {
                    // Assigns the normal to each vertex using the interpolated information
                    int meshNormalIndex = meshNormalBaseIndex + shapeNormalIndex;
                    meshNormals[meshNormalIndex] = Shape2DExtrudeControlPoint.TransformDirection(shape.normals[shapeNormalIndex], interpolatedRotation);
                }

                // The last control point only has one resolution pass!
                if (controlPointIndex == _controlPoints.Length - 1)
                {
                    break;
                }
            }
        }

        return(meshNormals);
    }