From 08094b430207b446ab1a18f9c74a0f18c0e6117f Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Tue, 20 Nov 2018 17:24:02 -0700 Subject: [PATCH] Toggle rendering normals with 'n'; move Next iteration key to 'space' --- Terrain2/GameViewController.swift | 4 +- Terrain2/Renderer.swift | 78 +++++++++++++++++++------------ 2 files changed, 50 insertions(+), 32 deletions(-) diff --git a/Terrain2/GameViewController.swift b/Terrain2/GameViewController.swift index 6e7e20f..217b0b1 100644 --- a/Terrain2/GameViewController.swift +++ b/Terrain2/GameViewController.swift @@ -68,7 +68,7 @@ class GameViewController: NSViewController { override func keyDown(with event: NSEvent) { switch event.charactersIgnoringModifiers { - case .some("n"): + case .some(" "): if let progress = renderer.scheduleAlgorithmIteration() { progressIndicator.isHidden = false progressObservation = progress.observe(\.fractionCompleted) { [weak self] (progress: Progress, change: NSKeyValueObservedChange) in @@ -85,6 +85,8 @@ class GameViewController: NSViewController { } } } + case .some("n"): + renderer.drawNormals = !renderer.drawNormals case .some("z"): renderer.drawLines = !renderer.drawLines default: diff --git a/Terrain2/Renderer.swift b/Terrain2/Renderer.swift index 60a65b5..e4fe92f 100644 --- a/Terrain2/Renderer.swift +++ b/Terrain2/Renderer.swift @@ -54,6 +54,12 @@ class Renderer: NSObject, MTKViewDelegate { } } + var drawNormals = true { + didSet { + print("Normal drawing \(drawNormals ? "enabled" : "disabled")") + } + } + private var iterateTerrainAlgorithm = true private var didUpdateTerrain = false @@ -314,41 +320,22 @@ class Renderer: NSObject, MTKViewDelegate { renderEncoder.endEncoding() } - let normalsRenderPassDescriptor = renderPassDescriptor.copy() as! MTLRenderPassDescriptor - normalsRenderPassDescriptor.colorAttachments[0].loadAction = .load - normalsRenderPassDescriptor.colorAttachments[0].storeAction = .store + if drawNormals { + let normalsRenderPassDescriptor = renderPassDescriptor.copy() as! MTLRenderPassDescriptor + normalsRenderPassDescriptor.colorAttachments[0].loadAction = .load + normalsRenderPassDescriptor.colorAttachments[0].storeAction = .store - if let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: normalsRenderPassDescriptor) { - renderEncoder.label = "Normals Render Encoder" + if let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: normalsRenderPassDescriptor) { + renderEncoder.label = "Normals Render Encoder" - renderEncoder.setRenderPipelineState(normalPipelineState) - renderEncoder.setDepthStencilState(depthState) + renderEncoder.setRenderPipelineState(normalPipelineState) + renderEncoder.setDepthStencilState(depthState) - renderEncoder.pushDebugGroup("Draw Vertex Normals") + encodeVertexNormalsDrawCall(encoder: renderEncoder) + encodeFaceNormalsDrawCall(encoder: renderEncoder) - let vertexBuffer = terrain.mesh.vertexBuffers[BufferIndex.meshPositions.rawValue] - let normalBuffer = terrain.mesh.vertexBuffers[BufferIndex.normals.rawValue] - - renderEncoder.setVertexBuffer(vertexBuffer.buffer, offset: vertexBuffer.offset, index: NormalBufferIndex.points.rawValue) - renderEncoder.setVertexBuffer(normalBuffer.buffer, offset: normalBuffer.offset, index: NormalBufferIndex.normals.rawValue) - renderEncoder.setVertexBuffer(dynamicUniformBuffer, offset: uniformBufferOffset, index: NormalBufferIndex.uniforms.rawValue) - - renderEncoder.drawPrimitives(type: .line, vertexStart: 0, vertexCount: 2, instanceCount: terrain.mesh.vertexCount) - - renderEncoder.popDebugGroup() - - renderEncoder.pushDebugGroup("Draw Face Normals") - - let faceMidpointsBuffer = terrain.faceMidpointsBuffer - let faceNormalsBuffer = terrain.faceNormalsBuffer - - renderEncoder.setVertexBuffer(faceMidpointsBuffer, offset: 0, index: NormalBufferIndex.points.rawValue) - renderEncoder.setVertexBuffer(faceNormalsBuffer, offset: 0, index: NormalBufferIndex.normals.rawValue) - renderEncoder.setVertexBuffer(dynamicUniformBuffer, offset:uniformBufferOffset, index: NormalBufferIndex.uniforms.rawValue) - renderEncoder.drawPrimitives(type: .line, vertexStart: 0, vertexCount: 2, instanceCount: 2 * Int(terrain.segments.x * terrain.segments.y)) - renderEncoder.popDebugGroup() - - renderEncoder.endEncoding() + renderEncoder.endEncoding() + } } if let drawable = view.currentDrawable { @@ -366,6 +353,35 @@ class Renderer: NSObject, MTKViewDelegate { let aspect = Float(size.width) / Float(size.height) projectionMatrix = matrix_perspective_right_hand(fovyRadians: radians_from_degrees(65), aspectRatio:aspect, nearZ: 0.1, farZ: 100.0) } + + private func encodeVertexNormalsDrawCall(encoder: MTLRenderCommandEncoder) { + encoder.pushDebugGroup("Draw Vertex Normals") + + let vertexBuffer = terrain.mesh.vertexBuffers[BufferIndex.meshPositions.rawValue] + let normalBuffer = terrain.mesh.vertexBuffers[BufferIndex.normals.rawValue] + + encoder.setVertexBuffer(vertexBuffer.buffer, offset: vertexBuffer.offset, index: NormalBufferIndex.points.rawValue) + encoder.setVertexBuffer(normalBuffer.buffer, offset: normalBuffer.offset, index: NormalBufferIndex.normals.rawValue) + encoder.setVertexBuffer(dynamicUniformBuffer, offset: uniformBufferOffset, index: NormalBufferIndex.uniforms.rawValue) + encoder.drawPrimitives(type: .line, vertexStart: 0, vertexCount: 2, instanceCount: terrain.mesh.vertexCount) + + encoder.popDebugGroup() + } + + private func encodeFaceNormalsDrawCall(encoder: MTLRenderCommandEncoder) { + encoder.pushDebugGroup("Draw Face Normals") + + let faceMidpointsBuffer = terrain.faceMidpointsBuffer + let faceNormalsBuffer = terrain.faceNormalsBuffer + let instanceCount = 2 * Int(terrain.segments.x * terrain.segments.y) + + encoder.setVertexBuffer(faceMidpointsBuffer, offset: 0, index: NormalBufferIndex.points.rawValue) + encoder.setVertexBuffer(faceNormalsBuffer, offset: 0, index: NormalBufferIndex.normals.rawValue) + encoder.setVertexBuffer(dynamicUniformBuffer, offset:uniformBufferOffset, index: NormalBufferIndex.uniforms.rawValue) + encoder.drawPrimitives(type: .line, vertexStart: 0, vertexCount: 2, instanceCount: instanceCount) + + encoder.popDebugGroup() + } } // Generic matrix math utility functions