metaballs/MetaballsSaver/MetaballsSaverView.swift
Eryn Wells b95dffd5a8 [saver] DOES NOT BUILD, but I need to go to bed -_-
Quickly build a Swift version of a ScreenSaverView and throw some Metal at it.
Having trouble getting the RendererDelegate protocol satisfied.
2017-08-16 22:30:32 -07:00

97 lines
2.6 KiB
Swift

//
// MetaballsSaverView.swift
// Metaballs
//
// Created by Eryn Wells on 8/16/17.
// Copyright © 2017 Eryn Wells. All rights reserved.
//
import Foundation
import MetaballsKit
import MetalKit
import ScreenSaver
class MetaballsSaverView: ScreenSaverView, RendererDelegate {
private static func defaultParameters() -> Parameters {
var p = Parameters()
let defaults = UserDefaults.standard
let style = defaults.colorStyle ?? .gradient2Horizontal
p.colorStyle = style
let color0 = defaults.color0 ?? Float4(0.50, 0.79, 1, 1)
p.color0 = color0
let color1 = defaults.color1 ?? Float4(0.88, 0.50, 1, 1)
p.color1 = color1
return p
}
public var metalView: MTKView
public var field: Field {
didSet {
field.size = Size(size: metalView.drawableSize)
}
}
internal var renderer: RendererDelegate
override init?(frame: NSRect, isPreview: Bool) {
let params = MetaballsSaverView.defaultParameters()
field = Field(parameters: params)
metalView = MTKView()
metalView.translatesAutoresizingMaskIntoConstraints = false
addSubview(metalView)
NSLayoutConstraint.activate([
metalView.topAnchor.constraint(equalTo: topAnchor),
metalView.leftAnchor.constraint(equalTo: leftAnchor),
metalView.bottomAnchor.constraint(equalTo: bottomAnchor),
metalView.rightAnchor.constraint(equalTo: rightAnchor),
])
do {
renderer = try Renderer(delegate: self)
} catch let e {
fatalError("\(e)")
}
super.init(frame: frame, isPreview: isPreview)
}
required init?(coder: NSCoder) {
let params = MetaballsSaverView.defaultParameters()
field = Field(parameters: params)
metalView = MTKView()
metalView.translatesAutoresizingMaskIntoConstraints = false
addSubview(metalView)
NSLayoutConstraint.activate([
metalView.topAnchor.constraint(equalTo: topAnchor),
metalView.leftAnchor.constraint(equalTo: leftAnchor),
metalView.bottomAnchor.constraint(equalTo: bottomAnchor),
metalView.rightAnchor.constraint(equalTo: rightAnchor),
])
do {
renderer = try Renderer(delegate: self)
} catch let e {
fatalError("\(e)")
}
super.init(coder: coder)
}
override func animateOneFrame() {
}
// MARK: - RendererDelegate
public var renderSize: Size {
get {
return field.size
}
set {
field.size = newValue
}
}
}