Toggle rendering normals with 'n'; move Next iteration key to 'space'

This commit is contained in:
Eryn Wells 2018-11-20 17:24:02 -07:00
parent 296af144ce
commit 08094b4302
2 changed files with 50 additions and 32 deletions

View file

@ -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