public class TiltShift: OperationGroup {
    public var blurRadiusInPixels: Float = 7.0 { didSet { gaussianBlur.blurRadiusInPixels = blurRadiusInPixels } }
    public var topFocusLevel: Float = 0.4 { didSet { tiltShift.uniformSettings["topFocusLevel"] = topFocusLevel } }
    public var bottomFocusLevel: Float = 0.6 { didSet { tiltShift.uniformSettings["bottomFocusLevel"] = bottomFocusLevel } }
    public var focusFallOffRate: Float = 0.2 { didSet { tiltShift.uniformSettings["focusFallOffRate"] = focusFallOffRate } }

    let gaussianBlur = GaussianBlur()
    let tiltShift = BasicOperation(fragmentShader: TiltShiftFragmentShader, numberOfInputs: 2)

    override public init() {
        super.init()

        ({ blurRadiusInPixels = 7.0 })()
        ({ topFocusLevel = 0.4 })()
        ({ bottomFocusLevel = 0.6 })()
        ({ focusFallOffRate = 0.2 })()

        configureGroup { input, output in
            input --> self.tiltShift --> output
            input --> self.gaussianBlur --> self.tiltShift
        }
    }
}
