[Metaballs] The ViewController is the bridge between the Field and the Renderer
This commit is contained in:
		
							parent
							
								
									ea3638d12c
								
							
						
					
					
						commit
						e971d0dbca
					
				
					 1 changed files with 48 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -7,21 +7,62 @@
 | 
			
		|||
//
 | 
			
		||||
 | 
			
		||||
import Cocoa
 | 
			
		||||
import MetalKit
 | 
			
		||||
import MetaballsKit
 | 
			
		||||
 | 
			
		||||
class ViewController: NSViewController {
 | 
			
		||||
class ViewController: NSViewController, RendererDelegate {
 | 
			
		||||
    private var field = Field(size: CGSize()) {
 | 
			
		||||
        didSet {
 | 
			
		||||
            field.size = metalView.drawableSize
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private var renderer: Renderer!
 | 
			
		||||
 | 
			
		||||
    private var metalView: MTKView! {
 | 
			
		||||
        return self.view as! MTKView
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override func viewDidLoad() {
 | 
			
		||||
        super.viewDidLoad()
 | 
			
		||||
 | 
			
		||||
        // Do any additional setup after loading the view.
 | 
			
		||||
        guard let metalView = metalView else {
 | 
			
		||||
            view = newErrorView()
 | 
			
		||||
            print("self.view should be an MTKView; got \(type(of: self.view)) instead")
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        do {
 | 
			
		||||
            renderer = try Renderer(view: metalView, field: field)
 | 
			
		||||
        } catch let e {
 | 
			
		||||
            print("\(e)")
 | 
			
		||||
            view = newErrorView()
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        metalView.delegate = renderer
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override var representedObject: Any? {
 | 
			
		||||
        didSet {
 | 
			
		||||
        // Update the view, if already loaded.
 | 
			
		||||
    override func viewWillAppear() {
 | 
			
		||||
        super.viewWillAppear()
 | 
			
		||||
        renderer.mtkView(metalView, drawableSizeWillChange: metalView.drawableSize)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private func newErrorView() -> NSView {
 | 
			
		||||
        let view = NSView()
 | 
			
		||||
        view.layer?.backgroundColor = NSColor.red.cgColor
 | 
			
		||||
        return view
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // MARK: - RendererDelegate
 | 
			
		||||
 | 
			
		||||
    var renderSize: CGSize {
 | 
			
		||||
        get {
 | 
			
		||||
            return field.size
 | 
			
		||||
        }
 | 
			
		||||
        set {
 | 
			
		||||
            field.size = newValue
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue