public class MaskingEchoBox: ConfiguredQuadRenderable<MaskingEchoBox.Config> {
    public struct Config: QuadRenderConfiguration {
        let box_width: ADFloat
        let box_height: ADFloat

        let box_rotation: ADFloat
        let box_roundness: ADFloat

        let repeat_count: ADFloat
        let repeat_x_spacing: ADFloat
        let repeat_y_spacing: ADFloat
        let repeat_x_offset: ADFloat
        let repeat_y_offset: ADFloat

        let fade_mask_mix: ADFloat
        let fade_mask_rotation: ADFloat
        let fade_mask_offset: ADFloat
        let fade_mask_scaling: ADFloat
        let invert_mix: ADFloat

        public init(
            boxWidth: ADFloat = 1.0,
            boxHeight: ADFloat = 1.0,
            boxRotation: ADFloat = 0.125,
            boxRoundness: ADFloat = 0.05,

            repeatCount: ADFloat = 5.0,
            repeatXSpacing: ADFloat = 0.3,
            repeatYSpacing: ADFloat = 0.0,
            repeatXOffset: ADFloat = 1.7,
            repeatYOffset: ADFloat = 0.0,

            fadeMaskMix: ADFloat = 1.0,
            fadeMaskRotation: ADFloat = -0.125,
            fadeMaskOffset: ADFloat = 1.0,
            fadeMaskScaling: ADFloat = 2.0,
            invertMix: ADFloat = 0.0
        ) {
            box_width = boxWidth
            box_height = boxHeight

            box_rotation = boxRotation
            box_roundness = boxRoundness

            repeat_count = repeatCount
            repeat_x_spacing = repeatXSpacing
            repeat_y_spacing = repeatYSpacing
            repeat_x_offset = repeatXOffset
            repeat_y_offset = repeatYOffset

            fade_mask_mix = fadeMaskMix
            fade_mask_rotation = fadeMaskRotation
            fade_mask_offset = fadeMaskOffset
            fade_mask_scaling = fadeMaskScaling
            invert_mix = invertMix
        }

        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_box_frag"
    }
}
