Skip to content

Instantly share code, notes, and snippets.

@cruinh
Last active July 21, 2022 01:08
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save cruinh/df5a2f59210863d201a2 to your computer and use it in GitHub Desktop.
Save cruinh/df5a2f59210863d201a2 to your computer and use it in GitHub Desktop.
GlowFilter for CoreImage in Swift
//
// GlowFilter.swift
// based on ENHGlowFilter from http://stackoverflow.com/a/21586439/114409
//
// Created by Matthew Hayes on 12/27/15.
//
import Foundation
import UIKit
import CoreImage
class GlowFilter : CIFilter
{
var glowColor : UIColor!
var glowSize : CGFloat = 1.2
var inputImage : CIImage?
var inputRadius : NSNumber?
var inputCenter : CIVector?
override var outputImage: CIImage?
{
get
{
guard let inputImage = inputImage else { return nil }
let monochromeFilter = CIFilter(name: "CIColorMatrix")
var red : CGFloat = 0
var green : CGFloat = 0
var blue : CGFloat = 0
var alpha : CGFloat = 0
glowColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
monochromeFilter?.setValue(CIVector(x: 0, y: 0, z: 0, w: red), forKey: "inputRVector")
monochromeFilter?.setValue(CIVector(x: 0, y: 0, z: 0, w: green), forKey: "inputGVector")
monochromeFilter?.setValue(CIVector(x: 0, y: 0, z: 0, w: blue), forKey: "inputBVector")
monochromeFilter?.setValue(CIVector(x: 0, y: 0, z: 0, w: alpha), forKey: "inputAVector")
monochromeFilter?.setValue(inputImage, forKey: "inputImage")
var glowImage = monochromeFilter?.outputImage
let inputCenterX = inputCenter?.X ?? 0
let inputCenterY = inputCenter?.Y ?? 0
if inputCenterX > 0
{
var transform = CGAffineTransformTranslate(CGAffineTransformIdentity, inputCenterX, inputCenterY)
transform = CGAffineTransformScale(transform, glowSize, glowSize)
transform = CGAffineTransformTranslate(transform, -inputCenterX, -inputCenterY)
let affineTransformFilter = CIFilter(name: "CIAffineTransform")
affineTransformFilter?.setDefaults()
affineTransformFilter?.setValue(NSValue(CGAffineTransform: transform), forKey: "inputTransform")
affineTransformFilter?.setValue(glowImage, forKey: "inputImage")
glowImage = affineTransformFilter?.outputImage
}
let gaussianBlurFilter = CIFilter(name: "CIGaussianBlur")
gaussianBlurFilter?.setDefaults()
gaussianBlurFilter?.setValue(glowImage, forKey: "inputImage")
gaussianBlurFilter?.setValue(inputRadius ?? 10, forKey: "inputRadius")
glowImage = gaussianBlurFilter?.outputImage
let blendFilter = CIFilter(name: "CISourceOverCompositing")
blendFilter?.setDefaults()
blendFilter?.setValue(glowImage, forKey: "inputBackgroundImage")
blendFilter?.setValue(inputImage, forKey: "inputImage")
glowImage = blendFilter?.outputImage
return glowImage
}
}
override init()
{
super.init()
glowColor = UIColor.whiteColor()
}
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
glowColor = UIColor.whiteColor()
}
}
@cruinh
Copy link
Author

cruinh commented Dec 27, 2015

example usage:

class GameScene: SKScene
{
    lazy var effectNode : SKEffectNode = {
        let node = SKEffectNode()
        let glowFilter = GlowFilter()
        glowFilter.glowColor = UIColor.blueColor().colorWithAlphaComponent(0.5)
        glowFilter.inputRadius = 20
        node.shouldRasterize = true
        node.filter = glowFilter
        return node
    }()

    override func didMoveToView(view: SKView)
    {
        addChild(effectNode)
        let spaceship = SKSpriteNode(imageNamed: "Spaceship")
        spaceship.position = CGPoint(x: size.width/2, y: size.height/2)
        effectNode.addChild(spaceship)
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment