From d870b9d6c9f01abcf7a62b9f518532c416956128 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Sun, 25 Sep 2016 01:39:11 +0300 Subject: [PATCH] added chapter 17 --- .../Resources/Shaders.metal | 5 +-- .../Sources/MetalView.swift | 29 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 27041 -> 27721 bytes 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/ch09/chapter09.playground/Resources/Shaders.metal b/ch09/chapter09.playground/Resources/Shaders.metal index e52b42e..e98195c 100755 --- a/ch09/chapter09.playground/Resources/Shaders.metal +++ b/ch09/chapter09.playground/Resources/Shaders.metal @@ -20,6 +20,7 @@ vertex Vertex vertex_func(constant Vertex *vertices [[buffer(0)]], constant Unif return out; } -fragment float4 fragment_func(Vertex vert [[stage_in]]) { - return vert.color; +fragment half4 fragment_func(Vertex vert [[stage_in]]) { + return half4(vert.color); +// return half4(0.0, 1.0, 0.0, 1.0); } diff --git a/ch09/chapter09.playground/Sources/MetalView.swift b/ch09/chapter09.playground/Sources/MetalView.swift index 769c51d..921a3e6 100755 --- a/ch09/chapter09.playground/Sources/MetalView.swift +++ b/ch09/chapter09.playground/Sources/MetalView.swift @@ -14,7 +14,7 @@ public class MetalView: NSObject, MTKViewDelegate { override public init() { super.init() device = MTLCreateSystemDefaultDevice() - queue = device.newCommandQueue() + queue = device.makeCommandQueue() createBuffers() createPipeline() } @@ -37,27 +37,27 @@ public class MetalView: NSObject, MTKViewDelegate { 4, 0, 3, 3, 7, 4, // left 7, 6, 5, 5, 4, 7] // back - vertexBuffer = device!.newBuffer(withBytes: vertexData, length: sizeof(Vertex.self) * vertexData.count, options: []) - indexBuffer = device!.newBuffer(withBytes: indexData, length: sizeof(UInt16.self) * indexData.count , options: []) - uniformBuffer = device!.newBuffer(withLength: sizeof(matrix_float4x4.self), options: []) + vertexBuffer = device!.makeBuffer(bytes: vertexData, length: MemoryLayout.size * vertexData.count, options: []) + indexBuffer = device!.makeBuffer(bytes: indexData, length: MemoryLayout.size * indexData.count , options: []) + uniformBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) } func createPipeline() { - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") let input: String? let library: MTLLibrary let vert_func: MTLFunction let frag_func: MTLFunction do { input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - library = try device!.newLibrary(withSource: input!, options: nil) - vert_func = library.newFunction(withName: "vertex_func")! - frag_func = library.newFunction(withName: "fragment_func")! + library = try device!.makeLibrary(source: input!, options: nil) + vert_func = library.makeFunction(name: "vertex_func")! + frag_func = library.makeFunction(name: "fragment_func")! let rpld = MTLRenderPipelineDescriptor() rpld.vertexFunction = vert_func rpld.fragmentFunction = frag_func rpld.colorAttachments[0].pixelFormat = .bgra8Unorm - rps = try device!.newRenderPipelineState(with: rpld) + rps = try device!.makeRenderPipelineState(descriptor: rpld) } catch let e { Swift.print("\(e)") } @@ -72,12 +72,12 @@ public class MetalView: NSObject, MTKViewDelegate { let cameraPosition = vector_float3(0, 0, -3) let viewMatrix = translationMatrix(position: cameraPosition) // let aspect = Float(view.drawableSize.width / view.drawableSize.height) - let projMatrix = projectionMatrix(near: 0, far: 10, aspect: 1, fovy: 1) // let projMatrix = projectionMatrix(0, far: 10, aspect: aspect, fovy: 1) + let projMatrix = projectionMatrix(near: 0, far: 10, aspect: 1, fovy: 1) let modelViewProjectionMatrix = matrix_multiply(projMatrix, matrix_multiply(viewMatrix, modelMatrix)) let bufferPointer = uniformBuffer.contents() var uniforms = Uniforms(modelViewProjectionMatrix: modelViewProjectionMatrix) - memcpy(bufferPointer, &uniforms, sizeof(Uniforms.self)) + memcpy(bufferPointer, &uniforms, MemoryLayout.size) } public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} @@ -86,14 +86,15 @@ public class MetalView: NSObject, MTKViewDelegate { update() if let rpd = view.currentRenderPassDescriptor, let drawable = view.currentDrawable { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.renderCommandEncoder(with: rpd) + let commandBuffer = queue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) commandEncoder.setRenderPipelineState(rps) commandEncoder.setFrontFacing(.counterClockwise) commandEncoder.setCullMode(.back) commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) - commandEncoder.drawIndexedPrimitives(.triangle, indexCount: indexBuffer.length / sizeof(UInt16.self), indexType: MTLIndexType.uInt16, indexBuffer: indexBuffer, indexBufferOffset: 0) +// commandEncoder.setTriangleFillMode(.lines) + commandEncoder.drawIndexedPrimitives(type: .triangle, indexCount: indexBuffer.length / MemoryLayout.size, indexType: MTLIndexType.uint16, indexBuffer: indexBuffer, indexBufferOffset: 0) commandEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() diff --git a/ch09/chapter09.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch09/chapter09.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 1d5e4b9ef41811637d59fbc2eccdf3b1021a850d..2061fba8a556e458431255dacab4310e50d4d817 100755 GIT binary patch literal 27721 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 literal 27041 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