/
MTKRenderer.swift
80 lines (64 loc) · 2.21 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
68
69
70
71
72
73
74
75
76
77
78
79
80
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 `SKScene` is rendered through a MetalKit while the controls
and game information overlay is rendered throuhg UIKit.
*/
class MTKRenderer: NSObject, Renderer {
var scene: SKScene
var device: MTLDevice
var commandQueue: MTLCommandQueue
var renderer: SKRenderer
var playerView: PlayerView?
var viewDelegate: ViewDelegate?
init?(scene: SKScene) {
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()
playerView.setControlViewDelegate(self)
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()
}
}
extension MTKRenderer: ControlViewDelegate {
func joystickMoved(toLeft: Bool) {
viewDelegate?.joystickMoved(toLeft: toLeft)
}
func jumpButtonPressed() {
viewDelegate?.jumpButtonPressed()
}
}