/
MTKRenderer.swift
67 lines (54 loc) · 1.91 KB
/
MTKRenderer.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import UIKit
import SpriteKit
import MetalKit
/**
`MTKRenderer` is a `Renderer` that uses MetalKit and SpriteKit to render
the game on to the iOS device.
The `GameScene` is rendered through a MetalKit while the controls
and game information overlay is rendered throuhg UIKit.
*/
class MTKRenderer: NSObject, Renderer {
var scene: GameScene
var device: MTLDevice
var commandQueue: MTLCommandQueue
var renderer: SKRenderer
var playerView: PlayerView?
init?(scene: GameScene) {
self.scene = scene
guard let device = MTLCreateSystemDefaultDevice(),
let commandQueue = device.makeCommandQueue() else {
return nil
}
self.device = device
self.commandQueue = commandQueue
self.renderer = SKRenderer(device: device)
renderer.scene = scene
super.init()
}
/// Set ups the views for a single player game.
func createSinglePlayerView(at superview: UIView) {
let playerView = PlayerView(superview: superview, device: self.device, drawDelegate: self)
playerView.setupSubviews()
self.playerView = playerView
}
}
extension MTKRenderer: MTKViewDelegate {
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
}
func draw(in view: MTKView) {
guard let renderPassDescriptor = view.currentRenderPassDescriptor,
let commandBuffer = commandQueue.makeCommandBuffer(),
let drawable = view.currentDrawable else {
return
}
renderer.update(atTime: CACurrentMediaTime())
let viewport = CGRect(x: 0, y: 0, width: view.drawableSize.width, height: view.drawableSize.height)
renderer.render(
withViewport: viewport,
commandBuffer: commandBuffer,
renderPassDescriptor: renderPassDescriptor
)
commandBuffer.present(drawable)
commandBuffer.commit()
}
}