From 20ea436aca04b1390f2478f18f308cb9cf5ceff0 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Thu, 31 Aug 2017 15:57:25 -0500 Subject: [PATCH] added arkit metal --- .../UserInterfaceState.xcuserstate | Bin 10421 -> 21827 bytes ARKit/arkitdemo/Renderer.swift | 86 ++++++++++++++++-- ARKit/arkitdemo/Shaders.metal | 20 ++++ ARKit/arkitdemo/ViewController.swift | 7 +- 4 files changed, 103 insertions(+), 10 deletions(-) diff --git a/ARKit/arkitdemo.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ARKit/arkitdemo.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 42ae98ca6d59592e2eddc484d671dccbde2b7a73..44c3ce9515e65c8aa76219fd2aaf78c5fa2eacbf 100644 GIT binary patch literal 21827 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 literal 10421 zcmd^Fd3;k<_P_T&mZV9W*X%D_leP#5U7;H&v~OR0LT>R7AyHK}1xXncsPNP1=k)<9vR9PV@OR$z9Gp_uO;7 z=X>r;b+g;$52U8PgD@h9L48nP)Q?GKQl=)(<$Zpa*E2QITRoev3HYZaI(;<_E@&=K z40xNB2;a7OCwm$7M-rq$YNSB}&^2fv8iWR;Ytaytf-+GS%0@Y8JSssGP$`;-CZWlw z3^gDZnvEKf8#N&h@}g!m2eqMF(cNezx(_{wHlU5D6Kz3D&{nh^J&Jasr_j^rIdlNM zfL=kbqqop;bON10@1xJq=jaRcCHfX4j4{Cs?t}Z{ez-rDU_Iur0UNOio3RDQVJo)b zcsu|P!D%=H=iuw{C_Dz|;{rSmPr#FKIj+D?T#ajRE#~nY?8AN>z%6(lUWjkTOYm~M z0^f!2#w+ptcpbV0KZrYV7v73@;K%T8ych4o`|(ToW&8?$10Thw@q73T{se!Dzro+) z@9+hJ2quIuqz~y!`Vl#aCMu#PCSoQQl1Q#4sU(wJM{-FKDIw*gf>e@O#6fN(4a7xe zlbgr_vXIBX5v5$p_>^a+Z8V&XJGFC*(`=75SP$3}y(!FnyT5Oh2YSBVnXW6eDBgOf;in zbc~*{GBzfjNnjG0K^2Lf7PtEtlADKONq?-J~+H#_ja`J5e-> zp@cG>h()oq4}F4GI@rX*w4%)H%$%&G%x3UZQ$<)md~7i8t77v&T= zSaoqh;S{g0(ckQ>;S0PqEls>95L#G^%qVdS(jh(KkO3KyiT0)aXn!i9QW~`dSx_9Z zA{#QH1S+G^G=?f@6lH0(gB{dc?i81&*4yeRwU_b!fY;}&cJuatGr$)(15O947lsB$ zlsl`(IDN(bN|)aSV;n5k)8+NLt9$j$3ilNGoJ}w^4jS@m0uVIe?SQy^uP5O1y4}3b z!HyE9gti*lSD2NPo>`ckl{73ndwA0DJTOyse%|n;qT$1`G7EF^3NwbKA4NmqERs;N za1ynk`NY^hCDoyz#)Rq9x8L=n{%kO-`%9!zGI?~2Mr%sEcF53_jLfVN;;}neOICWS zH7za2nv*_!;Or`0d~44Rll`r(x`2aK_THyx*hvmn z1FfO+?U{2-!Nw|8>TXY(+8R8D;sTJ}EMSs90Nzks3;$eoF5X9_ETNK0Vfpl&qdGlj zm@c}Y2aaH>_>uR6{-yRw;pr8{g`OI3Eni#4*YQ5yQ^R+1#;K+Di9xJ8X0|BeYze>P z-5pjc>xc)BQXLy`jbh-S!Qd&Sc6*JF=RGCPHg8LyqN2FK9`Lz5^|0y4F1u?!PvwG3 zLL{VRW#ktXrWPg@q~)b1rKJ|+Ck+Q{CKcw5$;nDj%g-xH&zsRM*mo!xI3sldY%M8y zR;0wvB;&EvG)4Nb;oz2~cG0e)9^&VaA4c}|);Bl;!XuU{9jvas9Zq?uH9Kv=P-{CJ z^iXTg@XQ4Z9IUpz9loRr%^{uAvla+SW#@oWy;ttcHbV2r>t>YN3tZs*UXRn));ZGX zU=^kI@q8O!o7bI4&Wz5@8_0Nt6)7-lL{&$yUIrit+|&CDFe&$KYDOdHdVf`0^y?`TT*d-of& zkjjsuRFno=8TNZ&1qU^uB_Lp@0GnMfY&gn*vk<<8!$~6jW6uhq`Uo@zC2mC{(RJv0 zGzyJIxhPNYNvfi1s-aq{+lul5*9%b*8Vd+tO!a{5%jn&7D+E*$t)2-`QdsK(B+v8l z0N^Zqw>NlOOPzCF^-gGZut~i!C<1FM0xq{J&?d~Z19%1m3=>6!r;AdD{-KBh-tVgS z{Eh@c2~oaFfFW(3Uw|;DCm?F;7u_#p2RoXH61RcRRG>;Yjj3oFnvSZ_49ZahHBu8b zQwxowR%+XZW+4Yyq!?Z`s21@kj>gj*uu2lVc)F0@43?>$?he9IIUp1)9yZbh06z!h zJ5R0CS1Z^~P*c=Mz;KcKiQnxl)lD#Zy7()h+d+b*$Y@Jvdv& zH~V-$K($lA0oZuqOY?NGZQ=^f-leiVSr)`I4uRx}Tw)aUgEL{kY{DHYUb zb@jZ*)#4Ww6Y>W?FCg~ln|-b(fSuoT(F}@c0?j^w=0i}*&`oFoS_q4@phf5wv=}X! z3LMv63n`(p*$MvxRW*WKPoTW58CJB`cC!%?!UV^U++vm2=L&5XR?47RET)MpFxK19 zQdn;px*gqt?nKMc3RDa(7Rr7l-kP9^X7wbtNzOn+a6}W}Sx>V-Kmg9>O{@#e?dhXw z^cp&x4xmX6Hf5@i;F95>L>~rKivxU9fmaZh9ELT>RV_7v79W2U3AAn%TGItsbuU^? z2ht%lnWi2?YtjACvkpCg)=%$Qt0Jfc9YhDyYyTkavqS`sO=z=&HGw8QRufZXP{bss z%h!oIP{w~46H=rL9DY3=3Qm6QG^el86{zK#yrIrVf}JUmouU>y&|{D-@_asLTPNCq zGLE6gVOzV<6KFS@TNOIkin5Yv0ap`nLT6JmO{c>sa_Au~ z>`f7<8X2yg=ruv7KRaAp;cw^-2b=IGR_KJZ3ex|~&=Axffn6nbpttFW4s?u;6bgg^ zB3_7!JN^j9LIO^rcLf2b=ye_FG`*fymkZ1z)cXNChm>9DLv$8>L`TulG`9(bO5z3*#5z7Uu4?CnQPkr!Xm^=mZh9+_>?}nP3uLTMn(LR>ShanJt_W%N0=fwF;}Q^%%jid%PYY-vEuv%T4YYVG`U(AvenD3u;Qx;PLC4YY zbPAmXaqgfu(&`yS5D7wd7x1u3Tsx>O5aB=aMnL@tFBAzF7m9)3=`)7<3g-d#3fB-l zxKkDCgGhylX>O@@yK2NTBgyY=@zwC%o5fPhBIOnw1q@4$qj3yY&=NX@j*{>>=B4_}~r zT;hKmSL1d6?xHn9ofx!lvbV0z&qF0;`>n8EqeR8xe>)~ZeOQjoV*4bFz914kRuT+1 zoPZM}SvyWZ8NE^$z6K8zQx}~{r;3>-=xTT<@-#U?)w49e>nl*>(SW-Cc0VpSnhZpjg zoD5Aq`D$K^Fiy$V@ zwP|Ip`i9`(&@y$nQCOxPH((c@O&h73Hc`(*0d=V&DWx1g31ZTa+6=(2Hc%N{R zp=BS!52M7*n`w2Z;Su~7VfHpkJMeb8=-(MF$|A?>9)pQNLkFKTn({)?$&-fR76~*DdLrM1l-Ap?mARiWrIY1BLIOa7& z-Nx4jJzl7WgnP&C>&Y^p1)}*wdk`x>8w`OyC{03OD0&r;jY5wQ-asXU;x@doh(*Tm zbzWb$AHob#q(JEH`4fcf)Z+hFY28~T{fQJQJBWm??;uh1!H{o=_>t!qB!z~?5Efj5 zDCmX`5=%GI>fY==7$ihP^l)ZGi@NA0Iut$-EqvHStKlxO7p|tKWx^d+Mp_tGNgT0- z)rhB^v@*2l05UMV=pfn^jwmvOBtZu(G_->x(}#LG(#SBOV;vpT5nMeKgCvXOgx45B zxAd%WJsA}dtt5}+gNUH>lLGokxAT*+cySlGffSQ*bQ^t??hFS2nLsA>_G&Vjl+nM? z?SeIhdyep-3B_|lZlkrgqmwCQdc@=^GK21*j{)w%R57&0c}ue+<~d1i#5|tV(Z}ho z(4yfx4RLaFZp7q9;s>Hh+@y(kh!^gt<`5sWI|Xl|1yJw(^dP;li>xH8$UXG0^fh`6ys(F` zkhMW_a=^iksQYiqQ+tCGZbSXaP$)Rvz2!X^ly}I%j{L9Wl>s4!J9MAO!9yn5M799N zkZLZ?YZ8_p9&{$oFCR52pJcAm8O|s3arL zkOP9Do+W$8b7U{sNA}a#>EGxZ^iBE}J+g%yBnN|rdI1deHoOEw9sOT1R4mrAS3@rK z7C9kU>Iiw893{udJLEWhhaRUV=t+8tzWc}Z-2a42g^ctm`Ao<{=jnSL2c5s<~KtH5s=|}V&{g{42KYfH;fxG57@(a02 zekB4iIS+^(O+TZb(=X_k@TqbdRJ`?kz+NzZy31eacGZiIOSNKi0YBGO!x#IfxS+Ix z3J&18cSqPb({0UA2LR$_8F2_7ZXzuMFnngxuw4gCBzYni+r>cc5r^E>TEIfyr20vH0 zkyMj<__;zOWc}4-J7C&N@H2$N@DqeL$XgJ#AHWX~&cTll&XdpK2MAxo)2Vc(l$pug z%p774GjB_5k_5?6NtPs6QYxvC%#iSsI!V1`k>oDP2FWH#honpLuw<)bn`FD>ImtfB z0m&iB^O6@OFH2sPye2s%`ATY(CQD~Zo29o)?~`tmZkO(m?v(D5?v_3!eMY)Rx>x$9 z^oaDR^d0F5=_%=H=^5z<(zDWY(r=>rMX95PL}f;mM0ukYN8J~-HELhfiKvTFm!d95 zU5WZxrj!|F@v>yuWZ6uaL*|s#$aq=3%q3eWTP52p+bw%b_O|Sp?6~Zt>|MD`u9h3+ zW_g_4CQp#3%16rcc`9b+%`3d}=&tBTqfbVkiRm9>jfsy*jJYOeP)u6P@R-b) z?3lcm#+c@q2V%Nn4#&J1^Me8_`Y8G-qzaiLT9Kg`qbO92Rg6=VC`uJ}#f^%3g-g+> zXi@|ea~1Ox^A$HK9#I@poKk$G_(XAD@wwtM+lTGPO4uk?&c?7Tt7L6#0y}^m$PQ+Q zut{tRo5qe}$FV%y#;##^vj^GZ>^b&3_9AM7MTsy(XbRi{;-s=ibGs_v`q zua>H1>S(oAtyde=CbdOvRgY3vsTZo(syC}U)LrVw)w|VCsh?Fpr{1SNqJCHXf%>fa zoca^>MfH#BpVYso|Ea+mM$=cL(p;lS(PV21HRCiTno^BjQ=yrnnWm}HxHavXTQqlT z?$NB)tkta3tk>++?9=Sm9MBxnyrDUwIjT9XIjMP9^Nr?5%~j3cHUHFNZH!i>)o68E zlh&fOYU8y-wHewm+OgVV?Rf1ZZJD-QTd8f(&e1N^F48X6-lkoqy+eDi_I~XH+6T28 zwcE9iYoE|QsokU9tKF|Xs6C`TtUaN9Py4?1L+vNp^V-j~UurMukgl(;zfP))(Xl$E zPOTfH8?W=|+I7oxcj%Vu?$WK)-J@Hr>(F)S9@cHuZPRVn?a=Miy{tQ~`%Ev>kI+xk z*XdpQM!iShtoP}c=vV1i>+jRA)34WW&~Md0so$gDtKYAGUjL&0W&NxA!}_!OZ}b=R z-|H{yujqf~`f*ZD#>H?fr{ve~n8@Nr}quefTH}@3x9Jh}(hS248HO7SlMS;BO$M)Fj=^teF|-=m4DE(H z49g978CDwZF|0P+XSm<+fMJ*6O~ZSJ?~O`hqH(mb#5mD7*;sC@G)^@xGp;c{XxwPr zZ0s~{Gj2ETFzz(&G9EADM*z&sNl;yPLjO7E%S<5-g zCzkVZ^0?t~RdI{r9*%o0?quBQxHEAd#(fm`aookYt5%7Xvl^{tYn;_)O|TBI4zv!o zj<8;59c9h6jxK{nDuMx&$bj>hAq>UXDhW$w%Ki! zwyC!1wtAb()@W<8{l)f-ZJ+Ic?U3yy+bg!iw%2WM+fLa&vVCd0Wc$(flkJyyCO#@& f9v>6W#w+6!;|Is51oIUlM0{t`#rM$v__Y56x5f!$ diff --git a/ARKit/arkitdemo/Renderer.swift b/ARKit/arkitdemo/Renderer.swift index 1c875c8..0b1dd4e 100644 --- a/ARKit/arkitdemo/Renderer.swift +++ b/ARKit/arkitdemo/Renderer.swift @@ -22,21 +22,28 @@ class Renderer { var renderDestination: RenderDestinationProvider var sharedUniformBuffer: MTLBuffer! var anchorUniformBuffer: MTLBuffer! + var debugUniformBuffer: MTLBuffer! var imagePlaneVertexBuffer: MTLBuffer! var capturedImagePipelineState: MTLRenderPipelineState! var capturedImageDepthState: MTLDepthStencilState! var anchorPipelineState: MTLRenderPipelineState! var anchorDepthState: MTLDepthStencilState! + var debugPipelineState: MTLRenderPipelineState! + var debugDepthState: MTLDepthStencilState! var capturedImageTextureY: MTLTexture! var capturedImageTextureCbCr: MTLTexture! var capturedImageTextureCache: CVMetalTextureCache! var geometryVertexDescriptor: MTLVertexDescriptor! var mesh: MTKMesh! + var debugMesh: MTKMesh! var uniformBufferIndex: Int = 0 var sharedUniformBufferOffset: Int = 0 var anchorUniformBufferOffset: Int = 0 + var debugUniformBufferOffset: Int = 0 var sharedUniformBufferAddress: UnsafeMutableRawPointer! var anchorUniformBufferAddress: UnsafeMutableRawPointer! + var debugUniformBufferAddress: UnsafeMutableRawPointer! + var debugInstanceCount: Int = 0 var anchorInstanceCount: Int = 0 var viewportSize: CGSize = CGSize() var viewportSizeDidChange: Bool = false @@ -77,6 +84,7 @@ class Renderer { let anchorUniformBufferSize = alignedInstanceUniformSize * maxBuffersInFlight sharedUniformBuffer = device.makeBuffer(length: sharedUniformBufferSize, options: .storageModeShared) anchorUniformBuffer = device.makeBuffer(length: anchorUniformBufferSize, options: .storageModeShared) + debugUniformBuffer = device.makeBuffer(length: anchorUniformBufferSize, options: .storageModeShared) let imagePlaneVertexDataCount = planeVertexData.count * MemoryLayout.size imagePlaneVertexBuffer = device.makeBuffer(bytes: planeVertexData, length: imagePlaneVertexDataCount, options: []) let defaultLibrary = device.makeDefaultLibrary()! @@ -143,6 +151,13 @@ class Renderer { anchorDepthStateDescriptor.depthCompareFunction = .less anchorDepthStateDescriptor.isDepthWriteEnabled = true anchorDepthState = device.makeDepthStencilState(descriptor: anchorDepthStateDescriptor) + let debugGeometryVertexFunction = defaultLibrary.makeFunction(name: "vertexDebugPlane")! + let debugGeometryFragmentFunction = defaultLibrary.makeFunction(name: "fragmentDebugPlane")! + anchorPipelineStateDescriptor.vertexFunction = debugGeometryVertexFunction + anchorPipelineStateDescriptor.fragmentFunction = debugGeometryFragmentFunction + do { try debugPipelineState = device.makeRenderPipelineState(descriptor: anchorPipelineStateDescriptor) + } catch let error { print(error) } + debugDepthState = device.makeDepthStencilState(descriptor: anchorDepthStateDescriptor) commandQueue = device.makeCommandQueue() } @@ -152,10 +167,14 @@ class Renderer { (vertexDescriptor.attributes[0] as! MDLVertexAttribute).name = MDLVertexAttributePosition (vertexDescriptor.attributes[1] as! MDLVertexAttribute).name = MDLVertexAttributeTextureCoordinate (vertexDescriptor.attributes[2] as! MDLVertexAttribute).name = MDLVertexAttributeNormal - let mdlMesh = MDLMesh(boxWithExtent: vector3(0.075, 0.075, 0.075), segments: vector3(1, 1, 1), inwardNormals: false, geometryType: .triangles, allocator: metalAllocator) + var mdlMesh = MDLMesh(boxWithExtent: vector3(0.075, 0.075, 0.075), segments: vector3(1, 1, 1), inwardNormals: false, geometryType: .triangles, allocator: metalAllocator) mdlMesh.vertexDescriptor = vertexDescriptor do { try mesh = MTKMesh(mesh: mdlMesh, device: device) } catch let error { print("Error creating MetalKit mesh, error \(error)") } + mdlMesh = MDLMesh(planeWithExtent: vector3(0.1, 0.1, 0.1), segments: vector2(1, 1), geometryType: .triangles, allocator: metalAllocator) + mdlMesh.vertexDescriptor = vertexDescriptor + do { try debugMesh = MTKMesh(mesh: mdlMesh, device: device) + } catch let error { print(error) } } func drawRectResized(size: CGSize) { @@ -165,7 +184,7 @@ class Renderer { func update() { let _ = inFlightSemaphore.wait(timeout: DispatchTime.distantFuture) - let commandBuffer = commandQueue.makeCommandBuffer() + guard let commandBuffer = commandQueue.makeCommandBuffer() else { return } commandBuffer.addCompletedHandler{ [weak self] commandBuffer in if let strongSelf = self { strongSelf.inFlightSemaphore.signal() } return @@ -174,9 +193,10 @@ class Renderer { updateGameState() guard let passDescriptor = renderDestination.currentRenderPassDescriptor, let drawable = renderDestination.currentDrawable else { return } - let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: passDescriptor) + guard let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: passDescriptor) else { return } drawCapturedImage(renderEncoder: renderEncoder) drawAnchorGeometry(renderEncoder: renderEncoder) + drawDebugGeometry(renderEncoder: renderEncoder) renderEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() @@ -188,6 +208,8 @@ class Renderer { anchorUniformBufferOffset = alignedInstanceUniformSize * uniformBufferIndex sharedUniformBufferAddress = sharedUniformBuffer.contents().advanced(by: sharedUniformBufferOffset) anchorUniformBufferAddress = anchorUniformBuffer.contents().advanced(by: anchorUniformBufferOffset) + debugUniformBufferOffset = alignedInstanceUniformSize * uniformBufferIndex + debugUniformBufferAddress = debugUniformBuffer.contents().advanced(by: debugUniformBufferOffset) } func updateGameState() { @@ -204,7 +226,7 @@ class Renderer { func updateSharedUniforms(frame: ARFrame) { let uniforms = sharedUniformBufferAddress.assumingMemoryBound(to: SharedUniforms.self) uniforms.pointee.viewMatrix = simd_inverse(frame.camera.transform) - uniforms.pointee.projectionMatrix = frame.camera.projectionMatrix(withViewportSize: viewportSize, orientation: .landscapeRight, zNear: 0.001, zFar: 1000) + uniforms.pointee.projectionMatrix = frame.camera.projectionMatrix(for: .landscapeRight, viewportSize: viewportSize, zNear: 0.001, zFar: 1000) var ambientIntensity: Float = 1.0 if let lightEstimate = frame.lightEstimate { ambientIntensity = Float(lightEstimate.ambientIntensity) / 1000.0 @@ -225,16 +247,43 @@ class Renderer { if anchorInstanceCount == maxAnchorInstanceCount { anchorOffset = max(frame.anchors.count - maxAnchorInstanceCount, 0) } + let count = frame.anchors.filter{ $0.isKind(of: ARPlaneAnchor.self) }.count + debugInstanceCount = min(count, maxAnchorInstanceCount - (anchorInstanceCount - count)) for index in 0.. float4x4 { + var matrix: float4x4 = matrix_identity_float4x4 + let x = rotation.x + let y = rotation.y + let z = rotation.z + matrix.columns.0.x = cos(y) * cos(z) + matrix.columns.0.y = cos(z) * sin(x) * sin(y) - cos(x) * sin(z) + matrix.columns.0.z = cos(x) * cos(z) * sin(y) + sin(x) * sin(z) + matrix.columns.1.x = cos(y) * sin(z) + matrix.columns.1.y = cos(x) * cos(z) + sin(x) * sin(y) * sin(z) + matrix.columns.1.z = -cos(z) * sin(x) + cos(x) * sin(y) * sin(z) + matrix.columns.2.x = -sin(y) + matrix.columns.2.y = cos(y) * sin(x) + matrix.columns.2.z = cos(x) * cos(y) + matrix.columns.3.w = 1.0 + return matrix + } + func updateCapturedImageTextures(frame: ARFrame) { let pixelBuffer = frame.capturedImage if (CVPixelBufferGetPlaneCount(pixelBuffer) < 2) { return } @@ -253,7 +302,7 @@ class Renderer { } func updateImagePlane(frame: ARFrame) { - let displayToCameraTransform = frame.displayTransform(withViewportSize: viewportSize, orientation: .landscapeRight).inverted() + let displayToCameraTransform = frame.displayTransform(for: .landscapeRight, viewportSize: viewportSize).inverted() let vertexData = imagePlaneVertexBuffer.contents().assumingMemoryBound(to: Float.self) for index in 0...3 { let textureCoordIndex = 4 * index + 2 @@ -278,7 +327,7 @@ class Renderer { } func drawAnchorGeometry(renderEncoder: MTLRenderCommandEncoder) { - guard anchorInstanceCount > 0 else { return } + guard anchorInstanceCount - debugInstanceCount > 0 else { return } renderEncoder.pushDebugGroup("DrawAnchors") renderEncoder.setCullMode(.back) renderEncoder.setRenderPipelineState(anchorPipelineState) @@ -295,4 +344,23 @@ class Renderer { } renderEncoder.popDebugGroup() } + + func drawDebugGeometry(renderEncoder: MTLRenderCommandEncoder) { + guard debugInstanceCount > 0 else { return } + renderEncoder.pushDebugGroup("DrawDebugPlanes") + renderEncoder.setCullMode(.back) + renderEncoder.setRenderPipelineState(debugPipelineState) + renderEncoder.setDepthStencilState(debugDepthState) + renderEncoder.setVertexBuffer(debugUniformBuffer, offset: debugUniformBufferOffset, index: 2) + renderEncoder.setVertexBuffer(sharedUniformBuffer, offset: sharedUniformBufferOffset, index: 3) + renderEncoder.setFragmentBuffer(sharedUniformBuffer, offset: sharedUniformBufferOffset, index: 3) + for bufferIndex in 0..