Skip to content

Commit 399edc3

Browse files
jandroktstackotter
authored andcommitted
Replace RendererError struct with an enum, and make the RenderCoordinator in WithRenderCoordinator's content property not nullable
1 parent 77ce2b1 commit 399edc3

File tree

3 files changed

+75
-85
lines changed

3 files changed

+75
-85
lines changed

Sources/Client/Views/Play/GameView.swift

+53-55
Original file line numberDiff line numberDiff line change
@@ -44,71 +44,69 @@ struct GameView: View {
4444
var body: some View {
4545
JoinServerAndThen(serverDescriptor, with: account) { client in
4646
WithRenderCoordinator(for: client) { renderCoordinator in
47-
if let renderCoordinator = renderCoordinator {
48-
VStack {
49-
switch state {
50-
case .playing:
51-
ZStack {
52-
WithController(controller, listening: $inputCaptured) {
53-
if controllerOnly {
47+
VStack {
48+
switch state {
49+
case .playing:
50+
ZStack {
51+
WithController(controller, listening: $inputCaptured) {
52+
if controllerOnly {
53+
gameView(client: client, renderCoordinator: renderCoordinator)
54+
} else {
55+
InputView(listening: $inputCaptured, cursorCaptured: !inGameMenuPresented && cursorCaptured) {
5456
gameView(client: client, renderCoordinator: renderCoordinator)
55-
} else {
56-
InputView(listening: $inputCaptured, cursorCaptured: !inGameMenuPresented && cursorCaptured) {
57-
gameView(client: client, renderCoordinator: renderCoordinator)
58-
}
59-
.onKeyPress { [weak client] key, characters in
60-
client?.press(key, characters)
61-
}
62-
.onKeyRelease { [weak client] key in
63-
client?.release(key)
64-
}
65-
.onMouseMove { [weak client] deltaX, deltaY in
66-
// TODO: Formalise this adjustment factor somewhere
67-
let sensitivityAdjustmentFactor: Float = 0.004
68-
let sensitivity = sensitivityAdjustmentFactor * managedConfig.mouseSensitivity
69-
client?.moveMouse(sensitivity * deltaX, sensitivity * deltaY)
70-
}
71-
.passthroughClicks(!cursorCaptured)
7257
}
73-
}
74-
.onButtonPress { [weak client] button in
75-
guard let input = input(for: button) else {
76-
return
58+
.onKeyPress { [weak client] key, characters in
59+
client?.press(key, characters)
7760
}
78-
client?.press(input)
79-
}
80-
.onButtonRelease { [weak client] button in
81-
guard let input = input(for: button) else {
82-
return
61+
.onKeyRelease { [weak client] key in
62+
client?.release(key)
8363
}
84-
client?.release(input)
85-
}
86-
.onThumbstickMove { [weak client] thumbstick, x, y in
87-
switch thumbstick {
88-
case .left:
89-
client?.moveLeftThumbstick(x, y)
90-
case .right:
91-
client?.moveRightThumbstick(x, y)
64+
.onMouseMove { [weak client] deltaX, deltaY in
65+
// TODO: Formalise this adjustment factor somewhere
66+
let sensitivityAdjustmentFactor: Float = 0.004
67+
let sensitivity = sensitivityAdjustmentFactor * managedConfig.mouseSensitivity
68+
client?.moveMouse(sensitivity * deltaX, sensitivity * deltaY)
9269
}
70+
.passthroughClicks(!cursorCaptured)
71+
}
72+
}
73+
.onButtonPress { [weak client] button in
74+
guard let input = input(for: button) else {
75+
return
9376
}
77+
client?.press(input)
9478
}
95-
case .gpuFrameCaptureComplete(let file):
96-
frameCaptureResult(file)
97-
.onAppear {
98-
cursorCaptured = false
99-
inputCaptured = false
79+
.onButtonRelease { [weak client] button in
80+
guard let input = input(for: button) else {
81+
return
10082
}
101-
}
83+
client?.release(input)
84+
}
85+
.onThumbstickMove { [weak client] thumbstick, x, y in
86+
switch thumbstick {
87+
case .left:
88+
client?.moveLeftThumbstick(x, y)
89+
case .right:
90+
client?.moveRightThumbstick(x, y)
91+
}
92+
}
93+
}
94+
case .gpuFrameCaptureComplete(let file):
95+
frameCaptureResult(file)
96+
.onAppear {
97+
cursorCaptured = false
98+
inputCaptured = false
99+
}
102100
}
103-
.onAppear {
104-
modal.onError { [weak client] _ in
105-
client?.game.tickScheduler.cancel()
106-
cursorCaptured = false
107-
inputCaptured = false
108-
}
109-
110-
registerEventHandler(client, renderCoordinator)
101+
}
102+
.onAppear {
103+
modal.onError { [weak client] _ in
104+
client?.game.tickScheduler.cancel()
105+
cursorCaptured = false
106+
inputCaptured = false
111107
}
108+
109+
registerEventHandler(client, renderCoordinator)
112110
}
113111
} cancellationHandler: {
114112
appState.update(to: .serverList)

Sources/Client/Views/Play/WithRenderCoordinator.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import DeltaRenderer
66
/// without having to introduce additional loading states into views.
77
struct WithRenderCoordinator<Content: View>: View {
88
var client: Client
9-
var content: (RenderCoordinator?) -> Content
9+
var content: (RenderCoordinator) -> Content
1010
var cancel: () -> Void
1111

12-
init(for client: Client, @ViewBuilder content: @escaping (RenderCoordinator?) -> Content, cancellationHandler cancel: @escaping () -> Void) {
12+
init(for client: Client, @ViewBuilder content: @escaping (RenderCoordinator) -> Content, cancellationHandler cancel: @escaping () -> Void) {
1313
self.client = client
1414
self.content = content
1515
self.cancel = cancel
@@ -40,7 +40,7 @@ struct WithRenderCoordinator<Content: View>: View {
4040
} catch let error as RendererError {
4141
renderCoordinatorError = error
4242
} catch {
43-
renderCoordinatorError = RendererError(.unknown(error))
43+
renderCoordinatorError = RendererError.unknown(error)
4444
}
4545
}
4646
}

Sources/Core/Renderer/RenderCoordinator.swift

+19-27
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,19 @@ import FirebladeMath
33
import MetalKit
44
import DeltaCore
55

6-
public struct RendererError: LocalizedError {
7-
public enum ErrorKind {
8-
case getMetalDevice
9-
case makeRenderCommandQueue
10-
case camera(Error)
11-
case skyBoxRenderer(Error)
12-
case worldRenderer(Error)
13-
case guiRenderer(Error)
14-
case screenRenderer(Error)
15-
case depthState(Error)
16-
case unknown(Error)
17-
}
18-
19-
public let kind: ErrorKind
6+
public enum RendererError: LocalizedError {
7+
case getMetalDevice
8+
case makeRenderCommandQueue
9+
case camera(Error)
10+
case skyBoxRenderer(Error)
11+
case worldRenderer(Error)
12+
case guiRenderer(Error)
13+
case screenRenderer(Error)
14+
case depthState(Error)
15+
case unknown(Error)
2016

2117
public var errorDescription: String? {
22-
switch kind {
18+
switch self {
2319
case .getMetalDevice:
2420
return "Failed to get metal device"
2521
case .makeRenderCommandQueue:
@@ -40,10 +36,6 @@ public struct RendererError: LocalizedError {
4036
return "Failed with an unknown error \(error.labeledLocalizedDescription)"
4137
}
4238
}
43-
44-
public init(_ kind: ErrorKind) {
45-
self.kind = kind
46-
}
4739
}
4840

4941
extension Error {
@@ -109,11 +101,11 @@ public final class RenderCoordinator: NSObject, MTKViewDelegate {
109101
/// - Parameter client: The client to render for.
110102
public required init(_ client: Client) throws {
111103
guard let device = MTLCreateSystemDefaultDevice() else {
112-
throw RendererError(.getMetalDevice)
104+
throw RendererError.getMetalDevice
113105
}
114106

115107
guard let commandQueue = device.makeCommandQueue() else {
116-
throw RendererError(.makeRenderCommandQueue)
108+
throw RendererError.makeRenderCommandQueue
117109
}
118110

119111
self.client = client
@@ -124,7 +116,7 @@ public final class RenderCoordinator: NSObject, MTKViewDelegate {
124116
do {
125117
camera = try Camera(device)
126118
} catch {
127-
throw RendererError(.camera(error))
119+
throw RendererError.camera(error)
128120
}
129121

130122
do {
@@ -134,7 +126,7 @@ public final class RenderCoordinator: NSObject, MTKViewDelegate {
134126
commandQueue: commandQueue
135127
)
136128
} catch {
137-
throw RendererError(.skyBoxRenderer(error))
129+
throw RendererError.skyBoxRenderer(error)
138130
}
139131

140132
do {
@@ -145,7 +137,7 @@ public final class RenderCoordinator: NSObject, MTKViewDelegate {
145137
profiler: profiler
146138
)
147139
} catch {
148-
throw RendererError(.worldRenderer(error))
140+
throw RendererError.worldRenderer(error)
149141
}
150142

151143
do {
@@ -156,7 +148,7 @@ public final class RenderCoordinator: NSObject, MTKViewDelegate {
156148
profiler: profiler
157149
)
158150
} catch {
159-
throw RendererError(.guiRenderer(error))
151+
throw RendererError.guiRenderer(error)
160152
}
161153

162154
do {
@@ -166,14 +158,14 @@ public final class RenderCoordinator: NSObject, MTKViewDelegate {
166158
profiler: profiler
167159
)
168160
} catch {
169-
throw RendererError(.screenRenderer(error))
161+
throw RendererError.screenRenderer(error)
170162
}
171163

172164
// Create depth stencil state
173165
do {
174166
depthState = try MetalUtil.createDepthState(device: device)
175167
} catch {
176-
throw RendererError(.depthState(error))
168+
throw RendererError.depthState(error)
177169
}
178170

179171
statistics = RenderStatistics(gpuCountersEnabled: false)

0 commit comments

Comments
 (0)