public class MaskedRepeatCircleCurveRenderable: ConfiguredQuadRenderable<MaskedRepeatCircleCurveRenderable.Config> {
    public struct Config: QuadRenderConfiguration {
        let canvas_size: ADVector2
        let line_width: ADFloat
        let x_space_scale: ADFloat
        let y_space_scale: ADFloat
        let x_offset: ADFloat
        let y_offset: ADFloat
        let pinch_amount: ADFloat
        let repeat_count: ADFloat
        let repeat_x_spacing: ADFloat
        let repeat_y_spacing: ADFloat
        let repeat_rotation: ADFloat

        public init(
            canvasSize: ADVector2 = .ones,
            lineWidth: ADFloat = 0.1,
            xSpaceScale: ADFloat = 1.0,
            ySpaceScale: ADFloat = 1.0,
            xOffset: ADFloat = 0.0,
            yOffset: ADFloat = 0.0,
            pinchAmount: ADFloat = 0.0,
            repeatCount: ADFloat = 0.0,
            repeatXSpacing: ADFloat = 0.0,
            repeatYSpacing: ADFloat = 0.0,
            repeatRotation: ADFloat = 0.0
        ) {
            canvas_size = canvasSize
            line_width = lineWidth
            x_space_scale = xSpaceScale
            y_space_scale = ySpaceScale
            x_offset = xOffset
            y_offset = yOffset
            pinch_amount = pinchAmount
            repeat_count = repeatCount
            repeat_x_spacing = repeatXSpacing
            repeat_y_spacing = repeatYSpacing
            repeat_rotation = repeatRotation
        }

        public static var defaultConfiguration: Config {
            return Config()
        }
    }

    override public var configureAction: ConfigureAction {
        return { encoder in
            super.configureAction(encoder)
        }
    }

    override var fragmentShaderName: String {
        return "masking_echo_circle_curve_frag"
    }
}
