From 18ce09ec48ea8d88040f61e179933961fc10855a Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Thu, 23 Jun 2016 22:53:42 +0300 Subject: [PATCH 01/20] added chapter 15 --- README.md | 3 +- ch15/chapter15.playground/Contents.swift | 8 +++ .../Resources/Shaders.metal | 30 ++++++++ .../Resources/texture.jpg | Bin 0 -> 335193 bytes .../Sources/MetalView.swift | 66 ++++++++++++++++++ .../contents.xcplayground | 4 ++ .../contents.xcworkspacedata | 7 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 22934 bytes ch15/chapter15.playground/timeline.xctimeline | 6 ++ 9 files changed, 123 insertions(+), 1 deletion(-) create mode 100755 ch15/chapter15.playground/Contents.swift create mode 100755 ch15/chapter15.playground/Resources/Shaders.metal create mode 100644 ch15/chapter15.playground/Resources/texture.jpg create mode 100755 ch15/chapter15.playground/Sources/MetalView.swift create mode 100755 ch15/chapter15.playground/contents.xcplayground create mode 100755 ch15/chapter15.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100755 ch15/chapter15.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate create mode 100755 ch15/chapter15.playground/timeline.xctimeline diff --git a/README.md b/README.md index 4bf80c5..f025e1c 100644 --- a/README.md +++ b/README.md @@ -15,4 +15,5 @@ Repository to accompany the following blog posts: - [Using MetalKit part 11](http://mhorga.org/2016/05/10/using-metalkit-part-11.html) - [Using MetalKit part 12](http://mhorga.org/2016/05/18/using-metalkit-part-12.html) - [Using MetalKit part 13](http://mhorga.org/2016/05/25/using-metalkit-part-13.html) -- [Using MetalKit part 14](http://mhorga.org/2016/06/01/using-metalkit-part-14.html) \ No newline at end of file +- [Using MetalKit part 14](http://mhorga.org/2016/06/01/using-metalkit-part-14.html) +- [Using MetalKit part 15](http://mhorga.org/2016/06/23/using-metalkit-part-15.html) \ No newline at end of file diff --git a/ch15/chapter15.playground/Contents.swift b/ch15/chapter15.playground/Contents.swift new file mode 100755 index 0000000..366d424 --- /dev/null +++ b/ch15/chapter15.playground/Contents.swift @@ -0,0 +1,8 @@ + +import Cocoa +import XCPlayground + +let device = MTLCreateSystemDefaultDevice()! +let frame = NSRect(x:0, y:0, width:400, height:400) +let view = MetalView(frame: frame, device: device) +XCPlaygroundPage.currentPage.liveView = view diff --git a/ch15/chapter15.playground/Resources/Shaders.metal b/ch15/chapter15.playground/Resources/Shaders.metal new file mode 100755 index 0000000..83af2b1 --- /dev/null +++ b/ch15/chapter15.playground/Resources/Shaders.metal @@ -0,0 +1,30 @@ + +#include + +using namespace metal; + +kernel void compute(texture2d output [[texture(0)]], + texture2d input [[texture(1)]], + constant float &timer [[buffer(0)]], + uint2 gid [[thread_position_in_grid]]) +{ + int width = input.get_width(); + int height = input.get_height(); + float2 uv = float2(gid) / float2(width, height); + uv = uv * 2.0 - 1.0; + uv = uv * 2; + float radius = 1; + float distance = length(uv) - radius; + constexpr sampler textureSampler(coord::normalized, + address::repeat, + min_filter::linear, + mag_filter::linear, + mip_filter::linear ); + float3 norm = float3(uv, sqrt(1.0 - dot(uv, uv))); + float pi = 3.14; + float s = atan2( norm.z, norm.x ) / (2 * pi); + float t = asin( norm.y ) / (2 * pi); + t += 0.5; + float4 color = input.sample(textureSampler, float2(s + timer * 0.1, t)); + output.write(distance < 0 ? color : float4(0), gid); +} diff --git a/ch15/chapter15.playground/Resources/texture.jpg b/ch15/chapter15.playground/Resources/texture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..00075c99a31198025418b21ad31cbb7222691532 GIT binary patch literal 335193 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

u`e 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

x`-TgHHVgVtqqd(tI&x9Qx{^ zdDcZjB6M4=mBsFRiU4Kms}wQHlPTRr46 z0|o4nN)lX77^rYSLI_eo$mDdTFNIibU6i~_3jYAYA>vC5GnKZqk)$LLeptcF5I*oz zj-Ym}DN6H;^E0m>a!GbS|I?&zwEa@XP0fphR(pkTK;FEP0O)c68Rr%8>qG3UZD@;i zq@5~hAQ0PaQiz0!T1UoMjyT3@jO6ZA@o4c39wviRw({rG;NIyJfTqaU<@g|udIEXr zO<9gMS{&Z5s(60;N!xoQR@XMnWMlVS%EX5|fL0vizdqxN74AI~FuW@@-leJBLxFJ= z53)&70c9nD#y|i9ytX*V;}x``tV)sTDdIV;=eLds+G%XdNgC(n*tuM=a(4`o!30-0 z`AlJ|HQnJ>QRbb&l05BS;u%s0spNkuEK`Zucu*{ovfQ9ch68c=nN)I9EZ-?78N!@_ z*Qm=##!Z;|rm1TBoz!F!Fph3y*LtArT@LWgq%Kky)P$ie6_LSbu?>YB8dtfCVnaZ4Cbgo4PW zvz!6xf=wnk#Tz#IG{{V!R?*8gTKo;4gDJvp$ z$;yQz9R~u9isVE-A<=wACY<*=e6MY|tHFBl`OAd|DX{wi+uzoz4JWF(6Wc<+hVC_c ztvP4c-m0to%0A?DWV462}T%{Mg0C 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

gL`ex@D}Y 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ʫpL!(Q6mDhPNgTpbT=@qv4Dh%-uH57A9-}oaSks`}4IXvlib)&tc*hwPtvELA+?mSC z@1eu|I<A6lWwKsK;KkSZN%|)LPxdjE^vt`9t?tAQn=3_W*6@(uR#v zI8Peh-(P7TWW0@*%4@qjTb5I~jkJ>g0LwfamSzi;BOyt_IIgM*b8oUaaSihNw7(I` zFXg+9EGFOfU{Y{fca~Ra+nzZC(~SC5t1p?OO}#co&7X~-y|#^d=u$_cX?o@CHYq$7 z(wJp+jKdz$jfz)yJn`wCm5V^t%398)D_YBGU_at-FlgU*$`_HBf z^1PL}T*?z11v0CWzV)Qw+DwS6Hjb*>SN_~Anti6|rdN1m?i+9~md{ax{RymXV)iWQ z+V_ZC?fO=y5su7E@Y+uyC7v7)MIi3%Y2L!+Pf?dTEIMwHs9tI96W>c764AFaKbwFy z9m513I&t)>y~TZObJ|^}imzJU380oaQZn$vAR;Ugf(}nTG3`%7OW7S>v*EjoZ896k zRdnfzQ*jx?L`#6Ii;_m%^Tj0XxsrD|S?6nc+QwB0rPI6n7O%1H!Y}M z+Q?&sT3kr6;aNP?XovB9zy)FmIp?h;lwFH=dkoN@S&mzKZAHG(rNbuD>Wh?DY?j`* z#t%JlT1%Iv<|^w$r134CrI<}qNWT}>;Q3R*w{p4u1sswNaCjX@zH1oYW^K~vFMr}M z5km7rEI5Ma=4WNt<7gZ<><}_BpIW%WB+5-2x((6PG<7$3b4X>C7wq3J%)rG zgUvN}t3+?1hj%WoZ8KUr%_PD&w-w@N+Qb8#bAa4|+O_oB;nZM4od>1PJXqO?q25`cdEpf@LR@w z?=mpnd?XZkA{$xoIsi{T_0XZE%;hbS)WPB{M?47G;YdGe|H`2LSpWwY5dm&WlUk zx!C9$pMqr6qk~_*xV5){BO(RKFB#kcIR_Z$jMqGr*2w5?FGSAP*Tu^<>)6@c%`LMt z3swQ8Rf8iLcEBKdjzx0HlUlTBr_mmPrrKN29M@M<61H1NU<)ZFNaGwHIp@-{XdKE{ z_pf9nfglsKmf;FGJg9%XI;bZjrZH06Ow~r{r*Ws+U0Ws0HnB!yMOB$u-IsQ94<`g3 zhouTa<##x5h%jinJ+_VF9XX{%yt;!-)?DDAiv-5=j=R;ljk^qwO75WC?yt7T9e;At z`_KQ>@J|(Jes_s%v`ZrME}sft%Fz(f$25l#2|*mTLvfFK@aeu-H{IC!N{LEJE26p9 z=vManV2*33SjjGAb^~crz=4h5h|slMZ%KmSwjH3!3*1xa5(K(VOX#B@3cSLwFoy(M@YzCF@?av=b8pYJV$YJsz+rN zqFGo>tr2aeN8H2Z`MAIXsHe%Gu0QMymsbWXd5Xac+WFVF!DMY$SHq^xs#HJy-~%Y}%Y z1`$G(8<>2g`{Ryz#}%zfG-n7d=DE>hfVIT;Bu#PxBxIM_wBYpUPh1+w&gR^fDfq(O zG_5Y)!H(OlS&OC?;6XAcPBtIl1XeIL7KG$mZWpGU$?oD110AD?8sPwxJY;hC!FvJ z$E{7Rv1ehSN2Y6ScQg!<$W=^sP1PbnvoW^?l(5Ts8qRShG9$bR_QjsuovHi1t(F^m zV0#`qR9MwBe@&9wIAwdkE;5SYB4P=2#yx+!dSjYN+?kN-8iY5HMRlhncTrBp2$__r z8N%`RdE|}Q;Vzf(?A5?iUK(`@w_#H(|081v^c29{I8I=(sp zK_Cz~>?)+Su~AwPF1Kv*rOn5eIe@Z4Rf?6~xZCTD91}~Cm2$e<>2Zm#BS4c#09Z}} z?JC{s{VSooG0Bv5C zErKc8K?k3>NVo?CARsI9-3MQMP|MiE@eZFJlj99P#+Hh++s!O?y2^kVgnN-;nH2OY za2wjXsY{xlBl#RvY4T5THMW4 z=9(waGU92}ZDwWw zfCoK#nx0z?q(`dSoi|;(mdXIo?uRiJ3=!l9&K+~|^G?@@qas^veG#s#N#87^XPl#c z%#Or$^ug&-V@XG;P8~SfTu*Zu^F#^ugAfbz0K8+6c*jiswQb))COI_g$mEjlH)gd` z(oJqa`2ZRDK--MxIOjC9*e+vScz!FXCAze@j@MsY1ijjl#?POW$d8Vku0v-B8OIg0 zYFkIDGMqZC8PWJ|+Fe5ST@PQf`v$oTJE4LZ9qsSoV!4t60zPAG2^6m7+&;9W7PXJO zzZ7JuOKB@V!0oQ!YsiDPoUxcdhG%x$C^D$dc+S=JJf8g47rCO-sfBr`!DV`hauV66 z{npfCP7VM$ksz9RLWa-og9Kt*8;GrGQ%$)`WMMjvEhz5KD;@^1 zl6XJ0^}Eex*5CK0*5%c0+1DjwXpmz8xyDa=-`ljU70c(p<{wwPyrq9H_+z2bmDVOm z97lN~l^7TvSpk{(O1Kk`FH*{R_^vM(nn)f;ey{NnE zR{F#b3+}f|G=%vv5C~QXTN&sNuhy3`wX9{-sby<4cVF=~jis5Dc1t4cMGQ9o0JIKq z(4Hx~HKBKBRcEAHnWK%FOav^C2*wJHpyvRL@y%o|Vu!_#3R=nGueNEiqP~qJI=!qY zcC6yV4kD4*L*Q%r$WAhEkL7ut+qrCe9|~9 zrHJFwrdLkSb)nNrX{)ZMAufw=dvP?eFoCdU5Cu~kGp;hE4cNyR&NEsmI}^*P(CAup zZ(x@x<^s+h2>HNJF|;;!1II(fXEt0;!KS&my|%TpK3cMk&w@h9j>FfnIIevedj;2; zbu$&*j9>j+fB}Rc4!P%U6m#oF!MT}r_DD4uBb_5R4(N+;2KPg-fI#CMU}vAks_w;E z7+RNtP0hr&klZ3%PUO5(voDy6ss;pMnRyu`;d)Xs^I$Ot~OihOTDx=ycyza`vjg1a{aEQK#|9B zFW*wflEO8cDRvtw4$LfVzk;}D zOddxDrY23khdtt-5qMKT(WbJBG}ZN@NA^vpm;yfV2b(EV_fwW7vz%acts@5CVrMHW zn3@x4Kk$#ma%KBow;Pcy?xL#f$bRy~yec3gX;lF9&T~#%wa{^oRzBe*g_BpeiA*qdc^uNv((KmKV9}#Xs3wqMxffBXG3~}!V?Ty5Q6x0VS6Zx=_HPtA zEG+zRrByVTtGDgHkxiTmNET`pOGs!&hRmsXe zVSF*F=~g2d4YnV&}TBGI(#@df3? zO{L635HrD=|EhKozYw$hF<==w(s4y*eBtcy9VFMrKueNZFqs(EP1uT=49grh#OQEDvq+NWNH7S)*cK3Jy!I;5&da zM|4~P zu(Lf-z0d6zE9AcD}m__p@b2rdxdUfCS zj-4CXYC=bVU&cebhZrf3q2!e(9QCe+B_(NUj#Q1O3<=5nD04{yi{?wY>E0O8tu&1)?M?m7)#Qa*UC}Cq$ipbcNXY6qt_jq0mqd=} zQ{`LS^*t_IT`xh@uc1eg76HE9g9an6;13*n`c^M{39GXz%Kkk@MTSdh51kPPbs!bo zG7e4v=aL6ekxo%5T{EitG*(ccm1CAUV<8MfXbJ%Y=aJ7m8qGxs&D`_9iB>kB@PYW9 zZJ|k`lGDvn4(C%7hgLWpfG0Js9ko_3%$!fXO{RbU)$y-~k0te;{{W3{h?4JJnWT~q z(Z>mBqCok{BdV|s=G5t%~g9E@k2bgpK05+h$o zzD40NKok&Hzxz1uLGS5CfKjRRvq)cPPJoaHaZL%bIaNif$|GkXhaiSgl?r(n z&N6#d3gah^MKHNcn98KFk-Izj#&ghPk9u|^si6y@Mv%q>vJoEgMo8nYYLT*p!Y@2T z!!kbR8#--VkG<$B$q@x9!P+^OR#z01#F9aXD9|N8btvw~Sj1zI+Q+?$hVKPMR9DE|FA!N@zfyOWg zrDJVPlQHe2Nnlrz%yRNclNrZ+K>Ugeo7bj$ECZev+TT4h5YkhB3 zDQ~Q5Ia1R6&*VnIMj5bh+e>W#57M@rn!HxVbmE?`a<7dwi(BEk=%=bQgTFbZYD($pT7Ni_UEN4lDtBUEiGBzU9RU7GH>3b$fKhbT$bax$E9$m z@;wPJnSrNGKC`byt7m$#Px3Y!RKjliMbn?kJWgv6cvyISKP{7=oaw3|R1Tax?ttCva-T zj|N%azOOCBTVQMyxAPP*Df~^ekTajVnz=P&B#yJh@%dzGFraDj7Ud%Z5ufAZ<>(G; z6wMLK$*IX3M?8qz;c&=|1FH|bGCPht)u@fjxqfYQTtbpA^KzJUa7U7GbAgUQ;~2#j zB-+yaLmZMut`<|b3JE&{HgbAkwtikaR5fAPXN)w(5HbnRZpNxI zu_)&yytq13>2|DcXBd-@l)9@B6^j5t$31aXWZl7)^dz^ll329{-7UdoNI4}LlWKre zjzMg%Vn-m=NnA)QEbe2|{?PYwIGRZ(c!3;T}SaCF9uXKhZR{ zW}e{4B2v-C_Z3+6ZzJ~qN!KO(a)vK%?TDWhsx616TnFau1+nTM+ zy$s2qu)4oZLDpDpJcg1)x_>n{nTlkw=PX=-yZfVxeF1KAdV51{aV^5J3bV?Q;0@se zV+7;!J=>_ zB&6X$9YDr6alxS^#d{n2H-_{bZBlkw1KOSP$GDH*s|}k`a2au){`jcX1g6nT#6Ac7axnpEASuDU<-J6W`ejk7(} zhUdf(D$O0ZJS=iZHnwti4ZTi#@m!l})Ac%UeNe~O{5RqKIO|&MCg$2DCjL^x%}Du0 zSktSso&poeHBnAZ%c(MUi+zkO2g80K@z$okHPs-G!!~x>fA)TdpvAi4RJWdEB(qG- zw-QKj4l-~t+PZ4WF%#f8J?QF;fd!8{$O@+FeP-%wNSi(c($#@KG8G&fS9FlgP zcm&kkS1gF3wz9ahSwnziEjSsBN3i_E(SheU&lOiAsfRtxPif^6K`|`24V4?4k`4xb z@268uL}dC-r9PNqyqHNeV-RmVs-IKOzojOJala5eV{fPUdr`Z&4RL6;ZjTaU_nu%e zl=dXITDmZDl1sUi+JswujK2xr-FQdgcAKMIzuT{t)t2f$j|e0(LN<;-7+m^RwPdGJ z+o_cZIKf}1R5APKL1eo*h z+J{O@bDy1Ub74F^r)nDOBvHpDst~gqPxXJi&Nl)^(75FF6rhJG*yi)M2DMEDk*THJ z-{{d?`A)IOvc#9Kg3IKLv0QdiMh_JaRy!2+_;2-HCGWSTvI%1n+BBF==Y>3yIVUI5 zoLWx9dmde*UB|3ySL+qIeL{HzY8w(xmeCM^CNjLT<*<9#Y}YC{slI0JdUdadn#<06 zk}cc?NbH?5zG22$LHoV4+PLLAor)v=(R&PsYKCbdk~JlMMJe)4H%Q-TC+$%(73*67o0J z=8l_ir%aZ6rEjvr^EI0s5?HR%L0{o~e8bwIzr=1jo__^^@x=EQdY+wTZJ=1>@>F?p zLoA?%5S1Z`$j2P?Cc5QS)73k+VDRdul3E%bDe#W5;hi2WZ^Jjbjm5fc{{V`AQI+nk zieUN1BPS~Bfau$^!2_I8PP{5ROtz}MB)9!*bp;F#wM*3Bym9yIcn_H}#nAysh)Sfxx?vdKLoUZP4 zDA`!Z(PFUCHH&y;yNp-{Gr&YZ$oyjpM%(J3Y>q zMQb^&Z|!em7W##;f3_~>nI&0H3Sjh3M%vu!n{tj=ui7i6<6a-k#) zB8B;e)6MlI)jf|`TRppSNR`LhrDC>oo%km zdvhG?^SNUrg#7AwBP5)R{Q50tavFigI=pu4>*5KE>pM3ycFPTmTArYsYT>xvAU^ciQHe?)-B%nQtwwn`$i~XOVo?nWbd_;1uXiIp(QGmv&2?Ud!(? z;)liX#Adr)_Xqcu@Q*GiLb*8(#0DT|ji>8Ps%_a5%~yACL!!_%3+WXvBk<;-sNO{u z>x*;=1SrZewdIs9;Cimyll7>SSMwyl64g&9f56e#f!C}S!^Dp^pB1@Dt}Ia&J9#$} zBa3cHz$0@pZ2MxejJaRCXV}(M)Yi91;`QxYTD^`N&n&i|9FZlZx~nXWyzNo|T;QLO z5J~2`slqAwv!10_ZL~&Iy396l%M0X~%S2K{Di&8eSZz2xy0FQr_D!(%sUp6R?#_ zUCr%dP`tU);?pdpm2MOdK2-Tkkue!i_&ahkGg(uDQoA}T&A8beZ-w;hYrQB>rND8g zA&N*?{{X9%6nuntIOjO#xhl!uUZ(VtO3R?Lt<|N<$t&zqq==AXQ_iLcRW% zC8{IbtkBA=4%HkK&T!ZmEJ6BGPWu`*Sc=NyQMuZYX3WR?(m2?-Z;*Lmxl(ctPp(0(S8j))6#AVsdTr*N1Wzmtc?6~Z8@ za1e3`>S<`jb4ndUNwB(Grn7Ifz{ch{j76Jj08h*^y|L8#QOZH9cdJ^amimsL0h8^n z;KMuP$&zE8r4B&caof~XU!c-BH`j0NHEArJmK9hhsz!_x0dOVk&KL2Pbz51 z=*Bjoc_Q0dd1w|5=0-v0Gc%qUh&&IQIrgb=u~3&nOL(sm-|dWAC|+ICDv+oId}D!( zo~MeLSk^4`4+Yslb8jiQ9%a11OB+h>gom7w(~@v22J9&-oj#?e!*>tZ^thRBULi6u z%Ez7A10aEreQ46;MLQI2CK@$>w${|gu#hGJpC!r0c{_;c4JP#&#mA?nzpCHb>u`kd zyB3ODJEUXwfaIze@JYbNcLEBNp0%uH?DboYQRh~DN?NCc^&KTFpTU}>DXUoG+SYrx zTuS!8bs@QUpKQtjz$}H7;DeD@3bB6@(e87)Qd-A#v0qg2&8@G8FSPFz#J(EweW@3a z+0PrBONneJ)NI)U%67anFPM?B1OfoS1dm?yTujo@g{GltJ4tVG4C~?rMmv3$@VTL?KH`(rPHboi&4j7O(XVbL^mQlEtbD9SBWL@lk+;fQaK_(Jj+CP9stqg$ zPViQpeQV+Nf=J|wN#bkB9$2J`W*9zHh;q45I75NPYT+u6Q#z50(Ch4D(Jx{;W})IO zS{sQY3kBldye9+@uHIJAN|XFxhW;#yu6NkM(`_2pI=$|bhVhlGPj77SL_AGrA~l=4 z0FlWu97zK?z-_A0f`0cRlaDs2l_s=hd!1uMT{`zu63?gw%sQ zG0jD_w^Ma@sppzch&3%kPuI08D+|lZ7!2}CVu}z{vyhOmXHvjyKR5>-hPIRv>O!gW zWj#_q6>Azu-J+$0HpCe(rIBu948VX&Czku0aO%58C|s+p!OBldSfL+-qmnyvUF`2| zqfz#YVpdFnv`D0KGI=LF_owYg?2gIxFYLV@EjL{$eXc0-*o-=o#demE`hpG*HHwYh z)`;5HM#h0HuBBxxmrX0`P^x;ET%ipDt>?i>xNApw+v0RRl1$3Ky# z_9^r^{To!Vw6VIoy`MHuD^Bw(v}qVW#B+{RWDM0!HtdSJO630l3~Vf+(5AY+lqJ@$ zCC;SREXGNErjeQvmiwb`C3+L}r-+l3mAWe&_;@s*oBRzKwY^<68FyZ_%uz#&TRWdD z!jZqty#fF-!;VHrt!C1F4x3oJYDTZ6NS3y-$*Dy$wors+RsiigdXdindRB7LjWQeg z?G2PRmaZDuhAh#Yhk9f<$6^?agN_bGO`Yy&nr!4W+5X8au*qs-cwhY<;Yn~*;IAa- zJ-24IoGyus>~`KI*ND&sj-~_86iP@Wq)Izlb}mgq4i`%J#p&m~+2Tmz1JS6vy(H5!w;dK@*WsY6W~)fv~i+iLn{wx<+| z);Do1kGGdrly36z)2=|L7&ytN(V8i#MK#qF?BI%V9Fm5DM2*BIML#J}2;hw8oN>id zb{68y*0Vz@n50{j7Ru()-&EA+x48Q>Njes_ zWb(<4hd4|efOy@U8gZtqhboOXZiZ)y{7-T(bjxVBCZ<_F*%iCC8ZMh#9DKkIbCFj{ zn)k1=*v7S1td{+K4z4d2>AGF2&1rpeZy%N9q!BBld6~O2 zzm7qYMoQz{8s}2c6!k1cJQiv8IPCnnL$>RWm&|1u&)g%R&wjLAIS>EW^3Mg|K|X_} zYBLOC!X=Hsz}%`8`g##xJ5_tld9&)NJHdJyy5y1ETcz8W)Lf?cwtyZ_EGp*<#~AJ_ zD4JZ%i5A}3X1Z0xj;_3o-zfTX^sNYILuvMVD`_vj(6Ow51lz$NVEm(}*F4rzT9%p5 zYaVZz6pN6Oa%Emi0>eK~%B};EmE`V41I!^=$s8jV94>SHD?=*_`^UFb+9hJ)Okniq z->LTLKn%Zu;)4-H42Vf+kxGGpPfkJOty+D_Yq6KB-Ct@m+S$Wx2)w)jqq$^c@>1G7 z%y0+RAuU zBq*fSVbH*xfn9bD+rXf2g}PYK|SiDPnnSC%9}ZV z5Hxl}Q#X^zHl#jT5@EOIzyyWsg*XE|#GL4ZAEYmlB2}3g6SazgJh6?Vh%^YKBl*n zWR<&_Mp174j*?wRN!K+8mfFeFdIj^&Hyq&QhfEA{j!CXtN-I`%#l}xWPHpCEkr+`F zC^FK>r4Ry7LIDghj8e+hr)=@yFp%=Yj(c)_1yn8) zv530CyNIJ(m$-{;Nei*&H5}|CzdU5}YMcq?=xS;9$*RKp=iwYPNEdVbp!7_RryO?1 zYdL6Z6Q$FwVbfvq9&Pb9?csw42X9@x^yjJVSvg#*AWKN5wA8fdo@wr034|)x3fohu zV0rZdtd_JouMBFE#|zJYbdgIeD&jG_bBRDyBOGLr$j23%7Us6A40?u=t8nY*hs$H)`!5evafjm15=LGYLYd~t}nyvMotMLkJn_2$= z;#Z{DeS%x$`Pa{ROOP?t54-a5pK9*6Efk*Z{s#v)HD=b)Ry{kxdU9(zjK)U+q1keh zFv64^eB5*&{c7TxJ9(^)y>9+%dF}1fD`f&7+{uETYQGrC>5fNwlz}Uc`!$u#y9?-; zTsFfLps0P|ZX+1LLqvqHb3S-h+DI>xVY88dp4nZuGPx+t!TZ3HRQ4l2w2@)r-5$>3 z-R@IxDv2V>M(hBk2h7~zmjmB9rwLe2H#sj4=&(t11&yGS?Gi@LrG`;~$Wh-M@&o&a8d zhrMGW@1d)%>#t`L$DbzYRAk{LF2q!aJX-E^UkbGyUiZQm`WB*% z{j1@tiF`dJ%x}C%ELB3WDK2lC?InikLowg- z0*8RWe4zK@v}Q6h_1Sc#mAsH+M)}zX$gSpM8=LBWTu@Ruy&GH8t+i{PEtcX!a3d-+ zf)o%LbC%ERS~$A_)8F`(>I;Xkx3*oW7uzhBW)Q0pA>F=Ae8U4C-%8HfZaAaMH0@%- zE4@xlLNNX)lJ;iQV{^JmA(g*yVs3#JGO84GInP|zWTM@acDMEToYd@`uf5K`%Ii|{ z+UDNf#iS+t$41{7RLJ|lWpRO!IOe%$9d$Zl&N$f4+KAL42XwP`76Ob6cmS ziE7U0SEt8!soFeJm1!mU9bD`yw}l8e>E5}XjM*}6KI$oSXIq&+(ygD#OF{~g(4CEw z(2_b6PEpj9%UaYn8XdK>M=M+xKYdUZ0HATObs!!y>qKSHQdcuhpw{!OjdAvydC)RW z2vps>A1L+bnzksbosN~KCb49f)}lKnw>Y_C2n-H61Te~;r#Y-8CRdTnNxI_x;hDzh zr7`h^RZa*argO=~UF?Tr6UEmWH2TCQd1bo3w`C^l{aI4#Tzsbk104Y3wuSAXn@Z)| z;ca_uHmxF%Apl3WD7$#cWxyC6v00|?V%$sqBG+M`N|D5-O(tP)8x5QpiQ!pK%EPJT zbDF5DGFs4!#a0$JmWc;~=T+6x*LplikwYol%rnQdA^CI8GPvN5Ye-7(U5s2_>qcSt zL&lf3+BKwlgz0H-CFz9~5Tsd<^&+pZR&Z>Gsx-bR}_Jf z>Y7%Z+QipU-I=tTzbW050KqG+%*->wHU=NDJn%uGJH(5N;hiH>fXXDD1h6z`3|Vs& zj6pvxae;%+y(zS4v^QN6BYdzo@8#U3%N#_Iure|`08UN_1L;v~lXC&?bS)yvYn?{r ze2bLdJ;U-?gSQ^pBw%K*R_wJ0Xz!us&1pZ1uOiWOXlGvvTU;4+JE@6syb~5PCHPBmGEtOyam3FelwZ37V>TzCdyZ1Y9Z*_Dq ztn4AyF2Y^LAhse{ph(Y_&B@vsj!xb>QSg;=oO*QH4DiosaALZ51f(29z>IvvobKb& zmHD?XV+rjg)8)9hgFopfb$XKX9^jC6Oo>MRq?eZQ+)rq+lD5&6 zZH=*|k2pJArwxKm9B{*)I#e`~Y29jUYN{?SRLl&_RE%&HK;Rtl%}N55zM>7QS~}(( zggjwE7zZ4mp*&T-s(h`IV5~<}Jv(nq#N}&W|dE zNdR!wvcn$}4_c--5?kikPLQNv_1F1_Q z$EsPt77-u@H$eDR;AaJobKa&mS}vgM^)fV-n%7>u)nmAh?&52xB)FC09#Kd^NmX`z z)yesCIU=-_l8Q^E%;QbA-&R3ud8em~^%*Vn;P&!MI>id3Nfo=6`CRT88<13y(KA0Sy zv@k|?r+0S@qTWCq5a1RYoGIzY{{UX9C>t{*)^x;{SGv7Rcw!!Nd6KLIkUDaC!R$Vj zqJw)GI*B{Ij97ecb$2Ma(6p7hiat!2tkA0lBMuQ)B}Yu|?^`-4d``wHyMGLR^3|li zCBL5UP`kbwO5ANo>}&{RL{c{~GOG~BjzJt$%aS@Jaj$6ib}ni9Rh6Vu-!%6Zcd`(R zJ=CH`O{X{mYJr~T89fbUIXBZoXwyqu>S>w$m<_tPVz|SBv}AL^_NcYlcd-N9&u~1( zn*v9~v7qD-I30WAty)A}gxhM1ADUf)74sHea*Zdyet--d(PS56nkLkdthH1=YaK0cKOKs%IG!cjac!)CFleq+g9Y^=N`up`bCmTHuUUsE*sjsOuwyPXE zWu>68ianCtrgtHgxx)H_a!;jmrr~zo&Z$LBB$bWpEj~L7h-|FEb3OoRYt-LU%Tj zvLS-uFV?OG>o8Jk^Eb4b#zeAiV*g6;lkqsHM1j!x6a z$r&Sq?^8C4h1u9eV6faR5SwWmkTys?rr}7XiCt>V9}=5d{4M?`M@|)#~XcXG>T_V znvJX)Z`s#u((s3H`-CVN9Q7X62?dS&n{-VQ(QVs%Nf4Q&k(C@N=Wz!(-f}PpU&g4& zd?qu;(9+PQaxD>cD~(S~v0HX~$>lMXRv}dZEJ!1c z20s(c4QX+=W7TbLwDkLIEh4|!;_^318xm4BVzKkb0|5GgTt}i%wU!|IO7B66{Xt~S1jt@F|@pv4=kTK+Y%K}94cq#+dcbLK7FKM=h!z)W~5{{nn#~)G%?+I540aM zZu~j=9u5UkdWFdBbsr@b&wAWm?nwhor4fe&{SI@1>%~zIxw+$uOUqpw%xKN)2@+eS zfGHvjpOo$+o^yfCTw|#US2@^UQqo@D>r70uF)cA6w#xkEChk9wH8M0>oM(bQAb57e z#GW(o=(vk!t*Eu+K4ED5%Z7m#;G}?sB+91)ImURd+SH`!#oJ?ol;WyMUdN=VfXuII zRHH|h+Dkt1fX4?X9l1W@xFr+0PUz>nOKTmyvA?%(n}3%!I4Sa;x$Em%MFq}7NYpQF z8E&uLBZ@=jL%B(Tyr#efTO5_^#c4S96kl@Rh&)F=uM}X-7`F_uqT8y1$Z?E_~ zf6Ty@zzfimid13GduT+es4KIEweaqttLj>qzqK1K8X0Y#7cvnPF@eb-5O;HqITh0> zD8*Tr(@t`elC{p(!rI?Tu)VdpS6OaioBKb=UKZoZ`NWF27$I}&O>w_@-0M!t#ucrN z!LqhXxZFm=e)4vPZ09HjFnHtt0IgcdtLR4OVWpM5h8uR8F#vIJ?;?`zfId--e};Qj z4|7XsKy9FhUR!c^+R8lW)p^S)`G!wUPJjB7oz3-5lG7>8r9}h|<*pF)SYUqRw;y4tp5)j1n>z2nxz{NRGcQp3#M_+8PwxKj)6;_@vE<3hmXvM;YWG)YGfallR zx%IZDjrBa~JU?+H`tAP!h$p;;<|!d-2o*y?aFRaRNoEA(F6`}Ljw`*+DI|_Gr71Vj z9hHTgcX~{g21d7vOK=J52?rSO*nHK>-JQ;)I>{lvw2sAQjwoO#vqb!F7Uzaj#v6fx z!kg1lE@5g~dTSTgTE6ENmJasmZ6R&4GRgjiZML!5^PIRN$c zHG_5)ikHhG?Yz44QRa|Df+pM|5S`<33VAD%J!nRrM7n$_szAog5-Vx9#Wb?AHyc3; z%E6A;=)t(An?y+*ewC`~dS0h*Ya@N7Y!!sI$j9vxDuOVcX)7oMWGP^A-n5icM5$ZQ zpT@o@);vsfZ3DxzMFrF_NvP_VAz4-kLu`!zV0OC&`GM$04OJ*8-c#FTjH*etqaM9{ ziEX?Wr$r8%scI3;scI;TF_!vsGNbIsF~Uhe3Fm=Bs`X1mQly)_wJ%wCcTjui=C!w$ zb9%?jd=DjgC67^z4tmy3O4eq(Gg|&@n@fvFvJ+ifhF`ac&c$`xw2_}cpm00X$IPaT zoqNRA4XCB0DE?GRq9}K4cO;y%Fzz$jh{r)}OQl)d-ChM*Va(iQ;8OR-K*o?gwM!B%~ zfqwQ;x~`{TZ>aAoe5Uf{Xr(A|(SQd%a&ew(Sx)rVmDl+kiY-=`W{sVHSz&W;Z!&I@ zDKoLYT#RQUY3MVPk4oo)I^B@XHbk@3+8d`nY@fY556BrnCu;&uPHD+Dv;?&cOwFlX zLv9GX0h{d>&cSmCBWcb-&QGloYAAAD4OGjJCpBZ1gfGpvmx zPeU6~ip7gXX*7)tjpU3e1q6H$#DFqM6>)EHX(N;Ie}-=?Y;@}vRtv1$LleqAaU5~J z@};^VJY%1ly0GE2i@mAZ3I(+)hsiC#U01;v~1NUpjSzRq`+um?D^EJG+mS zT!E362d#J$sd%T`L+PU)SvB8NWD8*nN=P=yS|tqGd~L{XKZIk7%Iw&J(q)n<&j%W4F{yKJ!}c18yNXnY{Uy!;Tz>K<$jBMTW6nLQWhG#W)ab77>@5&fOEdq^cz{?NCS4?byBD;1B*bG1e? zS&1jN9MZQdxoPt)N>g}N&Kq{Q(+`&%dyFs*qDFYZX6gy~zUe2{pR{4hjQg2lzOnmN zlLmq#<)CKYvAS(I`>dme2c-#Fj`vmV{oEYj zW10q;+}g{fj|tn{JMD%Qc;+vXz;ZYToE_N&4h0OuTb^fYJhu9T$cN3em=}yG82NLt z`QwqtH0^zjj87A5QyZB45urxE+q?{zub9-m`^ttnOe#fEl{ozH64j6L6JEtleR z)~M6uj_la*Plm0$HDcOA%+na6DQ_|iETn*ilpZp2NYCR@Qf_kQG>kbSlIUq_T3x(Q zT*npmVwNz4s@RLeq5ZI%#d^^7RiR%ZVH?!??k0b)7wK+rpP~0TkBk z10;qvByCVQ=lNA$$StWrX}Yp%Qa75$6329ExY|&jbJ(!sA5mI!D-p`>Y{3wYR(q6` z1v}3K0&$RXy^mmP7b}{ibow5uBfMp@BGNTdv)i#a+&_!v&Iexk_o(H#Gpu{jaS>}2 z3aS`LUN_!V?}ugbj+*c?w5p&M3d@k#$?Mx0s$B+;Kk-JS{vp1P!FKYEBTt41Z*@D6 z;b)U^`67+bF;)3@Imjn~I-1^^ND!PSB-Q~bbI(`c#2PP<+7ddfJ2=12XS0|2;kQ{T(4AUo%Uy+ zUC&^*v07XSS}nvz4%S?@I=yIghdhiwp9ETL5Zxu|);d?5A~-7ZN^H%8@b2Oo5Q0c_ydWzMV_ zF+po?-~^2j4Y^RGaUID%mAa|Pc(3W4%AYl){$7Tij-v*V1H0Qc#D6SEBn(-%W3L1P zGT&Os>TAnmdT1^6INsJ!e#dczkna8va$7yUb6CsW)X^)I^s9!3{yz!0Ga^R!8eP<^ zK`O2H2=2;HQPoI2MN`#t60~+^tm@i}&85izc8%5dDFc!{LCEReu-{X3tWmJN16hr( z;#FvOW;8j&6)4KvdItQfM!nJ+yU-I`xzjb+bn9D4=FzV%Hu+E;n_c)UvUVBc4fnrV z6mGB7nXbn<@n*|by0n5&RxKXoeA{T27V{r|)hNxJa7W$g&2?egPhHM>x3!VvQdny8 zTQpD=Hn6=jw9IqWR zK|e~_r^=a%c9Sw~HK&GX?V_>c58jYgJk&`pB zOoC6Clen-7ahx1;&*7RQHx^rpk}{W5HnJs}EU@`U?8D6c*d&vX3F-!V(aY31t)b{% z8S!8Ccb#jgg_g$SYP!g*LOUKdu+LI^boy63;L5rt)b!hXTXxm-xxAP>+(^5Kjg+0N ztWN|UaC;h<&Al0;iOBea#M%#qtgbv)5|-8^m+aOyq$vhfP{8F#!t~vb!n&!`l}U2_ z=Pg=_oNmhh01I?|TUU!y*X4?PzYuG$AeK#=RK&^-*&_sD3Ei}eR@jLo)KIV`O07yXx zzIs+|138U%SBFi#c2AlzzEi9U;0bvocLR*)7_B24gJ&aWZyeLz-cCuig+nO=b8ap2 zj+rN(aau{+LRRNPpm>V+PQRB=v7R-8<`(l_$KPc4N7Rbt1Z}FcLtG z_ZS8Xl_U6vPMp=0jYQOR%XrgFy0$LTt}-|Qj!H(v3=dT!(E3((?k0{~#af?}(&;M5}AS*6owU~{)P`3_0x@0?dvD8g5Re;4L*VjQBBJCLj`C+1Zv=Eb)>qK++ z5J9L2^&7bbjrv^~Hkj4df>e^Hg1v~xy=@!8*=npgE_C{8a+mq=^QEP{k1E;RCBmr; z@h6E2OghV>5b;E@;M~bH0pMK7T2ykS!%ae7&`uvBg;E+Bm=2V2P6)A=DBLq z_HW6X(W%alO@qS|-dQc=ml925BQ3*4_heZYoR0is)0*S<+M9A*zq#&J=QmqKQJB_e zOiAa|AN8T90930on zMtq)!*UBnhqdY5nrt8{$)sCmO9cM&wX>^hC9IS*WbOS%Te3O&V|~&De=lwuxQ# z{{S;lNxBmfNZf=^?@*3)oXEBTqI)R&i`e$T=>Rg~gp zic@%iNb+1eNblvI4qGfRMsNTXGOZ`*Txi8R?#`wnx7R;pftT%Mk1^R$1=@H3jCBKw z=6Y&$=xZw6$1EdIwp)uG+hGusxRl^vhR?2YdepUWxtp(%Y~^5G)_D$qj5_?mutrJG zCY%J>kdR4na`#sRc}T$GL-V-E8D2R6b*&$fCWe({m$Ixd$>dJq{Gl1fSgr^?{W==W zmTdn3VlIx7w6EvKa26*hc#U@fmn>HVH#ix{sphy8B=EJ|myHebH1_dsT*v#l9aw;l zG7ro29MyC76|Qp{{+Se4_ZD_4wxFsa?$63qbK5xtZpk&YW!%n7qB*$D%(9DKOlsRg z1A=zvmFEYhYg;QB-H%9wvRuy;O%!t7N^f<&Y_Pj~fc7IUj(bf+bmHnL&_&lr9HyPd?|hI}q5#nqvu! z496cC!TEcSeh)Ng8kZxLrHUY27gY)#&fVrv1a`sM%N?g~Gk`ni zrBow#VrMHWnHpp=N8$TBR$R*H86!NDNek&Vt>jNSSTbHA zY}1^dl>3Ze^&+^XH*>ZzRxCvoqRv_fiAbV2!r`-%k_q~9X>=aOE&iz$vUzM#2x5?Y z*((}=dH2EVTBz%D7b7|ye)iGXWQbkc%!kWm`F0R^z#orl)zeR7B~`@en$`&P*0`Ej zqP3l)+$SJ%7k1tKvT!nMpIhj3wya0x=`ne8_;S)IXO!)kp9LZ;2*b*uhEHw0J9jlb=e5uH~g;D^0z(k6ud>jJNhK66#q;?u*C)$U8!k zI2rBIn~UZ3CNjHcRpLvHKG6|lLmNNcfO5Qj?2r%MJmRrYW~u6Okut`!q;SM7WefeI z8>m(;xdK@6@{TdQAH9s$t-AtB<*VyRBeF!dh(*L<{H`KpeBc7T&#z2WM5gRnwbHJm zcIp-YnSX)y=Cq{eyK1rjsMM?ITd#6*il#RbBV}Lr7w+4pFMYV>* zOVLdJe*H#SUvVt1TsiDPz&L#OI2E1x6huv(-n`p24b2^}nTbCsR$`!)ZUgW^BL|_P z+6?78Cr zyv8}&-LP;t#Z7@+^Q6+A^8Q0+9g9A91SM1`+TVulnLDQwurSrwtl_+N0 zoxn>NLQVq=amgJjB7^b54r*p`$U@!^PSw-0IrJ zj+v~_b8gRVJ+zYBOo7*7*%rq_%Z%;MJv!5qrzd3E8up7;lk^V{!ExeiC^Z+fn%7F* zi6ecg>ntuq2Kh-`a52Vv=e$WMJ6`P@Ms8kLA@Lox)Y@*LYa%R$=H7p@xN*58R3HL# z+#FyI^-yU$ic3a{mYTKJqYa$MJgDJ;2#YJUql^!jXMjcyc_*zm6r1y8sWz9PXH&5^ zn^gkO6Jkl4B1k}^A%GapIvSMhU9M^Pb~~7~*(Sb;Wz%GpEyT>l3N}46$m2B<+-T6& zG)s+JOxvZ;ws@IJ0ar^Z%xn)K6I=~6@HNPM=U-e@} zRxNh?&G@tni=7DA$$D=z#!oW9D*}PY$SBLXNGCigI3G&SpIxjL)49j^zr%CbSkE?_ zI!P6*=!xdXvU%cQ1e;U_Q_B!=e=e2P38^y~#oI%jvyRTrDQ&#zY%Hh3y8_7aGjI?x z5wu}I$Q7id+wWphOHGTAc%nFLX0VFoUNY>lTc9k+7w>Oxl(E~!di$E6WZSt>s+NY& z{3deS>FaT8Z}w|oM4!7%l>u=3EnUrN4U8IusWLh#$*jnx!tQ zbD>Jd53j*tu6UP4&~4ZEkV|oWE(X)($|ES8o-iZG$>>FQ({hX@FGJ0)qdJj}{ZD7m zb+z!!OtDCjOLq^DB$JGwz#(@302ilf^PSt!^f^_vIgM9e)MV8S&GSVizT7-6cFKWq zyBInAIvUzBRw2&X8rB!ryHZOT7jh8mxQ~+r90CVJjF4+5V!9dHj8jP0H@55t+T}9N z6?X-3lfs@r!Rl*Bkjbp{y*lF1y@kU^sHzrgX-5IL1diVS07{uXN=4?;G$|p0jD~yI zRI^LGHrWBj6c49Lj&_RWOnvRXudeuN4OZUep}tFxE$y}iV-!aPo4+THYNC{6E^cM$ zJT|9qX4+$HXe0_;mHELzxM1gz$Q)8_Ugboke>zR2EsDmUZMI)F3z>@)k`(*MTNnhM zfSO5bakea2mKh{5$P^;nE2{7U9xAlAQxc05&qU7H) z^Eu;EQHory+atWS(lxuAX+GV4_Lr=PR?5%HWQ1(OgSiVg_ltM_etfx8(O=I~(~mv3 z`DkhA_v1#sHohwJB(s@fmfGu2%u($SZkz29tF(X*`RR?njYEoR@ce&4N^LtbUk_O6 z^6K}mbE#SzX)b}WxOBcuNFN-}D z0I-%gBv__Z4#sJ1;@qZ1J68-Cw;XVBTShJrNwk~%j!XN`dn1d|^_PX9hfBPj>@8YZ zBU_Ep28-s{0_5#DJgWEWTFw{M+U&T`X0B11?&d=B{g}H%rbw;JZQCYEC*}l^*Npb3 z6qe;mci1(3KF<0pDejzG-pqWtq(@-`fD0hNBP_Y#9MK6lwwA=soMe-Gn33u?+Eg&T zhQVtQ+bQx@-I)&n;1WA-1of?4RJCSzaoF~MhMy4M#I`d*tAe`qmht4M`5rZ5Ln@4N z2W;1!iNiQcO^xYSQ;(g^E4@ngXr~a!sM9{=k&e>Loklr1C#uvWjh3hX)8#I8dpkRu zTaU7=3vF(;orq+Oc{u4gtk^Q>W# zI4-ceoH4;FM&Xf)?8Dkg#p~4^n5)K7anqwa9X~?Sw1sPHRx`^yhGw}rd8KAdW!bV0 zcsS1-;;@wEE&3f1f{w-AJ43yBBfYth0Rk(jC=`}%pb$HCsFPN(;dDZeE~$2ILo3uQ(%5A?S??|6hG=3^@~g=SL$#C2Cxei1P6y#bK$+M@J+`4~ zEIO=4TWP|X*M8OBPB_L6eb*W9Sv@u=*k2HMZ|x=tWh*|E>kLxJ<=<xj#!X8oF2XD#%+#N?Xc?>)GVQr89|l;NCF~ORZ=-S zNaS;ZH+?BIp2NFHBGlAP6e#Z#5w>||Qy2)?1m(sCIXoJr9Sr&PFIZh$L~a?~X12)k zq*n~21CDq(-P^rmC9a23YTAy}OzI&`CdK1o8Hu>*GCY1;2=+!)gai(E0n}FXn&vsGrr>O7!fU%pFA_N(SdPaQAnjOs7uCwY9lCXw`2wbadLGv*xPBL-)T!GT6 zaZ6!Sla}Xwq~2-v@(3B(cFh{O4k%9K z+~cjS!=uH1rDZ%@<$zGEz+s0%I`C=BO;J%-M${1MR#FRnG$rk!$D3?j;*udDD#;YC z#c_kVQHLFvbflVOyRSpJ(W23{Z8qO^(T`P$zRqmqXNu}D7v)(ZW1MH91(c3Kq~b%B z_8#66yOr&3CV^mh(6Ndc4CQ#Zg^}ZI7el*iMnK0L zxNx@IS++;9f(M)c>e4;wcp(B;HQ z*+FXM_!_#ctU`EftweU#mJvdh?GW68IKT`(UUzZG&t7Yp%KE*|$i~Xui}t#}7je7` z9;ba5nk_CiZOM^FRk{9sF-pMI%Q{3lgw1>)o+z#6ka>#iKy*e{Vn_!YNgx`g#9Ws0 z{%h!M77SRRK2jADsbS26aq2e>L8enMYuA>yDQ_7Qkbcc@`~kFNo}l)?TpXH7BsTOYT2FIt z5uW;E=h?bFyi#r}B7x54ByGT7N~V(~8#-5rwEb4s?7mN(aWU8=h=NNoz&XIi-o(^O zHYp>su}C~IZmp@Jqwa8^F(e~nYPK*katS!B+Pep-ld9cZ>XI$xy~5hrN4_Nv708eQ zw3aA*3<6D4}`VjCH}}bJtCCZ=xbj z+iq@rJkZ-wxH|8OH4Cf15!xZO)8f=0bdlL1!VozM8@OBws*~upIpGUCy~}#V^|ig( zw4OF-<#DnDn1SaY762Tn$UOF}EOjG34-rjcc$b!QHJXDQG9nGzmnU)0Kt?f>&{bOF zI*$xJmHfYAnoqH67cz+6Jj}44uo|NG9w7MC}4)=+Z;(5GOz8bTdYbY&ludb$x z&9(jVEMtUklmH8i0ms)I(FF%R_CVaZTCv0EQru}8yxL^45~Wxb#?|{e5tEU}4A>(% z2R_x+G^HD(o)?R;)WN9;@7Bf?+Y^;vK0Iw;S0jP>WAm(PhN0lhf=Ml4a+IoTqIIdYiol$A7 z!}T3T%El;eWk6$^MA{_zMpu=~4tfs6b)hFM1k#C1P17uOzY*Tgb8DN}RY)#I*NbN) zk)6yB1KO?0sH8);HO}`$y3nkxFz~9B1{6Ea(uDTva5IBk(o*hS(>(XZ`nC3#e6aX= zBwY>Kd!u0lITno*4bK=|q(sbc-ISd4uDVcCTJDZ{&C_~p%U%@JHGN>ibF0V#Gf8t} zwC(dle(b9ZXT*|hW zA_lpRa&RPNjFd70a5sOELX%pK%VEA3(6r0FMhN8uq$thj$CVq`J3VvLoEj=krErXH zTGn*^M^4qP%+C~R1FzeiL$KVtxyk5M4z)0pTuo(kKGRh;x>TAj{{S{PWHT(I?=gQv z$pjwXN}gN0f-X&GE38*HR|#%Bp!3^-w1TGtfx%t#nP2w#=?+03f@k2C=y#<@@SjzA?7z$21dgi(-OWllC*8EO7F#Y7)-v0oB+QFxb zsLc1ML`8!|8Ib(Q5Afp!K^;Bok;>a0mcHekLrJwBZJD;)GZ?}W41^#bE?+r4GHIsw zxU9A`qtI_#O}1E6`PS-QNg!z3a3lhyInP0Z*0btfi5&Yi{BzB3aHcpN%CnWjg;FpG z=m`C5R6}GpF---;Gg&t4qOPSJfVg~&{#9tqv!TTmoI72_cVl#+R03GB!5AF(&T1st zYeQp8)MvQ27jHX93I<3)1Oj{f!<>)^!Q!)$x6ILMQ`EIqyPn$OFzNPmFs-p}l8$#V zUZDHZwuK_qy0)to?VAw{1}%yFL5av=wELgRllMoVi=k`x9vJZcwWD}~_7iohu!6&K zlrgL&quQmE_V&$fB&5}rolIhye(}Zln?%v{bA7DeME7y1xJv(q&KvfDtRp@ucSj{0vndMjbg}L<(Cb{dbR=l zI@QA$DC~}ExOF}DEKlHl7eu!pd)}i7Yo#c%v z;gVWA9x1FRi2N}embZ4&-f59Mj~<`{q^e|N%#1e0X=^D(an|W6qqaP|>T$ zxw)q67gvTSwq!bgmdf{0?%u3G02Y&j_zrXFT=R;J@4rK;oVm4IF`gl~l1m@5Y0P$8 z#*-FB*c5@1r1m%&&T~$h*6gayxY-vxH+N}#CBLwSNzzEwFJf%8u)fW>Cjb>V$UePI zO=RPv(_K8n4%C&_w_26FAeYC)_R(n2O6zGLk&1lVmQn<)&6Nin;0${Tx~+2RXB(+m zBi}DH$gd={)GU=i3ScL3-{uv;W*q?|BD{pz=%;0||J31pO=lRqu$I<8G|WpuZj7w> z0gD}j2LVSp;0)KxL0unW+DD&!NLxEtq3~o;D{A`lDz(JKtaiRrhQkaN^A8*znFhPC zsmAp>E}wzHi=Q%7*IvGwp0nYdH3f~8oym%MY^~#i&mb8jF(^{x@s3BOa86fuM{3c0 zjBQt6`)Cnq^0l-JB#XcW3Ms)L4ZVN;Rcbw0u5-rr$4Xg6#mtdfv$404)P*FT0qN7J z1EpKlg{)~qCY`2Q&px3$EPo+EZ;kRDqzo|}0#0#BYQ)!bG9MF7CAGwM0!vvf$L^*P zvhF0GyxioFFiAM7cso87_{Y@(! z0^dUfC zTlB|@{#Ckx*`jO~R(4)Sc7eAijt5GID?JP4PewN0%HK=3jyo{d5nn(0MYsWEB0;nO z&bx?FoDy-*(ABrhLW)Nlsp$gOQxQ!uhfKSa!5nN)&v2`i41)tDbD!|yw~Vy(GLqMF z_Kl=0M(zuk%uN9XGzVfJY>m5rsG@SdqKqt1)nT3x^P(1L7=%v6PaB4N9-MYHF=)}5 z>2({hwzyDSHbkSb9-m69TVbbi%s@*nSp3Cy`G<}DYHT~|K_!5m;xxL5NU8*)22j}p zCnG+X!&N6@WdzQH`!d)(H<8+-`5}JjRAo58Ju&phHJ34ISgEN@k*S%XUD2{4`HPS@ zdXdP_>rOGaIiyd0Yis?TZ>WWPn|T8)k*e%c$VNjc$t%wT9MVnR#XB`~L&B3sb*W2f z41Z^e`rHML7dg1F+XG{P!CkG7N}7rC+)!%e-ECgLNeay*alos+Q-E2{ae?0;d)9GA z?php^NXeCvj(0DapP89YB#ylC(z+sZ$ddEJ@OYL;Wz&e;0w>xcU~nAn!P~}L0B4#N zM-9o86v#Ed4&GY*k~`_`yqV9Mi5oH%bqu2+o30N(&aM>`GpSFxR@%-uCJ>|LnRhS% z?E#NW^vLh{)wvUE8@G>X*Qmg7%-Hs%OeO(wwY z8~m(Wcq+==g(JVMVw1VM*z~Ui&o#}SW|$k=&k_s6Yd^kmK57+x*c zH7z?@x6`bIjdv7zd5+K-IaddPf=KnPBO9xdv^jlKQco-x#>QqQL}y&H6M%lC9OP9- zBXTgIxhZp#xXP-_vCqhHmK=@)4&O?-Edngnm&rxfuiI*u8-5 zSjr`HGt%zg!y1KzI*f@Fmyn@~8^tC&g;gPnhmUK7B|*mE2U?Wc(HQca!Cg`*+fnfE zithgav|=AUuBW#8%3-(-guclTHbUhj$i_fD?ll+MK`L$R&o9<|SK}WW_=ix@pldw` z`vqY8ef__ga7l2uNK#c^G7l`Lr(TuW7(y{pcXv7Y=P5Ww%Gn6x>h{{0j>7I} z;hs>)B3TEUzC5@rLuUXUdV$}qJ%!6-%XN#iw}(!WIDXlAJdwu~jzgI6>^Cp_$L1O7 z-n5FlWl7l`)yIfu@gLbCu$m@?5H!XxcB`<%V?A(3LBXtCZE~WtxmQ`Z8cn-AMVTUr znPZK9a#WWj1I}@i_)<#aJlg)|>h-3xgi0=)EVB8FhTsOq4^BIp=!&+ay>v7*sWja! z<3)26m{ygJTlaa-1ED`dQtu+RI!_eNHCx>_<~Ew<&P|3u#06x)<7ZLz?@<+D5o;4n zETPkFZ3=y&Rv&4Rk*)lay;OBp$>aPgQr6{kI6n^B>VNQ&>az*)Bpa;fk7~00o>-&U z&gVJEUBei`uDP|yk~Z0~$D(%S11O>|=#j6|)u!Dvb{Hqh84^%?rtJhVp5T-DX| zAGaU3>X%C;?c$`7SkAj091=(i$I4G|dj2&$-GI#0v~TS>)imp5TL_NEw^kwK&&){b zPUD}YUp9n|wa_)M3+uMJjFLxxVK()K5h0D^npHy>JJ%RSQlPI|tEPxoW$zm5de{6R zBUFm+IABYxO>H7=n&DZ=Rf~2=!Q4sfk7`hgY;IOOzT3rDTK=OyoeEl+L#GT7yZzI* zJY$ll0=JYoNvBhsu{pQ8)6y7ZcyACoiSxNYQS&&a72=DS1(mmm?A_wlAiar9Zy;xu*70A>02~fm z3`RR~it3}ggV^M+rKF3#5%CV475$C%^kj!n(?q#KueWP%2P3bhKMKmNHnul~OTCEv zNn>g?#k$jw?DL$;i}EYSAwrl7#^xs(B9%EbtjAI}mCCy3g>PEs9aU`Swz5eA%+7Wm z6XsGnb{v2?99ER-rk%;1Jynjb-h0daIvra25iN|*<*Y7MKtpgi2^d8%o(OfqftLA$4n4D7iZPkXDvlZ*_lZ13V`JdW21^@QZtbt&ljv;nqNFa`IMnUI;T{va!CCc`*IdM~PT+4f#+BUbP>hakPMdgM| zsFXmFjA2x$*<|TS;vCLyadPpgJ4f#dvE-4^kUb(X3Ck+UPQccx5WA$IFcEE4+@?&(CY4e`fBkE|q(0qv~3Gm%|GM%A1yz zSf|QJZNohqvFa)wrmsYLPmO#-d1qi_({JsST0-}vilf}9vitFW2JO4sJ^E;uS0eHqj6>hlOmWHyW+}(F;uE<}j$FGi}@Q z{%5sz!kfd#nriLrzdQVnSxr}bux`tCfB)6+Yq>mUHnzIu{lCc^CfiQ65Fm9j6?V?u z%9z{BJ7=)34nECCmj0*G$xoX0^c_8(v#7%Qrl$(cdY2~iBNEO|(GrJ{e+noVSjKte znx1IvnQ9WoXl|OSoC=%w^Hye1y*-U3VO3JFE2bi}AN0#F(V|Vo!>62MOTXR`6I(fBQYZiy?6C=iq%_N7* zECTKs!01kKilt#YnHHWfxwzSA?<|Y*mv+fOpaYSCz{%=6){>>A(VDBRj?UX!vAogD zoW~?Dx;WKIB!YP-j;Fs`-_6gWprlx z9A3FB8kV9O4W>I~X;>>{tg|>$PERZskVqsBhPol7eNK9w^t9-87P^(hmQO5z&l5fw zgDQa>VB;q_Y@75ru>13_;_A@1N4D4*QwT=+K7MN0Qer zOtFF(hs~w;G}2rIVU*wsZr+GslHPpeO^16 zie^cS}vxajP;51-FEgT zVD?JMI-&!#d5AC_x@RS^SyHFX72MucIa$XIN=6duSBzfV0Q*4zhHeoQ4y5n}ZOPGY zWU6l7#m^7l>rrabPaKM(V4~v56d2J@-38A(y-M@xMMW0BQfc#F^g4@$dw}v@1fFTx zQOXKj8G-+IOK;|BwG%1PQzDt)6&)7a=sa|E{c z5$}!50CpBUH$W8QJONdEqdrR(w0mIpLHvVoRZBDqa0VD{&PQ>QaqCKNK_jrzSj&F` zSWay1p+-yAU}Q3|z#Bpk6!J00CyJj?l5FO@Njt%MZm)>@OEj=a31ZB8m1bfF&~v#* z;nuA!36GhTd2K!Xs8pY_Tn6$1Bg_W{c95rl8#p-VD%FxD>c=jhZKd7AsOoL@n`s{p z9Av9xanl`ojG9f~VWnc-o|$he!tj!@w2oq6!cD5DAz6VO_9CL~7opN=*7vtDNY)3; zD<(!5E0j1G7{^YSCZbPKn@meeOTeMsLM)pUH_L|V2RJ=_C?~1q77ZBqv*UR!5SXpt zff-TM2Dy*QQa)}Qo%j{oFW|!de{sc2TJvc14-aW~*|nX+Ndw9}#2>t0B({0S&A>S) z0OyL~lUK3dvNSF&wHdD#+Q!-509e~b`${_#kmH0~v$@A9G+4&!$xUX>}Tvj(bi^Xzn35lkKsBc>_x+-Me~~AsN4n${MUT^4RHDEpHsLZ&I@=71)YaCPT@~1Dxj{$keUNzJ|)_QLU}?+GL6LNLl2u zU_7-7yoCyIayoK(sFMhs&BT}YT8Oq{UR#6&zX#>mS+=W_$QdM4PVEWe6}ZzFURlbLMCz{^#^qKeQMUl~1bX|^99fCxYQ81ZpjNn^ z;w|c{Xh0#ELXGNh0_-^?n!PMTEO_?j>TMn^5*@M|S%|rpc4Up>Qa7s;gS#b9rg)+n z5Y^GL_Bp5X3vA~PVu zo(KehFahsU-HT4;^P=6Rk>wk9dk1kMz`<4L^04Tjl0YZdzeEO zy%O2zmp*KwByH2ckpi)a%&qMT*rOk zy=zkOWDg9k6kEJ@(_Fh@U8VqXt+-?#Zne!gC^FR3(4tz_Z7Hmc^mE)MmlC{nsi8E5JPBv~X)uRJs@k#Ujuy ziGGICYgSoceZh){Y=k9A%5r!;0j(7-qWw1qvoXP(sQG>e*cvBV{ekF3X~*+%f+N+XWuY_M3!UN-H|I0R>>wRQ7*yv*a0 z_mWy2j-Lqd?z0V{K=Dr)V>PwbKP2)?;kFv$1!?*iRK&=+( z07q42Azvf_LE&qbrm0G6TjM`1qx-{`OA^qsSKrk zIHyw5mWFVPOH)oAMHj>7%26sjCvBwG!!a1QVNNsD9vtl)^GU5sNaL>cC%Tg6*gLAt z8ioo;AjH@#Hu~or*2!3oYnplm(%(sMrr+JHHmX69UBRQ^P*+#`J^(Xnc zWApFsG4kUab4s)nEV`M}tIcy->OB$&-r5Nf?oo+lcO){BHn7fcD-@qor8dodGTH^u zqQ3h)av*FxSZJJNkV-n8!|R&Kr*P(1A^yx7q!%j@A(fg%Es&&1{4PMlW2SMRdRJ&~ zbBw;Qi5>SLvzb8!4&ZahBc7n+w-vl<4b#x`?-9>6^Xc(R60Fv9yF|=G91N)hdSj(_ z)6(ZHNa{}|jl@>&Ad*iZHoReoBrfb=73y)GIHEeKX0KRZh27!A)q;ZZ1cLC%by5Zkx*N+jK3-8-;2 zBHNs)CxUQu?~He?Anzh(tczY6SZpMRPqr9omByd}Rtx43;2Z(mgYD9tPkUF>Vrj)K zj;~K^<8g6oZ?)jcp_6*#ZvHK&uQ(i6Jhe%i#hmAgY%bZF$_IIFWs^Hp3}h=~eshjb ztz8){*)PCi84S0#+8td<>FfV#H@E1$NU`)BYIqYRNU~b1OXB>;p)6 zgG`&9B~O(8>}TZ%smI#J$fPzDJ7o4aC%$XXomo$I zchaR8=#`KE*5|crD79;EvRJH<&1>?rNrXq4no0J>u!IwXEnQRNJ%7 z1xlRq!yM$}jN-Jl#$oDkt>wx}WQla%Kp4AIhTQH%T2$;wtM1uc6?n$TTVj06)p;c2rakLLp_^nClVZlS_H* zwG_BgEyz1?-!lB!f#7=`@KTNnlH36s(EK%^NC^`2OC+r!9Ies zNw=w2Im@Z!)MbrKQcDiNCvxP-WCIyFi;RTpIq>Z4(!3j0+THc(A+h6H#PP-FR4OS@?pfa4fa$S`m| zU%K)(vC=I~-xKMiaryE?Bb((&Ib#ZMR z@JJ?~Qn$^_ig!AsiGmlu%aOn}EsFLa@GhQw8Fj3|dvdc|Na-vPk+7_B=Y}6ZDyJ*j z#3(bA)%8CK*?5tpxMyo`J!ZKChKc;bGLm2tK+X<1s!?qf&Cuz5KjE8eEA2{O2i-?D zi>YG%%FS?u#~4pEBk_%rFlJU9h6mP(JEYm1eb&<>_<`d4jUGARNEEw-L{iI;K~M-Q zf-+A(LrM|3duni(TKxBx7S{5ta$Lj7xK&_VI3OJM7{=<+M#U%8wV~c$$#ZjMERDKE z3$j!Du%K@s?)$BrW1JCE(nGz=T5h>6i*jxY8LwV9ifB$emQ^|3obbSo)h;0IV*=*l z^6Wj#K4ft6(#n`U#bt3k~EfCD|poob=FAbQv2s!lcn!&{A zN1a$|{{Ut2EyTAU=-PA+@h0Q@-SeT7a$}O946x5!0p7YL3&YIjRc%wqsGH%D^p(n3sONn#ZM3_-xh zxUOe4(C+qUYw)K~i$=6-T|`9{q>@V%^UMy?$Z|ezF|_T+*0RJa*^x6yBNTxdG< zms*S}(Y?IZ&u_^dT*NxE9^??DdepCaHZ^)Pkkl@&UANeRCY8cPA;%1Vi;kQV$9n37 zbupij*iYc~ztQZjwFUnGiHtEf+FmeJI0q}&IUr%HomJ(NNY~l9M^tagUpJ3a_m}Yx^=L(d(L2&&5M|pA&y+_ToMTN<28(1*=pIWl1p6? z%=kOSvESX;-hHdhlHNHXzATIKtoXycN2miCWzJ7bR<$X(T|TCCswu5H9*3mZ=y2*< zq|Ip*vfZT8MCzVmv+QBL8}BYMI2?Yp%H-^gxlzJ+w$Ap#(@wqnIF3nfm7s=UlsNUy3BJx@uw{7+- zUj+DiFDcy51Q5(3QS!)8e({SC0Lu_u_c-*f7N4|!r%YtI7op03Y*}gzK9yo;w(|b~ zcQ{VWPs~UACmG=9J!?)zwP2*4#)Za{r&#H$cNvv0l?+eOL+)S!U`|NrMM{%y#keS| zoEMEQZiSo{(8gkx{^1~w<0dl`NC3&;91)S9LtV5I=D%)-pNW%Evg_3MPX+j|PSHFc z4Xv)8Evzij;g9UQw(k+=c_d|vHyLh8uR3YDJNlh*f>B9yId2kp^Ip^~V6uwfGdhj` z0BFYT$@lrj2V5U&xKm13HhL=*gx)99tkT*hjOjO_$hNj<*#VH2ZWAD9hC8_8s_~P* zQWRS9Mcp?_y}x9=MV3jWQ|C!3+K7>m0b&mz=V;n7Qz;?!JF8tj{?^h6VASTey1OJs zBZ$a_QImJ!EGl|r6v2AwH-pYu~#yHMK_C!06&EJ;eir1e)xo&Wp_NK2R+Ukw6 z&IJPA-H1}svE9xGAy*jB8Lpai-%a0B3bXELcwYBYv$B&_ys|;|hDWuya8u2Q1Gw>? zyaU_46=1K+aw$too`a!92C1cLo+P!pjjy0qk|-Y$#<747NbWO{kSmI#wW7`8y~+^l zHVYl!_JXahsW?)QMvb-AT!QN-1C!1H=~Uyjij1yO)2}?4p2W$w=G`ppG8de#>>hG` zb6QF_S0O!2-xTX&*%n!XiMBe!1bqCbjJ6JO-`DV^PMepJRVJX1IM+0&VzrM|c^XYR za%5N#;rq7IdgJx4Mx5^XQRddAWz71WUxl+eKeVrzT>Lx1baKLTBToLQR z9V-dcly=iw8bXw2l6vSv2f}?<{;WD#!Dx`qEV6 zb@6|hgTr2Jtu3*irs)0()ik+gynsQdrtzp|R+3biHwI&#fVM!vJ*uZVk#H4r}LBXf+FKvGz;YgtEqmZ#@p|=Lb9y zo-5|(3vPX4mG&gnygLlB+&zSnT}ptok~SX>IrZcMYGUkDdK4nlY(Bys?D=GnS%Twk z-1H23OtnLf#FDHXdM|t7NC%brU-*ucp zrSJ0QcvPI{Q~Ll1FByOqTKK_i$W6D?E7K5>>+qSZ4sPLFd?Xs!rsz*5YfH zR?)L0(g`k9heu7MIgxqE#s{GHtAprECqWy-YOxSfDEAfX^Aq15f~L%?-4CA3UBxSf zL2^lv0ObJ~8$$FXd((@tGFLgdZ;hHXF)L0N4drvRJ~%kY2Pck%)`~YFyBx&#SDNhV zvC7ai1jLr0pEr3ZKqu4y&V9XasDl&kh@FWgBG#v2TnM#;$Q&Pe0G<6Pd^ zz0S{Kt)T?^RC8O+29p<;twNt@wDT2FT1bd0ykH&Qbc5?v86@@C%1NcBtk}_Y2ruWd z(5JJw(|kz5h_Raw3q}s&@XDVl8RKq4R7wplWvqLm;ZZkdqwH^gX5U82E+S-)%-I+q zg)N?$BepA@yB!GYq42Zc$0KTR`3Uj<0HVy#wd9doa)mj;-Hdx@X_E5yEAx>EB9FddHI2gt{`qqg9v7@4_ zzFG+%dj)rHIb}@b?m6eCJ*p%!X&Bi()y2K4Gh8tn6^RX#xM%O2eBFTWRjDY_y0ed0 z(~{Q7p4T{#v`W#R;SC#ZBw%4kBZHch>>{R+(8O+D#oNyLE$(7$umBvp;N%85!N*#u zX}Kv}>mr_6WHHANmu~`ujzBk}He0A>+ztw_AB{zd*v{8{IdiN-sl{h?8r@F=+gry0 z`LM{!Gt-`U$vCGM?=Msj;cLm9H^V#Yk>MR0+f0Rg)4mIzHa1X?Zq4QludX<3@%h&H zi2m`n)WZz_0CtySth$p?(XZz7t`iq-%A!ym8C^zkoM$_L&VH4F(YdAJtC&*yM39C1 zN)S&85{P-pcfkJuWGyBpNqUoCYBEJ=_*m!NA&HhXM+=ZJ4hYYs09Mwt>#s8*w0qCKrMq0A~sniVe$k;48)v*ScCGfY;#V|#I<7GzOVhh zCXFQ%!y1KxM`d7#8nWwe!{)NRsO=LiWKrMQY!ZR8$} zjj9O1;f-`bC%H0qIlEJBe++MNY{JK9p4SKFWpH`|2X?`$cSPvcr=s{ORnz=Asp=5g z%-0dL_nKws0V634BM9R^#1JcS$i{0Y*m74nUlIQRXn3PtNpE2hTU&_dxY$&M0J5%6 za(aL}WYs6izGHgXBDIf)r=1$+1$J$~HdlHS^JNVc-<3588 zf$DuLqA}3sl(i&V=`G_$jwSm`mt}bg=1c&izDItwE;lJM_K~Pv&*c5Qd3O?$8aT)h ztCCn?H$4F4n$A(NtYlBCLlvfvb*n{epKY*ZyIYx5I58pt~I&5QDftdswnv9w_b6<+3x0R7Q4hZMX`|LHS1} zxl|d^bH{a08*0{i)R9;_EEbHBm}4YI8n7+1CnSuMpRIaOqMUB`X9Y_9va&Vob!#h& zi+x3H{GCCa&A?t&$-#U#0CmqyVxmc^5Kb3Rx>2s!1W*>+z&Ca1~ z;pV%5>AH*oZ}kVv%LK9$urAUzJ{53Vp~Y`bHcnkvLz1+e)GedxdMAc_KWfpX&M}au921;V=^K+M%Xd6 z&T z*BW}9W}*G3q{%IvrOOM2jNAaHfU=&YagDu49MxGp_BBoP8Ki6PscGX+l~}qt32^z& zNFZ$(&m*6qqICIP#~E{Ib&YK`#+32f&hF6zx@0>e*?891)0T6@PmMa`zyIn7VP7BT5U7_w$xGEcQlmtu^i zRZk?G_4ci!S=`E05=UF%-G1Lv@Iq;K#cnkn8BM%S$P0N`ATqW&#{(XfjcD3@-OHt- zw^LhD&~2sAENozB)3r;@v5C?~jv}f7%c9`zVZp^_r|(~MX}V_}t66Fy&dO()yzo4U z6l@Cs7-34EKt~w|J?m&mKO-q7Po+t7swkT6RyYy%&l(1ei$*_-oSwM^aZxKk(lTtT z;<#+Itx_FKDRB%tB3?*xMqh#kO76!Uh|OIl+P8426@F*X;dM=F4O#1gz|K+Bb!? zjV2pqv3b_|cw#bS6=WkSU3+qSV-?9cxjl9}DZxb^kkDM9Ge+KbledyX6_JJkIKdgm zdgVr!=zssv`K}F8OG}%nH?@=+kr(ml(P6TS#D!k~63nA=kFTwG(v8=9bv}v{ac`y0 z_RCjWi$uS)P}f2=jz$bnFPK3;BCr`9_^wu;Q?XdnxwOm*PSJ*$K*MT3~XXf2?MSGwb2$7*D@o&>VJ-<+f@ z!0%E!@x^vik2HC1aa59oxsOdx5!nw5%c-MA@may;+(gf~2~`f!ySqQi2R%)3az1NV z>Xg!r_dIgrK=D_IWLWNe`%OaHF!DQ)A}rVgJ5B)G!1X5bbRP4oH3wXmz zc%z!?JKH#Uiq=`=MF$)awD5f?`$#^PB~z^(Te+QcsCbIjbQ*S;_M{E08dkVn&C$1U zfu4D)RN(hy%B@ATY)vnZ^$BBLI{qu7WGr#}*w@Q$Hv@sYraimX z6YOmQ;j*&2K63zMAcjU`(2Q~a0PCquqMEssERw?FB%V_wZa80E#hj3fsIOfOypeyehDgaE?d!FMSA&lIswyi;AoMe}4La^gogoh@Fk*|0 zKJBNL$ZxuNBC0G?OomGqgTVUL!@|(Au0_TfWmrkt`#}S!JQLQdn)M=P)v3sf!)c{h z*y++=EUfz?xKy{_xFU|YAnq;3;AzdbCt=e{F-Yy?k+kV8?ye(@X})*|3A$%@A1DDy z1#m&fY;#=pPeX2Fj?ms)onGQ)y4wD3QD3K*o{B$&k_B%qB8;P~ncEFBOxLutW2{3e zUU{Xg-rwbT=K!ym9dU*P<2?xLn&gc~2X+4d0O*}HHDjXi{2n>ftYb&N9ujNBjq_yTExcGN9ibbq=cUHQK#7Ga?q`#hP*lw5(8TT>eNyq~O zwO6&)(n{V$Dtx-d>*i$N+jz%9yq51&)6-niu0SZ-D!NH+a=BfyM>B?CbDV;Db64(3 zT|Qq>a-4o8e?s?z{6*oNX6>{^zc%`bQmtio3){;Q?cnW@0Oe07ZgGtB)}nN$9a*Gn z##?mx7fzL9Z#3^~dAn@cx@A`~l~e&ETz$|+2RxdKm$5yS)-NP`a8k|~40kdpGH;J= z)EN0l`LUlt%^`@ohMZ!K;GtG|TWz#sWyioYdWO28by!rrM%~M;0N8`!x7LE`R`roms6gSX*bcG zFNx!Zz%t#-6~*F4e#{(~0zkRtGC&v@J^SaiV3E|DF=muqX>c?{syCYnW>|1rB|s~~ z1IRhfC>dhLRD$7SiNtMnB4J!HApyW3kT+y!y&DOUd{Vg7G~Jgz9SGv|2$ohKanN9Z z4tHP-j0_BOnyP7EQ08dF@V$(d`fMqw38s6k=0=f8ourXT{n!}JI-HJ`GkWM!HuTRg zM7EaAEyc9X33MQ-Wnf6j9XK506*5h-lSA#TG`&YnORKr$S0J4y*l&2@7AU0 z+6#{Hh=$@z8=~^G^2`z`fZ81SEO0T?7#w#z)xq4Ij#_ADzmn2h#d!(>tL9`#0+K@$ zgU8ATHET_Z+~}jeicJn!t}f(8wOJ3ypgR`I?me;dWE_lER@8Sn>E)YGHc+M1mk_is zDzRp3uB9_h>?B_>TSc=WNYbv=`4}d##!5reTlzSRnm%-i(({ClzwY!&$K{nNCnMiHf zJGKVf^D^~5)l!qPMC{CMQ&6&EVz`mo-qrV8$QLdd8!Fl3s*DrGD;gq{o*=jpsno6f z;DHx0;KXstl5xpWzllE7)NT!&b10KjlT=p!07JWoi&kY&M5V@agZ}qw>DgPU%Kj_# zF1?(00h)I5j?`F_1fD_5bM1^`laSIcXwhmi%^Wu>MDT_3k0LxE;O)i^K<71#yp2<~ z=T+j*v+5omzqhx7MG{!cYdy8Pi33mkI2q0{^KZBRqN<=$iMnGp7CB4$j43ZwtkHV|f%;!NhEg-@Qd_0CCro(~c_# zxw1LvG~~C{7gB-c`+UnVdv{;mvMX*ZS8`&uNxWiS=`Xld@pA*$#rJU4YbMT zm_mZ+Ll)b|7|-3Pl~>fb(pJ#(zY^-2g6a;kVolMts{%e~;e_oDNWjV5Il!*CMKp3% zs?*T!G?lpVM~0z*N&;KLr6b^t>;T>JbIvi>jMqHUgxS?fSBf}oU&DHfT+cKygK-lv zxnO=!nZlLMcX|>>71K^?)@L1BZueW88h3}UBGfeh0Ji|k9kUmSbMq0mEsjroX0w$= zXX%+aB?t5O3D$uZ`9IK*3V)e4ckiE z^s=%o%Q~yVP+;wS#aK2D?xUZrT}P#fg|B;>OQ1!l={FJHmV*2`&u4QID4GUWBP!V3 zdUKrd$4Z`lR;{m*UeB2|*S}Ky9V*mg zEwpBQ@`n1Zy~K3U^_HC5z!q@EHS*mYWb1bmMynOxd!;xB2OLk{fwW1wry1k`@aA^{}kwrJ!3r^zR6*_lmqqrJmX;WLp5fW4yt?c87LA=NLPI#bZ%9H3*ci7`aQKUrX?Iui|;) z@mGlM1Q(jk>t6o=XIco-7}dgsciZWKg&dF0w4GHSc0Cs66sgKjnp-`Q?HX=@r|EWr zP~U3YRLIQ7ou!8zk0617Gr%?Hw{yPi>1}MLxzu82k>H6@WR4)s_HBhT_fHuh<7wzd zX)$hbI<3Y1{=GJ*=fxhMV2cy^X_jUnfB*xM0RWs(z8y=tS{)vrIGXCp+WzKK0+e{! zO67n*DLb=~#t#COtV=~rb56OqyPD-BSYfr8e(^zM0o*15{6RjH517c6A%U1&+yiRv ze7`lft~gdZdmQxkq*_-jTTdh=CcBnFWEs9h;v%5u484vA4M6Nr)pVUMNfS|l97g4q zFg|iXVnUPXeX&h8RgPj^HWPTaEUcG^a;&TukGcbO>By~9(2Fabnrhlro|F`@H|TcF z44K-&fhW2A>y}jR?v0}+?wQBlTiWXPlC7bS$x@E$4hqQJj=j5jR>`!1tCD!Tz*>#& zjUDm1SZ&}@f{azN!=X?}VaFXYT2ic&Ip+r>7r?q1vel!GSOk|StF~y)#bu1(ml@i3 zXSG#oiLC`nm9;w$6HPqu$t&9z*vyvm#@vPU3=eNXio%-L)Zb&9)okRB(j7`Q7bZAW zR1vp#&5|1(8=U**tw~1nwEna^Y`K$K z*iQvdKZ`yjn{N@oQ%=%%%^sP&G-hjah4T+~&p%qasZyhLtCv%rGL>4+FGRW?CdhVLqSP2VCcch>ah^v6xK7EvYQt@uJXW_!~ctb}qU0>Vzs?5x@)79i*N;N7B39URWnD ziJoLB-lI|YR{p1h}7sKILAk-enf zBv4Bn>E_Og(W(!XHyo8c52)=}v}l;};_BUl#)`_o5LW~Dpn?J9k;&^ttX}5Ul$N?p zgEVBt=G-J=Wb|On+&@F^3a;yyzUB^r zspy(zwXL42^Fx0INXl-GGKZny1DtIb=y|6lCfl~<#@0)*(`%k1@R*5iw5NG4)weRB zb%>IpDdF2k4#x)l0{iw2=Nhu*vDrrxZi@{W3RSkK&K&)F^{hRejonkwtb9&V#w)3$49OS*P^z1;jluShek&&p zMQiF|+-oVRdDnJLzEgn^D}_>|24FcSI0H3HKuFdxeXC8fn(3}0iaV&3EF|uc$>GQV z@y6U5o7voHBwNYJRYZ^=qT3Wj;9f=XfSK7B+Ng1=f-Sq z(U;D(F#u7~yOk%9ath})y*W7l0FjkSN?yIpzwO(v4=lQWi>)3hf*B&#bk&uuuVheP zbjupEM=k&?0LK{^t+^DJyZD$YjxN*t##(ra4;%>A)QS;{tgs~s_S>vGa+7ZH_`Vos|7WR##g2si+obO1MAz3MH0BJOEg-P?G6&}tVm zM{jH!$w_Wb5CZBPkmL`TXBptL|(6mm}HjXfXD!Y~ zG63&bN;XGSWp;X9)}w3vm-dYvWJOXXnL`yNlnkq9jz9vrUgtuInQy5j)#at_!UUBL z=Zu0%hUe~qjtKlc>Ff;}_SUyI)5SdF?QusY)QVsgOpY7oQo|!S88og9*&3H>Eo5u= z4Vz$+M-smZxEru|0OJ`ntVvr(i%Ib^NvhpR8_h1^C=Jia@`1M_t~vbraaAW_6!l9@ z07+qKXA9dr#Gyj2Baa6kczlDQ$2ra^E4@lH{7G(aEgCyqMJ`87?7H7=>lbYIcE)6O3SW;PtAq zNQTZ-Y3{8i=PvfxMvw->w%nHJ3H#aoD_f>TnmP>z&Nhe5MR%3r*rmZC3vyWJ82iKu znU0xGcx2RNi$EmFcX+S%wI6s}!L+d8@MSwxbI_V2{M~|ge(!T1P4Nb!;gy!!^*7t8 zmK6XT#~{uC!N46e?l`9?sq9+37oq4nM3!35k*HiSj`?C=G7+CHRSAr7&i?>v!dF@X zchtXc@d0Adq_VO`F_{~DYN9C>qQZ^{JaBrB^l~ztw>cXtukBZz=L~E~{{U5!fIr^# z=b^16tc4eHTm5>;uI7PMoG*~daKU%D$^3ZcrZ8bCEs@Xaw*jI^EYL@98~Lo@U~VI( zJ&5MFkC}|$V{c26>Q=aUrBP=ZBD23cWC}(TJ+O1@S<6C}rkvMpYc#|-o;FmqYM8463yYwF7oC%w%*<}cGi(Phubu`Q6j0xZ!8vZo(?&s7;{J}Pmx@+ z;eQWkw&@0!Y{KCph1N(Il7>_pvKRPy>C|$0sHryFWx@(N6AuhuN33tLjNUXvJeKY9 zzSiZ?5V$93$m1uaE`1AX+MHjC;;_^f>2&wXhhd%V8$`@8vGQ=Z#~_T?MJCaOT~L}I zh%YSRg3wL1V8ThTGq{nC3WgkU@7S8D!7^#hq*1)lt)_@eZFM3#7YeG1$kDmZGo16> zRYrCqP;B4u#m1N6J74U(nOsBUwD7(Fly7ywQ|w8=tZF`Yb6RlZRxI0U-V@Vx33W)! z@fxN3Ci4LPH~oW4gGJe$96e4J=c_Knlo6+@~4H6hcn=Y+RPr7weXtL%PAgwx>MQJXO1x>x&r`hkUEwKyC*GZV#VZ}3 zgtXaP$*_Q_GF>3te86(ekaO3HRa&I1w|z*ArCIYm7e)SOdv)PaW8!IUEj+)o-x#Gx z0Csp;K74>NwN49e?_4fdM`UzIr=o*t5rW<+=GnD|LZQLVo}Mt! zG<{;*!?qvA6F4Cmq2AWb~`#ZF4P*xvir;4_mx87Cv%Bu*Ehcmo7l^ z-FB;OCxe1B+ck^T=v6eC=JF&aNj%AL$b7UJ-eh7(^gVj<{HdKc(!`cmuPBxmZPw9- zjf3&DmE1r)XC9Q<4H>$>i5a}B5DLSbMIsOZW7zZ1{$SOpbrY40J-4P$wOmfAWtCZC zX#s7;un6NM6WX*^Gj8U+)!|ETvI}7$JDj_6i?|FNk)GbQ30>-Ga+@1Foli><2Dg+P zN(6;tlXf^iQ`0oqD{RaP4TEZ{%}CUgU1B)?kfvuYjnkZO4jaMePUUf z(s+@fy0#JR49AS99Q*a6*3c|fp5h~6J=V zRz!Wc`TlHeZ1IuCGAZ87NUz~yqfq-z-NIZl5h6;-wT1!8w;3Q2$Gthd2}fGmOgG_T ziDUaz#mmmQHv4g&Mh4Pro0`VQlK9i%96 z%0+oC-))al<_4pEE1$GVBpeivBPt0vJu{v&RS-Y_()rU+(`2`62@!IJ;Caeaw&2Lv z;Pb&85^KSPxvrV@byqEo`x}VkjwmE=DDF&>KfZh8t}81Sdz~EmvuXCm+9?oEX&>3* zyyWj(mF?L%3cOoH&)#-DA1CzwqxLa}d~IT$z_PC2f))8=aX9P_El zn?@A3TK2s625m}bv6+DKEQgYhvOEbFlH4%_^UZW62yBj7dr9u}JuBhO-kqRnH#Q374ldCl|f;~)|{j;Gp%D+!}DbgP?Yk~@V8 zB>w0>p7himGmxeXrZ|QQT+3Q zPX$V!;rHh>;%8Cn(G{*FM_G>5UzDf-65}KB818DBnlgMxW|Qf+0v)S7Bg}xQA9;Br zKBtgtT2E6d%JDLMJ7j!GaPI`G6}<6{*2T)Q`DB1W^(UMP)}!V1GN*hwL_os)0_^+@jyV}UsZokzuO_r2&@_!x?Xg3lP9u_7m&|*ZfenGZh7Neo0M%5S zZK~K*;WYi;r$(ADjP&`WX@13WK?)hmCL0;(Gm(xfnbfBHqoq@-x3l}iyVW&YOMfa| zCRuM+q}d61csJ*(w0TpgQ2 zu5!4@+YElp`FBiF6;Z4lTb7RT)Q{q(mC z6tGe9x6DU!*unbOGiHU`oj*fuFUhfmBDYXj0Ks1bbtj_&IHaDUO`NWor=^|Ta0vip z0Wup4f_MX{=sWkSxqS|j+godRE+9k<@S!N1n;$M&TNpn#1oi2Pn-Fm~Fg4GeC!Fi% zmX+g`e83u0(MjZF`sV=Fw@gV}Vyu>X87)w5o+TKBJndmA#&k`^=$7+G{uR zI|LS98?}zpPPdN2-z2I)pg1gk@PAX2T#}QUyVUd}1r=qX&iI4Cf7`lLh$Zu#a8m1;ck^w_)bdS4F9r(9U-MhLuBZRXqGSkJX?a}zUpk>@+| zyc~2s)utsrYpt1v8cUYXMz=d_NueKX`$fD^rO`86K?@fqIMf#pkU7RPjt8l(87m%w z(9*Ng^!AtSXXLn@RKX%11WUr9QP-2kI#IZrFFX*wnCO${NXwvJK$ccsGJf{peJXm2 z&797otOt9083+=rpD7q}Rfiztf3d5D)Yrwckrf+=Hk{#ip7Z{k|P-NLvLpT z7#YiFwO_Jn-sqQFEn8o>T_;J@bjG>7`widrn3_n)Syu@RSW>4YTPLcK*RMSZDJf_W zk1OW0I_dP-^*uJ${{T#sxY0XO`+L&nkl?vY{@`7(X}7-;xNY zK9*vMF2Y0xu;P`LMg~Ahrl6t6+WJPvu&2nO@B9pi6kP$Q4}3?=PIhAC;Fo z6rSMmf-9S;()Kf_yW26IcVZ)9h9`0mG7dd)#Z|6F%uf(rt@YlOadR>~yBEX+vdFWc z45WZL`FC)5=C!7+7G)_b#^-V1ZDva)XN&=G<}`CEhePw=Z8-#F9Gs4#xhh8N>x0nR z*Stx69=CYa8m#hd)nrCO$bMM> zgz58YVSG4->i+;&HXDJK;aY8lH^KxtBuGHY?&-L6&2(33E1Yy2 z*`0mHEzZg4#wZ z*3p*d%vl%ZDBV=4CnJt1Pe8FWNfxDXt50zh@2klaUt^XhA~o{J=#y)AV~?M#^dJ(n!p^49Vs*7|dBR2^5UyCxhQS)Jk@DE-|_xeP&+{`Feg< z>PJA4Ibuw4aq=Fy0B|=b$4Y7(`jsj2Xj!`P1;i6xOAb}0K(m$T2m~kxJwQ8!9G4TB z%ESGo;|pnE)Fwl1D>ADq0W?K$%Ed--ImzRi=xtMJqnnmhZl2xFdgAu;LAFK~NRve> zJQu21Nw5qP#xe-tkI%hqqt5rx=aolIZF_YqX8=IkfK^ zHTA9UnR>B1K&c=&ffod-=agKLk3+>wb}qy=I+u!Xw3L?Sb+^DM^CJ0hG-~)Kdkn5e z9CJyeiqO>4HF>VItF*OdT|(MPqi7kJ#UcTi_LH5#ha{Sp5KFnt-|5$uQ+>93h~%`8 z;^GoF72lAm3G^WHI#oL%rdF3j(>1+X&sEeF*76_#xQp+)C>~gBgV9$R?l|VEGHNyy zqMNzec#_6j+dCLYH!$538J;&Qgm3^{kOtlWAb>&SRteaodDZ8`-CjHCA5OZ$CiyMH z7RYS!tQ#0Oc+^%COrn+&Ol_jRc_C=C_NRz&201twA&0MVPWBp$Wl6Lpa7-7T zb8j+R`Gk_ncvSsJOs)6#7xT>*dJ$NOzjpAeGNsljiCjm*yoOdAO-nCkgLk;x$cBaC2 z3evD^rfq>*aI>rmEjqlyWKmu{-C%9$#PzcCKD z#~nGO;*t`P*&^P|3r zUAGd + + + \ No newline at end of file diff --git a/ch15/chapter15.playground/playground.xcworkspace/contents.xcworkspacedata b/ch15/chapter15.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100755 index 0000000..919434a --- /dev/null +++ b/ch15/chapter15.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ch15/chapter15.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch15/chapter15.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100755 index 0000000000000000000000000000000000000000..14e3d068615bfeee3a1c44da33904cf7c9b0d892 GIT binary patch literal 22934 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 literal 0 HcmV?d00001 diff --git a/ch15/chapter15.playground/timeline.xctimeline b/ch15/chapter15.playground/timeline.xctimeline new file mode 100755 index 0000000..bf468af --- /dev/null +++ b/ch15/chapter15.playground/timeline.xctimeline @@ -0,0 +1,6 @@ + + + + + From 6efead432883dd889a88cdd3b7bfd81217b1cb1b Mon Sep 17 00:00:00 2001 From: Marius Date: Wed, 27 Jul 2016 00:56:00 +0300 Subject: [PATCH 02/20] updated to Swift 3 --- ch01/chapter01.xcodeproj/project.pbxproj | 17 +- .../UserInterfaceState.xcuserstate | Bin 18776 -> 22924 bytes .../xcschemes/chapter01.xcscheme | 2 +- ch01/chapter01/AppDelegate.swift | 13 - .../AppIcon.appiconset/Contents.json | 58 -- ch01/chapter01/Base.lproj/Main.storyboard | 18 +- ch01/chapter01/ViewController.swift | 15 +- ch02/chapter02.xcodeproj/project.pbxproj | 17 +- .../UserInterfaceState.xcuserstate | Bin 14020 -> 17440 bytes .../xcschemes/chapter02.xcscheme | 2 +- .../AppIcon.appiconset/Contents.json | 58 -- ch02/chapter02/MetalView.swift | 34 +- ch03/chapter03.xcodeproj/project.pbxproj | 16 +- .../UserInterfaceState.xcuserstate | Bin 17515 -> 19763 bytes .../xcschemes/chapter03.xcscheme | 2 +- .../AppIcon.appiconset/Contents.json | 58 -- ch03/chapter03/MetalView.swift | 52 +- ch03/chapter03/Shaders.metal | 3 +- ch04/chapter04.xcodeproj/project.pbxproj | 20 +- .../UserInterfaceState.xcuserstate | Bin 14141 -> 19895 bytes .../xcschemes/chapter04.xcscheme | 2 +- ch04/chapter04/AppDelegate.swift | 13 - .../AppIcon.appiconset/Contents.json | 58 -- ch04/chapter04/Base.lproj/Main.storyboard | 8 +- ch04/chapter04/MetalView.swift | 63 +- ch04/chapter04/Shaders.metal | 3 +- ch04/chapter04/ViewController.swift | 27 - ch05/chapter05.xcodeproj/project.pbxproj | 16 +- .../UserInterfaceState.xcuserstate | Bin 24557 -> 26227 bytes .../xcschemes/chapter05.xcscheme | 2 +- .../AppIcon.appiconset/Contents.json | 58 -- ch05/chapter05/MetalView.swift | 79 +- ch06/chapter06.xcodeproj/project.pbxproj | 152 ++-- .../UserInterfaceState.xcuserstate | Bin 16131 -> 17929 bytes .../xcschemes/chapter06.xcscheme | 10 +- .../xcschemes/xcschememanagement.plist | 2 +- ch06/chapter06/AppDelegate.swift | 11 +- .../AppIcon.appiconset/Contents.json | 58 -- ch06/chapter06/Base.lproj/Main.storyboard | 687 +----------------- ch06/chapter06/Info.plist | 31 +- ch06/chapter06/MetalView.swift | 39 +- ch07/chapter07.xcodeproj/project.pbxproj | 16 +- .../UserInterfaceState.xcuserstate | Bin 14862 -> 18537 bytes .../xcschemes/chapter07.xcscheme | 2 +- .../AppIcon.appiconset/Contents.json | 58 -- ch07/chapter07/MathUtils.swift | 12 +- ch07/chapter07/MetalView.swift | 65 +- ch08/chapter08.playground/Contents.swift | 13 +- .../Resources/Shaders.metal | 4 +- .../Sources/MathUtils.swift | 12 +- .../Sources/MetalView.swift | 83 ++- .../contents.xcplayground | 2 +- .../UserInterfaceState.xcuserstate | Bin 14980 -> 16465 bytes ch09/chapter09.playground/Contents.swift | 13 +- .../Sources/MathUtils.swift | 2 +- .../Sources/MetalView.swift | 116 +-- .../UserInterfaceState.xcuserstate | Bin 24161 -> 27041 bytes ch09/chapter09.playground/timeline.xctimeline | 6 - ch10/chapter10.playground/Contents.swift | 13 +- .../Sources/MetalView.swift | 61 +- .../contents.xcplayground | 0 .../UserInterfaceState.xcuserstate | Bin 16567 -> 23421 bytes ch10/chapter10.playground/timeline.xctimeline | 6 - ch11/chapter11.playground/Contents.swift | 13 +- .../Sources/MetalView.swift | 71 +- .../UserInterfaceState.xcuserstate | Bin 18466 -> 19188 bytes ch11/chapter11.playground/timeline.xctimeline | 6 - ch12/chapter12.playground/Contents.swift | 10 +- .../Sources/MetalView.swift | 34 +- .../UserInterfaceState.xcuserstate | Bin 19598 -> 22543 bytes ch13/chapter13.playground/Contents.swift | 6 +- .../Sources/MetalView.swift | 32 +- .../UserInterfaceState.xcuserstate | Bin 19608 -> 20504 bytes ch14/chapter14.playground/Contents.swift | 4 +- .../Sources/MetalView.swift | 32 +- .../UserInterfaceState.xcuserstate | Bin 21322 -> 22481 bytes ch15/chapter15.playground/Contents.swift | 13 +- .../Sources/MetalView.swift | 73 +- .../contents.xcplayground | 0 .../UserInterfaceState.xcuserstate | Bin 22934 -> 23897 bytes ch15/chapter15.playground/timeline.xctimeline | 0 81 files changed, 684 insertions(+), 1798 deletions(-) delete mode 100644 ch01/chapter01/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ch02/chapter02/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ch03/chapter03/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ch04/chapter04/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ch04/chapter04/ViewController.swift delete mode 100644 ch05/chapter05/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ch06/chapter06/Assets.xcassets/AppIcon.appiconset/Contents.json mode change 100644 => 100755 ch06/chapter06/MetalView.swift delete mode 100644 ch07/chapter07/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ch09/chapter09.playground/timeline.xctimeline mode change 100755 => 100644 ch10/chapter10.playground/Contents.swift mode change 100755 => 100644 ch10/chapter10.playground/contents.xcplayground delete mode 100755 ch10/chapter10.playground/timeline.xctimeline delete mode 100644 ch11/chapter11.playground/timeline.xctimeline mode change 100755 => 100644 ch15/chapter15.playground/Contents.swift mode change 100755 => 100644 ch15/chapter15.playground/contents.xcplayground mode change 100755 => 100644 ch15/chapter15.playground/timeline.xctimeline diff --git a/ch01/chapter01.xcodeproj/project.pbxproj b/ch01/chapter01.xcodeproj/project.pbxproj index 2d5df56..6cbc653 100644 --- a/ch01/chapter01.xcodeproj/project.pbxproj +++ b/ch01/chapter01.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 29400C7D1C3AEE1300345568 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29400C7C1C3AEE1300345568 /* AppDelegate.swift */; }; 29400C7F1C3AEE1300345568 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29400C7E1C3AEE1300345568 /* ViewController.swift */; }; - 29400C811C3AEE1300345568 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 29400C801C3AEE1300345568 /* Assets.xcassets */; }; 29400C841C3AEE1300345568 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 29400C821C3AEE1300345568 /* Main.storyboard */; }; /* End PBXBuildFile section */ @@ -17,7 +16,6 @@ 29400C791C3AEE1300345568 /* chapter01.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = chapter01.app; sourceTree = BUILT_PRODUCTS_DIR; }; 29400C7C1C3AEE1300345568 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 29400C7E1C3AEE1300345568 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 29400C801C3AEE1300345568 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 29400C831C3AEE1300345568 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 29400C851C3AEE1300345568 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -53,7 +51,6 @@ isa = PBXGroup; children = ( 29400C7E1C3AEE1300345568 /* ViewController.swift */, - 29400C801C3AEE1300345568 /* Assets.xcassets */, 29400C821C3AEE1300345568 /* Main.storyboard */, 29400C851C3AEE1300345568 /* Info.plist */, 29400C7C1C3AEE1300345568 /* AppDelegate.swift */, @@ -88,11 +85,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29400C781C3AEE1300345568 = { CreatedOnToolsVersion = 7.2; + LastSwiftMigration = 0800; }; }; }; @@ -119,7 +117,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 29400C811C3AEE1300345568 /* Assets.xcassets in Resources */, 29400C841C3AEE1300345568 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -186,7 +183,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -224,7 +221,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; }; @@ -233,24 +230,25 @@ 29400C891C3AEE1300345568 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = chapter01/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter01; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; 29400C8A1C3AEE1300345568 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = chapter01/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter01; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -273,6 +271,7 @@ 29400C8A1C3AEE1300345568 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/ch01/chapter01.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch01/chapter01.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 18e3b2b0c68b7b24567c3efdd9c9379238c67e1c..ba92cabe6645acbd44ae86a22125b3d9d32e8a48 100644 GIT binary patch literal 22924 zcmd6P2UwF=+weKh3Y!2D2z&295+H<~gaiqSq9|@LLQoV4CZOW#Io-q6y=*H(?Y7g} zz4zOxZLQs{Z--So?a-?K{p2A)EVaJh^?qM}xGqSZbDsN*dyjJ#cD1*;y4C8v2qOlu zh(kOQWUFOsW~MB+J6&y#&Y3BWg-h(s-L6?FHfQtVHh4TOrQ6XJitvS7cZM+2kPP{t zFfqqXJZdO3`%Gh-RRfXcn4{=AgM~9-5Du&;n#by=WC$ zjn<&GXdOBS5k%3s=sa`@x)g0f*P`pt_2>q4Bf1%FM?281=nix@dH_9$9z~C#7to97 zCG;|S4Sj+>MW3P1(HH0d`ZxL#eT9BPKcl1Q7xXLo4gHReVGi@yABW&j9EKxsG>*Xu zI1#7g44i}2Sc8jj39i7Ecs#DbRy+ky#dGmIJRdjVX5539;}v)%?!~L{YP<%o#h2hq z@nv{D-hemaO?WfD2H%MLa6i5k--d6;ci^4)9(*sp58sa;!jIy|@C*1A{2~4te}fO= zZ}AWKS9~1*!5{`RJmbswF+ofy6UM|d2}~lB#3VC$jGECfS|*>-F=b3SQ^A-S3scKX zWg3`i%v@$3GoM+=EMa<>)eL1WU@l=cFdLaGm}{9EnOm3v<~HVTW*74ivzvK}d762Z z`4{sV^E&e}^9l1Q^BMCw^96H&Immp={J{Lk9Al2NnB`f44PZmrNH&g*XN%bqwv;Vn z%h?LHk~OeK*2Gq^X4b;iuoKzIY(3k+HnOu=8@rHgX4_Z?yMkTG_Og^cmpzZYj9t%O z#a_)`!(PkY#@^1}!QRQ<#oo>CWba|0V4q~4VxMN8VP9hZ#lFVA$L?d_XZN!ou%ED> zvj^ED?04)>?9Uv-u^h+ooWRLAA1;Us(ztXko6~Swu7oS)%D8f_f~(@j za}C@yZaUY<&EV#73%MoSQm∨5xbG+zM_b*UPQt&gIVI&ga&18@P?!ChkgZ8+RLb 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 Mc8+%#rnd9{0i2SlLI3~& delta 10426 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 LdAO|p%DVr5uKSBK diff --git a/ch01/chapter01.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter01.xcscheme b/ch01/chapter01.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter01.xcscheme index b3bc40d..2adec09 100644 --- a/ch01/chapter01.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter01.xcscheme +++ b/ch01/chapter01.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter01.xcscheme @@ -1,6 +1,6 @@ - + + - + @@ -673,8 +673,11 @@ - - + + + + + @@ -682,6 +685,11 @@ + + + + + diff --git a/ch01/chapter01/ViewController.swift b/ch01/chapter01/ViewController.swift index 65fd44c..994db6f 100644 --- a/ch01/chapter01/ViewController.swift +++ b/ch01/chapter01/ViewController.swift @@ -6,7 +6,7 @@ // Copyright © 2016 Marius Horga. All rights reserved. // -import Cocoa // contains Metal +import Cocoa class ViewController: NSViewController { @@ -15,10 +15,15 @@ class ViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() - if let device = MTLCreateSystemDefaultDevice() { - label.stringValue = "Your GPU name is:\n\(device.name!)" - } else { - label.stringValue = "Your GPU does not support Metal!" + /* The MTLCopyAllDevices() function is only available in macOS. + For iOS/tvOS devices use MTLCreateSystemDefaultDevice() instead. */ + let devices = MTLCopyAllDevices() + guard let _ = devices.first else { + fatalError("Your GPU does not support Metal!") + } + label.stringValue = "Your system has the following GPU(s):\n" + for device in devices { + label.stringValue += "\(device.name!)\n" } } } diff --git a/ch02/chapter02.xcodeproj/project.pbxproj b/ch02/chapter02.xcodeproj/project.pbxproj index c91e5c5..c8b196f 100644 --- a/ch02/chapter02.xcodeproj/project.pbxproj +++ b/ch02/chapter02.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 29E74AD11C4159D60023A39A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29E74AD01C4159D60023A39A /* AppDelegate.swift */; }; - 29E74AD51C4159D60023A39A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 29E74AD41C4159D60023A39A /* Assets.xcassets */; }; 29E74AD81C4159D60023A39A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 29E74AD61C4159D60023A39A /* Main.storyboard */; }; 29E74AE01C415A020023A39A /* MetalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29E74ADF1C415A020023A39A /* MetalView.swift */; }; /* End PBXBuildFile section */ @@ -16,7 +15,6 @@ /* Begin PBXFileReference section */ 29E74ACD1C4159D60023A39A /* chapter02.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = chapter02.app; sourceTree = BUILT_PRODUCTS_DIR; }; 29E74AD01C4159D60023A39A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 29E74AD41C4159D60023A39A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 29E74AD71C4159D60023A39A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 29E74AD91C4159D60023A39A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 29E74ADF1C415A020023A39A /* MetalView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MetalView.swift; sourceTree = ""; }; @@ -54,7 +52,6 @@ children = ( 29E74ADF1C415A020023A39A /* MetalView.swift */, 29E74AD61C4159D60023A39A /* Main.storyboard */, - 29E74AD41C4159D60023A39A /* Assets.xcassets */, 29E74AD91C4159D60023A39A /* Info.plist */, 29E74AD01C4159D60023A39A /* AppDelegate.swift */, ); @@ -88,11 +85,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29E74ACC1C4159D60023A39A = { CreatedOnToolsVersion = 7.2; + LastSwiftMigration = 0800; }; }; }; @@ -119,7 +117,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 29E74AD51C4159D60023A39A /* Assets.xcassets in Resources */, 29E74AD81C4159D60023A39A /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -186,7 +183,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -224,7 +221,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; }; @@ -233,24 +230,25 @@ 29E74ADD1C4159D60023A39A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = chapter02/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter02; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; 29E74ADE1C4159D60023A39A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = chapter02/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter02; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -273,6 +271,7 @@ 29E74ADE1C4159D60023A39A /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/ch02/chapter02.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch02/chapter02.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index e571953582ee938d05f774f15767fd88f8cd55fb..6326d60b7dc156aad9ce7b2ec8296ae12fbb11c6 100644 GIT binary patch delta 10636 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 PxaRjc&0pC6nH&BO?8;Ii delta 7865 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 delta 9931 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 diff --git a/ch03/chapter03.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter03.xcscheme b/ch03/chapter03.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter03.xcscheme index 6ec6aa7..2c78ce6 100644 --- a/ch03/chapter03.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter03.xcscheme +++ b/ch03/chapter03.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter03.xcscheme @@ -1,6 +1,6 @@ $901|&W><| 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 delta 8263 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 - + + - + @@ -668,7 +668,7 @@ - + diff --git a/ch04/chapter04/MetalView.swift b/ch04/chapter04/MetalView.swift index 847b46e..744f295 100644 --- a/ch04/chapter04/MetalView.swift +++ b/ch04/chapter04/MetalView.swift @@ -10,59 +10,56 @@ import MetalKit class MetalView: MTKView { - var vertex_buffer: MTLBuffer! - var rps: MTLRenderPipelineState! = nil - - override func drawRect(dirtyRect: NSRect) { - super.drawRect(dirtyRect) - render() - } - - func render() { - device = MTLCreateSystemDefaultDevice() - createBuffer() - registerShaders() - sendToGPU() - } + var commandQueue: MTLCommandQueue? + var rps: MTLRenderPipelineState? + var vertexBuffer: MTLBuffer? struct Vertex { var position: vector_float4 var color: vector_float4 - }; + } + + required init(coder: NSCoder) { + super.init(coder: coder) + createBuffer() + registerShaders() + } func createBuffer() { - let vertex_data = [Vertex(position: [-1.0, -1.0, 0.0, 1.0], color: [1, 0, 0, 1]), - Vertex(position: [ 1.0, -1.0, 0.0, 1.0], color: [0, 1, 0, 1]), - Vertex(position: [ 0.0, 1.0, 0.0, 1.0], color: [0, 0, 1, 1])] - vertex_buffer = device!.newBufferWithBytes(vertex_data, length: sizeof(Vertex) * 3, options:[]) + device = MTLCreateSystemDefaultDevice()! + commandQueue = device!.newCommandQueue() + let vertexData = [Vertex(position: [-1.0, -1.0, 0.0, 1.0], color: [1, 0, 0, 1]), + Vertex(position: [ 1.0, -1.0, 0.0, 1.0], color: [0, 1, 0, 1]), + Vertex(position: [ 0.0, 1.0, 0.0, 1.0], color: [0, 0, 1, 1])] + vertexBuffer = device!.newBuffer(withBytes: vertexData, length: sizeof(Vertex.self) * 3, options:[]) } func registerShaders() { let library = device!.newDefaultLibrary()! - let vertex_func = library.newFunctionWithName("vertex_func") - let frag_func = library.newFunctionWithName("fragment_func") + let vertex_func = library.newFunction(withName: "vertex_func") + let frag_func = library.newFunction(withName: "fragment_func") let rpld = MTLRenderPipelineDescriptor() rpld.vertexFunction = vertex_func rpld.fragmentFunction = frag_func - rpld.colorAttachments[0].pixelFormat = .BGRA8Unorm + rpld.colorAttachments[0].pixelFormat = .bgra8Unorm do { - try rps = device!.newRenderPipelineStateWithDescriptor(rpld) + try rps = device!.newRenderPipelineState(with: rpld) } catch let error { self.print("\(error)") } } - func sendToGPU() { - if let rpd = currentRenderPassDescriptor, drawable = currentDrawable { + override func draw(_ dirtyRect: NSRect) { + if let drawable = currentDrawable, let rpd = currentRenderPassDescriptor { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let command_buffer = device!.newCommandQueue().commandBuffer() - let command_encoder = command_buffer.renderCommandEncoderWithDescriptor(rpd) - command_encoder.setRenderPipelineState(rps) - command_encoder.setVertexBuffer(vertex_buffer, offset: 0, atIndex: 0) - command_encoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) - command_encoder.endEncoding() - command_buffer.presentDrawable(drawable) - command_buffer.commit() + let commandBuffer = commandQueue!.commandBuffer() + let commandEncoder = commandBuffer.renderCommandEncoder(with: rpd) + commandEncoder.setRenderPipelineState(rps!) + commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) + commandEncoder.drawPrimitives(.triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder.endEncoding() + commandBuffer.present(drawable) + commandBuffer.commit() } } } diff --git a/ch04/chapter04/Shaders.metal b/ch04/chapter04/Shaders.metal index 87188e5..958e762 100644 --- a/ch04/chapter04/Shaders.metal +++ b/ch04/chapter04/Shaders.metal @@ -14,7 +14,8 @@ struct Vertex { float4 color; }; -vertex Vertex vertex_func(constant Vertex *vertices [[buffer(0)]], uint vid [[vertex_id]]) { +vertex Vertex vertex_func(constant Vertex *vertices [[buffer(0)]], + uint vid [[vertex_id]]) { return vertices[vid]; } diff --git a/ch04/chapter04/ViewController.swift b/ch04/chapter04/ViewController.swift deleted file mode 100644 index d8740a2..0000000 --- a/ch04/chapter04/ViewController.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// ViewController.swift -// chapter04 -// -// Created by Marius on 1/26/16. -// Copyright © 2016 Marius Horga. All rights reserved. -// - -import Cocoa - -class ViewController: NSViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. - } - - override var representedObject: AnyObject? { - didSet { - // Update the view, if already loaded. - } - } - - -} - diff --git a/ch05/chapter05.xcodeproj/project.pbxproj b/ch05/chapter05.xcodeproj/project.pbxproj index 4ffaaea..c2db75a 100644 --- a/ch05/chapter05.xcodeproj/project.pbxproj +++ b/ch05/chapter05.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 298037231C62437900FBBC6A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298037221C62437900FBBC6A /* AppDelegate.swift */; }; - 298037271C62437900FBBC6A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 298037261C62437900FBBC6A /* Assets.xcassets */; }; 2980372A1C62437900FBBC6A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 298037281C62437900FBBC6A /* Main.storyboard */; }; 298037321C6243CB00FBBC6A /* MetalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298037311C6243CB00FBBC6A /* MetalView.swift */; }; 298037341C62440400FBBC6A /* Shaders.metal in Sources */ = {isa = PBXBuildFile; fileRef = 298037331C62440400FBBC6A /* Shaders.metal */; }; @@ -17,7 +16,6 @@ /* Begin PBXFileReference section */ 2980371F1C62437900FBBC6A /* chapter05.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = chapter05.app; sourceTree = BUILT_PRODUCTS_DIR; }; 298037221C62437900FBBC6A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 298037261C62437900FBBC6A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 298037291C62437900FBBC6A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 2980372B1C62437900FBBC6A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 298037311C6243CB00FBBC6A /* MetalView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MetalView.swift; sourceTree = ""; }; @@ -56,7 +54,6 @@ children = ( 298037311C6243CB00FBBC6A /* MetalView.swift */, 298037331C62440400FBBC6A /* Shaders.metal */, - 298037261C62437900FBBC6A /* Assets.xcassets */, 298037281C62437900FBBC6A /* Main.storyboard */, 2980372B1C62437900FBBC6A /* Info.plist */, 298037221C62437900FBBC6A /* AppDelegate.swift */, @@ -91,11 +88,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 2980371E1C62437900FBBC6A = { CreatedOnToolsVersion = 7.2.1; + LastSwiftMigration = 0800; }; }; }; @@ -122,7 +120,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 298037271C62437900FBBC6A /* Assets.xcassets in Resources */, 2980372A1C62437900FBBC6A /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -190,7 +187,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -228,7 +225,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; }; @@ -237,7 +234,6 @@ 2980372F1C62437900FBBC6A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = chapter05/Info.plist; @@ -245,19 +241,21 @@ PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter05; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; 298037301C62437900FBBC6A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = chapter05/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter05; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/ch05/chapter05.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch05/chapter05.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index d5df0befe731d91dc6b101348ba43a3736e6cccb..963e81b21c9ef556f23b3d27f76a0dee92f3553d 100644 GIT binary patch delta 14695 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 delta 13299 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 Mear8cKTGTW4>C?aZ~y=R diff --git a/ch05/chapter05.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter05.xcscheme b/ch05/chapter05.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter05.xcscheme index 1ad0d75..2f4f9c3 100644 --- a/ch05/chapter05.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter05.xcscheme +++ b/ch05/chapter05.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter05.xcscheme @@ -1,6 +1,6 @@ Matrix { + func translationMatrix(_ matrix: Matrix, _ position: float3) -> Matrix { + var matrix = matrix matrix.m[12] = position.x matrix.m[13] = position.y matrix.m[14] = position.z return matrix } - - func scalingMatrix(var matrix: Matrix, _ scale: Float) -> Matrix { + func scalingMatrix(_ matrix: Matrix, _ scale: Float) -> Matrix { + var matrix = matrix matrix.m[0] = scale matrix.m[5] = scale matrix.m[10] = scale matrix.m[15] = 1.0 return matrix } - - func rotationMatrix(var matrix: Matrix, _ rot: float3) -> Matrix { + func rotationMatrix(_ matrix: Matrix, _ rot: float3) -> Matrix { + var matrix = matrix matrix.m[0] = cos(rot.y) * cos(rot.z) matrix.m[4] = cos(rot.z) * sin(rot.x) * sin(rot.y) - cos(rot.x) * sin(rot.z) matrix.m[8] = cos(rot.x) * cos(rot.z) * sin(rot.y) + sin(rot.x) * sin(rot.z) @@ -70,8 +64,8 @@ class MetalView: MTKView { matrix.m[15] = 1.0 return matrix } - - func modelMatrix(var matrix: Matrix) -> Matrix { + func modelMatrix(_ matrix: Matrix) -> Matrix { + var matrix = matrix matrix = rotationMatrix(matrix, float3(0.0, 0.0, 0.1)) matrix = scalingMatrix(matrix, 0.25) matrix = translationMatrix(matrix, float3(0.0, 0.5, 0.0)) @@ -80,44 +74,45 @@ class MetalView: MTKView { } func createBuffers() { - let vertex_data = [ - Vertex(position: [-1.0, -1.0, 0.0, 1.0], color: [1, 0, 0, 1]), - Vertex(position: [ 1.0, -1.0, 0.0, 1.0], color: [0, 1, 0, 1]), - Vertex(position: [ 0.0, 1.0, 0.0, 1.0], color: [0, 0, 1, 1]) + device = MTLCreateSystemDefaultDevice()! + commandQueue = device!.newCommandQueue() + let vertex_data = [Vertex(position: [-1.0, -1.0, 0.0, 1.0], color: [1, 0, 0, 1]), + Vertex(position: [ 1.0, -1.0, 0.0, 1.0], color: [0, 1, 0, 1]), + Vertex(position: [ 0.0, 1.0, 0.0, 1.0], color: [0, 0, 1, 1]) ] - vertex_buffer = device!.newBufferWithBytes(vertex_data, length: sizeof(Vertex) * 3, options:[]) - uniform_buffer = device!.newBufferWithLength(sizeof(Float) * 16, options: []) - let bufferPointer = uniform_buffer.contents() - memcpy(bufferPointer, Matrix().modelMatrix(Matrix()).m, sizeof(Float) * 16) + vertexBuffer = device!.newBuffer(withBytes: vertex_data, length: sizeof(Vertex.self) * 3, options:[]) + uniformBuffer = device!.newBuffer(withLength: sizeof(Float.self) * 16, options: []) + let bufferPointer = uniformBuffer.contents() + memcpy(bufferPointer, Matrix().modelMatrix(Matrix()).m, sizeof(Float.self) * 16) } func registerShaders() { let library = device!.newDefaultLibrary()! - let vertex_func = library.newFunctionWithName("vertex_func") - let frag_func = library.newFunctionWithName("fragment_func") + let vertex_func = library.newFunction(withName: "vertex_func") + let frag_func = library.newFunction(withName: "fragment_func") let rpld = MTLRenderPipelineDescriptor() rpld.vertexFunction = vertex_func rpld.fragmentFunction = frag_func - rpld.colorAttachments[0].pixelFormat = .BGRA8Unorm + rpld.colorAttachments[0].pixelFormat = .bgra8Unorm do { - try rps = device!.newRenderPipelineStateWithDescriptor(rpld) + try rps = device!.newRenderPipelineState(with: rpld) } catch let error { self.print("\(error)") } } - func sendToGPU() { + override func draw(_ dirtyRect: NSRect) { if let rpd = currentRenderPassDescriptor, drawable = currentDrawable { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let command_buffer = device!.newCommandQueue().commandBuffer() - let command_encoder = command_buffer.renderCommandEncoderWithDescriptor(rpd) - command_encoder.setRenderPipelineState(rps) - command_encoder.setVertexBuffer(vertex_buffer, offset: 0, atIndex: 0) - command_encoder.setVertexBuffer(uniform_buffer, offset: 0, atIndex: 1) - command_encoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) - command_encoder.endEncoding() - command_buffer.presentDrawable(drawable) - command_buffer.commit() + let commandBuffer = device!.newCommandQueue().commandBuffer() + let commandEncoder = commandBuffer.renderCommandEncoder(with: rpd) + commandEncoder.setRenderPipelineState(rps!) + commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) + commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) + commandEncoder.drawPrimitives(.triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder.endEncoding() + commandBuffer.present(drawable) + commandBuffer.commit() } } } diff --git a/ch06/chapter06.xcodeproj/project.pbxproj b/ch06/chapter06.xcodeproj/project.pbxproj index d5b5d90..04ca30b 100644 --- a/ch06/chapter06.xcodeproj/project.pbxproj +++ b/ch06/chapter06.xcodeproj/project.pbxproj @@ -7,23 +7,21 @@ objects = { /* Begin PBXBuildFile section */ - 292765421C6BDE3400094CA9 /* MetalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292765411C6BDE3400094CA9 /* MetalView.swift */; }; - 29DB1AF61C6BDDD500BCC31B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29DB1AF51C6BDDD500BCC31B /* AppDelegate.swift */; }; - 29DB1AFA1C6BDDD500BCC31B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 29DB1AF91C6BDDD500BCC31B /* Assets.xcassets */; }; - 29DB1AFD1C6BDDD500BCC31B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 29DB1AFB1C6BDDD500BCC31B /* Main.storyboard */; }; + 298451301D47EF08008D81B9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2984512F1D47EF08008D81B9 /* AppDelegate.swift */; }; + 298451351D47EF08008D81B9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 298451331D47EF08008D81B9 /* Main.storyboard */; }; + 298451421D47F0BF008D81B9 /* MetalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298451411D47F0BF008D81B9 /* MetalView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 292765411C6BDE3400094CA9 /* MetalView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MetalView.swift; sourceTree = ""; }; - 29DB1AF21C6BDDD500BCC31B /* chapter06.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = chapter06.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 29DB1AF51C6BDDD500BCC31B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 29DB1AF91C6BDDD500BCC31B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 29DB1AFC1C6BDDD500BCC31B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 29DB1AFE1C6BDDD500BCC31B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2984512C1D47EF08008D81B9 /* chapter06.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = chapter06.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2984512F1D47EF08008D81B9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 298451341D47EF08008D81B9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 2984513B1D47EF08008D81B9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 298451411D47F0BF008D81B9 /* MetalView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MetalView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 29DB1AEF1C6BDDD500BCC31B /* Frameworks */ = { + 298451291D47EF08008D81B9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -33,30 +31,29 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29DB1AE91C6BDDD400BCC31B = { + 298451231D47EF07008D81B9 = { isa = PBXGroup; children = ( - 29DB1AF41C6BDDD500BCC31B /* chapter06 */, - 29DB1AF31C6BDDD500BCC31B /* Products */, + 2984512E1D47EF08008D81B9 /* chapter06 */, + 2984512D1D47EF08008D81B9 /* Products */, ); sourceTree = ""; }; - 29DB1AF31C6BDDD500BCC31B /* Products */ = { + 2984512D1D47EF08008D81B9 /* Products */ = { isa = PBXGroup; children = ( - 29DB1AF21C6BDDD500BCC31B /* chapter06.app */, + 2984512C1D47EF08008D81B9 /* chapter06.app */, ); name = Products; sourceTree = ""; }; - 29DB1AF41C6BDDD500BCC31B /* chapter06 */ = { + 2984512E1D47EF08008D81B9 /* chapter06 */ = { isa = PBXGroup; children = ( - 292765411C6BDE3400094CA9 /* MetalView.swift */, - 29DB1AF91C6BDDD500BCC31B /* Assets.xcassets */, - 29DB1AFB1C6BDDD500BCC31B /* Main.storyboard */, - 29DB1AFE1C6BDDD500BCC31B /* Info.plist */, - 29DB1AF51C6BDDD500BCC31B /* AppDelegate.swift */, + 298451411D47F0BF008D81B9 /* MetalView.swift */, + 298451331D47EF08008D81B9 /* Main.storyboard */, + 2984513B1D47EF08008D81B9 /* Info.plist */, + 2984512F1D47EF08008D81B9 /* AppDelegate.swift */, ); path = chapter06; sourceTree = ""; @@ -64,13 +61,13 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 29DB1AF11C6BDDD500BCC31B /* chapter06 */ = { + 2984512B1D47EF08008D81B9 /* chapter06 */ = { isa = PBXNativeTarget; - buildConfigurationList = 29DB1B011C6BDDD500BCC31B /* Build configuration list for PBXNativeTarget "chapter06" */; + buildConfigurationList = 2984513E1D47EF08008D81B9 /* Build configuration list for PBXNativeTarget "chapter06" */; buildPhases = ( - 29DB1AEE1C6BDDD500BCC31B /* Sources */, - 29DB1AEF1C6BDDD500BCC31B /* Frameworks */, - 29DB1AF01C6BDDD500BCC31B /* Resources */, + 298451281D47EF08008D81B9 /* Sources */, + 298451291D47EF08008D81B9 /* Frameworks */, + 2984512A1D47EF08008D81B9 /* Resources */, ); buildRules = ( ); @@ -78,25 +75,28 @@ ); name = chapter06; productName = chapter06; - productReference = 29DB1AF21C6BDDD500BCC31B /* chapter06.app */; + productReference = 2984512C1D47EF08008D81B9 /* chapter06.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 29DB1AEA1C6BDDD400BCC31B /* Project object */ = { + 298451241D47EF07008D81B9 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0720; - ORGANIZATIONNAME = "Marius Horga"; + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 0800; + ORGANIZATIONNAME = Marius; TargetAttributes = { - 29DB1AF11C6BDDD500BCC31B = { - CreatedOnToolsVersion = 7.2.1; + 2984512B1D47EF08008D81B9 = { + CreatedOnToolsVersion = 8.0; + DevelopmentTeam = C2X9Q6VFVJ; + DevelopmentTeamName = "Marius Horga"; + ProvisioningStyle = Automatic; }; }; }; - buildConfigurationList = 29DB1AED1C6BDDD400BCC31B /* Build configuration list for PBXProject "chapter06" */; + buildConfigurationList = 298451271D47EF07008D81B9 /* Build configuration list for PBXProject "chapter06" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; @@ -104,45 +104,44 @@ en, Base, ); - mainGroup = 29DB1AE91C6BDDD400BCC31B; - productRefGroup = 29DB1AF31C6BDDD500BCC31B /* Products */; + mainGroup = 298451231D47EF07008D81B9; + productRefGroup = 2984512D1D47EF08008D81B9 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 29DB1AF11C6BDDD500BCC31B /* chapter06 */, + 2984512B1D47EF08008D81B9 /* chapter06 */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 29DB1AF01C6BDDD500BCC31B /* Resources */ = { + 2984512A1D47EF08008D81B9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 29DB1AFA1C6BDDD500BCC31B /* Assets.xcassets in Resources */, - 29DB1AFD1C6BDDD500BCC31B /* Main.storyboard in Resources */, + 298451351D47EF08008D81B9 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 29DB1AEE1C6BDDD500BCC31B /* Sources */ = { + 298451281D47EF08008D81B9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 292765421C6BDE3400094CA9 /* MetalView.swift in Sources */, - 29DB1AF61C6BDDD500BCC31B /* AppDelegate.swift in Sources */, + 298451421D47F0BF008D81B9 /* MetalView.swift in Sources */, + 298451301D47EF08008D81B9 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 29DB1AFB1C6BDDD500BCC31B /* Main.storyboard */ = { + 298451331D47EF08008D81B9 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 29DB1AFC1C6BDDD500BCC31B /* Base */, + 298451341D47EF08008D81B9 /* Base */, ); name = Main.storyboard; sourceTree = ""; @@ -150,10 +149,11 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 29DB1AFF1C6BDDD500BCC31B /* Debug */ = { + 2984513C1D47EF08008D81B9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -161,13 +161,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -186,18 +187,21 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 29DB1B001C6BDDD500BCC31B /* Release */ = { + 2984513D1D47EF08008D81B9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -205,13 +209,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; @@ -224,58 +229,63 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; }; name = Release; }; - 29DB1B021C6BDDD500BCC31B /* Debug */ = { + 2984513F1D47EF08008D81B9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - COMBINE_HIDPI_IMAGES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = chapter06/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter06; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.metalkit.chapter06; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 3.0; }; name = Debug; }; - 29DB1B031C6BDDD500BCC31B /* Release */ = { + 298451401D47EF08008D81B9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - COMBINE_HIDPI_IMAGES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = chapter06/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter06; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.metalkit.chapter06; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 29DB1AED1C6BDDD400BCC31B /* Build configuration list for PBXProject "chapter06" */ = { + 298451271D47EF07008D81B9 /* Build configuration list for PBXProject "chapter06" */ = { isa = XCConfigurationList; buildConfigurations = ( - 29DB1AFF1C6BDDD500BCC31B /* Debug */, - 29DB1B001C6BDDD500BCC31B /* Release */, + 2984513C1D47EF08008D81B9 /* Debug */, + 2984513D1D47EF08008D81B9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 29DB1B011C6BDDD500BCC31B /* Build configuration list for PBXNativeTarget "chapter06" */ = { + 2984513E1D47EF08008D81B9 /* Build configuration list for PBXNativeTarget "chapter06" */ = { isa = XCConfigurationList; buildConfigurations = ( - 29DB1B021C6BDDD500BCC31B /* Debug */, - 29DB1B031C6BDDD500BCC31B /* Release */, + 2984513F1D47EF08008D81B9 /* Debug */, + 298451401D47EF08008D81B9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 29DB1AEA1C6BDDD400BCC31B /* Project object */; + rootObject = 298451241D47EF07008D81B9 /* Project object */; } diff --git a/ch06/chapter06.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch06/chapter06.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index b174838decb42b20cabeb9e84eddc8efbcdd903a..8f4dc11fe8b672fc60db4534ca171ed98e993112 100644 GIT binary patch literal 17929 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 a%&W_5&s&stzF7PaBL0;W2G&G*p8o+d8v-8y diff --git a/ch06/chapter06.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter06.xcscheme b/ch06/chapter06.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter06.xcscheme index d92b1b7..af7d21a 100644 --- a/ch06/chapter06.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter06.xcscheme +++ b/ch06/chapter06.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter06.xcscheme @@ -1,6 +1,6 @@ @@ -32,7 +32,7 @@ @@ -55,7 +55,7 @@ runnableDebuggingMode = "0"> @@ -74,7 +74,7 @@ runnableDebuggingMode = "0"> diff --git a/ch06/chapter06.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/xcschememanagement.plist b/ch06/chapter06.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/xcschememanagement.plist index 8e90fc7..9b1a329 100644 --- a/ch06/chapter06.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/ch06/chapter06.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/xcschememanagement.plist @@ -12,7 +12,7 @@ SuppressBuildableAutocreation - 29DB1AF11C6BDDD500BCC31B + 2984512B1D47EF08008D81B9 primary diff --git a/ch06/chapter06/AppDelegate.swift b/ch06/chapter06/AppDelegate.swift index 247cfb6..b492ba3 100644 --- a/ch06/chapter06/AppDelegate.swift +++ b/ch06/chapter06/AppDelegate.swift @@ -2,13 +2,14 @@ // AppDelegate.swift // chapter06 // -// Created by Marius on 2/10/16. -// Copyright © 2016 Marius Horga. All rights reserved. +// Created by Marius on 7/26/16. +// Copyright © 2016 Marius. All rights reserved. // -import Cocoa +import UIKit -@NSApplicationMain -class AppDelegate: NSObject, NSApplicationDelegate { +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? } diff --git a/ch06/chapter06/Assets.xcassets/AppIcon.appiconset/Contents.json b/ch06/chapter06/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 2db2b1c..0000000 --- a/ch06/chapter06/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "images" : [ - { - "idiom" : "mac", - "size" : "16x16", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "16x16", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "32x32", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "32x32", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "128x128", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "128x128", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "512x512", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "512x512", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ch06/chapter06/Base.lproj/Main.storyboard b/ch06/chapter06/Base.lproj/Main.storyboard index 46163bb..5327e07 100644 --- a/ch06/chapter06/Base.lproj/Main.storyboard +++ b/ch06/chapter06/Base.lproj/Main.storyboard @@ -1,682 +1,27 @@ - - + + - - + + + - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - + + + + + + + + + - + - diff --git a/ch06/chapter06/Info.plist b/ch06/chapter06/Info.plist index 69d1345..e4ece02 100644 --- a/ch06/chapter06/Info.plist +++ b/ch06/chapter06/Info.plist @@ -6,8 +6,6 @@ en CFBundleExecutable $(EXECUTABLE_NAME) - CFBundleIconFile - CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -18,17 +16,28 @@ APPL CFBundleShortVersionString 1.0 - CFBundleSignature - ???? CFBundleVersion 1 - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - Copyright © 2016 Marius Horga. All rights reserved. - NSMainStoryboardFile + LSRequiresIPhoneOS + + UILaunchStoryboardName Main - NSPrincipalClass - NSApplication + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + diff --git a/ch06/chapter06/MetalView.swift b/ch06/chapter06/MetalView.swift old mode 100644 new mode 100755 index 33682be..58fccb5 --- a/ch06/chapter06/MetalView.swift +++ b/ch06/chapter06/MetalView.swift @@ -6,39 +6,36 @@ // Copyright © 2016 Marius Horga. All rights reserved. // -import Cocoa +import UIKit -class MetalView: NSView { +class MetalView: UIView { - override func drawRect(dirtyRect: NSRect) { - super.drawRect(dirtyRect) - render() + var commandQueue: MTLCommandQueue! + + var metalLayer: CAMetalLayer { + return self.layer as! CAMetalLayer } override class func layerClass() -> AnyClass { return CAMetalLayer.self } - var metalLayer: CAMetalLayer { - return layer as! CAMetalLayer + override func didMoveToWindow() { + super.didMoveToWindow() + let device = MTLCreateSystemDefaultDevice()! + commandQueue = device.newCommandQueue() + redraw() } - func render() { - let device = MTLCreateSystemDefaultDevice()! - metalLayer.device = device - metalLayer.pixelFormat = .BGRA8Unorm - let drawable = metalLayer.nextDrawable() - let texture = drawable!.texture - let rpd = MTLRenderPassDescriptor() - rpd.colorAttachments[0].texture = texture - rpd.colorAttachments[0].loadAction = .Clear - rpd.colorAttachments[0].storeAction = .Store - rpd.colorAttachments[0].clearColor = MTLClearColor(red: 1, green: 0, blue: 0, alpha: 1) - let commandQueue = device.newCommandQueue() + private func redraw() { + let drawable = metalLayer.nextDrawable()! + let descriptor = MTLRenderPassDescriptor() + descriptor.colorAttachments[0].clearColor = MTLClearColorMake(0, 1, 1, 1) + descriptor.colorAttachments[0].texture = drawable.texture let commandBuffer = commandQueue.commandBuffer() - let commandEncoder = commandBuffer.renderCommandEncoderWithDescriptor(rpd) + let commandEncoder = commandBuffer.renderCommandEncoder(with: descriptor) commandEncoder.endEncoding() - commandBuffer.presentDrawable(drawable!) + commandBuffer.present(drawable) commandBuffer.commit() } } diff --git a/ch07/chapter07.xcodeproj/project.pbxproj b/ch07/chapter07.xcodeproj/project.pbxproj index bc672e5..2bb7acb 100644 --- a/ch07/chapter07.xcodeproj/project.pbxproj +++ b/ch07/chapter07.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 29B186261C84FF5800E9C0AA /* MathUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B186251C84FF5800E9C0AA /* MathUtils.swift */; }; 29D8782A1C84D2B0007B5F17 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29D878291C84D2B0007B5F17 /* AppDelegate.swift */; }; - 29D8782E1C84D2B0007B5F17 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 29D8782D1C84D2B0007B5F17 /* Assets.xcassets */; }; 29D878311C84D2B0007B5F17 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 29D8782F1C84D2B0007B5F17 /* Main.storyboard */; }; 29D878391C84D309007B5F17 /* MetalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29D878381C84D309007B5F17 /* MetalView.swift */; }; 29D8783B1C84D335007B5F17 /* Shaders.metal in Sources */ = {isa = PBXBuildFile; fileRef = 29D8783A1C84D335007B5F17 /* Shaders.metal */; }; @@ -19,7 +18,6 @@ 29B186251C84FF5800E9C0AA /* MathUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MathUtils.swift; sourceTree = ""; }; 29D878261C84D2B0007B5F17 /* chapter07.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = chapter07.app; sourceTree = BUILT_PRODUCTS_DIR; }; 29D878291C84D2B0007B5F17 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 29D8782D1C84D2B0007B5F17 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 29D878301C84D2B0007B5F17 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 29D878321C84D2B0007B5F17 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 29D878381C84D309007B5F17 /* MetalView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MetalView.swift; sourceTree = ""; }; @@ -59,7 +57,6 @@ 29D878381C84D309007B5F17 /* MetalView.swift */, 29B186251C84FF5800E9C0AA /* MathUtils.swift */, 29D8783A1C84D335007B5F17 /* Shaders.metal */, - 29D8782D1C84D2B0007B5F17 /* Assets.xcassets */, 29D8782F1C84D2B0007B5F17 /* Main.storyboard */, 29D878321C84D2B0007B5F17 /* Info.plist */, 29D878291C84D2B0007B5F17 /* AppDelegate.swift */, @@ -94,11 +91,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29D878251C84D2B0007B5F17 = { CreatedOnToolsVersion = 7.2.1; + LastSwiftMigration = 0800; }; }; }; @@ -125,7 +123,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 29D8782E1C84D2B0007B5F17 /* Assets.xcassets in Resources */, 29D878311C84D2B0007B5F17 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -194,7 +191,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -232,7 +229,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; }; @@ -241,24 +238,25 @@ 29D878361C84D2B0007B5F17 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = chapter07/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter07; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; 29D878371C84D2B0007B5F17 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = chapter07/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter07; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/ch07/chapter07.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch07/chapter07.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 4118b493aa3470c7a114e07688642fe7cfe766f3..43480b97236a21fb94fc1511db74b7fd7ed640c0 100644 GIT binary patch delta 10852 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 Matrix { + func translationMatrix(_ matrix: Matrix, _ position: float3) -> Matrix { + var matrix = matrix matrix.m[12] = position.x matrix.m[13] = position.y matrix.m[14] = position.z return matrix } - func scalingMatrix(var matrix: Matrix, _ scale: Float) -> Matrix { + func scalingMatrix(_ matrix: Matrix, _ scale: Float) -> Matrix { + var matrix = matrix matrix.m[0] = scale matrix.m[5] = scale matrix.m[10] = scale @@ -39,7 +41,8 @@ struct Matrix { return matrix } - func rotationMatrix(var matrix: Matrix, _ rot: float3) -> Matrix { + func rotationMatrix(_ matrix: Matrix, _ rot: float3) -> Matrix { + var matrix = matrix matrix.m[0] = cos(rot.y) * cos(rot.z) matrix.m[4] = cos(rot.z) * sin(rot.x) * sin(rot.y) - cos(rot.x) * sin(rot.z) matrix.m[8] = cos(rot.x) * cos(rot.z) * sin(rot.y) + sin(rot.x) * sin(rot.z) @@ -53,7 +56,8 @@ struct Matrix { return matrix } - func modelMatrix(var matrix: Matrix) -> Matrix { + func modelMatrix(_ matrix: Matrix) -> Matrix { + var matrix = matrix matrix = rotationMatrix(matrix, float3(0.0, 0.0, 0.1)) matrix = scalingMatrix(matrix, 0.25) matrix = translationMatrix(matrix, float3(0.0, 0.5, 0.0)) diff --git a/ch07/chapter07/MetalView.swift b/ch07/chapter07/MetalView.swift index a042c98..975c572 100644 --- a/ch07/chapter07/MetalView.swift +++ b/ch07/chapter07/MetalView.swift @@ -10,57 +10,58 @@ import MetalKit class MetalView: MTKView { - var vertex_buffer: MTLBuffer! - var uniform_buffer: MTLBuffer! - var rps: MTLRenderPipelineState! = nil + var commandQueue: MTLCommandQueue? + var rps: MTLRenderPipelineState? + var vertexBuffer: MTLBuffer! + var uniformBuffer: MTLBuffer! required init(coder: NSCoder) { super.init(coder: coder) - device = MTLCreateSystemDefaultDevice() createBuffers() registerShaders() } - override func drawRect(dirtyRect: NSRect) { - super.drawRect(dirtyRect) - if let rpd = currentRenderPassDescriptor, drawable = currentDrawable { - rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let command_buffer = device!.newCommandQueue().commandBuffer() - let command_encoder = command_buffer.renderCommandEncoderWithDescriptor(rpd) - command_encoder.setRenderPipelineState(rps) - command_encoder.setVertexBuffer(vertex_buffer, offset: 0, atIndex: 0) - command_encoder.setVertexBuffer(uniform_buffer, offset: 0, atIndex: 1) - command_encoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) - command_encoder.endEncoding() - command_buffer.presentDrawable(drawable) - command_buffer.commit() - } - } - func createBuffers() { - let vertex_data = [ - Vertex(position: [-1.0, -1.0, 0.0, 1.0], color: [1, 0, 0, 1]), - Vertex(position: [ 1.0, -1.0, 0.0, 1.0], color: [0, 1, 0, 1]), - Vertex(position: [ 0.0, 1.0, 0.0, 1.0], color: [0, 0, 1, 1]) + device = MTLCreateSystemDefaultDevice()! + commandQueue = device!.newCommandQueue() + let vertex_data = [Vertex(position: [-1.0, -1.0, 0.0, 1.0], color: [1, 0, 0, 1]), + Vertex(position: [ 1.0, -1.0, 0.0, 1.0], color: [0, 1, 0, 1]), + Vertex(position: [ 0.0, 1.0, 0.0, 1.0], color: [0, 0, 1, 1]) ] - vertex_buffer = device!.newBufferWithBytes(vertex_data, length: sizeof(Vertex) * 3, options:[]) - uniform_buffer = device!.newBufferWithLength(sizeof(Float) * 16, options: []) - let bufferPointer = uniform_buffer.contents() - memcpy(bufferPointer, Matrix().modelMatrix(Matrix()).m, sizeof(Float) * 16) + vertexBuffer = device!.newBuffer(withBytes: vertex_data, length: sizeof(Vertex.self) * 3, options:[]) + uniformBuffer = device!.newBuffer(withLength: sizeof(Float.self) * 16, options: []) + let bufferPointer = uniformBuffer.contents() + memcpy(bufferPointer, Matrix().modelMatrix(Matrix()).m, sizeof(Float.self) * 16) } func registerShaders() { let library = device!.newDefaultLibrary()! - let vertex_func = library.newFunctionWithName("vertex_func") - let frag_func = library.newFunctionWithName("fragment_func") + let vertex_func = library.newFunction(withName: "vertex_func") + let frag_func = library.newFunction(withName: "fragment_func") let rpld = MTLRenderPipelineDescriptor() rpld.vertexFunction = vertex_func rpld.fragmentFunction = frag_func - rpld.colorAttachments[0].pixelFormat = .BGRA8Unorm + rpld.colorAttachments[0].pixelFormat = .bgra8Unorm do { - try rps = device!.newRenderPipelineStateWithDescriptor(rpld) + try rps = device!.newRenderPipelineState(with: rpld) } catch let error { self.print("\(error)") } } + + override func draw(_ dirtyRect: NSRect) { + super.draw(dirtyRect) + if let rpd = currentRenderPassDescriptor, drawable = currentDrawable { + rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) + let commandBuffer = device!.newCommandQueue().commandBuffer() + let commandEncoder = commandBuffer.renderCommandEncoder(with: rpd) + commandEncoder.setRenderPipelineState(rps!) + commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) + commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) + commandEncoder.drawPrimitives(.triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder.endEncoding() + commandBuffer.present(drawable) + commandBuffer.commit() + } + } } diff --git a/ch08/chapter08.playground/Contents.swift b/ch08/chapter08.playground/Contents.swift index 96ca6ff..694d377 100644 --- a/ch08/chapter08.playground/Contents.swift +++ b/ch08/chapter08.playground/Contents.swift @@ -1,8 +1,9 @@ -import Cocoa -import XCPlayground +import MetalKit +import PlaygroundSupport -let device = MTLCreateSystemDefaultDevice()! -let frame = NSRect(x: 0, y: 0, width: 300, height: 300) -let view = MetalView(frame: frame, device: device) -XCPlaygroundPage.currentPage.liveView = view +let frame = NSRect(x: 0, y: 0, width: 400, height: 400) +let delegate = MetalView() +let view = MTKView(frame: frame, device: delegate.device) +view.delegate = delegate +PlaygroundPage.current.liveView = view diff --git a/ch08/chapter08.playground/Resources/Shaders.metal b/ch08/chapter08.playground/Resources/Shaders.metal index a9bad7e..2234835 100644 --- a/ch08/chapter08.playground/Resources/Shaders.metal +++ b/ch08/chapter08.playground/Resources/Shaders.metal @@ -11,7 +11,9 @@ struct Uniforms { float4x4 modelMatrix; }; -vertex Vertex vertex_func(constant Vertex *vertices [[buffer(0)]], constant Uniforms &uniforms [[buffer(1)]], uint vid [[vertex_id]]) { +vertex Vertex vertex_func(constant Vertex *vertices [[buffer(0)]], + constant Uniforms &uniforms [[buffer(1)]], + uint vid [[vertex_id]]) { float4x4 matrix = uniforms.modelMatrix; Vertex in = vertices[vid]; Vertex out; diff --git a/ch08/chapter08.playground/Sources/MathUtils.swift b/ch08/chapter08.playground/Sources/MathUtils.swift index cc13d82..3461891 100644 --- a/ch08/chapter08.playground/Sources/MathUtils.swift +++ b/ch08/chapter08.playground/Sources/MathUtils.swift @@ -21,14 +21,16 @@ struct Matrix { ] } - func translationMatrix(var matrix: Matrix, _ position: float3) -> Matrix { + func translationMatrix(_ matrix: Matrix, _ position: float3) -> Matrix { + var matrix = matrix matrix.m[12] = position.x matrix.m[13] = position.y matrix.m[14] = position.z return matrix } - func scalingMatrix(var matrix: Matrix, _ scale: Float) -> Matrix { + func scalingMatrix(_ matrix: Matrix, _ scale: Float) -> Matrix { + var matrix = matrix matrix.m[0] = scale matrix.m[5] = scale matrix.m[10] = scale @@ -36,7 +38,8 @@ struct Matrix { return matrix } - func rotationMatrix(var matrix: Matrix, _ rot: float3) -> Matrix { + func rotationMatrix(_ matrix: Matrix, _ rot: float3) -> Matrix { + var matrix = matrix matrix.m[0] = cos(rot.y) * cos(rot.z) matrix.m[4] = cos(rot.z) * sin(rot.x) * sin(rot.y) - cos(rot.x) * sin(rot.z) matrix.m[8] = cos(rot.x) * cos(rot.z) * sin(rot.y) + sin(rot.x) * sin(rot.z) @@ -50,7 +53,8 @@ struct Matrix { return matrix } - func modelMatrix(var matrix: Matrix) -> Matrix { + func modelMatrix(matrix: Matrix) -> Matrix { + var matrix = matrix matrix = rotationMatrix(matrix, float3(0.0, 0.0, 0.1)) matrix = scalingMatrix(matrix, 0.25) matrix = translationMatrix(matrix, float3(0.0, 0.5, 0.0)) diff --git a/ch08/chapter08.playground/Sources/MetalView.swift b/ch08/chapter08.playground/Sources/MetalView.swift index 9305067..61a864c 100644 --- a/ch08/chapter08.playground/Sources/MetalView.swift +++ b/ch08/chapter08.playground/Sources/MetalView.swift @@ -1,69 +1,68 @@ import MetalKit -public class MetalView: MTKView { +public class MetalView: NSObject, MTKViewDelegate { - var vertex_buffer: MTLBuffer! - var uniform_buffer: MTLBuffer! - var rps: MTLRenderPipelineState! = nil + public var device: MTLDevice! + var queue: MTLCommandQueue! + var vertexBuffer: MTLBuffer! + var uniformBuffer: MTLBuffer! + var rps: MTLRenderPipelineState! - required public init(coder: NSCoder) { - super.init(coder: coder) - } - - override public init(frame frameRect: CGRect, device: MTLDevice?) { - super.init(frame: frameRect, device: device) + override public init() { + super.init() createBuffers() registerShaders() } - override public func drawRect(dirtyRect: NSRect) { - super.drawRect(dirtyRect) - if let rpd = currentRenderPassDescriptor, drawable = currentDrawable { - rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let command_buffer = device!.newCommandQueue().commandBuffer() - let command_encoder = command_buffer.renderCommandEncoderWithDescriptor(rpd) - command_encoder.setRenderPipelineState(rps) - command_encoder.setVertexBuffer(vertex_buffer, offset: 0, atIndex: 0) - command_encoder.setVertexBuffer(uniform_buffer, offset: 0, atIndex: 1) - command_encoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) - command_encoder.endEncoding() - command_buffer.presentDrawable(drawable) - command_buffer.commit() - } - } - func createBuffers() { - let vertex_data = [ - Vertex(pos: [-1.0, -1.0, 0.0, 1.0], col: [1, 0, 0, 1]), - Vertex(pos: [ 1.0, -1.0, 0.0, 1.0], col: [0, 1, 0, 1]), - Vertex(pos: [ 0.0, 1.0, 0.0, 1.0], col: [0, 0, 1, 1]) + device = MTLCreateSystemDefaultDevice() + queue = device.newCommandQueue() + let vertexData = [Vertex(pos: [-1.0, -1.0, 0.0, 1.0], col: [1, 0, 0, 1]), + Vertex(pos: [ 1.0, -1.0, 0.0, 1.0], col: [0, 1, 0, 1]), + Vertex(pos: [ 0.0, 1.0, 0.0, 1.0], col: [0, 0, 1, 1]) ] - vertex_buffer = device!.newBufferWithBytes(vertex_data, length: sizeof(Vertex) * 3, options:[]) - uniform_buffer = device!.newBufferWithLength(sizeof(Float) * 16, options: []) - let bufferPointer = uniform_buffer.contents() - memcpy(bufferPointer, Matrix().modelMatrix(Matrix()).m, sizeof(Float) * 16) + vertexBuffer = device!.newBuffer(withBytes: vertexData, length: sizeof(Vertex.self) * 3, options:[]) + uniformBuffer = device!.newBuffer(withLength: sizeof(Float.self) * 16, options: []) + let bufferPointer = uniformBuffer.contents() + memcpy(bufferPointer, Matrix().modelMatrix(matrix: Matrix()).m, sizeof(Float.self) * 16) } func registerShaders() { - let path = NSBundle.mainBundle().pathForResource("Shaders", ofType: "metal") + let path = Bundle.main.pathForResource("Shaders", ofType: "metal") let input: String? let library: MTLLibrary let vert_func: MTLFunction let frag_func: MTLFunction do { - input = try String(contentsOfFile: path!, encoding: NSUTF8StringEncoding) - library = try device!.newLibraryWithSource(input!, options: nil) - //print(library.functionNames) - vert_func = library.newFunctionWithName("vertex_func")! - frag_func = library.newFunctionWithName("fragment_func")! + 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")! let rpld = MTLRenderPipelineDescriptor() rpld.vertexFunction = vert_func rpld.fragmentFunction = frag_func - rpld.colorAttachments[0].pixelFormat = .BGRA8Unorm - rps = try device!.newRenderPipelineStateWithDescriptor(rpld) + rpld.colorAttachments[0].pixelFormat = .bgra8Unorm + rps = try device!.newRenderPipelineState(with: rpld) } catch let e { Swift.print("\(e)") } } + + public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} + + public func draw(in view: MTKView) { + 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) + commandEncoder.setRenderPipelineState(rps) + commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) + commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) + commandEncoder.drawPrimitives(.triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder.endEncoding() + commandBuffer.present(drawable) + commandBuffer.commit() + } + } } diff --git a/ch08/chapter08.playground/contents.xcplayground b/ch08/chapter08.playground/contents.xcplayground index 06828af..9f9eecc 100644 --- a/ch08/chapter08.playground/contents.xcplayground +++ b/ch08/chapter08.playground/contents.xcplayground @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/ch08/chapter08.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch08/chapter08.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 4b12b70ee54fcc35f0dcf5400cbe4f928aeff114..9826afda956d995046a0b520d44fb800856e8857 100644 GIT binary patch literal 16465 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 E9~N)+RsaA1 literal 14980 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 rRg&5zwMVKmwI+3HsyDSRbzbU%)Fu966`~g!xF6 matrix_float4x4 { return matrix_float4x4(columns:(X, Y, Z, W)) } -func rotationMatrix(angle: Float, _ axis: vector_float3) -> matrix_float4x4 { +func rotationMatrix(angle: Float, axis: vector_float3) -> matrix_float4x4 { var X = vector_float4(0, 0, 0, 0) X.x = axis.x * axis.x + (1 - axis.x * axis.x) * cos(angle) X.y = axis.x * axis.y * (1 - cos(angle)) - axis.z * sin(angle) diff --git a/ch09/chapter09.playground/Sources/MetalView.swift b/ch09/chapter09.playground/Sources/MetalView.swift index 27e9042..769c51d 100755 --- a/ch09/chapter09.playground/Sources/MetalView.swift +++ b/ch09/chapter09.playground/Sources/MetalView.swift @@ -1,28 +1,26 @@ import MetalKit -public class MetalView: MTKView { +public class MetalView: NSObject, MTKViewDelegate { - var vertex_buffer: MTLBuffer! - var uniform_buffer: MTLBuffer! - var index_buffer: MTLBuffer! - var dss: MTLDepthStencilState! + public var device: MTLDevice! + var queue: MTLCommandQueue! + var vertexBuffer: MTLBuffer! + var uniformBuffer: MTLBuffer! + var indexBuffer: MTLBuffer! var rps: MTLRenderPipelineState! - var commandQueue: MTLCommandQueue! var rotation: Float = 0 - required public init(coder: NSCoder) { - super.init(coder: coder) - } - - override public init(frame frameRect: CGRect, device: MTLDevice?) { - super.init(frame: frameRect, device: device) + override public init() { + super.init() + device = MTLCreateSystemDefaultDevice() + queue = device.newCommandQueue() createBuffers() createPipeline() } func createBuffers() { - let vertex_data = [ + let vertexData = [ Vertex(pos: [-1.0, -1.0, 1.0, 1.0], col: [1, 1, 1, 1]), Vertex(pos: [ 1.0, -1.0, 1.0, 1.0], col: [1, 0, 0, 1]), Vertex(pos: [ 1.0, 1.0, 1.0, 1.0], col: [1, 1, 0, 1]), @@ -30,71 +28,75 @@ public class MetalView: MTKView { Vertex(pos: [-1.0, -1.0, -1.0, 1.0], col: [0, 0, 1, 1]), Vertex(pos: [ 1.0, -1.0, -1.0, 1.0], col: [1, 0, 1, 1]), Vertex(pos: [ 1.0, 1.0, -1.0, 1.0], col: [0, 0, 0, 1]), - Vertex(pos: [-1.0, 1.0, -1.0, 1.0], col: [0, 1, 1, 1]) - ] - let index_data: [UInt16] = [ - 0, 1, 2, 2, 3, 0, // front - 1, 5, 6, 6, 2, 1, // right - 3, 2, 6, 6, 7, 3, // top - 4, 5, 1, 1, 0, 4, // bottom - 4, 0, 3, 3, 7, 4, // left - 7, 6, 5, 5, 4, 7, // back - ] - vertex_buffer = device!.newBufferWithBytes(vertex_data, length: sizeof(Vertex) * vertex_data.count, options: []) - index_buffer = device!.newBufferWithBytes(index_data, length: sizeof(UInt16) * index_data.count , options: []) - uniform_buffer = device!.newBufferWithLength(sizeof(matrix_float4x4), options: []) + Vertex(pos: [-1.0, 1.0, -1.0, 1.0], col: [0, 1, 1, 1])] + + let indexData: [UInt16] = [0, 1, 2, 2, 3, 0, // front + 1, 5, 6, 6, 2, 1, // right + 3, 2, 6, 6, 7, 3, // top + 4, 5, 1, 1, 0, 4, // bottom + 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: []) } func createPipeline() { + let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + let input: String? + let library: MTLLibrary + let vert_func: MTLFunction + let frag_func: MTLFunction do { - let path = NSBundle.mainBundle().pathForResource("Shaders", ofType: "metal") - let input = try String(contentsOfFile: path!, encoding: NSUTF8StringEncoding) - let library = try device!.newLibraryWithSource(input, options: nil) - let vert_func = library.newFunctionWithName("vertex_func")! - let frag_func = library.newFunctionWithName("fragment_func")! + 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")! let rpld = MTLRenderPipelineDescriptor() rpld.vertexFunction = vert_func rpld.fragmentFunction = frag_func - rpld.colorAttachments[0].pixelFormat = .BGRA8Unorm - rps = try device!.newRenderPipelineStateWithDescriptor(rpld) + rpld.colorAttachments[0].pixelFormat = .bgra8Unorm + rps = try device!.newRenderPipelineState(with: rpld) } catch let e { Swift.print("\(e)") } - commandQueue = device?.newCommandQueue() } func update() { - let scaled = scalingMatrix(0.5) + let scaled = scalingMatrix(scale: 0.5) rotation += 1 / 100 * Float(M_PI) / 4 - let rotatedY = rotationMatrix(rotation, float3(0, 1, 0)) - let rotatedX = rotationMatrix(Float(M_PI) / 4, float3(1, 0, 0)) + let rotatedY = rotationMatrix(angle: rotation, axis: float3(0, 1, 0)) + let rotatedX = rotationMatrix(angle: Float(M_PI) / 4, axis: float3(1, 0, 0)) let modelMatrix = matrix_multiply(matrix_multiply(rotatedX, rotatedY), scaled) let cameraPosition = vector_float3(0, 0, -3) - let viewMatrix = translationMatrix(cameraPosition) - let aspect = Float(drawableSize.width / drawableSize.height) - let projMatrix = projectionMatrix(0, far: 10, aspect: aspect, fovy: 1) + 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 modelViewProjectionMatrix = matrix_multiply(projMatrix, matrix_multiply(viewMatrix, modelMatrix)) - let bufferPointer = uniform_buffer.contents() + let bufferPointer = uniformBuffer.contents() var uniforms = Uniforms(modelViewProjectionMatrix: modelViewProjectionMatrix) - memcpy(bufferPointer, &uniforms, sizeof(Uniforms)) + memcpy(bufferPointer, &uniforms, sizeof(Uniforms.self)) } - override public func drawRect(dirtyRect: NSRect) { - super.drawRect(dirtyRect) + public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} + + public func draw(in view: MTKView) { update() - if let rpd = currentRenderPassDescriptor, drawable = currentDrawable { - rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.3, 0.5, 0.5, 1.0) - let command_buffer = commandQueue.commandBuffer() - let command_encoder = command_buffer.renderCommandEncoderWithDescriptor(rpd) - command_encoder.setRenderPipelineState(rps) - command_encoder.setFrontFacingWinding(.CounterClockwise) - command_encoder.setCullMode(.Back) - command_encoder.setVertexBuffer(vertex_buffer, offset: 0, atIndex: 0) - command_encoder.setVertexBuffer(uniform_buffer, offset: 0, atIndex: 1) - command_encoder.drawIndexedPrimitives(.Triangle, indexCount: index_buffer.length / sizeof(UInt16), indexType: MTLIndexType.UInt16, indexBuffer: index_buffer, indexBufferOffset: 0) - command_encoder.endEncoding() - command_buffer.presentDrawable(drawable) - command_buffer.commit() + 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) + 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.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 6294b51a5384da980209f0281e9d4a149eb835ae..1d5e4b9ef41811637d59fbc2eccdf3b1021a850d 100755 GIT binary patch literal 27041 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 - - - - diff --git a/ch10/chapter10.playground/Contents.swift b/ch10/chapter10.playground/Contents.swift old mode 100755 new mode 100644 index 96ca6ff..694d377 --- a/ch10/chapter10.playground/Contents.swift +++ b/ch10/chapter10.playground/Contents.swift @@ -1,8 +1,9 @@ -import Cocoa -import XCPlayground +import MetalKit +import PlaygroundSupport -let device = MTLCreateSystemDefaultDevice()! -let frame = NSRect(x: 0, y: 0, width: 300, height: 300) -let view = MetalView(frame: frame, device: device) -XCPlaygroundPage.currentPage.liveView = view +let frame = NSRect(x: 0, y: 0, width: 400, height: 400) +let delegate = MetalView() +let view = MTKView(frame: frame, device: delegate.device) +view.delegate = delegate +PlaygroundPage.current.liveView = view diff --git a/ch10/chapter10.playground/Sources/MetalView.swift b/ch10/chapter10.playground/Sources/MetalView.swift index 6cbc65c..393222e 100755 --- a/ch10/chapter10.playground/Sources/MetalView.swift +++ b/ch10/chapter10.playground/Sources/MetalView.swift @@ -1,46 +1,45 @@ import MetalKit -public class MetalView: MTKView { +public class MetalView: NSObject, MTKViewDelegate { - var queue: MTLCommandQueue! = nil - var cps: MTLComputePipelineState! = nil + public var device: MTLDevice! + var queue: MTLCommandQueue! + var cps: MTLComputePipelineState! - required public init(coder: NSCoder) { - super.init(coder: coder) - } - - override public init(frame frameRect: CGRect, device: MTLDevice?) { - super.init(frame: frameRect, device: device) + override public init() { + super.init() registerShaders() } - override public func drawRect(dirtyRect: NSRect) { - super.drawRect(dirtyRect) - if let drawable = currentDrawable { - let command_buffer = queue.commandBuffer() - let command_encoder = command_buffer.computeCommandEncoder() - command_encoder.setComputePipelineState(cps) - command_encoder.setTexture(drawable.texture, atIndex: 0) - let threadGroupCount = MTLSizeMake(8, 8, 1) - let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) - command_encoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) - command_encoder.endEncoding() - command_buffer.presentDrawable(drawable) - command_buffer.commit() - } - } - func registerShaders() { - queue = device!.newCommandQueue() - let path = NSBundle.mainBundle().pathForResource("Shaders", ofType: "metal") + device = MTLCreateSystemDefaultDevice()! + queue = device.newCommandQueue() + let path = Bundle.main.pathForResource("Shaders", ofType: "metal") do { - let input = try String(contentsOfFile: path!, encoding: NSUTF8StringEncoding) - let library = try device!.newLibraryWithSource(input, options: nil) - let kernel = library.newFunctionWithName("compute")! - cps = try device!.newComputePipelineStateWithFunction(kernel) + let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) + let library = try device.newLibrary(withSource: input, options: nil) + let kernel = library.newFunction(withName: "compute")! + cps = try device.newComputePipelineState(with: kernel) } catch let e { Swift.print("\(e)") } } + + public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} + + public func draw(in view: MTKView) { + if let drawable = view.currentDrawable { + let commandBuffer = queue.commandBuffer() + let commandEncoder = commandBuffer.computeCommandEncoder() + commandEncoder.setComputePipelineState(cps) + commandEncoder.setTexture(drawable.texture, at: 0) + let threadGroupCount = MTLSizeMake(8, 8, 1) + let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) + commandEncoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) + commandEncoder.endEncoding() + commandBuffer.present(drawable) + commandBuffer.commit() + } + } } diff --git a/ch10/chapter10.playground/contents.xcplayground b/ch10/chapter10.playground/contents.xcplayground old mode 100755 new mode 100644 diff --git a/ch10/chapter10.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch10/chapter10.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index b0371a6e8797b8d4ce9f83f00151cbe0082ec193..4591e067402659c8f2fa1fb12861372764f1ff17 100755 GIT binary patch literal 23421 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 literal 16567 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 P3Vt$+f}f$^nbZFtQ2z&= diff --git a/ch10/chapter10.playground/timeline.xctimeline b/ch10/chapter10.playground/timeline.xctimeline deleted file mode 100755 index bf468af..0000000 --- a/ch10/chapter10.playground/timeline.xctimeline +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/ch11/chapter11.playground/Contents.swift b/ch11/chapter11.playground/Contents.swift index 00f436f..694d377 100644 --- a/ch11/chapter11.playground/Contents.swift +++ b/ch11/chapter11.playground/Contents.swift @@ -1,8 +1,9 @@ -import Cocoa -import XCPlayground +import MetalKit +import PlaygroundSupport -let device = MTLCreateSystemDefaultDevice()! -let frame = NSRect(x:0, y:0, width:300, height:300) -let view = MetalView(frame: frame, device: device) -XCPlaygroundPage.currentPage.liveView = view +let frame = NSRect(x: 0, y: 0, width: 400, height: 400) +let delegate = MetalView() +let view = MTKView(frame: frame, device: delegate.device) +view.delegate = delegate +PlaygroundPage.current.liveView = view diff --git a/ch11/chapter11.playground/Sources/MetalView.swift b/ch11/chapter11.playground/Sources/MetalView.swift index 425569a..db61db1 100755 --- a/ch11/chapter11.playground/Sources/MetalView.swift +++ b/ch11/chapter11.playground/Sources/MetalView.swift @@ -1,56 +1,45 @@ import MetalKit -public class MetalView: MTKView { +public class MetalView: NSObject, MTKViewDelegate { - var queue: MTLCommandQueue! = nil - var cps: MTLComputePipelineState! = nil + public var device: MTLDevice! + var queue: MTLCommandQueue! + var cps: MTLComputePipelineState! - var shader = - "#include \n" + - "using namespace metal;" + - "kernel void compute(texture2d output [[texture(0)]]," + - " uint2 gid [[thread_position_in_grid]])" + - "{" + - " output.write(float4(1, 1, 0, 1), gid);" + - "}" - - required public init(coder: NSCoder) { - super.init(coder: coder) - } - - override public init(frame frameRect: CGRect, device: MTLDevice?) { - super.init(frame: frameRect, device: device) + override public init() { + super.init() registerShaders() } - override public func drawRect(dirtyRect: NSRect) { - super.drawRect(dirtyRect) - if let drawable = currentDrawable { - let command_buffer = queue.commandBuffer() - let command_encoder = command_buffer.computeCommandEncoder() - command_encoder.setComputePipelineState(cps) - command_encoder.setTexture(drawable.texture, atIndex: 0) - let threadGroupCount = MTLSizeMake(8, 8, 1) - let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) - command_encoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) - command_encoder.endEncoding() - command_buffer.presentDrawable(drawable) - command_buffer.commit() - } - } - func registerShaders() { - queue = device!.newCommandQueue() - let path = NSBundle.mainBundle().pathForResource("Shaders", ofType: "metal") + device = MTLCreateSystemDefaultDevice()! + queue = device.newCommandQueue() + let path = Bundle.main.pathForResource("Shaders", ofType: "metal") do { - let input = try String(contentsOfFile: path!, encoding: NSUTF8StringEncoding) - let library = try device!.newLibraryWithSource(input, options: nil) -// let library = try device!.newLibraryWithSource(shader, options: nil) - let kernel = library.newFunctionWithName("compute")! - cps = try device!.newComputePipelineStateWithFunction(kernel) + let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) + let library = try device.newLibrary(withSource: input, options: nil) + let kernel = library.newFunction(withName: "compute")! + cps = try device.newComputePipelineState(with: kernel) } catch let e { Swift.print("\(e)") } } + + public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} + + public func draw(in view: MTKView) { + if let drawable = view.currentDrawable { + let commandBuffer = queue.commandBuffer() + let commandEncoder = commandBuffer.computeCommandEncoder() + commandEncoder.setComputePipelineState(cps) + commandEncoder.setTexture(drawable.texture, at: 0) + let threadGroupCount = MTLSizeMake(8, 8, 1) + let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) + commandEncoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) + commandEncoder.endEncoding() + commandBuffer.present(drawable) + commandBuffer.commit() + } + } } diff --git a/ch11/chapter11.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch11/chapter11.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index f4c9511657e57e18cf265a284e8735a79b65f256..81d391f703f4bec3a0f64a34640d4465e91c0139 100755 GIT binary patch literal 19188 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

Y=%Olc4xF!+Urd+0lwXke9r)pY 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 diff --git a/ch05/chapter05.xcodeproj/project.pbxproj b/ch05/chapter05.xcodeproj/project.pbxproj index c2db75a..f1362b3 100644 --- a/ch05/chapter05.xcodeproj/project.pbxproj +++ b/ch05/chapter05.xcodeproj/project.pbxproj @@ -33,6 +33,16 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 297F43061DE9960800638FC8 /* Supporting files */ = { + isa = PBXGroup; + children = ( + 298037281C62437900FBBC6A /* Main.storyboard */, + 2980372B1C62437900FBBC6A /* Info.plist */, + 298037221C62437900FBBC6A /* AppDelegate.swift */, + ); + name = "Supporting files"; + sourceTree = ""; + }; 298037161C62437900FBBC6A = { isa = PBXGroup; children = ( @@ -54,9 +64,7 @@ children = ( 298037311C6243CB00FBBC6A /* MetalView.swift */, 298037331C62440400FBBC6A /* Shaders.metal */, - 298037281C62437900FBBC6A /* Main.storyboard */, - 2980372B1C62437900FBBC6A /* Info.plist */, - 298037221C62437900FBBC6A /* AppDelegate.swift */, + 297F43061DE9960800638FC8 /* Supporting files */, ); path = chapter05; sourceTree = ""; @@ -88,7 +96,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0810; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 2980371E1C62437900FBBC6A = { @@ -164,8 +172,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; @@ -208,8 +218,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; diff --git a/ch05/chapter05.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch05/chapter05.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 963e81b21c9ef556f23b3d27f76a0dee92f3553d..e04aa460b22814a4fdafa3b22f3730d19665f5ae 100644 GIT binary patch delta 12975 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 V*4Eu7Ls<9UDY@?d$G>Ik{vVSEE&u=k delta 13060 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 diff --git a/ch05/chapter05.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter05.xcscheme b/ch05/chapter05.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter05.xcscheme index 2f4f9c3..45e4f67 100644 --- a/ch05/chapter05.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter05.xcscheme +++ b/ch05/chapter05.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter05.xcscheme @@ -1,6 +1,6 @@ .size * 3, options:[]) + uniformBuffer = device!.makeBuffer(length: MemoryLayout.size * 16, options: []) let bufferPointer = uniformBuffer.contents() - memcpy(bufferPointer, Matrix().modelMatrix(Matrix()).m, sizeof(Float.self) * 16) + memcpy(bufferPointer, Matrix().modelMatrix(Matrix()).m, MemoryLayout.size * 16) } func registerShaders() { let library = device!.newDefaultLibrary()! - let vertex_func = library.newFunction(withName: "vertex_func") - let frag_func = library.newFunction(withName: "fragment_func") + let vertex_func = library.makeFunction(name: "vertex_func") + let frag_func = library.makeFunction(name: "fragment_func") let rpld = MTLRenderPipelineDescriptor() rpld.vertexFunction = vertex_func rpld.fragmentFunction = frag_func rpld.colorAttachments[0].pixelFormat = .bgra8Unorm do { - try rps = device!.newRenderPipelineState(with: rpld) + try rps = device!.makeRenderPipelineState(descriptor: rpld) } catch let error { self.print("\(error)") } } override func draw(_ dirtyRect: NSRect) { - if let rpd = currentRenderPassDescriptor, drawable = currentDrawable { + if let rpd = currentRenderPassDescriptor, let drawable = currentDrawable { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let commandBuffer = device!.newCommandQueue().commandBuffer() - let commandEncoder = commandBuffer.renderCommandEncoder(with: rpd) + let commandBuffer = device!.makeCommandQueue().makeCommandBuffer() + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) commandEncoder.setRenderPipelineState(rps!) commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) - commandEncoder.drawPrimitives(.triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) commandEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() From 04968efaede86bc9d4daa2c4142e02109564d1fa Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Sat, 26 Nov 2016 22:54:25 +0200 Subject: [PATCH 10/20] initial commit --- ch06/chapter06.xcodeproj/project.pbxproj | 20 ++++++++++++--- .../UserInterfaceState.xcuserstate | Bin 17929 -> 17972 bytes .../xcschemes/chapter06.xcscheme | 2 +- ch06/chapter06/MetalView.swift | 24 ++++++++---------- 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/ch06/chapter06.xcodeproj/project.pbxproj b/ch06/chapter06.xcodeproj/project.pbxproj index 04ca30b..d317b25 100644 --- a/ch06/chapter06.xcodeproj/project.pbxproj +++ b/ch06/chapter06.xcodeproj/project.pbxproj @@ -31,6 +31,16 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 297F43071DEA287400638FC8 /* Supporting files */ = { + isa = PBXGroup; + children = ( + 298451331D47EF08008D81B9 /* Main.storyboard */, + 2984513B1D47EF08008D81B9 /* Info.plist */, + 2984512F1D47EF08008D81B9 /* AppDelegate.swift */, + ); + name = "Supporting files"; + sourceTree = ""; + }; 298451231D47EF07008D81B9 = { isa = PBXGroup; children = ( @@ -51,9 +61,7 @@ isa = PBXGroup; children = ( 298451411D47F0BF008D81B9 /* MetalView.swift */, - 298451331D47EF08008D81B9 /* Main.storyboard */, - 2984513B1D47EF08008D81B9 /* Info.plist */, - 2984512F1D47EF08008D81B9 /* AppDelegate.swift */, + 297F43071DEA287400638FC8 /* Supporting files */, ); path = chapter06; sourceTree = ""; @@ -85,7 +93,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0810; ORGANIZATIONNAME = Marius; TargetAttributes = { 2984512B1D47EF08008D81B9 = { @@ -164,8 +172,10 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -212,8 +222,10 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; diff --git a/ch06/chapter06.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch06/chapter06.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 8f4dc11fe8b672fc60db4534ca171ed98e993112..e1437e642c535fa6d7b16b8c0e52480982ec9738 100644 GIT binary patch delta 10652 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 delta 10679 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 AnyClass { - return CAMetalLayer.self - } - + var metalLayer: CAMetalLayer! + override func didMoveToWindow() { super.didMoveToWindow() - let device = MTLCreateSystemDefaultDevice()! - commandQueue = device.newCommandQueue() + metalLayer = CAMetalLayer() + metalLayer.device = MTLCreateSystemDefaultDevice()! + metalLayer.frame = layer.frame + layer.addSublayer(metalLayer) + commandQueue = metalLayer.device?.makeCommandQueue() redraw() } private func redraw() { let drawable = metalLayer.nextDrawable()! let descriptor = MTLRenderPassDescriptor() - descriptor.colorAttachments[0].clearColor = MTLClearColorMake(0, 1, 1, 1) + descriptor.colorAttachments[0].clearColor = MTLClearColorMake(0, 0.5, 0.5, 1) descriptor.colorAttachments[0].texture = drawable.texture - let commandBuffer = commandQueue.commandBuffer() - let commandEncoder = commandBuffer.renderCommandEncoder(with: descriptor) + let commandBuffer = commandQueue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: descriptor) commandEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() From 959623e0e39a0d1b04a799a838bca04055df34ab Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Sat, 26 Nov 2016 22:59:37 +0200 Subject: [PATCH 11/20] initial commit --- ch07/chapter07.xcodeproj/project.pbxproj | 20 ++++++++++++---- .../UserInterfaceState.xcuserstate | Bin 18537 -> 18734 bytes .../xcschemes/chapter07.xcscheme | 2 +- ch07/chapter07/MetalView.swift | 22 +++++++++--------- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/ch07/chapter07.xcodeproj/project.pbxproj b/ch07/chapter07.xcodeproj/project.pbxproj index 2bb7acb..0d1d83c 100644 --- a/ch07/chapter07.xcodeproj/project.pbxproj +++ b/ch07/chapter07.xcodeproj/project.pbxproj @@ -35,6 +35,16 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 297F43081DEA2E3400638FC8 /* Supporting files */ = { + isa = PBXGroup; + children = ( + 29D8782F1C84D2B0007B5F17 /* Main.storyboard */, + 29D878321C84D2B0007B5F17 /* Info.plist */, + 29D878291C84D2B0007B5F17 /* AppDelegate.swift */, + ); + name = "Supporting files"; + sourceTree = ""; + }; 29D8781D1C84D2B0007B5F17 = { isa = PBXGroup; children = ( @@ -57,9 +67,7 @@ 29D878381C84D309007B5F17 /* MetalView.swift */, 29B186251C84FF5800E9C0AA /* MathUtils.swift */, 29D8783A1C84D335007B5F17 /* Shaders.metal */, - 29D8782F1C84D2B0007B5F17 /* Main.storyboard */, - 29D878321C84D2B0007B5F17 /* Info.plist */, - 29D878291C84D2B0007B5F17 /* AppDelegate.swift */, + 297F43081DEA2E3400638FC8 /* Supporting files */, ); path = chapter07; sourceTree = ""; @@ -91,7 +99,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0810; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29D878251C84D2B0007B5F17 = { @@ -168,8 +176,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; @@ -212,8 +222,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; diff --git a/ch07/chapter07.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch07/chapter07.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 43480b97236a21fb94fc1511db74b7fd7ed640c0..ccf83e06cc7d124e422127bdeb8f1662c7d126c1 100644 GIT binary patch delta 10013 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 delta 9914 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 Ef91Kj_5c6? diff --git a/ch07/chapter07.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter07.xcscheme b/ch07/chapter07.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter07.xcscheme index c45abd3..1f22050 100644 --- a/ch07/chapter07.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter07.xcscheme +++ b/ch07/chapter07.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter07.xcscheme @@ -1,6 +1,6 @@ .size * 3, options:[]) + uniformBuffer = device!.makeBuffer(length: MemoryLayout.size * 16, options: []) let bufferPointer = uniformBuffer.contents() - memcpy(bufferPointer, Matrix().modelMatrix(Matrix()).m, sizeof(Float.self) * 16) + memcpy(bufferPointer, Matrix().modelMatrix(Matrix()).m, MemoryLayout.size * 16) } func registerShaders() { let library = device!.newDefaultLibrary()! - let vertex_func = library.newFunction(withName: "vertex_func") - let frag_func = library.newFunction(withName: "fragment_func") + let vertex_func = library.makeFunction(name: "vertex_func") + let frag_func = library.makeFunction(name: "fragment_func") let rpld = MTLRenderPipelineDescriptor() rpld.vertexFunction = vertex_func rpld.fragmentFunction = frag_func rpld.colorAttachments[0].pixelFormat = .bgra8Unorm do { - try rps = device!.newRenderPipelineState(with: rpld) + try rps = device!.makeRenderPipelineState(descriptor: rpld) } catch let error { self.print("\(error)") } @@ -51,14 +51,14 @@ class MetalView: MTKView { override func draw(_ dirtyRect: NSRect) { super.draw(dirtyRect) - if let rpd = currentRenderPassDescriptor, drawable = currentDrawable { + if let rpd = currentRenderPassDescriptor, let drawable = currentDrawable { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let commandBuffer = device!.newCommandQueue().commandBuffer() - let commandEncoder = commandBuffer.renderCommandEncoder(with: rpd) + let commandBuffer = device!.makeCommandQueue().makeCommandBuffer() + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) commandEncoder.setRenderPipelineState(rps!) commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) - commandEncoder.drawPrimitives(.triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) commandEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() From 73d127250b94bffde1e4e19717367108f108d0ed Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Sat, 26 Nov 2016 23:06:47 +0200 Subject: [PATCH 12/20] updated to Swift 3 --- .../UserInterfaceState.xcuserstate | Bin 17972 -> 18182 bytes ch06/chapter06/MetalView.swift | 2 +- .../UserInterfaceState.xcuserstate | Bin 18734 -> 18646 bytes ch07/chapter07/MetalView.swift | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ch06/chapter06.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch06/chapter06.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index e1437e642c535fa6d7b16b8c0e52480982ec9738..e3032813891910052427388b2db1864e5e059e38 100644 GIT binary patch delta 10330 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 apQamMW{|3rSAbCUFMUw`Tk}67;J*Mdz#aVn delta 10357 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 Of9d1$zZL(dSNlKBhl^AI diff --git a/ch06/chapter06/MetalView.swift b/ch06/chapter06/MetalView.swift index 8689c5d..7570bd4 100755 --- a/ch06/chapter06/MetalView.swift +++ b/ch06/chapter06/MetalView.swift @@ -1,7 +1,7 @@ // // MetalView.swift // chapter06 -// +// // Created by Marius on 2/10/16. // Copyright © 2016 Marius Horga. All rights reserved. // diff --git a/ch07/chapter07.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch07/chapter07.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index ccf83e06cc7d124e422127bdeb8f1662c7d126c1..c961a245581aedd1507aefb2f7722b14bed4e2f8 100644 GIT binary patch delta 10254 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 Kq5rRXqyGTory#Qc diff --git a/ch07/chapter07/MetalView.swift b/ch07/chapter07/MetalView.swift index fd1add0..b20b49c 100644 --- a/ch07/chapter07/MetalView.swift +++ b/ch07/chapter07/MetalView.swift @@ -1,7 +1,7 @@ // // MetalView.swift // chapter07 -// +// // Created by Marius on 2/29/16. // Copyright © 2016 Marius Horga. All rights reserved. // From 474a32a19d42460f8243278cca3f8d57a431bd64 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Mon, 28 Nov 2016 22:38:35 +0200 Subject: [PATCH 13/20] updated to Swift 3 --- .../Sources/MetalView.swift | 24 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 16465 -> 16805 bytes 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ch08/chapter08.playground/Sources/MetalView.swift b/ch08/chapter08.playground/Sources/MetalView.swift index 61a864c..a425315 100644 --- a/ch08/chapter08.playground/Sources/MetalView.swift +++ b/ch08/chapter08.playground/Sources/MetalView.swift @@ -17,33 +17,33 @@ public class MetalView: NSObject, MTKViewDelegate { func createBuffers() { device = MTLCreateSystemDefaultDevice() - queue = device.newCommandQueue() + queue = device.makeCommandQueue() let vertexData = [Vertex(pos: [-1.0, -1.0, 0.0, 1.0], col: [1, 0, 0, 1]), Vertex(pos: [ 1.0, -1.0, 0.0, 1.0], col: [0, 1, 0, 1]), Vertex(pos: [ 0.0, 1.0, 0.0, 1.0], col: [0, 0, 1, 1]) ] - vertexBuffer = device!.newBuffer(withBytes: vertexData, length: sizeof(Vertex.self) * 3, options:[]) - uniformBuffer = device!.newBuffer(withLength: sizeof(Float.self) * 16, options: []) + vertexBuffer = device!.makeBuffer(bytes: vertexData, length: MemoryLayout.size * 3, options:[]) + uniformBuffer = device!.makeBuffer(length: MemoryLayout.size * 16, options: []) let bufferPointer = uniformBuffer.contents() - memcpy(bufferPointer, Matrix().modelMatrix(matrix: Matrix()).m, sizeof(Float.self) * 16) + memcpy(bufferPointer, Matrix().modelMatrix(matrix: Matrix()).m, MemoryLayout.size * 16) } func registerShaders() { - 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)") } @@ -54,12 +54,12 @@ public class MetalView: NSObject, MTKViewDelegate { public func draw(in view: MTKView) { 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.setVertexBuffer(vertexBuffer, offset: 0, at: 0) commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) - commandEncoder.drawPrimitives(.triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) commandEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() diff --git a/ch08/chapter08.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch08/chapter08.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 9826afda956d995046a0b520d44fb800856e8857..ee9d1009f662cd5adf1cc4e69f5b6e1c7e06cf60 100644 GIT binary patch literal 16805 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 E9~N)+RsaA1 From 14db3095d056aa88a4d656ede9b683a59d892152 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Tue, 29 Nov 2016 18:44:39 +0200 Subject: [PATCH 14/20] updated to Swift 3 --- .../UserInterfaceState.xcuserstate | Bin 16805 -> 16494 bytes .../Resources/Shaders.metal | 1 - .../Sources/MetalView.swift | 3 --- .../contents.xcplayground | 2 +- .../UserInterfaceState.xcuserstate | Bin 27721 -> 27430 bytes 5 files changed, 1 insertion(+), 5 deletions(-) diff --git a/ch08/chapter08.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch08/chapter08.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index ee9d1009f662cd5adf1cc4e69f5b6e1c7e06cf60..2b92eb44a8bd0618999bc7096d88456db558e2c5 100644 GIT binary patch delta 9141 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 WIiW^54j>fz0=QmPf2;pboA-YrJ{AT5 literal 16805 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.size, indexType: MTLIndexType.uint16, indexBuffer: indexBuffer, indexBufferOffset: 0) commandEncoder.endEncoding() commandBuffer.present(drawable) diff --git a/ch09/chapter09.playground/contents.xcplayground b/ch09/chapter09.playground/contents.xcplayground index 06828af..9f9eecc 100644 --- a/ch09/chapter09.playground/contents.xcplayground +++ b/ch09/chapter09.playground/contents.xcplayground @@ -1,4 +1,4 @@ - + \ No newline at end of file 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 2061fba8a556e458431255dacab4310e50d4d817..9c3f51668007be8c53b537177424c71ed0064238 100755 GIT binary patch literal 27430 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ö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 From 2fa2654ec80f87514a6aea5c8c63f9da2d4702bd Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Tue, 29 Nov 2016 21:44:40 +0200 Subject: [PATCH 15/20] updated to Swift 3 --- .../Sources/MetalView.swift | 14 ++-- .../UserInterfaceState.xcuserstate | Bin 23421 -> 18328 bytes .../Sources/MetalView.swift | 76 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 19188 -> 19061 bytes 4 files changed, 45 insertions(+), 45 deletions(-) diff --git a/ch10/chapter10.playground/Sources/MetalView.swift b/ch10/chapter10.playground/Sources/MetalView.swift index 393222e..879e690 100755 --- a/ch10/chapter10.playground/Sources/MetalView.swift +++ b/ch10/chapter10.playground/Sources/MetalView.swift @@ -14,13 +14,13 @@ public class MetalView: NSObject, MTKViewDelegate { func registerShaders() { device = MTLCreateSystemDefaultDevice()! - queue = device.newCommandQueue() - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + queue = device.makeCommandQueue() + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") do { let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - let library = try device.newLibrary(withSource: input, options: nil) - let kernel = library.newFunction(withName: "compute")! - cps = try device.newComputePipelineState(with: kernel) + let library = try device.makeLibrary(source: input, options: nil) + let kernel = library.makeFunction(name: "compute")! + cps = try device.makeComputePipelineState(function: kernel) } catch let e { Swift.print("\(e)") } @@ -30,8 +30,8 @@ public class MetalView: NSObject, MTKViewDelegate { public func draw(in view: MTKView) { if let drawable = view.currentDrawable { - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.computeCommandEncoder() + let commandBuffer = queue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeComputeCommandEncoder() commandEncoder.setComputePipelineState(cps) commandEncoder.setTexture(drawable.texture, at: 0) let threadGroupCount = MTLSizeMake(8, 8, 1) diff --git a/ch10/chapter10.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch10/chapter10.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 4591e067402659c8f2fa1fb12861372764f1ff17..70c0b8b2d94be42e97dd937b86a665e52fc3d201 100755 GIT binary patch literal 18328 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 RH$?^iMlr#^q2Gmd{~!OSV-)}Z literal 23421 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 diff --git a/ch11/chapter11.playground/Sources/MetalView.swift b/ch11/chapter11.playground/Sources/MetalView.swift index db61db1..24c4256 100755 --- a/ch11/chapter11.playground/Sources/MetalView.swift +++ b/ch11/chapter11.playground/Sources/MetalView.swift @@ -2,44 +2,44 @@ import MetalKit public class MetalView: NSObject, MTKViewDelegate { - - public var device: MTLDevice! - var queue: MTLCommandQueue! - var cps: MTLComputePipelineState! - - override public init() { - super.init() - registerShaders() + + public var device: MTLDevice! + var queue: MTLCommandQueue! + var cps: MTLComputePipelineState! + + override public init() { + super.init() + registerShaders() + } + + func registerShaders() { + device = MTLCreateSystemDefaultDevice()! + queue = device.makeCommandQueue() + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") + do { + let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) + let library = try device.makeLibrary(source: input, options: nil) + let kernel = library.makeFunction(name: "compute")! + cps = try device.makeComputePipelineState(function: kernel) + } catch let e { + Swift.print("\(e)") } - - func registerShaders() { - device = MTLCreateSystemDefaultDevice()! - queue = device.newCommandQueue() - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") - do { - let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - let library = try device.newLibrary(withSource: input, options: nil) - let kernel = library.newFunction(withName: "compute")! - cps = try device.newComputePipelineState(with: kernel) - } catch let e { - Swift.print("\(e)") - } - } - - public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} - - public func draw(in view: MTKView) { - if let drawable = view.currentDrawable { - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.computeCommandEncoder() - commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 0) - let threadGroupCount = MTLSizeMake(8, 8, 1) - let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) - commandEncoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) - commandEncoder.endEncoding() - commandBuffer.present(drawable) - commandBuffer.commit() - } + } + + public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} + + public func draw(in view: MTKView) { + if let drawable = view.currentDrawable { + let commandBuffer = queue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeComputeCommandEncoder() + commandEncoder.setComputePipelineState(cps) + commandEncoder.setTexture(drawable.texture, at: 0) + let threadGroupCount = MTLSizeMake(8, 8, 1) + let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) + commandEncoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) + commandEncoder.endEncoding() + commandBuffer.present(drawable) + commandBuffer.commit() } + } } diff --git a/ch11/chapter11.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch11/chapter11.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 81d391f703f4bec3a0f64a34640d4465e91c0139..d18e907a9931fa7300a979ee1e3926659a0eba5c 100755 GIT binary patch literal 19061 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

NJk40smHjk6@kWR?l-=;quDjmY=(A@fQtJ&u)b$ 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 b$g*cSv+A-Yy6O%<5ZpU2g?o4Z%|ibJ!C^}% From 7991e3bc31bda9fe5702f659b7ff7bb3c329a381 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Tue, 29 Nov 2016 22:06:06 +0200 Subject: [PATCH 16/20] updated to Swift 3 --- .../UserInterfaceState.xcuserstate | Bin 19061 -> 19629 bytes .../Sources/MetalView.swift | 24 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 22543 -> 20848 bytes 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ch11/chapter11.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch11/chapter11.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index d18e907a9931fa7300a979ee1e3926659a0eba5c..ce8659ea17eab8fea0010c75955b48820c641d8d 100755 GIT binary patch literal 19629 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 literal 19061 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.size) bufferPointer = mouseBuffer.contents() - memcpy(bufferPointer, &pos, sizeof(NSPoint.self)) + memcpy(bufferPointer, &pos, MemoryLayout.size) } func registerShaders() { - queue = device!.newCommandQueue() - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + queue = device!.makeCommandQueue() + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") do { let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - let library = try device!.newLibrary(withSource: input, options: nil) - let kernel = library.newFunction(withName: "compute")! - cps = try device!.newComputePipelineState(with: kernel) + let library = try device!.makeLibrary(source: input, options: nil) + let kernel = library.makeFunction(name: "compute")! + cps = try device!.makeComputePipelineState(function: kernel) } catch let e { Swift.print("\(e)") } - timerBuffer = device!.newBuffer(withLength: sizeof(Float.self), options: []) - mouseBuffer = device!.newBuffer(withLength: sizeof(NSPoint.self), options: []) + timerBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) + mouseBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) } } diff --git a/ch12/chapter12.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch12/chapter12.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 844b8dfe10bbd70136d17174387ebdecb7d81c11..4d3e7a8e5e41a2bd81401c228cf3a025dc1ea3a9 100755 GIT binary patch literal 20848 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 QAY6Z$2G?Kr@9d8M52bmFMgRZ+ literal 22543 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 Date: Tue, 29 Nov 2016 22:46:21 +0200 Subject: [PATCH 17/20] updated to Swift 3 --- .../Sources/MetalView.swift | 24 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 20504 -> 20805 bytes 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ch13/chapter13.playground/Sources/MetalView.swift b/ch13/chapter13.playground/Sources/MetalView.swift index 2a6bdcb..e41a720 100755 --- a/ch13/chapter13.playground/Sources/MetalView.swift +++ b/ch13/chapter13.playground/Sources/MetalView.swift @@ -10,7 +10,7 @@ public class MetalView: MTKView, NSWindowDelegate { var mouseBuffer: MTLBuffer! var pos: NSPoint! - override public func mouseDown(_ event: NSEvent) { + override public func mouseDown(with event: NSEvent) { pos = convertToLayer(convert(event.locationInWindow, from: nil)) let scale = layer!.contentsScale pos.x *= scale @@ -28,8 +28,8 @@ public class MetalView: MTKView, NSWindowDelegate { override public func draw(_ dirtyRect: NSRect) { if let drawable = currentDrawable { - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.computeCommandEncoder() + let commandBuffer = queue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeComputeCommandEncoder() commandEncoder.setComputePipelineState(cps) commandEncoder.setTexture(drawable.texture, at: 0) commandEncoder.setBuffer(mouseBuffer, offset: 0, at: 2) @@ -48,23 +48,23 @@ public class MetalView: MTKView, NSWindowDelegate { func update() { timer += 0.01 var bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float.self)) + memcpy(bufferPointer, &timer, MemoryLayout.size) bufferPointer = mouseBuffer.contents() - memcpy(bufferPointer, &pos, sizeof(NSPoint.self)) + memcpy(bufferPointer, &pos, MemoryLayout.size) } func registerShaders() { - queue = device!.newCommandQueue() - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + queue = device!.makeCommandQueue() + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") do { let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - let library = try device!.newLibrary(withSource: input, options: nil) - let kernel = library.newFunction(withName: "compute")! - cps = try device!.newComputePipelineState(with: kernel) + let library = try device!.makeLibrary(source: input, options: nil) + let kernel = library.makeFunction(name: "compute")! + cps = try device!.makeComputePipelineState(function: kernel) } catch let e { Swift.print("\(e)") } - timerBuffer = device!.newBuffer(withLength: sizeof(Float.self), options: []) - mouseBuffer = device!.newBuffer(withLength: sizeof(NSPoint.self), options: []) + timerBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) + mouseBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) } } diff --git a/ch13/chapter13.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch13/chapter13.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 4c407cd41a5826e0cbbe29c8acbad230d77c6d54..a500de3e739d23c2d8a3439f9c0cbc033a10e892 100755 GIT binary patch literal 20805 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 literal 20504 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 Date: Tue, 29 Nov 2016 23:05:57 +0200 Subject: [PATCH 18/20] updated to Swift 3 --- .../Resources/Shaders.metal | 3 +- .../Sources/MetalView.swift | 35 ++++++------------ .../contents.xcplayground | 2 +- .../UserInterfaceState.xcuserstate | Bin 22481 -> 25264 bytes ch14/chapter14.playground/timeline.xctimeline | 6 --- 5 files changed, 13 insertions(+), 33 deletions(-) delete mode 100644 ch14/chapter14.playground/timeline.xctimeline diff --git a/ch14/chapter14.playground/Resources/Shaders.metal b/ch14/chapter14.playground/Resources/Shaders.metal index 946c689..cddf12f 100755 --- a/ch14/chapter14.playground/Resources/Shaders.metal +++ b/ch14/chapter14.playground/Resources/Shaders.metal @@ -33,8 +33,7 @@ float fbm(float2 uv) } kernel void compute(texture2d output [[texture(0)]], - constant float2 &mouse [[buffer(0)]], - constant float &timer [[buffer(1)]], + constant float &timer [[buffer(0)]], uint2 gid [[thread_position_in_grid]]) { int width = output.get_width(); diff --git a/ch14/chapter14.playground/Sources/MetalView.swift b/ch14/chapter14.playground/Sources/MetalView.swift index 2a6bdcb..c53b382 100755 --- a/ch14/chapter14.playground/Sources/MetalView.swift +++ b/ch14/chapter14.playground/Sources/MetalView.swift @@ -7,15 +7,6 @@ public class MetalView: MTKView, NSWindowDelegate { var cps: MTLComputePipelineState! = nil var timer: Float = 0 var timerBuffer: MTLBuffer! - var mouseBuffer: MTLBuffer! - var pos: NSPoint! - - override public func mouseDown(_ event: NSEvent) { - pos = convertToLayer(convert(event.locationInWindow, from: nil)) - let scale = layer!.contentsScale - pos.x *= scale - pos.y *= scale - } required public init(coder: NSCoder) { super.init(coder: coder) @@ -28,12 +19,11 @@ public class MetalView: MTKView, NSWindowDelegate { override public func draw(_ dirtyRect: NSRect) { if let drawable = currentDrawable { - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.computeCommandEncoder() + let commandBuffer = queue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeComputeCommandEncoder() commandEncoder.setComputePipelineState(cps) commandEncoder.setTexture(drawable.texture, at: 0) - commandEncoder.setBuffer(mouseBuffer, offset: 0, at: 2) - commandEncoder.setBuffer(timerBuffer, offset: 0, at: 1) + commandEncoder.setBuffer(timerBuffer, offset: 0, at: 0) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) @@ -47,24 +37,21 @@ public class MetalView: MTKView, NSWindowDelegate { func update() { timer += 0.01 - var bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float.self)) - bufferPointer = mouseBuffer.contents() - memcpy(bufferPointer, &pos, sizeof(NSPoint.self)) + let bufferPointer = timerBuffer.contents() + memcpy(bufferPointer, &timer, MemoryLayout.size) } func registerShaders() { - queue = device!.newCommandQueue() - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + queue = device!.makeCommandQueue() + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") do { let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - let library = try device!.newLibrary(withSource: input, options: nil) - let kernel = library.newFunction(withName: "compute")! - cps = try device!.newComputePipelineState(with: kernel) + let library = try device!.makeLibrary(source: input, options: nil) + let kernel = library.makeFunction(name: "compute")! + cps = try device!.makeComputePipelineState(function: kernel) } catch let e { Swift.print("\(e)") } - timerBuffer = device!.newBuffer(withLength: sizeof(Float.self), options: []) - mouseBuffer = device!.newBuffer(withLength: sizeof(NSPoint.self), options: []) + timerBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) } } diff --git a/ch14/chapter14.playground/contents.xcplayground b/ch14/chapter14.playground/contents.xcplayground index 06828af..9f9eecc 100644 --- a/ch14/chapter14.playground/contents.xcplayground +++ b/ch14/chapter14.playground/contents.xcplayground @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/ch14/chapter14.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch14/chapter14.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index bbb890a256454901db20e18468c9392999305a99..dfb49fdd817393ecfcd44b4ef56adea10d68bebd 100755 GIT binary patch literal 25264 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 literal 22481 zcmd6P33yXQ*Z<7j(l%X^bWPi&r7hi?CTY5-Nt3iq$_`~|*-F}mQYdX{QvoY7R{=#4 z6%Z9fpzNR`f(r-;qO!>jf-Hi9fQSpIpaSxro7=Prf>z(}`+slqJWX=%%x}(|bLMO_ zxfKnyHBEM<@+g3S03@IQ4H!Y5Kvx>`kgc()roOH;roLjdtffnX3Q z1!Z6`u!Cms5Eu_8fQjH?&;lL-lfa{3GI$!y0MCG#;8`#qyaE=0SHVKC2rLFm!AkH3 zSPR|;?|}Eg4)7897<>YDg5BT{I1G+}&%kML2Al^M!1v$>@FTbeet`n$0X?A?6hd$4 z1AU<%ltDR+fRV5ZjDpcH26lz9PzhBq9p*wU%!dYOh8EZZ_JMujAUGHfhvm=)N5V0% z3EE*ZoCF_*lOcjr;FIt<_&l5i=fU}K8C(umz?JYdxD|c?x54f3L%0Ke1V4tKz&-FF zJO)p})9?&D4==#4;YD}_ehaU{@8C7~3%o%9f+B*5V4^D#OT-cJL;{gWBoWC(3ZWo0 zL>8eX@(3MaBuqpBQAiXMJ&9h#Kw< zGGZ0+I%>pQZ^Z8;Mbacg z3P>MPOiIWQQclK@iKLoLBQ>O!%p-MV5osnZ2+;;1Al zmCB=Zl%C3`43v>FQ3X^#s)XuK4WI^6gQ!xfjH;nVQ)8%FYAjVp)l&`BII59C6iYou zJx4uH&7x*gbEp@nxzvl)OVn~|1+|h|MXjdRP_I$1Q*TgTP+w8!sY}#l>MHdeb&a}C z-Jot#x2W4Rpdn4u4DCe=X+K&-2hf4Eln$lkbOaqu$I$U~0-ZuDXf>TiXVO`;md>LM zw2|&b_on;Med%HJaJrlxL0jnxx{|J^8|ZQLB>GW$GL7gN^fUBKdLBKWeuZ91ucBAe z@6hkk@6j9SkLge7o%AkxH@%16OMgnApg*Ti(x>Q4^kw=R`U-u6zDfT||3?2#-=c5R zcNkB`ixD!xOb8=oLYY`5j)`Xym~U4<|Aeovzyt+>}L)$ zN0{Tx3Fb6&hWVPg$XsGBGv6@RnCr|>%q`}&fD+IGM&K*(6Nm&M0;wQW5G9BfBngrQ z8bSJin7ZcL+9SXdcmW~s27W*?s8@+%jBR4mVEo=@g$Bk{)>@mIT7eJnMFb*Sfe45Z zg?>f)a#2iHTAJFR%2K7Irx#?WXwsF&lq_X>Mv5srE3+WIK&476Dkv8P6c-c@s&5?A z)L^Z&71UQYkG0j=odX8}Ifz{Wf00!!hsCYh(QA6fjp5H60QIdAQE)J6i7h~ z=!(3N5Awsb2v8_eAn+bWEdveSK|(wXwKqU`Eh0*<1OG}C}IZ~y`n3NpZqEct8lOr=#>PeFhJH)C4>cv2cS><~eXh1s10GWe% ziPm9WmGU2LO<3@T#zyPJR@@+~v{y-QhYNCwC2!c#3>o>R#a1K>tnT#Di;MAnwqdDx7OKt zN}GCEC)PLHv9ec=vNqUljVg_zq1HOFy0N~wuFBKN$|0Z{#I6BD!7wl!l!Fn#3MxP) zr~)=H5``lflA{O|iMpUD6pdm~SA-jn0ySVXW@}F{7PGV-G=OoS5yhbb)PPy5MiVhx zA4V<&m z_H&cxCx&M{L}LL%E}>%)OI+3^zTXKQG* zHQ^6dJC1+w;^gdw3%uD@SJT`y7=vL3_iwb>oXkXEDu`VQSnwEl985v+C;=s+q@`dQ zcmgwPI!Z?Am_3}m<48o zIVc4wP%2U`#j@xLUIH8T#t%(D@|HKBHhX{vboDFXU>P60l zz6>nKs?e*XXS1E7r=SKKpZYp$rmEWupVVQ8W#-g-_FNkyKQU}PuRO)Q!986Y(zOI zADNs0o52S_(h9bKttc01TfsK49pxb%(htKhuEtY@zjF-fX|1lSu{T%Q+T|IYKlL2o z{&?%Q0_v&g&{e2FYb)4!*+rp|fyYw!(_ECCn6 zC2$!Pqi(4C5^x3U*;Uj7%cG8Sx(RN>;e~9sm0-(RSMB)NE>vu^%0+?hZQC^N-s@&t z{aBm5aUw6Q>zvE@3H3z2PNHsrKR6eC6Z{H(1HXe?;5N8}dZFH^59*8hp%T=81-J_V zgpj~53eso*8i+=qD*PIQYLR9rXEzJ1b}Of@LwK4T)MD3Wa3ndLj=I|cta`i+$9FhY z>gDk5QfK&ZpL=1>dxaCQS>bZ24ka4myf>g}Rd3whgn?RM`x*wZ%;Qy556V(k51Sz-YtfyS^=k?+2B(;P^nT&YBdRAM4O`Fp#^VoOBGv!FV8q z2`~{R!DN^M6)+WhPv;bR)K@wz^6(Be^1ctZ7>jkb<1!b$)K%Fg^d9N#+i?$7qY5+{ zS<%RHQEF)=HXsUYZQaDj!ztQbe2KlWxzgU;XmcneRAYsNX{Zt_B+P)Bm|_C-ggJvd z#u(rj9c!B!*~%)N{?}m>U>?+!i^B1c9g2qW@p5tW>0_;FY=wG|^*3$&C*S4&jzA+O zzyu3mAuJkF)fUWRttzuSC5}d+8U)Hk>XBIMb5c`N2Q*<{mx{FmyRlSk(Z}F)KDC`p z7yV1+NiK%nuF9>LD8fXe=7V(_9M62J|Yy z9BhT9Ad46I5KiPnQ9bg-(Lf8Yt~k8S&df}X%up&PO>(Z(5wHSVQ)orw7Q;%^_!mwH zR%0gwN5LA@gdS>lLa-LrySfP20LLLaYQ`=CbCI85bUqR}7LIe!hu}oFJ`ckdG#*Xh z%zz*6Xj+FHUWadE9|PZjYvG%49efL} zha1on=t(pkJ%ye|Gte_D;5+bL_#WJdU+=@sXeN3VJ%{Gt*DGkjf1i)>ck?m!`iT|w z6Pyy*33mYrRsp@M3Em4o#U{829zZXn=dr~E=p}wJ90KZAco-f*v(O9eP8og%PjH%l z9L-(~H)1B>KtxjK$e`LBW;vJP;mq@Xh9)we^G~%kb+!a2O zu5rm~n2<7oGyW+&Cvxs@6mb}0 zt;MEMrMa(tj5chsh_3Int}Yk36LgOy;t6uKLYEvCXCBYc>zwxegcc%`n|0A-q+#o# zN$;>OH{q>6t(4n%rTl>w-sOb(H!%tkLdbE9LP&{FB8&(pWM~;$j#i+RXw@G0GN;IC$o}h0*y&(M!Aj<&K`m)n_XH_KDxu_p6e10+ zM{6B1#ap}p(m4TSpf}qi1R|S@5YRgJfZ$#YCG?yVM;mx|o%fgS`foHdwIl5KH(rv^ zJM?n{Kb>yebh@LBoc9at@O~;~8ZPcQ6!a+3o9ILI1wx`9Q9|@52H?ftSYL1Fa}X{^ z?uFMHR-$T0?#wR_u0Ca(VCV0IH1P52pKhTK(MRZgwC^)w5K)Q;C?f_FLtqgeXgHiq zl!Ha3cvGUbs?k#BkziVg?=sV7yO71ls8` zVYrugmb3fBENu68Iqd#ke!_D&GF~9&qTOguhiQ44nD1`)+YC6dkXY<)z}wZ`5oZz0 zi52CdI2@m}$Jw}`)lsu_SDjX3B^MfYwmCn-YGO^fD7q6Pv=Xmz=$&cmoZTD5n|OAP zY6Gzj9Y7kMM;mZZN4!nEgASr2?ZE`Gk=X1Spb=Y$t>_RsjP!k?^B+FwFf>lw9mFU1 zG~I=p9!2`-{JKSMEk7j=;0TM@N9;$Rq2sN@LE;cPfj)PHoX!-CPit_s1}_9RkJ)}h z(VpCNqKT8p3Y|u0&==_Ja^fs;4p*bP66c8v=p4F? z?Y#b8eEPR89L?t<7Q#BJgZ@dx@ET|}3- zFZhMOa4$`tK_&IgjX2XT>t}1?KehEGJxDJnC8Q92gY?cDzN8-?ue(JL>hx@EoK>0a z(F5sE2DSqPp{pGLQZlTaaE=mZ5Kl&sU7SizMxpQ9l$`7eHZ37z$v83|{eZ5cU)mL& zOd=Jo+DoRAO7tVT#&M0Ss<%s+tI0;^H{`o2G?`9jxpmGabI?!dXIy{7U3tI2_j@kV zt)HGWy7e>RL2q;n+Fmo~3&Dx^kM!C_<&yq78C*>E2C>V?Ze(||2icSCg?>Z7qg&`U zy0eVzL-r;6ff%ws`h$gH7D`Yk3xDA>J%m?K_fQb0mADM%=hRw$gM}-_wpF3|){a_K zQ&D{*-#oyG*)^u2zNXIJZPc!?w0=4tqon1)EmG&E#;hoE$+~ z$qKTPtRijXNSvYEWg%oC$wHci0v39*P{=|b7W!dvcI3DPW?0FNiGRiYFDUKRpic2e3t~T>rrOHM9|D(|H0jzT!>S2B;=06>(-N>bu zjI!b#(k6w2hpt0S=7;hq7xnv(X4NrNQ?o<06b*INt^-Zs2l6TxGlo_{#&_@@#{bG70w#%wl^ zDEc3ei0cslrxNK5A^(X)ctDwKIP!tE+glWui{vSoKL<&E?}WQ3j&o$u;C_ER?b^5{EY~8nKSoh>&uT`7h1Oef9tTHibXILT(`6!NC*xHVZ=+lkc*4 zgNEaUGsbjA0M1f6zcWd`kFz#%GYi9!?@{stT-V3debAHKPJT%4z#Fcvoa}?WSg+=> z6}CpCW}%#gG8RVs&rJjG*ZfiP%(B@_9Jv&^libCJ)a{bIcLqzy-Q*rFjp73D2e!KZ zZh=#5pOX7Ip6z2{m&N1(7Djc3XGb`m9c5v(JI_v#lgS+%YhqaFfm!1y*3JC-)F$U( zXUMN{QH=b8JWHMgN2za%wl2o3J^mD!%#{J!>BNP<_ib;IcPWwb5S`9wK%=S zYr9K9O;g*xajkVCw*hX$hc9YzNM3~v1wQ_QKR8%|GGIs0+#mAPJ+Hhg@H zN~W+b`n4aB;5Sm2;L8ffu`&L;Q`kx>1E+D6ic(W)l!n6c)w3|4g$5QHS!h~DWl~xE zRyqp{SXhXq%5A1|soXs~-2V-m=|{#YhdlLRyR4j(ETp<~lPsdll!Yp$y0OsALJJFv zS%^P(UqHhNt7#GPRJK?mTKf^$N9sdX&^)SJ{g>Md$LwE>riMo{lk?@=46 zP1O6;W@-zymHL3%Ms24)q;^mrQ6ICgj)e^@Y-FLGg%3HZN4SPGfrSsV@DUb1%0k4# z$5=Rph0|DwHRdT6&R`){kmp!9i-mKz0e4cnsNK{aYA^LEwU63Q9iR?Uhp5BU5$Y&) zjQWf^PMx4Wr%qC*sM9Q*%ffjq#5o1#`brjJy?uj)>sW{*>n$wY&O%HSju;QJ5C?%L zSa^?a7^4RRZ$Hphux$1n=pRxUU?8iIF7k6E6r~SeBAw2%n zPU5>Ap6`U-&@vwXiB94_fPVMdwJYzVc>L+*BICc4D_*PjE4R{dJn++;RWa#7L0 zQ~_}2(HffiE%l*Exaha4Rfz+5>pHs;*iQ4XNAY;`+OBR&3soR~mQ#Qbex;W8F3=lHwA!QUBQ zWgYn;o+l|ygO4t$F`qjSSsI`3d;o8spr7PPTgBq@kWSKOTs(X3$+!PB$7ks|7zn2t z&I4bL<6cYY7wEY>$ZITo-3fwE%FRhPeK5F1gZHIX>h$&`gI++l-WO&Gjepa^$$2dc z-*kbwj>e20(vqb~$2eJO9V}l%<0BbM+oE^Z*u7>cy^ekhb7}(%-(ulPoZ=$n z0{=4ZK(9)vQDZ&K%FJ-drsz%d2OO{7r#I7E=&dY#hlRM5`yLB7E~U58+cD-27H(qU z`yA%x|BXbT(~5YuA~0%oE-xfy_N1~Fm1BLiXNL4X`Y^{IzBJ%k80fx~K0+VGbNP&g zc#a=%bJ^zL&kg9e;ev_hk2)(0gQ_$6b8u}b6MdTgl4H<)7wT8^c?|kB3qNGx4i5Aq zUOlf$mie9PCy4JNkPX2l1b3Qv2gcN`Wk&5 z!~V>|JuKYI!G8LG%J-S-vhU{)9@3&t(>SK1!djG;hLy8pHh(ZA$NBpi1BPN~Ud#8h z_^7RO#T}_W8uZcIgIh8j7BVZ%X$}}~M$AF+89C0b+Vk-dOBo5{54tjeEIh=*!yIFd zIQV^cZrQVy^}G<%lo^=3Ob)i4JSL2Zd?0yUm?(@H!@^@M{EWjq?!d&=rzx*K$zx_` zXm|;_t{f(jNyVT{5|hlNFbWoa&cc%{JjKG(OBp4j!l1a!dWMBxaG+=ZPbK*D?ASO( zT)TNI#awq4ACt!zAINhPQ-G&Z#KJFG_!T#m^KCr;ZeF$?yEqlrakVO&W6DrOPPL535FfOLcDq|aiurt#G#(pqkD7UmZWlPJ*#?sWd zDH}6{8G&K%yL1>UQ-NWtSojSKuW+#VOcr)MGZXAne&6q4Kzb%uQ_^HQev#9*$eGbh zJxA&Nd_2>@jN|q9I~IQ5uD{2xJdZvLb0B7CcWCbfW)cTa~NFmS9|n}ndp!QFPU8R542Rjm9i}VA=bH9BYILgNTemgpU z#!APD#OVBKk&X{eD|LnW?jDTqnIBj}#1dleMDNs>+PY17(yiOi%*}hc{mOjL68^X+ z*KL}kF@EBW<53yR9RYA}Er0@Sr~+9ch->{sWZNK*xeX!^2=IAQ*ZB#A0&kWGVF{^& zHhvJ?-{SbxHkv>z2)L(Ppdg4P!dN1l>-N~Tw$Yx*a_bf*z&{Uh8!dw4rrg0z%)mu% ztz!gn_q2}ZXp3~xcG<0Uia>c!Yba1V7!bvgG$qolb%r4Op4NdJHl6^Uw_`W4yKSPa zivPWUt?`gRFUTL@IFX4U@W9Xfh{De|N(VVWPd$yFAoD7IYRo!ZG2epgRA$Kt2JB+|+FDKJX>92gDGl?!Pz&WgL!J@Hdu`eN@@K~KZabGd<^&!S;^ zV?W!3pSUuCc^E%)WhVAV3$b%~9Y1GfA9H{?grBW)3_o4vbLJF&y2@GnOqHLR8_ciF z@62uH4*?Jm_~|N)KqBZWNE1{F9uh1QyeHTxI48I%_|=2<2=|bCM0!Md#CXJd#Cs%q zBzq`4lpbo2Vvp_~Jw1AR^z|t57~nC;qs(K7$1sm_539#`kLNs=dc5Va+vBLmB~RcP z?V00Q=-JP6i03fRa!;#grDv^Yoo9n*qo>{TA>>SzUH~n^Fz;%JU{W=<+;c6 zi03iS;p7K27dCM!rE7z;P*8s0UUL(A$UX@<8UXOWA_nPaq#A~_NO0P9uuY0Za z+TnH3>xkDeuM=J;y-s`m==Gb|A42?-4mI|%H zk-{e71mVNNM}(~Kap6?q6T;_(^Mp%;ZwWUFKN0R0?iKDA9uyuH{_ZXC_VV`j_VX5d z`+J9YclA#8R(LDD)!y0Ox!!r+dT)dGSnsLc3%r+mukv2w{kr!i@7>;ez4v(^@IK^y z#QT`{aqo-Xm%XoeU-kap`$zBV-amWa@F9Ktd=h*J3jCEZ1UOc zv(;yt&t9K>J_mdb`5f^%=5yTVy06qX&e!NW+PBH~5#Oo4Gkh2OZt&gV`~=hxkDpx;ox;eI3hD*S5wn*HYZz3lg%-*&(Kekc7d_+9k7 z>~}>JA&M92L?%(0s6zCNXqIS;=%VN+(Jiq+>?szCeZ)cHaB&xLqBupIDprXt;sN4P z@nG>VakQ9c!7AKc&T`~c%^u?c!PM0c#rsi_>lOB_=NbR z__X*7@sHx)#J40K5>JVj#9Jbjgi69BGD)H&RiculNwOq460Jlh=^^PW87`@m*d*1G zT1lOxLDDFBL^56SoMe_{j%2Q6fn=d%v1Ey4ndFe<8-M8UdZ{k!@1@bBf{$G@L{fB%90rT&BctNok&XZpALZ}mUzf7$t83fLQ?x16l)?2CN8J6|g4Y zoq$sT7Xq#Y{1os@z|BBipgFKMaAIIf;H1FGflmfL9r#S(vw_P4*9UG2+#I+ya9iNc zz}=AiLG6N6fU<_4_`IuUd+*f%&hI5IdPSQT6p zYzgib+#|SGaG&6^;Gx08gGU694XzI!7u*y)DR^4&?BExIUkrXZ`19cNA>JXq~$P*#0AxlG+hpY@)9kL_j(~u(}XQhPHS1OW9qyf?(X_7QW znkrRE)1>KAozx&TNeiX@r2VA>rKQpe=@{t*>BG`Tq>oBpl)fyTFI^yAC|xOiUAk7f zPP$(DsdT^ep!BfxsPv5Vob)T{1?e5>-B1`xhSH&e(C|=sXk=(qXiR8qXlke?G$S-C zG$+&?+AXw4Xz$Rzp(UXsLMuaUp`$`aht`HRhdvs*GW7M(4BH*HKkQ)G;jp7&m&1kOityZUOL({N9^t*h`-Jxk?;maruMD?^SBKYx zj|m?eULQU!{O$11!+(_tWKvnIEJ2neQ^=GuwX8taSJq!PP*x@zA{!>Fmf2-3vPrVZ zGFJAa>?zp{*-Y7Uvgc(l%a+LAl&zP&EqhP4Nw!(GTee5GSGG@fL3T~{v+RcKH`y)O z9l4j>NA4$=$OGg-@@RRiJYJq8Pm!m}v*dcYL2i;4%FXir@-q1l`7n8fyh=V&K1$vq zpCW%=K3D#de4c!ve6f6qe3^W`e6xJFe82pl{ILAE{B!v!`5F0-5weKHi1diei0p{m zh`b1WM7M|@5xpb&Mf8st6j2sokC+y*Bw|y<$%yk2zefBXaXaE}BoRqRdPE8%eIvz@ z0g*wG(UDyv<02CyM@Np2oEX^>`DmAIUG{Z3(B)8poUkNedBVwrO9|g3e4Frn zVpL*kqAD>hF(a`$(VqBF;)KMO#I=c=6SpRAOWcuoGl@#_PYOzsCWR+OBt<24O^Q#- zOv+BuCh3w4Nv5QtBui4aq`IW(NlTOVCjFFjCs~*rkSt4%O;#qSC2vgrF!^ZmspJdE z*OG51-%TM>=oF6>VMJzDJQ{PM7p1LRXchGzy zQ|~IFl2p=4UuCc|MwzNqE7O%(%3P&RS*+}#?5*spEKv?rmMWW+^OP%Y7nRldroDpZ+O6{_i~7gcYmPO8qUuBv`f6SxYfQD>@i z)OqTBwMkv1E>`zY_g42)4^Wq?hp30Et?DXuwR*IAthzznq;6F&Q?FF7QNN*Hr{17` zSG`HSMZHbEL;Z<*xB64{0rg?^G4%=cDfJiXFVz>+7u7$he^K95|DINqR+2U#ZBW|a zv_)yJr>#v}m$pFzG(H+XjaU<)8LX++)M&NFcP+ci5hA8U4{2c&mNk52EJ9-nSc zXVV`~pPK$;`qA_+)6b`Woqjn(nUR;F&oE>ZWX#BTIb(jtf{aBOS2KRgxRr4y6J++t zEXy2{IV^KT=4+W7GvCkLlDRF5&XQyWWCdkOvus(7S@x`lvL)2B3qR`Df_AH8QC+lpU*y%eI@&9_V?M>a&mIaIel_Uat7v<)N&2_p~2r4{1+o&uGtS&ucGgf6!jn z{-V99{at%IkIwVU3(4!6r^r*~Y4S4ja`H@hMR~<}-Sc|o^~oEPH!E*Z-mbhuc_;HO z-y;i=t^}%bXB@)-Dq8{u3k4z z_pol7?m688-E!S3-D|qFy0>)i>$d8)>vrfq(e2Wm*L&$h^!fT?{Q&)N{TRJnKVJW^ zev%&Pr|W0vpVdFFpRIpE|EhkK{vG`X`VaLV>v!q*>W}J=>rd)W>(A=H)L+s6tiO}* zmG7S)lrPN>&yUED&rix%Jj{fZZFtS_w&6p=Uc(8)mxc?5ONJ|k?+iB#zZq^D{xCu#Y4kP*8s)|$ zqsEwN%rWK}^Nq#E9>(6rzQz*c0ON3Dwb5>zWJJctjnjLO|F-)a4sz6bYTaZ_vFEAF& zESO)gpkQG^Yr*k?3k4SoE*E@Tm|0j*SX5{!>|Xd{;nKq8g)0l!6y7YNikKpgB4N>> zqN<{iMWc$w6un#YQPC$wyNdRj{mqf)uI6}il38g^GiR8y%sO+SxtDp6xyoE)t~J-2 z?dI|3hs}?er8SZA2ok&K5ag0{?dHK{F4P( zXp4tMXc1ZbEkTwLOBYL`CDWp{=q*Nz+0xC@)6&~gYOz}CEKQb&EE6q{T3E{z%QVZg zmRBr`ElVvcEU#JCTHdm3uxzpHu^g}*wj8sZw4AY=vwUUw*7B?6PBADZi#>{k#lFR& Z;;7=d;uJ?J3kZUL7Z~_==l|l={|DypZRr32 diff --git a/ch14/chapter14.playground/timeline.xctimeline b/ch14/chapter14.playground/timeline.xctimeline deleted file mode 100644 index bf468af..0000000 --- a/ch14/chapter14.playground/timeline.xctimeline +++ /dev/null @@ -1,6 +0,0 @@ - - - - - From 189b8b986c1ad7f7f24ef49a1c117a38e9490d9a Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Wed, 30 Nov 2016 00:25:19 +0200 Subject: [PATCH 19/20] updated to Swift 3 --- .../Sources/MetalView.swift | 20 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 23897 -> 24229 bytes 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ch15/chapter15.playground/Sources/MetalView.swift b/ch15/chapter15.playground/Sources/MetalView.swift index 39c41e9..a451e4d 100755 --- a/ch15/chapter15.playground/Sources/MetalView.swift +++ b/ch15/chapter15.playground/Sources/MetalView.swift @@ -13,42 +13,42 @@ public class MetalView: NSObject, MTKViewDelegate { override public init() { super.init() device = MTLCreateSystemDefaultDevice()! - queue = device!.newCommandQueue() + queue = device!.makeCommandQueue() setUpTexture() registerShaders() } func setUpTexture() { - let path = Bundle.main.pathForResource("texture", ofType: "jpg") + let path = Bundle.main.path(forResource: "texture", ofType: "jpg") let textureLoader = MTKTextureLoader(device: device!) texture = try! textureLoader.newTexture(withContentsOf: URL(fileURLWithPath: path!), options: nil) } func registerShaders() { - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") do { let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - let library = try device!.newLibrary(withSource: input, options: nil) - let kernel = library.newFunction(withName: "compute")! - cps = try device!.newComputePipelineState(with: kernel) + let library = try device!.makeLibrary(source: input, options: nil) + let kernel = library.makeFunction(name: "compute")! + cps = try device!.makeComputePipelineState(function: kernel) } catch let e { Swift.print("\(e)") } - timerBuffer = device!.newBuffer(withLength: sizeof(Float.self), options: []) + timerBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) } func update() { timer += 0.01 let bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float.self)) + memcpy(bufferPointer, &timer, MemoryLayout.size) } public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { if let drawable = view.currentDrawable { - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.computeCommandEncoder() + let commandBuffer = queue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeComputeCommandEncoder() commandEncoder.setComputePipelineState(cps) commandEncoder.setTexture(drawable.texture, at: 0) commandEncoder.setTexture(texture, at: 1) diff --git a/ch15/chapter15.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch15/chapter15.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index c4d17f04d1a4732723f46785516cecd21363cf71..e3db174bd8be02dcdd003d1e24b59f211923a3d0 100755 GIT binary patch literal 24229 zcmd742Ygf2`#*lpot-pIo3`mnI_YlHm2{^~(m|V0D3on2ZGb`-Y0Izz=Q3o7h>D1S zKnGh<6cJ^EsGzbzmLN`KgG^EUotxXVDS}o%-`C%N^Ln-Ez305obDrlp&pPMcp|zD2 zb@eeZM*#!`AOQtvz_4Gk`}+ruF`DWsYO4DO)(jnKEUT{@5Ljv|8&QET_X(`8sTBkG z+_JZwi9)~v8{h(5fdq61As`flfp8E3B0&_;0v*T(IUpD0fgT_q6aYOifS#ZNj0B@V zC8z?`pa#@}(ZB@iKs^`-CV^?-IWQZ%0A2$N!0TWkSOVSw>%qI=J+J}14>p1iz$Wks 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 literal 23897 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 Date: Wed, 30 Nov 2016 01:57:53 +0200 Subject: [PATCH 20/20] updated to Swift 3 --- .../UserInterfaceState.xcuserstate | Bin 20767 -> 20365 bytes .../UserInterfaceState.xcuserstate | Bin 11344 -> 11773 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ch17/chapter17.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch17/chapter17.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 6cfead6eee05a50a3d25d0c33a796cab015ac073..248130adb5eeadc4812bcea6ea78474d4acde5b7 100644 GIT binary patch literal 20365 zcmd6P2S8I-AMZJLu}L5h2m!(fn@mVT0s#WJx42h~5G54}GE~HIu65RGt<^eOt0HJ! zwR>xawa&WhsMg)uVOwph)~fZLn@bqh!PoctzE2dwz32SS`R{S=bwqioqq0h^J_;Zp z00}5S1BQ8?Su#LA&R$XJaFz{_J4ZZWFRH2>D7RG z1R@XwfyaC<>Z-KYLJ75R+9P9+Uz;3Vy z>;?P47hpd)01kmu;50Y~z6F=Tci;;61zZI;z)f%)+=Boz&~Q;0|~M9)(}RWAHdU0Z+oO;3;?>UVz`i zAK;Jh3cL!h!C&ET@Fu(s?+}3SCHx3~LO=+Ka3X?;BxFPs5lbWy$%LBF5PBk;$RTox zjzlM-GtrwELX03r5>F7LiBh7Rs3s;7Q;8>uIm9!>B4RnQidaoF5bKF8#GAy2#8zS( z@j0=RI7A#Kju1zQpNU_HtHd?pSK>F~cj7v6gSbijLEIw#B<_-sq(~3aoAe|7$w*R0 zMv>8E3>ix%k;$ZzOeZr)Bbh_ylby&OWPfr1IgqrGBgi6hG+9cHA|;8 z$ZyFX$REjH$gAY<S%7gNxyeMxfl#)-#LKI6)qn@Ou zQ!}WU)FNsz^*ptNT1qXWmQycK>!}UYMrsqanRSE~NX=ed&I5e|i8tkhaq!=}~kET}4;Z-1QW?5Gbv0eqhOSb zipgQ}nF6LG(~0TEbZ2@qg-m~D05gOc%GjBa%qXUWaWG?<8fGFhjd_xp&OFV`V;1+7 zmsOXR9syp!8~6ZUAOL~=yB8`)+iNNZ;h&9OrJua0)K*zp2mF9PA`n>zgdhM*1$v@9 zt5Dufrz_Cv+o=^9dUc*6-Dt^It;k;B zEUF%3FROB|EC!JvejNw_p+Ew{fE0v-2t*?Wc_2^Zg}jl^Iv@j4AR2EW6v#mw@j6w_LA}ZA8Aatg6CUT57MbW~d9==j9pF73zX? zy&^qBqgNR7j9Nv3){1&H!H8C&gadSu(Z}g59bv2JRN2o_=@?OpDGF`AXB&~% z`c`dix<;QGm8LgLPK~NH>eZ=HI*oerWH*D=zy#vg0}arEG>{H-Ko1Nc0~nD%5+ET8 zK!Hevf>1CLuLqeR4wykU$N{1{8suvg*_wkjOiv5txH&Up59a~9jJg_xbiwu)k_FrdIbqI%RQdqoqYIFWEf^24#s z_2csc{`bP_5o0jIpcY_4AvfHO!!wpM)D}ZJ*vlN%joav1YO5Jl;jAtzc1_{Oi}3hH zDw?hi!UM6O`&8KNZVjvg)gXS=DkMJ)CV(0+5!4Ri-AWlY*8%)TJ6=cBy|7z#l?`ir zfdiY0v&>devjz{J1SSvZUf6tXK=;BPuB6Akz*NA3_|*U*{B0Ua;J6#d)6uAP596^L zU?!N&0n9>)tHB(Ugyem?*&Jo=yYs-aAaD(s51s)FP%=tEscXPOEapW>fyG+LdBUVt z%V9xP*$c5Tl#OzIY}z_jKC3Xe^;ml;PT%ZUsI9Meusg@tt14;^yZrNV@ZxIl0#c&R z?oGV})^dJxC0GSkgF3JV)Pn}3LTaQzT9k&;k!~GW2VMs2!3O-b32a7sWI*|-1ODoX zdLj7`PX7yRRkl7g<@Uk+o?N@d?#ALuB{@m7)=8{+ye;B8ovQ3(y1V?X#O>1`a8K&K z*KPtjSzWpS0Vyh-2O1iuTmfxrgv9(W&o06qj; zQ3f(16Uszc4d5g2F*dnR!FFUu+1Si-k%f~=XwM4A7_3C@b^18Q*ek1SW6E*py6;w_ ztIaR5RoJjNDtg<>M%jmUbQIeyrKO!JE2}xlg<6V=?3Ipk%DFVxh%s1&n=f+#rmWaLp~pz~+~#|zD{6;& zpaRszDpU<9!k$8jExVO83!EIBvdME7R#j9NRaIBmdHwvF)6X-gJ*S`N!3DhI4cI`w z8PvQ+U)Snb`8uLb1F&Y>O08R8-h%>cCH6vS{i({?8F`4e#q$@EiCYTpwKAn1^898(8Jm3)BsDN5Cr7 zjKsEKQmIsZE3q3@VI9JbP=%w*Xk1#U+`Dg~q$+;xKfo>Q#tQoNar4+MpE~d-xBUm* z;%D9gcdf$2`?=oCj@EWq2ma#V+C1JWjBgTa7e|$nw|4g?mCerm2!y}~65u+dz;9eW zIKozGAB=xi*h{gZjk6YLIMD1ZUjI4OXqnrY8ftLbBBEFn#(go1GU4N;+ISN)<6xXe_lf9M%P0l zh_8bNn1PCsy$+gSCK`!G;e^UXc28%egA03Yjb1T1v1w^;Yzr*lu=8*bD?y2MupMlV z9B4L@544nGe^!Pgl6z=p*d50+*adcl-Ov+gG%8&KdjK=+g~nj(ocaGDp27Z5vKkIR zWzFIo42y6)gG1m@I1F0haA<=gkQ0@ov8V!7qAFCq4i-Z@90^C^F9&=AjYH$n1T+bM zO-D2S_u`qTRXnS5){JmYa7&;Xjst->Bg$*x-(d}$i2eI@I2p012D@XN&+z&`6}(sn z5oFOsG`T4OfYaej&VXj1+SPCrW&$>#z%o|?-WZ&%TzZ8okD?M=Io1G;p@qMSO5|c; zsiVxE{Swp4fAE=MKGvyGI2bDXxQM&o(Za>xcen&i z!!GqntFT~#VgeUg6g($Pk8rK3q7sb(fBXBkas2$b+YnjL->t&d8@kV-@f&L4%-~{| z3o1b4z+a5vlo_o8`d zK6(Z%K+iV7FW`Q70B1zo(L(ebT7)yA$K^whNNxU6s?_Fu=;v<3Cq$cKbMuhPnKmXy zx|W#_JPp4FC*WCl4!wYuV9R(OE&qp!3cSdP>JnPol&HYVT%v-Oae2wWCY}46F8{ z#Mcu9K@t=}qk7bU)}nRwga_dXY=k#@8NGrl)>n~yKv(-nS1mrUw_{X^>(d~aV#^o_qcxgYJW^pwK z?t9qBbJb~OZ`=5Owo+H_9oG78V|ra!)yj3|YKPQf3Ri-_~{`Z$%R^7E?6{pIlrAm(izqD|-Q&DAUL#&d2hibW>wAlMx0NZqN4$>?qC+UJXKZfi@K#p$5%KALLqEeqkD$ER+_F`z zM(!f^f%rAVZekCy7k!D2q2p_aFNpob0dxZWh^}xxBBE73#h2RHQ7PT6h5&a1q3ISj zn1{@1s>R(L_>wq}yO+c<;y7`FI7xg(oFYyWUlV7Dv&1=c5`BeEq0{JVbOxP8=g@g{ z0bSe(;)sjHCE^?GmM`Pa-(v?IM_j?~`4ajDUB-6v9sc}1{+EM(;P%gTq}x?gI4gLM zh)eZ$Wt{IW=9;UG&6M7_v4veHzL1Z*@3!(vdodo(HBz{1?Ix7tcBZ|Ur{u% zymxSgl}0b$)QP}Txh?@WFyA?b>y~0n+_Wkh?P~ouA~&tZAvIoW#O_^E@sn=llhvLxJ}$yg}&t#`!C`i?o~FnF$?Wg zYly!{04C!)8UNx^M3QJ6j+K(6p=1>r&R_RzaoxxDx$Pn+1tgBMYe^v)Kn9W`;y4+M zenLN^U(i)7?rUqw5Hge#DJdnx(XZ&bOOQ9wADk#%U0=5_xT>2A3j6^_lkznQi@Tp^ zAL*=U424+m{BZ8fglDL`t?+lox@4E%jq5U2SN{DrS7E!=zD56-l#}rwa5Wi+ep^i@ zpx@oaIG-6kt=W(nzF zA<06@y>Qbh2|v9&*EJmuMpANMF$vQWUn02Yc^ z7|g;DtPRcmHu5U4LltWIyi+Lq8udFa6Z7&@&9I_)9QD|qN2tFTww zD|{e7MtYdy#corfFC}TcK0XASIF0JLyp`+zRE%=3&ZQk*U2|n7{S6SPD|U^kbTTR z-qiA&>k;x@@>6`=OTI_GkCpF3ax1xw{D}OR{Dg&(ER5n*FouP47RIwMk%h@DOkGcI zCqE;1ke`z~$z9}bau2zeg-RCcS(wd23ky535bNb&78bLx6vUnN^rI^06&* ztV?as)h~I-Xsb~Dc*xeCr{&JR;$dRjytBuv`dJ<_&MNHGhMoQADt?K_Pp}G&ZNOJ+ zAEb>fS@1oNmxK@9ACK2Uqg!J9%wwcjg~~@_Jks2L<3SWw;iEezoI`k&skvkK4e|~b z9d43;khjP`$=fVcu~5xI4GXm_Olu(T!u{kuobPOBaqaaS3w1c(vAANxeaCbyP6YpJ z9kA!`MQ2N5ni^k?L{dH!J|JnJd?`Q5pAt|)78+QX!9pVoO)Si8paLloCJ`TcvM`H< zW=tY??8)Wk4=3^;_3|FUnKrli6#2;wEBZAZd%B5?qHwF_!A(pm0q&=gcp>I+Ld@lb z=;{FvAAj`P-#DhGa7x!eX(%m~Mx|3a7Ur=qpM?c1Y{$a(4U_>R8hOMH9Ad}+X|?$C z&718!{zhawstZSCd#VG~k?KTsW+DFDg@s*N*o}qV8>p_B$nGGH>dC?$9FaY_=XUUU z|0DI{5hDIaD${1Yc>d4jz1i_iR1T=sYINK&xLZL6Q#Ov=A=FT67-gk~v#^kbeOTC+ zh5cCAzkwQo$t}j@j%4w95+-*bNA95iS#q!6J^Pxe1-Tlvu_d`YCg;o|0Z=fbnHJs5?lURuJUG9;hTox8RhTMN7!bhk?o28q0B`NCU+l}Pv zCl9FAsPPd?vvg-s^Eh&6Q*)@NsJYbBEVQ!_OL7zoOIYY=pyp%gF5oTp2~N7B|EDeX zkDWW-`MbrwNY!yfuAp9`R#K~|)hryt!ZH>*Sy;}(u?^H3Ok@L3WCcfL<^M8~6Tc%% zPw#2cV7HyVM&Yz`i%>|tPQ5|BNxenAO}#_COT9T!@_4-_#6kho%)R0L48i`q;^resXf$Q zY9I9lwVygb9i$FXhgrCoh09oo8M~f^n_2iK3qNGx$1MDeg}Yd|kA+8Ac#4H*S@%8fqX?~pvR$<4-uhTlM#f5ZbV@X|EV#6g; zrP8&Vmhk6!_=&i}dpvxLT<^YpyUX>K(BJaVldQtL{~Kt&56}|$M;>^JRoL!718xI9 zuJYK(DzrTwyN%^&3po@%Ob*xib*EW{`Hx)pZ~5|lg7`bP{^XITw@Fd40zIfYXhFe4 zHR&F|&dmQu>pYB8G{vtoyG_!+&mbPuVQQgSv=@*4lvUXNky3D((Sxj^yM26|R^1+# zw0{!>?azZhZ58%@B>3a1na4?-7V!(sw+e?nav{ECYFoYe*hNG6MHg6weIL2#W2t+* zkX$@oAU*PhLlXJgq} zPp8nSAdbeZljm9d;0w+}mm)bXSGWQ%{@H=9M?Tf*n#luk8l=^<$b;x~8b26TPwQws zZJ=?Dx15D9u<%6|uBfL?G=3_dHnZ?07Ovz#@q^Tl%;o=4w%6vAP9gfJok-@2|LJ-o zrbUN)=II)vJ7cFi&|NuNI?|o!&NMDe>R7mjh4n0KsHeNpxH6$}WwMrq>o{6o{;$#! zGg|e_*3B-#XmnaF&QJB)mgzV>h_*hImf&PzM!G7j?zdNf^1<4o`s7H(nTt1Nu2o_5mZd>;5Z3*Tr%7WnUqI;LdQWPN0l zsNEJ&OCyeeN%UlT3O$vDZ?W)g7QVy6ck5}Eo`#t+orUkQ@O_RcAN*GZ{QMuCf2p14 zqClrj$MV%_TFG}l{TwC**B{N*M`P(xPcNbuV^Wr|a4QS9aio028#7MwH$64DHa!DZ zGFpQ{i%mdl)U^`v3L0np^|)wlE?FDv)p~jjjURrYvHpL;;-|ha>~n&>v$+z&}v$ew;q5 zp8kaX6vN@%c{dC9aBzEFaEiRmy|(rmf(vvlCRUT-GJb8kA)}>o@1YN1OnNW9kN$$* z&%!TQh`%3T;lXH-V zEWF9WTP(c2mdRj@jETu)vKX9?++_)ZB}kT_S;CXWj|{e~tC>7L?fUg`J%3kjhwJKx zJn^e)k=8REc+B7bof?|y%ERCI7b+5_7mxkNzg;vi{rH9cY%AZ@4?g#5#rMHH=AD1P z5aC}(W`;2~{FDM?WrnlxFBaabV@5DVECE;oKjF}KJom~~zY;t5IBIO}9M=O1AU1c# z3D+mLMnA!fc{ql9Pz6){w?X4w3*iSM@Y^B6R*<#Kl>0_cWe`g+EaAb8p7yb8bZqXd zj;*H6U}oPpZ4O6`my4R%+-H`y8ae3br5eA_zKi~WVX$Y*!ta_7 z!BQHIHB4tpH+ zIOcJ}<13H5o?_2r&kWBVo`XEccux0R;rWK=HqX7D`#it!Jm7i4^P=Y!FT%^qOY9}{ zO7&8CX}r?C^j;ZW!@b6Mm3viqReO#1s_~lQHP>sQ*CMayy_R~d^jht;#;d_=o!1es zAH7L$UvGhTfVapy%3I~F@lNyBc^kZq-kIKJ@2=k6y?c81_U_}|&wGIPAnzgG4)1F3 z1>W`EAA6ti{=tXx3GfN`iS&u`iSd#9#QSJ`(tLD21|OqOrjOZYfX`H)c|I@u9P~Nq zbHV4L&lR8FeD3%{U$JkJZ-#Fd-%-8}-_gEfe4V~yeb@MI^4;S5n(rIFAN%h0J>+}D z_e?L=~wPo;aBB1&ToU?8-Ba}_WND(`^i7l zKf=GG|5*Pi{xkg-`Y-Z--hZk8YX5cqoBZGMf7kzg{}26-_@DE?=>LuXcm6;4Ul9O- zm%v{j6a)%_1kr+cL82g8pb}^VX#$-fU(io5T;LFl6VwVO3#JOD3uX#t3!W0ZC}MO{SQL_I{kM1w>_MOKkbG(j{&^t5QcXn|;D*9FQyXc1K57D1NK|#?$sX@vhb&xhFJxCv9 z3Ca&@7t|rBQ&5+nZb2nMPX=uWdN=4?(Dy;V2Hg%81_uTQ1&f12gTsQm2KNmf5IiV& zNU$S#bnuv9XK+pMwBTogpACL4cyaKT!Dq#u;$U%zSR$5+<>CZ!k~l@2C+;EcDefgM z6b~0W#G}Py#7^;8@kH??@f0x`$djUk&uUJZFYA%{Ya zg`5caD&%y?_aQ%rTn+g(+Be6)j zOL|IrOZrHLNk&PkB;zC#BoigiNft|%NR~-nkkm`oOEyY2OSVXMN%lzgN%l()N=`~n zOU_8nNp4AQOYTbUg~2c~EHo@EEIceSEGjG}EG0}GrVUFE(}(4UwGZnU)+MZ4SdXwF zVb(BPSaI0Mu#&K`VH3mZ!`6o#2|Fz%q#ja*)Fd@abEJ9F0%?0`4{0B1Kj{GJAn7P+ zskBU5F0Gc1m)1yYrIVyHqzk1>q|2l)NLNYgr1jFZ(k;>trQ4-Dq&ua%r3a;lrAMX5 zq$i|*g!_i8!n48)!~2H!4<8slIDBZhHQW|n6mAb6748T};nTvWhtCY39sX4K)8X^O z7lbbiUljg)_|otD&kVaHxZX3u0~vo_$}g2#NCK{kui~~$gIfh$lS=h$b!iBksTxZM)r>!7&$m{ zXrwjL7FiTIF>-z67m-&Y|C0I0{AEI!NER#$ktNCWGJ`BbW|DP~b(VFN^^o>3;**@8R*&*2x z**V!avdgmXWk1WV%6^so9_0}wjEabgiIPXfN2Nq5qcl-zQI@FAQT?NaL=B4?9%YXz zi5eX>CJIH(iP{r&KI(_4pQ3(=x)$|Uv{$rmv>-Y#IygEsIyO2!Iw?9eS{bd0PK)jy zJv@4H^rGlDqqj!yi{2l7F#1UJvFMZ0r=!nCpO5}I`fBvA(br?LVmifiiRl*8GiFIl zeazaJmt!`@+>7;%^^X8TGnkY?-PfSWoO;jeT6Saxyi9Hg> zB~DLVnYc6YVB*QdZxgR2{+4(>@n+(!#M?~G$&yr% z)FG*JQn#c5NrRJyCJj#-kyM;CGKo!kF=>0!p`=^MM6yqEXmV_Fd~#B9YO*R>n`}%UQPWi^+xKg)H|v76y6Fyg+LLg2vUd@p^7v`cSW`0NySFR zn~JT9J&G?CClsd?XB6iZmlVG!epURgxT(0MxUIOW3{|En2PsRG3zW;0b;>Qu!^$s} zCzPj@XO!oamz0;4KPZ1vURD04yrI0MyraCQB2;mzL{*APsnV#@RR)zwWme^?@>T6s zom5>_Jyg9_eO3Kc#j26264hwcN2-0Q{i=hiBkD+XidvyoskQ1F^-T3_^;7D3>ci@@ z>htQ0>TfklO{T`I$sYfHp{5qOI1B*Vbq!X%A|@)}Ga# z*Ir6XO*5utrkT@n)8?c-pSCn@dD@D!U(@cT!*nv8NgtJ7l|C+gLV9ibk@R!v7t$}K zU)E*l+UYvzI_bLV=IWN}R_p3@>vS7*n{{vN-qU@k+otMtPjUZdO>G$gQ>yPWd(toW#tG}SX zq`zl~H>4Ye80-e8VS-_XVZPy6!y>~H!*atK!&<|7!$!j^hF1;m8MYht8BQ857``!l zXZX?Zv*D)UPs3fqy$qN^W<+MR%P7pK&6u7sFJpPenvAs>>oYcGY{_^x#tX)8jF*j9jkipMNni>!NllTaXp`KeFsV&xCY>q6WHRNOx|;f$ zMwmvM#+aO@v8GDXB-2#WG}Cm`EYlp*Leomqdehsck4&GMc9?dV_L`2Gj+?$Roi?2@ zoip9ejLB4I4#>1+Ix@#)PR*Q_IU{p+=G@FhnM*R4XTF%ZGIMq2hnW{MuVqQHVzN|O znOPmPdS&&=>Yp_zYiQQUEJs#pR$12AtjerOS+lbiX06P6IcsCqD_O5)y_vN&>*K8L zSv#_JX6??pWcD#j%ocNJbD?>-*Yo)49*&Ud_F0AuP1T)8c0lT11v$i_{WhNwK6`ESC0`PL{5g zUY0(V{+5B3k(SYxGRs)YI7^LXl4XizmSvG;ndL>xN=vq8ByHNJTe>evw=_+cG$}h2Xem2{(1sG|X4(R!7Ulx72nYy* zhzKn$$ReNuDvBVAD2O5;2!g1f2!evLi}KCQZMq=a^LxJc=#MtJcjnBT{eRA#WMpNj zwW?aBIszad00}5S1BQ8-SvxRnoW)jUttcNDRxxsnrKq}UP?*_PG}?+U_Y148sPqJI z`pQingePzU&cF+J10N6pB0&_01~DKO#DRE_06KxrpbO{ zYz1$Dcfd}t8|(oef}`LV_!1lkC%{+WTkswD0bB%^!4+@={0<>>f+8q}9?%#1K{*VC zVNeOfp&sTy12n>1*a>!qU0_$(4R(h;U~gCm`@^Ad7%YLKp%spS!4+^VTn9J8EpRJ*3%(8CfxF@Ra4*~sKY@qf7w|Yd z0e^t!;E(V;ya2Dm8}KH)1#iPY;GYCV&;&yW2oJ)S@FV0zC=o^|i5Mc5P!n1rozM|R zBA4hy^djs< z1JOvVBASSoiM7N!Vm+~mc%9fnyi4pRju2lEXNa@J_rwpxIpRm+JaK{eiMT@iN?a#y z6TcI8NI*i8AW71RbRz|%n3RzrWF#3&sz^1NNT!lHQcrdwyOF)gLUJ%Uf*eJbkYmXT zvWjHMDdbdg8u=7Com@yRA)hB-B$ty7WFxtnTtluWH;|jjSIMp9HgY@pHo24BOMXOt zOr9pskY~vs$@AnT@@Mi_@;CAZd6T?D{y{;Cpcu-D@}VS@l#)@tlpiIh{HbUvhKi-q zDIJwTWl~vGHl?R>sNPf`sxOsK6;S=CLaIMiOj)Q=R0%bjvQlHHu~aEFk*cGfr0S_j z)MN@#EH#CiPc5LHr4~|)sOPA~)Dr4>YBjZndYM{Ft)tdc8>m;Px2boi9n`zjPHGqR z9<`hLfx1BbMEyctrmj-gs9V%+>QCw}P0|$YOuNuR+MV{Ky=W;dqy6asI+zZj!|4b* zhK{9Gw3<$#Q)vTjq;u&`bYD83E};9-g>-*<06mZ{rY-a+x`ZB0Tj??MSb97?fv%+| z($nb~^h|md{WLwBowc7y%<>+!+xgXZ)D}CXi7u zK};|c$HX%UjEc!%GMOwUo6$2lOkbvu>CX&ihA<{(1XIjd7%MY|DQ7B}@yrCKmYK-Z zF;kh@%p7JB^Bl97d5KxUtSJmDuPH4(3|xRKa03D$0-gi%3gX9FYO4n0zbz4_e^^ne zxvHuW2!T5y5ZMUCzys?CI-?MiIIL4jN^W9mCskZps>%?Ttj#gT8B!Bd<8sugniO?P zPEt}%l1c2{Ew|Hv3ftJKN^_AVx1y+~%u-(MSXlxBLHHUV1v20Z{D2(zg8)P$200;T z@1}9%(5xiQ_mn9EQ+ApoP`eQfqZ>j?H2&!1=Gbztu9HC)Y}fyLXS+JCMk=R9Q>P z??Zvx5KrG~sp5 z4q@hlejvO76d-v6C`A68Fg$Ym_iNpAw`xmS)gik}4FW?O!C){11)xx*bPyO0%)qk| zn7{}Wh!l-rBq%~bC>Vtd!(`eUj2OS?q|nP;Qf{rTDYoXVaLD^v5 zJIk@v59D83s)ptjRTNv|u~K?itK(Z$AK$I2s>Xty&ZEFmih+-% zxb>Dv9Q1%W1=Y5iqUsu(#j*ZeuoQ%^2hV_cU_Mv?o&^iRBJdno43>cBQ7no>@hAbQ zkQybTB$SL&Q0jW@1k1pSU^#Y-75H@n{;vd0*by`+4W(n}(Ban^_`eKga{K4}w3E$N zVZ-)?O~_ha(y5#iUNL8OE#91u8Ni(23q~B1%#~G^V$K>l?zq_#D$V7^mSUb`ZW?F4 zRfgJrwUsy!_;43G$N*EvQ~g^88Y{{wZI&ubv!L2sG}ayvTPU}##!+gy)U?+=Hqdl@i^J@LI(8eOngRAM6Db#*x2sJO_Z)+XV|lccS$=k5P>uw^CE@+Ptk zyn*eq#gYmv)vLfZ@FplP%qzfe_~F}IhI83y2N=2%Df#QW+FgI&{`y}~`CjlT2wx38 z0w05YU_Vy;0i;Jc$bgJk-MOp5XW*b+rH8>0)CqO9E3!N4!Kso(_FKC;;C&xK2$&B zW`}wHP|;yt5DZ5B(E!Jyt*L`wv{G-Mj8R5HVHK{&63WarYfV)GPCsLD4VF-5sWz9I zREh19M?yhGjjhO1m5^`2u5F928gCutz&|hoCgG?ABViPbhA}V}#=&@)098;86VYHa z1Pw*Q&~RizBaj)5L`A50JxqovFco7V9n=CP)WHmx3A2y|jY11CB$A>AY{=`->*!bX z8)wQvxt3Apn$qe%T=`g4jlDbH!bJ)E!ptQK?8lN;5%t0W*o5u1yx43j#&I3rXqldC z8Cg@p34xO*7dd#DVpr+U*QNaXf|`+Kn8slKot>Om%ni5CFR|D-5?tEk$l;v<$1;W0lqyZM7(VR4t{Ki@! z%Y$U%FscD?5JzAjvNpiMXbcMP*UM~mq%=4jjs%{opb3tEW;7O+qOw)62&=_{%CQ<2 za3&PhVL2`kSPC#YDlf6WY)zIJn&9Z(acoPRzxR3j-Q2xhHqr>oftI zB-htygFizY_X_iSn#9tgin4ffWo4-)zPP%bUpW|_1?K_JX81Im4d=kQ@EKH#CZam@ zB&u(Q^Wg&QA`9UnGzm?{Zh;WXX+_q@X2p(M>sY5BPJdO^=CVp$)ZBBcC2bo=n{8$c zJ#6{r@)FCiuGV5pPHCwFn8DPTw*vWApv4>H zdd?s>pr^1w!cA~9-fNWW;|L-u|fp_yR+zEHV_l6X=6r$L~265=eu6{Hd%|XB< zR*%9ike-n6_%WW}{|9gnj+q#`J0$DSN+bM`+xGo#@iRYyADhIHII?z-b(xg%{#SYlksiQ^)NhuW%Mb04<3X&xrV?*E1 zv-v$AhDR`j!vbuChe0{7{-d1wkD+JL%ns-RTjnCX1b>FVprz;qv<$u2gkhf!{szKuNRXoCIBVj}An%V;ITzY+;cXdj$Hw{Q z@jRe1iTyg>Z3)f=MHL(_59)B!KE1+LjWI!y&05J-$T*927-FZ+#aCWxzr(VXXr_x} z({~Aovkn2!$_Ajr8^oLQz}6N!}eu#8A0G-xB*gcohaDxrEd zt;0q$i0lq?^h6GN6}`qqd=48sAP0}+hVJSxw=>ZVgf|jhh^}Z0+S*8TCwic5=nWJ; z%#Kj{R8(0xu=Kb9A|yLBDaj#>z65R?G!pq3N4$xwjYJ{QAH9XXMB#&SxH_>Mg969U z!NhP3DTpD&P+}O`j^0M^tRhT6N0`wLYzRmH1CW9!0Ye*z(dgYaU5q8FFr*+#i87*` zs30ndCkPwbiFTp)&~EfT`T*@&LsSzr#5iI+{;4G^uuMUu+ zx}tVu#RP{2o+73LPh2g9w9B}}EaGXLao;26qR-LCI6(q*(C)d!JXqF9%qJG0eds_d z1|t>`i#h9m4()Fs#$zF12lgztH^o};k%?>C;I?4VeVR={ksKT;wU%3=9D90^c!{I8 z9DUkAtU#Zk@WIx0&Bc%ov7Lv_Mr>0h7>~sFvom*Z5+s`8E@BNjgwx$&lQ?%m+yt)k z630s-{UK>Dp=h*PgMa6=dfq|fG+$^=t%s=sp=~Fu@yQJH#q2s&SQPf7}RQWf3f91I6#Lk^3W~w z(a`O|Hk{D5%HM%Z#2WI zhm?>~95!qf71cc4;VRuct~?h@OYEgF?^xVp2g`(N{*J7YFKqsD3;mA%Kv!AF93_28 zKfHpR^d|%0dw8WFf+mAO-az~)xwP13Deqrt#=onF6mf*htNG4jkOMD22$Bw|uvr}) z1uTW%S=`>a*3MAKP%?}&6fy$cM%V3za*LN!6ep)>bfZ=6WSm{?Hy>Z^9hf3Dn5`g? z2j2sE=newhPH@v4cNWPE9Idfjeb7}bjhP*1<#3|lW)U>{liz>Ktj^p9yP&)G%)qPo zkU?ZGG7ql<&>wgmF~LI6j%i{R*_X>3WIyyd3n7;{SV-}E>Cf$D06CC_coNwfp2#8O zu#UN-B?*vbvZ!McXmtcT94AMUR+BgaM3&sCxf>tFv60|D0eZQm~ z>18}=&wrV8QY-1C2asOLllC@=`#wIbFyZi0mC&nS&xE#zZdD053~>$9woC1$V@C}v zl$gZbA06@^lYT<`1=jJ5$V}qY$71B6yWPYS^D~Ku|NC}(-^Ow~EpOo$^*4#l|Gq`@ zEmbZ3?1Ir|te&cPdk?3*ev8A2Ld1rbDqe39W5B-&n zXt;}fAJ8viry*_;EV9AN%zI z@>B9N@*w#+d5ApB!Z6OQ!&w-~!e|!8vM`>7Di$WLCBGn#lE=s|$>Zb+@+2qlW6yq2mfqGUgw1>FfLgaVD|$(R;>Eaqef3?Pc&gPcH$VZFn@jc1GQf z1_gK;YLhtrp)?*AUMP%kxKxq!*vfc7ir_m+lrx19X*1D+THCs>;JVfX5x=z>B)Vq)k}*jQvp;cX7av8 z8Wo253+MUEB561vH13u8=ai~qR9ai#^24NP2 zWnmu{_GMu{3kz7-ubCQ-nH&L>)JPT}Ww^aBLlXz_HMqZ2xI=-#dQ3uwkRk%;qrro8~3Xa_usAbfP)N%?J zNMl)8%EB@hmb0*;nOcdp+sJ!tC8ymd{--_m=H5MT{MBPOQd>ACH&L6ZSE<*i*I8J_ z!fF=Quy7m;$2U`3F_UlbOitjKto@&6@@{aJZ%C^JJN)#03IoqgVlnjrwTJqU+Dm;z zeN646_EVow2dGb}&!~gc=hPtz1JODb*0T_o#ViY_vhXPu&S2pz7S3kjTo%q_;Q|&e zWZ`oxT*AVo9LX=Jqtr3#OX@gvg8GU&Nu8p;rcP7eP~TGDQD>;LEL_II6)arC!c8p1 z;@!?djJiK$;XW3A%ECh|JkG*zS@=B*FS77*2MkM{=b_1yxE_2czOmz14kz9pn%w^s zO&eCGe&*M~hY`CzdYyYt=(N=|RS&3XsNZ<<2v^LHCf^R~-Lvo3^FQr&ev>CX#UwWT ze@M3+ENVyC-i~D9G?Tc~zef1c@}LQR)6@UMwI%JuuZtfq8z0KkU*PgRiujAPXaP_8 z>BlnE2NVbRjF+Q2evl>69{f6U{!QyVs0ybg{5sD(miF&)h(~l5XgN=NzDeBqp<1vz z_5Hjd&oW+_sOpT5S^QNIK|JwiP2&8A5`R?H`$&x|`Gpq!Cz~>KG{5L#leqBz$K7L? zS^~e;^CofLL)Us(@8FSAOy(DP;jwDZ_O{T*0A~j+iH_FL8TiBo&gN~oyd{x0(V27> zP|~=vdXa_8IUI@)Zs3}1F;1D`3kKPbPN|aB^@A`BN>sPQL3C%j2PR5)p}W%EXk4zW zWMKmf8(FxjiS9}F!bEWwriq2k9MRSP1loISNEhd|vy+#?p8u0mwV0O_d?GAat#u%F zdJsLF<7F^CgdR!{W8upzT+70BEL`72n`m5_&=}HgVBsqqFB|`>yo8KR_+`f{cEzYu z5))KL@%TlVWBK$;Z7Fr;)L?ve^tSYZ+8EsZmyk!l*DAL z-xPHR{jQ{&F)O(KXsbS2N{=RbHN6J2f=%~*7Jk67vWItO4DvTTJ)|x<4OcRW8cia0 zfkbUe2NiFkG2(B+MQdBh+ETAJ(Oc{-VVlOEZ%L^iQkR&f!HGq!RXf5l z0~v1u+xIBLCi1ozsp>^sc?jwzfsw8_VPfJQ}=K+kGN#z8S$RshzObQFHun^nP zZ!Emp#AqOnj$Bjv8t$z=x+DG1Mt8}KMHQyZmiWRL7<|5PHDhFQnNCb+rVE2xr`XhQ zvG8{m{=ve#ECE+D-I*RtPo@`>$Mj|ik|ms3!i6Q=Si+qp#2xBtrXLTxZa(VSkfW}C zz_G3Nk35+{Jk8txObyKp=gHss2PzV#h^PJMKV391qwNb3_>}m=pUFAo{($FR9pqld z(UT=Q8u}8NGmcmL&u%A>>9+*<~M% zKf=|u!?Y#L3-?T0#&ILEa}%nc_k4%ZE16aIjBesadpJhVw~xk0Me+)ISZXcB{D~)v z?Q>=wv%b)NKmeN4`wEugX6tgQk!r%jyN54I^*=C(*>uCPFI|M zbGqhq!X$7E^eM~UT!{afo=-7V7FYi zzHY@Hrj2B+jzHHw>r0ax5;j-+f=uw++K9s?{-1pE(j9D2~>haL5e^l z&xqG;Kx%;?F-F@BV z?g8!!_h9!l_jLCR_bhk4yTLuzy|a5)_wMdJ-Sgc0xL3K)ac^|r?7r9iko))Uw?tx5 zlqgx0BQl7LqE4cGQK4vnXs~FgXt-#)XrXAa=y}mH(Q?rWQIqIZ(VL>}qIX2^iuQ>1 ziar+Y7ab7Y5_^cF#EIe*u|}*FcNQ0l2Z#rWhlq#a<40z3k=Q1#7LOB85Kk08DV`)o z;wj>J;$`A(;(g*DJSY#bN3@5=!{CwY(b=P`M|Y2&9s@iEc?|Iw=3(+MdlY$0@@V#W z-Q!b_>mGMKojpA~Wu9@Kde7dTBRwa1BF`zF(>$kp&h*^w`M&3eo*#Mc^E~GHo#&69 z7d$U|{_J_f3wSBK!n}-LJ-zyR4fZPWs`9G$n(W1TP4#-iYnRtiudlqWc-{6^dPjQ~ zdQbA6?Y+=@g?EGZD(`0Rjow?l-}2t=y~lg6_s8Dfcwh3q?tRnyw)Y+HKYg5hTzuSo zggzo44FhAL@JjCNEOmxX^b>knj`Hj?JDgq?JeyqEsz#UOQe<3dg&DDH0gBdZ0TI-Jm~`I z3h7?yC(`56uchBezmuMmo|pb4y(GOMqhxL}p-d$6kjZ3zGJjd1EJ)T}lB?*;3idvURczvW>FMve#r=WZPtWWP4>F%l69-$Uc*OE;}syLiU~PXI~fJ0AH=| z0N*0tTHoouGkj^%<&)${K1DuFzEJ+0e2ILi ze3^W?e1*J0zDmABzEA#z{FwZ>{44n>`DytD`9=B9^2_pH`!Rw;=Z*agb+_A}Ay%EGQxIVdxz zB&alKanOpOJwf||E(hHTx)bzgFbEa~%Yx;>fx*GSVZjl>iNPtsX~DYS%wT=6A$VAD zMev;9Rl)BEe-iv{@R{K6gMSSEDfs8$E5TQTZv@{C{v-Hqh#%H3GB~6p#2PX- zq&#G6$nKC2LOu-nI5Z$MIy5#kK2#k#DRg$|+|YTU&xY;~{WA1K=*iI2VfwIMVZFop zhV=`3Gi*=T-ms6uK2eI5zDj>(pfX4qr%Y6)DASagO1;vk?4&GLE>Siq-%xH>zN6f! z+^yWB{7AW9`Kj`A%InHo$~(%t;V|4iTpaEh?h{@ZJ~F&Gd{nqK ze0lh~@D1S`!(R=*9R5f6-3S;#Mf8mr9x)l88Tnh3UsPmN zpQu4mBcm#!CPqCOH7N>3O^KQoH81Mfs6|mrqLxN2i&`GFI%-qYJ5hV1_C+0tIv900 z>S)xrQD>vhMV*iODe6+xFVU{i>gep~!O>HqXGbrJZiwCxy(#*&=&jLjM!y~XVf4q* z`=dXNJ{Wx{`bhLIF|IM{nCzI6n97*inCUSKViv_LiFqMrdCba~^)VY`Hpjdkvo+?; znC&rN#9WS*#wufb#rBUi#g2}xiAAwfW2eW?ik%ZXFZPAl<*_Sb8)KVd*Tk-k{UG*q z924gqml4+~E-!9CTyb1QoGq>TcaATJA0BUxFODyX9}`~|KOw#@zCIqsPl=xvKRv!7{+;+U@mCUj6G9SV64DZk z37r$VCGoP!)F<{z?48&* zv0vhgiE9(rC%%%nImtUII4LwqnG~5+o>Z4qpENmXO48A!GfCekolClqoR!=oxmR-U zZqI^~O$?^4dD{E%`!H77MMwNGk( zYGLZ?)YntDroNH7J@uA`(TFsj8Xt{JBiDp!A~eyOSWSXPtx4D9YVtHgG{u?{%@|FY zrczU@c~Uc3!)m5!rfV8BA8C$i{!DX96Q}v5MWm_HlG0Msv}qY>ozl9d^+@ZL)+a4L ztt@R(T4UP2w8Lqq(tb$$E$vR)T`i%dwa!`(t+!UH_0{@o1GN!awKiSbMcYSPpzW_6 zq#dfYXh&q)XLl zbs4&BT~}QXU7oIwu0U6)8?GzSRqE<>({;0Sb9D1`&+3-xUeYz_R_RvjUe>*;+pc?G zcTjg+_m%FH?zHY(-38qx-DTacx@)={86ZQLAmn{g@Qa>j2N*E4Qq5}9`lH=Kjnhna46uWS-1Co%wC%h0N<&AWN7f$@0ze&r)QCWW{8~XQ{K2 zvQn}%S@~JDSu?UWWxbj8Ue>2s$Ffdjoyz(q>rB?gtY5Nz&AOU(BkNW+kuA#h%?{5_ z$WF{o$xh4GW#?vh$?lfjBfD32@9Z(z3$j;a@6A4#eJcAx_NDC0*}r99&%Tv?NAIE+ z=tX)@y^mg|m+J%c(fU|@yk4z;LO)55^i%Xt=@05p=}+sw)t}9Y&C%xQax!!DInU)Z z<}~H3&RLstKIeMQ&79jge;9@v#u_RORfchfI>RIbYnW=7WteYRYG^cUGHfxtVc2fi zY1nPpW7umrVmNL%X*g{-YdB}PV7O?wW+aSGMpvWI=xOvZ%8Y)-P-Co7Ys@m{7;}x? zj6IFLjeU)SjU~oXV};RX9B-UxtT#?J&NRMYTw!ds*Is}i_`l2s{;%V=an1h$LAwgm diff --git a/ch18/chapter18.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch18/chapter18.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index ce52f92bfc3b8951779165b837675e3697634090..07f813d52a8fbf1aba529250f6ba4e2201bcd6ad 100644 GIT binary patch literal 11773 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 +_?5ohfPcf6@s%J<3&L(e*rO$A zUB`b!#i5({RuFax!mccrZ1X*$1hz?Q>s{Tub!g)8c(JXQ^8`HF$nPG6>9kU(i@AKy zt(^IF)Jic=8nsf!Zrrog#*y|qyFA1RPen5xI7^?&(EfuYuV9e7)?LOWez)%cPtP+9 z3-u}qr0-T~=v!4C=}Qy$fCtbvv=i+`htWy;p3XV?j?P62Xf9JIa~(_R`#9P3O`LrC zE>0mX!cOeMrSy%Qa_ph;Z86?V->x}?KgVCv_iDbTZ`NGISLpjRd|oUsj+f6X=9Td( zd4AqxUXVABw}7{hw}^L`cZzqKcZPSCZ{c^~_vH8H_va7c7xIhvBlvFq1bzj-itp#w z@F($W`HlQN{A2u+{8RkX{4@OX{3iY-{?GhhV_*!9;m5?rJQ!0M6&K-{6YBk_IX3*v{x505X7Ulspa{I>Y*@$ba%jNcW%JAQBcr}6va z55^yk|0@26_{;IPgiwfud||AR5z2%KLZwhG)C#)^M++wi7YdgP*9q4Pw+R0!{Fm?} z;cnqx;itm=!h^z7!qdVt!taGY3eO9hgqMUrw}EZ?v>Dgt**06-9BR`fiW4bCZAI-x z9Yvi*$)Z$I7g0A+x~RWspeRR_CmJFu6b%;@i$;mYh&-YxqNhY}i9QkC5KF}E#1Dvb z#HC`lxLoWJPZU>*z2b+&esPU>lDJm9K)g`ANW56QM7&JALcCI3FK!gC7Oxer7w-{& zE50g;kr*WHB)uesk_nQaWR7I1WSL~SDil?UYDJA=lA=~or+8AaLa|n{QSr87m*RcJ2a4T_y^2p2`xW0P&M7V^t}A|5 z+)&(93Y7^;rBbcbD)mZ-vaPbcvZJ!IGFjO}*+-eHbSr(zI^|U5qspLihH{Q_o^pY5 zp>mOOvGNV&0p+hMkxHpjsWhrYReM!ORgx-2m8R;eDo_=vMyN)q#;BYsziNsqsG6ag zsd`+sNVQb8T=l%FQMFpNR<&NWN%fZML)Bi@r>gy`BdX6-$5mgb&ZwGHzpH^7sd?%+ zwNNcmOVkE+wtAp?xO%jDtolK>bR zYqn~RXijOaXn9(`HbyJZ8nh;@MQhVKv~9I1+HTr(ZBK14ZGY_`ZLT(7J5*b!^=M~n zmuQ!3pV!uF8?~#o8?}eEUul2Tp4T>MFKMsojJmeE4!TadBwe;{sIFKyN;gL5)Q!`P z*G=&E#+bdTt!=%(pr>z3(O=vM0Lb&a~!y0yCXx~;lxy6w7mbUSssbnojv(0!;o zrEAh%)BUddLw8FL^;j>~GkTdmL9f)S^;*46-&x;BpQZ1s@2?-I&(ROlkI;|QkJfwi z6ZMsPufA44T|Zy{wEh|Wv-%hGAL$S159^QWkLfQOfI(qMHVic681fAHh5|!{p~f)9 z@PuK5VXI-AVY^|6;a$TK!)J!$hA#|X8BQ9$H=HwEFkCd;Fx)f(BQmxzDvVa6-I!=> zXUs5W8ncc4jRTDZ#u3Jm#?i*H#!1FnW1VrDkrwLV!CX)YKG<*bDX)2S!~vs&1S3FZfB)| z=E3G6<|1>kd9-<~x!fEu*O{l8gXYJ~v(59&Pn#E+7n|QS?>1jBU$;mt2^N(_YcW{N z7Mmr}(%#a^l59z{46qEcnOfE#oZXEi)_&Et@PKSiZ8Hw*qT| zwVgG~T5PSh)>Gt+&2teaZT=b&GX}b*J?`>mKV~>ptr->v8Ls)?2nV zHjPbhGuf;*hpnBhqpgRnm+gLAZ(AQ*wynQypv`4lV0*)M$aco|v+XzARom~jn|5HA z*-dt{-D0=dQ|w*r-R(W?_uB8b53=XjbM1reC3dgfXRonOw%6IG+Mlw|w$HK8voE)= zwAb5L+1J|F+c(+&Vc%}wVc%tc-@e~|#QvH6xc!9vl>J-#clK)z1UVQ`oo zHiyH}#c{7=fFsY5?-=SB?ilG9<8V5BjylIQ2XRbyEOIP$ybwYu03q(1XXL)a{~Zng E1+_NqHUIzs literal 11344 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 KGmZ_GjR;V_r-ch}$ z`arc=wMDf}wL`T_wMVsIbwKs0>bx4Nb?R2??&^N(VQRPfNp-#YP4!mwHuZM(PW3_c z5%p2^arH^{DNTY#rO|418iU59v1k}gh9*bTRdc_lho(T&SJPiJP%~IFU9&**lIC^I zTbj2u?`n2wj%bc*j%iM4zR-NBIj#9db6Immb4_zY^Q-2z<~PkBTBwz24cgAy0a{l3 zu=Z)~%i6cK+q65hyR;u^_iFcRk7|!;PiVi;eyKgJ{YLv+QgTwSq{5`yq}fSxlNKhe zOL{+PZ_*b@HePlGBsBBo`%@B)gOS$uA~1CLc(?uE+WWJzp=>tMppEPOsNz z=zHk<>ig>l>IdtK^dt3U`Z4;kdZ*r{pQL|CKVQE@zgqvQ{x$vU`Zx6(^&jfD>bL86 z>UZn+=+7Fkp|zoxp}%2(VUS^zVT@s{VZ5Q-P-&<(_zgkBRKs+`qlS5gCk;;-o;55s zEHON9Xf&)hyldEO*kagb*lpNj*k}0IaMbXX;YY(o!)3!&!*#<=qr@mPT8&x8BBR?l z*;sA#8K)TM8J{&SGp;r6HGXFN+<4r0(s;`Fi}9-Qy78v*mhp}$!6Yz=OcImcWHgyg zR#O{OhN*|CmnqMbZ+gHq&NSXsZmKj@oBXDrX{u?u=^4|rrp2ZursqwKrZuK@rk73I zO*>7yO?yoHOdp%RHhpXQ&UDW7z3B(jRnxDg+os=4f0!j^xmjt}n3K%O=2UZ`d9-<~ z*=a5}SDGi7r_2=AGuB%~vdDOKZzu%TUWS%OjS@El*hHTNYXt zS)Q{jwXC&#VmWL%ZTZe}&howGXUiqa70WftA6AJ~ZB4T3ttKmDZEbC9ZEsDrmRYA* zAGa>FF19YUF0-z)zHNQay2-l5y4||Vy2rZTdcu0jdfNJ}^*if1>jmqN)}O7nZG4-< zmTenmtFg_rEwrt))!Q0ut8DMu-nVVGZLw{$?X(@R9kP99J7zm!J7>FK`_XpMcG-5t z4(!;TU>Dd$c8OhU?`F@p_q7kO53-lrefFvLI{Qrf9Q$MT$L&wppRzBoKW|@dUukc! zZ?JE+Z?*5R@3!x?e{BEMe#ri{{fzyb{et}``z8Ao`!)Lwhtgqjv~#p~q&m_anT}45 zo{l_6zN4?Bzhj_duw#V7=?FTeIUaP(bj)^y9P=FW9Sa-_9V;D;j@6E}jt!1?96KGm z9eW)69ETjY86LxDM2v)Cm<%S9>BwX;c}xM*j~U1mGDDaO#=}fug3L6gj(LoEf|<`e z%`9S;Fw2>&*HuGDGJVldY0O3D`BHuhw L

NJk40smHjk6@kWR?l-=;quDjmY=(A@fQtJ&u)b$ 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 b$g*cSv+A-Yy6O%<5ZpU2g?o4Z%|ibJ!C^}% literal 18466 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 w?X>N-9kLy@eP%mpJ7YU*`^I*`cC}|j�bae?0&Qg8NJV!2J#U?iv6809+NU3IG5A diff --git a/ch11/chapter11.playground/timeline.xctimeline b/ch11/chapter11.playground/timeline.xctimeline deleted file mode 100644 index bf468af..0000000 --- a/ch11/chapter11.playground/timeline.xctimeline +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/ch12/chapter12.playground/Contents.swift b/ch12/chapter12.playground/Contents.swift index 9faf781..939e603 100644 --- a/ch12/chapter12.playground/Contents.swift +++ b/ch12/chapter12.playground/Contents.swift @@ -1,8 +1,8 @@ -import Cocoa -import XCPlayground +import MetalKit +import PlaygroundSupport let device = MTLCreateSystemDefaultDevice()! -let frame = NSRect(x:0, y:0, width:300, height:300) -let metalView = MetalView(frame: frame, device: device) -XCPlaygroundPage.currentPage.liveView = metalView +let frame = NSRect(x: 0, y: 0, width: 400, height: 400) +let view = MetalView(frame: frame, device: device) +PlaygroundPage.current.liveView = view diff --git a/ch12/chapter12.playground/Sources/MetalView.swift b/ch12/chapter12.playground/Sources/MetalView.swift index 37c8100..9cc48fd 100755 --- a/ch12/chapter12.playground/Sources/MetalView.swift +++ b/ch12/chapter12.playground/Sources/MetalView.swift @@ -10,8 +10,8 @@ public class MetalView: MTKView, NSWindowDelegate { var mouseBuffer: MTLBuffer! var pos: NSPoint! - override public func mouseDown(event: NSEvent) { - pos = convertPointToLayer(convertPoint(event.locationInWindow, fromView: nil)) + override public func mouseDown(_ event: NSEvent) { + pos = convertToLayer(convert(event.locationInWindow, from: nil)) let scale = layer!.contentsScale pos.x *= scale pos.y *= scale @@ -26,21 +26,21 @@ public class MetalView: MTKView, NSWindowDelegate { registerShaders() } - override public func drawRect(dirtyRect: NSRect) { - super.drawRect(dirtyRect) + override public func draw(_ dirtyRect: NSRect) { + super.draw(dirtyRect) if let drawable = currentDrawable { let commandBuffer = queue.commandBuffer() let commandEncoder = commandBuffer.computeCommandEncoder() commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, atIndex: 0) - commandEncoder.setBuffer(mouseBuffer, offset: 0, atIndex: 2) - commandEncoder.setBuffer(timerBuffer, offset: 0, atIndex: 1) + commandEncoder.setTexture(drawable.texture, at: 0) + commandEncoder.setBuffer(mouseBuffer, offset: 0, at: 2) + commandEncoder.setBuffer(timerBuffer, offset: 0, at: 1) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) commandEncoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) commandEncoder.endEncoding() - commandBuffer.presentDrawable(drawable) + commandBuffer.present(drawable) commandBuffer.commit() } @@ -49,23 +49,23 @@ public class MetalView: MTKView, NSWindowDelegate { func update() { timer += 0.01 var bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float)) + memcpy(bufferPointer, &timer, sizeof(Float.self)) bufferPointer = mouseBuffer.contents() - memcpy(bufferPointer, &pos, sizeof(NSPoint)) + memcpy(bufferPointer, &pos, sizeof(NSPoint.self)) } func registerShaders() { queue = device!.newCommandQueue() - let path = NSBundle.mainBundle().pathForResource("Shaders", ofType: "metal") + let path = Bundle.main.pathForResource("Shaders", ofType: "metal") do { - let input = try String(contentsOfFile: path!, encoding: NSUTF8StringEncoding) - let library = try device!.newLibraryWithSource(input, options: nil) - let kernel = library.newFunctionWithName("compute")! - cps = try device!.newComputePipelineStateWithFunction(kernel) + let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) + let library = try device!.newLibrary(withSource: input, options: nil) + let kernel = library.newFunction(withName: "compute")! + cps = try device!.newComputePipelineState(with: kernel) } catch let e { Swift.print("\(e)") } - timerBuffer = device!.newBufferWithLength(sizeof(Float), options: []) - mouseBuffer = device!.newBufferWithLength(sizeof(NSPoint), options: []) + timerBuffer = device!.newBuffer(withLength: sizeof(Float.self), options: []) + mouseBuffer = device!.newBuffer(withLength: sizeof(NSPoint.self), options: []) } } diff --git a/ch12/chapter12.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch12/chapter12.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 746466e82019d519fd70aecdb7dddfa1aea64aae..844b8dfe10bbd70136d17174387ebdecb7d81c11 100755 GIT binary patch literal 22543 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 diff --git a/ch13/chapter13.playground/Contents.swift b/ch13/chapter13.playground/Contents.swift index 366d424..feabd6e 100644 --- a/ch13/chapter13.playground/Contents.swift +++ b/ch13/chapter13.playground/Contents.swift @@ -1,8 +1,8 @@ -import Cocoa -import XCPlayground +import MetalKit +import PlaygroundSupport let device = MTLCreateSystemDefaultDevice()! let frame = NSRect(x:0, y:0, width:400, height:400) let view = MetalView(frame: frame, device: device) -XCPlaygroundPage.currentPage.liveView = view +PlaygroundPage.current.liveView = view diff --git a/ch13/chapter13.playground/Sources/MetalView.swift b/ch13/chapter13.playground/Sources/MetalView.swift index 7120f0b..2a6bdcb 100755 --- a/ch13/chapter13.playground/Sources/MetalView.swift +++ b/ch13/chapter13.playground/Sources/MetalView.swift @@ -10,8 +10,8 @@ public class MetalView: MTKView, NSWindowDelegate { var mouseBuffer: MTLBuffer! var pos: NSPoint! - override public func mouseDown(event: NSEvent) { - pos = convertPointToLayer(convertPoint(event.locationInWindow, fromView: nil)) + override public func mouseDown(_ event: NSEvent) { + pos = convertToLayer(convert(event.locationInWindow, from: nil)) let scale = layer!.contentsScale pos.x *= scale pos.y *= scale @@ -26,20 +26,20 @@ public class MetalView: MTKView, NSWindowDelegate { registerShaders() } - override public func drawRect(dirtyRect: NSRect) { + override public func draw(_ dirtyRect: NSRect) { if let drawable = currentDrawable { let commandBuffer = queue.commandBuffer() let commandEncoder = commandBuffer.computeCommandEncoder() commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, atIndex: 0) - commandEncoder.setBuffer(mouseBuffer, offset: 0, atIndex: 2) - commandEncoder.setBuffer(timerBuffer, offset: 0, atIndex: 1) + commandEncoder.setTexture(drawable.texture, at: 0) + commandEncoder.setBuffer(mouseBuffer, offset: 0, at: 2) + commandEncoder.setBuffer(timerBuffer, offset: 0, at: 1) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) commandEncoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) commandEncoder.endEncoding() - commandBuffer.presentDrawable(drawable) + commandBuffer.present(drawable) commandBuffer.commit() } @@ -48,23 +48,23 @@ public class MetalView: MTKView, NSWindowDelegate { func update() { timer += 0.01 var bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float)) + memcpy(bufferPointer, &timer, sizeof(Float.self)) bufferPointer = mouseBuffer.contents() - memcpy(bufferPointer, &pos, sizeof(NSPoint)) + memcpy(bufferPointer, &pos, sizeof(NSPoint.self)) } func registerShaders() { queue = device!.newCommandQueue() - let path = NSBundle.mainBundle().pathForResource("Shaders", ofType: "metal") + let path = Bundle.main.pathForResource("Shaders", ofType: "metal") do { - let input = try String(contentsOfFile: path!, encoding: NSUTF8StringEncoding) - let library = try device!.newLibraryWithSource(input, options: nil) - let kernel = library.newFunctionWithName("compute")! - cps = try device!.newComputePipelineStateWithFunction(kernel) + let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) + let library = try device!.newLibrary(withSource: input, options: nil) + let kernel = library.newFunction(withName: "compute")! + cps = try device!.newComputePipelineState(with: kernel) } catch let e { Swift.print("\(e)") } - timerBuffer = device!.newBufferWithLength(sizeof(Float), options: []) - mouseBuffer = device!.newBufferWithLength(sizeof(NSPoint), options: []) + timerBuffer = device!.newBuffer(withLength: sizeof(Float.self), options: []) + mouseBuffer = device!.newBuffer(withLength: sizeof(NSPoint.self), options: []) } } diff --git a/ch13/chapter13.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch13/chapter13.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index ac9ca7b310403cea8b2ab3ba0332c49ce6191ba9..4c407cd41a5826e0cbbe29c8acbad230d77c6d54 100755 GIT binary patch literal 20504 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 diff --git a/ch14/chapter14.playground/Contents.swift b/ch14/chapter14.playground/Contents.swift index 366d424..abfc392 100644 --- a/ch14/chapter14.playground/Contents.swift +++ b/ch14/chapter14.playground/Contents.swift @@ -1,8 +1,8 @@ import Cocoa -import XCPlayground +import PlaygroundSupport let device = MTLCreateSystemDefaultDevice()! let frame = NSRect(x:0, y:0, width:400, height:400) let view = MetalView(frame: frame, device: device) -XCPlaygroundPage.currentPage.liveView = view +PlaygroundPage.current.liveView = view diff --git a/ch14/chapter14.playground/Sources/MetalView.swift b/ch14/chapter14.playground/Sources/MetalView.swift index 7120f0b..2a6bdcb 100755 --- a/ch14/chapter14.playground/Sources/MetalView.swift +++ b/ch14/chapter14.playground/Sources/MetalView.swift @@ -10,8 +10,8 @@ public class MetalView: MTKView, NSWindowDelegate { var mouseBuffer: MTLBuffer! var pos: NSPoint! - override public func mouseDown(event: NSEvent) { - pos = convertPointToLayer(convertPoint(event.locationInWindow, fromView: nil)) + override public func mouseDown(_ event: NSEvent) { + pos = convertToLayer(convert(event.locationInWindow, from: nil)) let scale = layer!.contentsScale pos.x *= scale pos.y *= scale @@ -26,20 +26,20 @@ public class MetalView: MTKView, NSWindowDelegate { registerShaders() } - override public func drawRect(dirtyRect: NSRect) { + override public func draw(_ dirtyRect: NSRect) { if let drawable = currentDrawable { let commandBuffer = queue.commandBuffer() let commandEncoder = commandBuffer.computeCommandEncoder() commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, atIndex: 0) - commandEncoder.setBuffer(mouseBuffer, offset: 0, atIndex: 2) - commandEncoder.setBuffer(timerBuffer, offset: 0, atIndex: 1) + commandEncoder.setTexture(drawable.texture, at: 0) + commandEncoder.setBuffer(mouseBuffer, offset: 0, at: 2) + commandEncoder.setBuffer(timerBuffer, offset: 0, at: 1) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) commandEncoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) commandEncoder.endEncoding() - commandBuffer.presentDrawable(drawable) + commandBuffer.present(drawable) commandBuffer.commit() } @@ -48,23 +48,23 @@ public class MetalView: MTKView, NSWindowDelegate { func update() { timer += 0.01 var bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float)) + memcpy(bufferPointer, &timer, sizeof(Float.self)) bufferPointer = mouseBuffer.contents() - memcpy(bufferPointer, &pos, sizeof(NSPoint)) + memcpy(bufferPointer, &pos, sizeof(NSPoint.self)) } func registerShaders() { queue = device!.newCommandQueue() - let path = NSBundle.mainBundle().pathForResource("Shaders", ofType: "metal") + let path = Bundle.main.pathForResource("Shaders", ofType: "metal") do { - let input = try String(contentsOfFile: path!, encoding: NSUTF8StringEncoding) - let library = try device!.newLibraryWithSource(input, options: nil) - let kernel = library.newFunctionWithName("compute")! - cps = try device!.newComputePipelineStateWithFunction(kernel) + let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) + let library = try device!.newLibrary(withSource: input, options: nil) + let kernel = library.newFunction(withName: "compute")! + cps = try device!.newComputePipelineState(with: kernel) } catch let e { Swift.print("\(e)") } - timerBuffer = device!.newBufferWithLength(sizeof(Float), options: []) - mouseBuffer = device!.newBufferWithLength(sizeof(NSPoint), options: []) + timerBuffer = device!.newBuffer(withLength: sizeof(Float.self), options: []) + mouseBuffer = device!.newBuffer(withLength: sizeof(NSPoint.self), options: []) } } diff --git a/ch14/chapter14.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch14/chapter14.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index a9856822261d25930c0699cf4f4fafff5ecc34ab..bbb890a256454901db20e18468c9392999305a99 100755 GIT binary patch literal 22481 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 Z;;7=d;uJ?J3kZUL7Z~_==l|l={|DypZRr32 literal 21322 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 diff --git a/ch15/chapter15.playground/timeline.xctimeline b/ch15/chapter15.playground/timeline.xctimeline old mode 100755 new mode 100644 From 6bf17dbe565e0bbd1c23641f49cf6a7369b02488 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Sat, 24 Sep 2016 23:34:59 +0300 Subject: [PATCH 03/20] added chapter 17 --- ch04/chapter04.xcodeproj/project.pbxproj | 14 +++- .../UserInterfaceState.xcuserstate | Bin 19895 -> 20119 bytes .../xcschemes/chapter04.xcscheme | 2 + ch04/chapter04/MetalView.swift | 26 +++---- ch17/chapter17.playground/Contents.swift | 8 ++ .../Resources/Shaders.metal | 24 ++++++ .../chapter17.playground/Sources/Render.swift | 73 ++++++++++++++++++ .../contents.xcplayground | 4 + .../contents.xcworkspacedata | 7 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 20767 bytes ch17/chapter17.playground/timeline.xctimeline | 11 +++ 11 files changed, 151 insertions(+), 18 deletions(-) create mode 100644 ch17/chapter17.playground/Contents.swift create mode 100644 ch17/chapter17.playground/Resources/Shaders.metal create mode 100644 ch17/chapter17.playground/Sources/Render.swift create mode 100644 ch17/chapter17.playground/contents.xcplayground create mode 100644 ch17/chapter17.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 ch17/chapter17.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch17/chapter17.playground/timeline.xctimeline diff --git a/ch04/chapter04.xcodeproj/project.pbxproj b/ch04/chapter04.xcodeproj/project.pbxproj index ae8dba4..428e017 100644 --- a/ch04/chapter04.xcodeproj/project.pbxproj +++ b/ch04/chapter04.xcodeproj/project.pbxproj @@ -33,6 +33,16 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 293936291D96FDD500008B3A /* Supporting files */ = { + isa = PBXGroup; + children = ( + 29C87D461C56E93B005F4615 /* Main.storyboard */, + 29C87D491C56E93B005F4615 /* Info.plist */, + 29C87D401C56E93A005F4615 /* AppDelegate.swift */, + ); + name = "Supporting files"; + sourceTree = ""; + }; 29C87D341C56E93A005F4615 = { isa = PBXGroup; children = ( @@ -54,9 +64,7 @@ children = ( 29C87D511C56E9DE005F4615 /* MetalView.swift */, 29C87D4F1C56E9C2005F4615 /* Shaders.metal */, - 29C87D461C56E93B005F4615 /* Main.storyboard */, - 29C87D491C56E93B005F4615 /* Info.plist */, - 29C87D401C56E93A005F4615 /* AppDelegate.swift */, + 293936291D96FDD500008B3A /* Supporting files */, ); path = chapter04; sourceTree = ""; diff --git a/ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 059fd6fae91a7863393762169b46933611350364..43b33571ca043b2c6c693bf99b6f025cc19915c7 100644 GIT binary patch delta 10500 zcma)hcU)7~`~N-TUS=Qxk`NL?2oeGzKnO_)BqUh3xc6ug6%`j2an+G?Ty?KocO48z zt#yyKYNxweTdh{>)>=nvwXIs~sJ{~s$M@4ee!L*uob#OLJmdY0bMDTiVBs<_M}g)D zbLXm(LGau+M)^)~KX50xQ{0c-Y3>Ynk-NlQ<8E`mb9cDA+(Ygk?h*Hxdj>GzfdIll zIFJGvhyV(p2MM4aNCXCu3d|rAp55Yg+5qJy(U?2>F!7u_Upc1N~1{z^9Oo1kt z3NxSuI$$<*!iKOBYz&*grmz|GHHU3rTi6b^hn-<>SPc8XzOWx02nWHTupAD9@4_i? zDx3zV!x?ZUoCW8?`EUVT2$#X-a0OfiKY;7tr*IeC4fnv$;OFoQ_$Ay655jNZF?byQ z0DpvM;YD~2{sOPV$M6Y!3jc-A5QhMQ2q7${!ysQ6ia?P_jWj40X;BSftiLKa)Jva$_aRb~0H^nV*OWYQ>!<}$9+ynQ< z{qR6shKJ%&_#HeEPr{S&yLdWYhL__NcqOjDmADF5<5hSw-h#Jc-!}Xy{sQmC2k{Yn z6n~G8;}iHtd={U>H}Fk-3;&9L!w>O4_z`}LpYV_m;KO+-FXL5w46o)jyq-_slXx?q z$>;F7yo+zZH{=`f1$-O63*VLR$@k(*`62wKEKpTJM#C-IZ{cljy&RDL!;hhO01 z7xF9km3#%ihX07)%74Ot&VS9H;D6vx@~8M8`P2Lv{wMwhf0Mt(|H}Wy-{ybk|KjiQ z5BY!jXM!LE3n4ti*ae4>EjWc7Ay;q-ZXr+b2wovyXdpBenh4E> zmO>k$i_lf*CKL&(zCx)mM0i^mCA=ey7A6Q2g&D$3VU{pkY>GX=Do(`{!)}wiLKoQSMvr z8226bJ;^8aNdaj=I*RF`v&0L59mRZ!KKv){9A~WH&XPAOxbvie*gQyMzRZoQ7sEZ_sw%jrq$P3wz^&p|b8EN|zyScD*e|RgalyY=Ee?VB#7dSD_0V8-6AE>aK>s74OAcos7Ytig>)s| zszEH!f;gZf-ANzPmkbg!!gq%!fn=sSFp@VbKni(Fd>pPZr!mz*I>;b}r1uNeffd-9 zY9I^PNDop}2^=7s^d!BWt6oo>E|n=gp#G~goCq3_6jCg1l^P69ncAQk>G!JIEkH}q ziu;fZApJ=R$u5-UiWQNuqDGc3Zx1>#&ACn7W|Bp0m7p`XjSLif$l{CN1aG~rZxJZr zjB7wo&wdu&?I1yinSRNt!7hiqHj2 ztQi{4RqsS21?Gxm;nNn;aJqGYm{dxnX#rU3 zciuv<2rLFm$T;F7gwSg6K3E2pgB4^vnLs9zN#bF}SYg4_b6d-*#b2Y;zI9;Ze=geu zHnU}0$-86g`1kLYU-axeIwMt=m2Dl{d9*dlma5AbTZf-dz-NA5pMqUr zH`qg_lNn?tnN9N=_9*xk z90T7Gk-SIdlLgh_I5<(Wb|G2hU(3WFBYG6kNf*G?|D^vJTx0at$r7@Z(Z4T_QzZIs zgFpXM$G^ZmM*Dy)Co32&3xpaSA65PGcNf2onVFe3ret=u^;IRGK=5B1LkJOA4tY{Z zsu;6sKeOE(Z|x{N)mB`hRHuf(Fa}E)3MFJUSz8Iip_Hs6U%ZAPD6jGB8u7BSTR=?B z^9Ssi;YltYF=)&+sRYJCJre+GVI0)Kc=91xPd*|Ws$l|*hl$WYHj)iwGubA789gG< z%wh+okximkB@fSpSuA9sm29biHnLT0q}Dl0xSF5m9)vm2?9vo zLodvS_2C=j6Y?q9MLs9yuA)?vDc(`#OAENFD%b+HgssSKvWI*odSgu49bm`TLJf9- zEcU8lSJ(}9hi{TE$yelSvbP!*!Z%?N>`C^Kz2pEn>=!z<#4mJzvY$A+cJ9;IJg|+~ zIif+GgoEJ_zY?Y7U-_oAxFqj@+~<=z9ZkS zVHyxf;dnR!P6W%D9>>WE@&h?ZPLYY?HuWmmY_4i0an|iJ4~k-cjb6IQuiRqTA1)<7 zGJ#Hu?`w4RR>DfZ2o>a~3Rp$Xz3#%bHEui0LbJf}A>6_lSHt!2Be(%>gqz@Ia-Liu z7s(}ZnOs>7x5903JKO1E++T{|ckug_OaX2&X_w zfz0m*gE%KqD|U}Bb9Cv|uV_elaal&zbGM;}sOf((X@;7k0tzB2h@wC)K8{!W+9DQH z|GQl$)ERZ5KuJL~1uB+yywcj3Zkwa~-|Y%fum4~Iy{H)VA)ip7ra(i?y*OPWyBhbhiJH=6;W2T}Yo&x=9X0Xv{3>wQmN7tB*Ij0^41`60ig5Q4nrVSeA_bM+L zULr0|l#5dnsqbAT*c3F?FIaiWpyHau{j+m3vv^{ygwxTCT49PS(R8kJp;X$ww0F@c zT~WEtnPau-TDOqF{xz^ibGUI8To^$lwf6gae)rEu3(!Ke2rZ@{g@RNH(kMu$z~Xm* z3r_mH>Z9egC^Xd->4+Ca8dcR!nf>Ko4QtXut5+HZw7zye<7LO74nmu22Qyzu`>kuz zKH7$Mvm}SMqaA1``WStJK1I7I$fCeTft>;e1q_5v3Ubz6jpp)nn`VpN*XV6dREINnIQ;|Ih`T9#i{T*UmszPIaFI-+IK@RGhoY`9RW$R9eiWN3NO;PP6+p#?>w zN{6xD$;@awm6i<{I;2SaDS4f*8~fhAsAoY@&*Fh~nEM;E`uqWUi2gy3&|~xjJw^Yb zXPBd)83oNLU{TeAf|eAtqM$VeZ768_0frdWD03MH;6NPYw^}>On!#F4m@?BSSV6%` zmZ8jD2i8c_zN{D&izd^8dQ1nu0u73L4(r>uxJIoXumUS_G#7$ZTq~@`8gY@eK;N4% zDcV!e_Y~IRI5w%n@mS9YR5%e$!Umiq3R$hRy(#EJK?f;!5+~ynMrOjP*o@O~I?h0s z#gw#m(jF9aqM#QA9hs>MrRn0_T!mPb7S}0@6)bGScFge5nS$;Vyv6*Bb8s%><3g8l zUe~6*iwBpN^eHJW>(G=H2NseneJ~Zfv4YW}xV&g!$CBa^X+uYp^eL|iC7h4zi=Om2 zREggZ-RTMKYMC|kGo#?m+O@A_n&+D}tDP_WpLzeeg-kGwR9)?x&l)uh|rL zXI4$bN$fL;f?~hj`w*@sym1i&K4y8YJ#p6VR*d@;N|VIzl2wXYpfT4Lw=C^lT#5Vo zGe^yoIKdVffJ<=yLTQ4ZG~y*`B_7}>s~JvsIs6=ucn~gSWeg9dpris1p`gEb&6L@& z91r)84x?Z|1s*}cKw@s+qNrqW-Kx>p$3;}(F?cK>2M0zrX$zj`FH_d zh!jt%o}{G@rPW*|DG=Jdi)VsjyF;;nu0Mb$iY}* ztnH$!19$#M7yT-vx8ohPkfwkw^u54yt($iFk-Qu4!Jkn;*d(Q3{QrUS3*^=T{B=y$ zjUK8+;)MS%B)-*)Wu@}s`osG4DK0Z6v*O*kS7~ptpP*-#elL-b<14HY#uxBKd9&hNIa<>q7gI3@_MrC@mlVs`2(UbZNh3u=lXUyo0GtrO*qdqu>{Dqn+fJ^P^eE#t-9%^CS3?{3xDfgKZRSr(g#K zJ1O{>f=^cSWB9TBIIx^2{zCaF1z%9`r5{E6*kNjjLnS_T#ETz04B~W0x_H6y(lFEb z8SK2kGtBR*;2Gw36C*1+%-$V~1`aD8nm^Q^dF#ZV%Zq*lFsSaS;8{3)M$E5Nndd-Q z#IswEO5BiVkYc6i^Gbe+|M7G7OU$hcrBVK16c1#_`D!;^McF-sv2KgC{JNK0d`Q99 z{v$>$!Zz@m*c5Ka*jDh&W_w>wZR2!#I~B>$M5G4@CW%r{9y_XQgDa@_V5h_M<_VDnm@uHMVFbazw_JrTMCZ(gO%C( zXMZmuhUTcn4bC3o9H%y4itB_w%U@=9n*2HbJb!_|$X}x1I|{z1;5Y>*DEMI&e}%uw z={OzFa?ME!PO+|#h3#pvPtK{fci`8R+&2CX;-KJ1a_y}bCl*~|qRvtqRrguP%s-&u z3`u<@p>wVHM>w5-!aw!b+p{(K{3i;oinDT^7J=icss$iG0STCba}->lfC+Z_MNSt2 z&}e^0!CFn$_;(W@<|Z_$X*Gn<+5~>FHi36;-;X7|-a5#vpu0MM1@!(nYFrtmOmuugm^(OBnb6{M8O~=2}TO8*BJi>1ve?UMZvEW z{6@iT3Vx^H4h45V1j_{z`!fq^Lb{M4SlBJnav{s_l|TF+e^T%l1@|bpPucC#ME}s= zHJ4sZ#m4T(J?cL{+OxyB(2yIqlB7mHd;U{nUZLqL1O=}=w|aR#XG_}(9T@b5c0zj! z{-NMerC$pFZenF#gO=R|cHvT+gM>l~o;=S%LQig7mC#G*EfiDmltPX|cJ6tO8=;>t z;MMFR3=~*~_?LobqTORql?lUMn;kBUpb$_9#SxzPHe&?Vu)NHu0%2<*^Yk-+jQgAX z4&^1Ra+R^5%>~$IbPh-lmM$2~1 zi$@jr&M)iLuVi>}+4sUcK@`V&mA+2+P28WoNEwSK;;DE#>w@Ot_gIg!7;j?lM}Efl z@!#yN$Yab(9eW#qc%E1A(d?awhS%~s_D;mWC-Wx0K3~WZBH_63G$1%Y77!UA_XQ{ev;n#ReL%ecLx43PH=uDq(}3my zEdpi)%nw)@@Ik=FfNcSL0uBcp3HUbPyTI^3O`tYV7pM;`3>+9ZEO12NsKC*IV*@7# zP6?bAI3sXY;GDo+fwzKGLG^=L1+@)oAJi$ROHj9<(x8z+V}pD_G-yK5oS^wZ3xgI1 zEe~25^x*8^{NUEXoq`L4 z`vs2+o)o+!xGH#c@Y>*Y!MlR@1s@AO8+<FZ9dMyAqYeD)CC*kTjGuku;MONP0+0B!eYGBxRCv36)HiOp#2J z%$CfRh?4n|D#;GXPm=4B-z2|F?n>@U{+9eBc`SJn#)rj(C4?EmjA1EZxnb@wPgs7~ z8)3fjVbjAFg)IwP5mphlI&5v&y0G5Vh5a4Qg~MAV3Rk%95QTVX%>hPoCKZTzUzZiZc{O9mr!XHVIG*B8W4V8vT)l!{QFRdp{ zmYSqyX}Z)cZ7nUAj+IW6&X&%Viqb{WB|ho<(&f@M(%sU1(u2~&(j(II(u>l|(yP*I zvIJSG%qh#0d1duwjb%+`&1EfQJ!Pe`A+on+LuEuZTQ*lF%I3=!$`;F(%9hF2%Qnb1 z$+pP0$#%#-mVGMQEjuLpMs`$oEJ7ZkkEj=6h%iR$=k@g%Dc0l+nr zrgDL@O1W0KPPtyWS-DlYUAa@aSGiw#PW$%MyEulMvso35gcu6>!R03AB;Yyf-1GDo+?R|tTL(Wsy9@PR83UPRV`GlR0CAyDyo{MnxUGd znxmShTB=&6TH#YwsH#+}RGU=0Ri{)>V}zK<7)?wM zm^Wkk#|(`b7BeDdRLtm@i7}I7ro>E(nGrK9W?jr@F+ayVRSW7Mb%XGVq)MM1+)I>d7Jy$KNee=}|)r-|j)yvc?)a%q=sc&kK zCR~%OacLTA8fltnI%qm-I%&FSdTL5FBQ-t^)lAS#(!8sgr&*?1r};>;QL{y}O|wJu zwPv5@faXxFBsL~CDKN;FKusa zv9_ONTRT^~Li>SshxUN>koFtxQSCA9_u3QMliDA(H?+63 zziEHh-qrr8y{CPkeW-mDhvUNIjB%d0_Hn+FI2yMkZgt!@amV9M#9fKI6ZdD_y|};Q z9>qP;1?fU`5}j1nURR{+qbt!3)V-}M*NxDP()o0gb+dJgbgOjhbsKeCblY{ib)W0L z((Tpl*ZmV86>pBW$LGg4h;JO-e_uh4FpjOX3H{m&Ol|9~D0)-WN~f*TtXq z>9Jm-kJ4-PCVi&frq9;r>g($p>YM1B>s#nM>O1S-(hty=>4)h@>PPFx>nG`_=%?#v z>KEu2>#Ove^gH#R>i6is&>zqr(jU0dbnl_j=o3@#Dnm#e@GVM2A zG~G_cso|-KsZCP5r?TfUp(~hS7ly*MtQreYtLwb68!}Mn9JDSV)r{7KgEB!(G!wisN%E-v*n$as`YR0ULZ5dx??9DikaX8~>#<7gQ zE!YxZ3ARWqQcHwIX{l#1S<);%izUmFYss_ZTN+pzS;{QaER~iIEgLMGEn6*LSdLka zTTWU|Th3Z8ST0+Bw)|yzVEM=L#PTc?X7ZVVnZcRL%!JIm%(j_>GiPKj%G{8-D|2t= z{>+1!hcl04p3FR*c{cNW=B3OlnZIV<&-~XKX;oNNR*f~zs<)b~nO2+6nr+Rsx~(*P=zpM|e|5zVq zMP});lCx5?(z7zNY*~3(`B@FJ8fP`jD#+@PH7ILj*7&U1S&OokW-ZUE$g0lzC~ITZ zmaJ`AJF-5`I+gX8O<_y7`CK-SE#KC_*4Wn6*4Ea^*46f=tkZLw{)?X-PqJ8U~*J7YU%yJ)*&yJov?du$K12ib$|p>~yB zW7pc_?e**id%8W#?y%?BUG}E-miE^6w)Rf;uJ$+Wh4vDAna}RCPqa_APqELm&#{a4 z`SvyTP4+$ZFYI60_t_8H58F@JPutJhFW4{HZ`=R0-?KlkKej)0a1Q7QaYQ>}9dV9$ zhrwZVm>gz@-SLK_z|qRl*3rSy*-_-^?da?1?-=ALbxoXeam zoa>z%om-sSogX_tbslgYb{=(p=RDy&>Ad2+=5yX~{_6bQdDr>W`LFX?4#)}1QRirL z;&bZdB;};!m~(P++&SKyH*y;0G|6d}Q;^d)hvqEJ*^#p^=UUG7oO?OXa$zo?8<-oC z8?rP~8@0#v<&$ZCC#I?+|(pBl&=-T4i?)unu#`TNqrt3G?9oIuQ?+$PWyCv=z zcdT3IPH?~BE^zm9Pj-v$b?%Sco7`L7JKUeRce_7#f92liKIs0&eZ~E=`?~w4`#1L; z_n+?j?uYJ2?kDbNc_2@dmz&orudgp}c;2+U<#}83zRkOu_sD}h*duttJyK7ENA0QS zN%SOnGCUTK)#LKGJswYir;Vq*r<13<=PgeUPfyP~p7%W;c-DJ1cs6^sd3Ja{_w4r^ z@*MFT^L+2Q;JNC#=DF_q&2z`|r{|tGz$^8}diCCVUW3=QvZ+Guo z-X7j!Z$Iw*qJlZ&7o}#X(s6UwE(f Kf8A$(tN#ZPg_s8b delta 10306 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 OZ*fNL_w&#Ess9Ir09I81 diff --git a/ch04/chapter04.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter04.xcscheme b/ch04/chapter04.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter04.xcscheme index 84e0aed..56204a9 100644 --- a/ch04/chapter04.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter04.xcscheme +++ b/ch04/chapter04.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter04.xcscheme @@ -50,6 +50,8 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUFrameCaptureMode = "3" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ch04/chapter04/MetalView.swift b/ch04/chapter04/MetalView.swift index 744f295..13712ee 100644 --- a/ch04/chapter04/MetalView.swift +++ b/ch04/chapter04/MetalView.swift @@ -27,36 +27,32 @@ class MetalView: MTKView { func createBuffer() { device = MTLCreateSystemDefaultDevice()! - commandQueue = device!.newCommandQueue() - let vertexData = [Vertex(position: [-1.0, -1.0, 0.0, 1.0], color: [1, 0, 0, 1]), - Vertex(position: [ 1.0, -1.0, 0.0, 1.0], color: [0, 1, 0, 1]), - Vertex(position: [ 0.0, 1.0, 0.0, 1.0], color: [0, 0, 1, 1])] - vertexBuffer = device!.newBuffer(withBytes: vertexData, length: sizeof(Vertex.self) * 3, options:[]) + commandQueue = device!.makeCommandQueue() + let vertexData = [Vertex(position: [-0.5, -0.5, 0.0, 1.0], color: [1, 0, 0, 1]), + Vertex(position: [ 0.5, -0.5, 0.0, 1.0], color: [0, 1, 0, 1]), + Vertex(position: [ 0.0, 0.5, 0.0, 1.0], color: [0, 0, 1, 1])] + vertexBuffer = device!.makeBuffer(bytes: vertexData, length: MemoryLayout.size * 3, options:[]) } func registerShaders() { let library = device!.newDefaultLibrary()! - let vertex_func = library.newFunction(withName: "vertex_func") - let frag_func = library.newFunction(withName: "fragment_func") + let vertex_func = library.makeFunction(name: "vertex_func") + let frag_func = library.makeFunction(name: "fragment_func") let rpld = MTLRenderPipelineDescriptor() rpld.vertexFunction = vertex_func rpld.fragmentFunction = frag_func rpld.colorAttachments[0].pixelFormat = .bgra8Unorm - do { - try rps = device!.newRenderPipelineState(with: rpld) - } catch let error { - self.print("\(error)") - } + rps = try! device!.makeRenderPipelineState(descriptor: rpld) } override func draw(_ dirtyRect: NSRect) { if let drawable = currentDrawable, let rpd = currentRenderPassDescriptor { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let commandBuffer = commandQueue!.commandBuffer() - let commandEncoder = commandBuffer.renderCommandEncoder(with: rpd) + let commandBuffer = commandQueue!.makeCommandBuffer() + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) commandEncoder.setRenderPipelineState(rps!) commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) - commandEncoder.drawPrimitives(.triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) commandEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() diff --git a/ch17/chapter17.playground/Contents.swift b/ch17/chapter17.playground/Contents.swift new file mode 100644 index 0000000..01fb50a --- /dev/null +++ b/ch17/chapter17.playground/Contents.swift @@ -0,0 +1,8 @@ + +import MetalKit +import PlaygroundSupport + +let view = MTKView(frame: NSRect(x: 0, y: 0, width: 300, height: 300)) +let renderer = Render(mtkView: view) +view.delegate = renderer +PlaygroundPage.current.liveView = view diff --git a/ch17/chapter17.playground/Resources/Shaders.metal b/ch17/chapter17.playground/Resources/Shaders.metal new file mode 100644 index 0000000..93a57ab --- /dev/null +++ b/ch17/chapter17.playground/Resources/Shaders.metal @@ -0,0 +1,24 @@ + +#include + +using namespace metal; + +struct Vertex { + float4 position [[position]]; + float4 color; +}; + +vertex Vertex vertex_transform(device Vertex *vertices [[buffer(0)]], + uint vertexId [[vertex_id]]) +{ + Vertex out; + out.position = vertices[vertexId].position; + out.color = vertices[vertexId].color; + return out; +} + +fragment half4 fragment_lighting(Vertex fragmentIn [[stage_in]]) +{ +// return half4(fragmentIn.color); + return half4(0.0, 1.0, 0.0, 1.0); +} diff --git a/ch17/chapter17.playground/Sources/Render.swift b/ch17/chapter17.playground/Sources/Render.swift new file mode 100644 index 0000000..afea1d9 --- /dev/null +++ b/ch17/chapter17.playground/Sources/Render.swift @@ -0,0 +1,73 @@ + +import MetalKit + +public class Render : NSObject, MTKViewDelegate { + + weak var view: MTKView! + let commandQueue: MTLCommandQueue + let renderPipelineState: MTLRenderPipelineState + let device: MTLDevice + var vertexBuffer: MTLBuffer + var indexBuffer: MTLBuffer + + struct Vertex { + var position: float4 + var color: float4 + } + + public init?(mtkView: MTKView) { + view = mtkView + view.clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1) + view.colorPixelFormat = .bgra8Unorm + device = MTLCreateSystemDefaultDevice()! + commandQueue = device.makeCommandQueue() + renderPipelineState = try! Render.buildRenderPipelineWithDevice(device: device, view: mtkView) + + var vertices = [Vertex]() + vertices.append(Vertex(position: float4(-0.5, -0.5, 0, 1), color: float4(1, 0, 0, 1))) + vertices.append(Vertex(position: float4( 0.5, -0.5, 0, 1), color: float4(0, 1, 0, 1))) + vertices.append(Vertex(position: float4( 0.0, 0.5, 0, 1), color: float4(0, 0, 1, 1))) + + var indices = [UInt16]() + indices.append(0) + indices.append(1) + indices.append(2) + + vertexBuffer = device.makeBuffer(bytes: vertices, length: MemoryLayout.stride * vertices.count, options: []) + indexBuffer = device.makeBuffer(bytes: indices, length: MemoryLayout.stride * indices.count, options: []) + + super.init() + view.delegate = self + view.device = device + } + + class func buildRenderPipelineWithDevice(device: MTLDevice, view: MTKView) throws -> MTLRenderPipelineState { + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal")! + let input = try! String(contentsOfFile: path, encoding: String.Encoding.utf8) + let library = try! device.makeLibrary(source: input, options: nil) + let vertexFunction = library.makeFunction(name: "vertex_transform") + let fragmentFunction = library.makeFunction(name: "fragment_lighting") + let pipelineDescriptor = MTLRenderPipelineDescriptor() + pipelineDescriptor.sampleCount = view.sampleCount + pipelineDescriptor.vertexFunction = vertexFunction + pipelineDescriptor.fragmentFunction = fragmentFunction + pipelineDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm + return try device.makeRenderPipelineState(descriptor: pipelineDescriptor) + } + + public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} + + public func draw(in view: MTKView) { + let commandBuffer = commandQueue.makeCommandBuffer() + let renderPassDescriptor = view.currentRenderPassDescriptor! + let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor) + renderEncoder.setVertexBuffer(vertexBuffer, offset:0, at:0) + renderEncoder.setRenderPipelineState(renderPipelineState) + renderEncoder.setTriangleFillMode(.lines) + renderEncoder.drawIndexedPrimitives(type: .triangle, indexCount: 3, indexType: .uint16, indexBuffer: indexBuffer,indexBufferOffset: 0) + renderEncoder.endEncoding() + commandBuffer.present(view.currentDrawable!) + commandBuffer.commit() + } +} + diff --git a/ch17/chapter17.playground/contents.xcplayground b/ch17/chapter17.playground/contents.xcplayground new file mode 100644 index 0000000..06828af --- /dev/null +++ b/ch17/chapter17.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ch17/chapter17.playground/playground.xcworkspace/contents.xcworkspacedata b/ch17/chapter17.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ch17/chapter17.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ch17/chapter17.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch17/chapter17.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..6cfead6eee05a50a3d25d0c33a796cab015ac073 GIT binary patch literal 20767 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 literal 0 HcmV?d00001 diff --git a/ch17/chapter17.playground/timeline.xctimeline b/ch17/chapter17.playground/timeline.xctimeline new file mode 100644 index 0000000..4e2f1f2 --- /dev/null +++ b/ch17/chapter17.playground/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + From f589c2601f1e0966c55b6f531c407f524c01856d Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Sun, 25 Sep 2016 00:01:27 +0300 Subject: [PATCH 04/20] added chapter 17 --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f025e1c..664abc4 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,6 @@ Repository to accompany the following blog posts: - [Using MetalKit part 12](http://mhorga.org/2016/05/18/using-metalkit-part-12.html) - [Using MetalKit part 13](http://mhorga.org/2016/05/25/using-metalkit-part-13.html) - [Using MetalKit part 14](http://mhorga.org/2016/06/01/using-metalkit-part-14.html) -- [Using MetalKit part 15](http://mhorga.org/2016/06/23/using-metalkit-part-15.html) \ No newline at end of file +- [Using MetalKit part 15](http://mhorga.org/2016/06/23/using-metalkit-part-15.html) +- [Using MetalKit part 16](http://mhorga.org/2016/07/06/using-metalkit-part-16.html) +- [Using MetalKit part 17](http://mhorga.org/2016/09/24/using-metalkit-part-17.html) From d870b9d6c9f01abcf7a62b9f518532c416956128 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Sun, 25 Sep 2016 01:39:11 +0300 Subject: [PATCH 05/20] 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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 Date: Sat, 1 Oct 2016 13:00:16 +0300 Subject: [PATCH 06/20] added chapter 18 --- README.md | 1 + chapter18.playground/Contents.swift | 45 ++++++++++++++++++ chapter18.playground/Sources/MetalView.swift | 40 ++++++++++++++++ chapter18.playground/contents.xcplayground | 4 ++ .../contents.xcworkspacedata | 7 +++ .../UserInterfaceState.xcuserstate | Bin 0 -> 11344 bytes chapter18.playground/timeline.xctimeline | 6 +++ 7 files changed, 103 insertions(+) create mode 100644 chapter18.playground/Contents.swift create mode 100644 chapter18.playground/Sources/MetalView.swift create mode 100644 chapter18.playground/contents.xcplayground create mode 100644 chapter18.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 chapter18.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 chapter18.playground/timeline.xctimeline diff --git a/README.md b/README.md index 664abc4..e021d1a 100644 --- a/README.md +++ b/README.md @@ -19,3 +19,4 @@ Repository to accompany the following blog posts: - [Using MetalKit part 15](http://mhorga.org/2016/06/23/using-metalkit-part-15.html) - [Using MetalKit part 16](http://mhorga.org/2016/07/06/using-metalkit-part-16.html) - [Using MetalKit part 17](http://mhorga.org/2016/09/24/using-metalkit-part-17.html) +- [Using MetalKit part 18](http://mhorga.org/2016/09/30/using-metalkit-part-2-3-2.html) diff --git a/chapter18.playground/Contents.swift b/chapter18.playground/Contents.swift new file mode 100644 index 0000000..0027557 --- /dev/null +++ b/chapter18.playground/Contents.swift @@ -0,0 +1,45 @@ + + +let shader = +"#include \n" + + "using namespace metal;" + + "kernel void k(texture2d o[[texture(0)]]," + + " uint2 gid[[thread_position_in_grid]]) {" + + " int width = o.get_width();" + + " int height = o.get_height();" + + " float2 uv = float2(gid) / float2(width, height);" + + " float3 color = mix(float3(1.0, 0.6, 0.1), float3(0.5, 0.8, 1.0), sqrt(1 - uv.y));" + + " float2 q = uv - float2(0.67, 0.25);" + + " float r = 0.2 + 0.1 * cos(atan2(q.x, q.y) * 9.0 + 20.0 * q.x);" + + " color *= smoothstep(r, r + 0.01, length(q));" + + " r = 0.03 + 0.002 * cos(120.0 * q.y) + exp(-50.0 * (1.0 - uv.y));" + + " color *= 1.0 - (1.0 - smoothstep(r, r + 0.002, abs(q.x - 0.25 * sin(2.0 * q.y)))) * smoothstep(0.0, 0.1, q.y);" + + " o.write(float4(color, 1.0), gid);" + +"}" + +//"#include \n" + +// "using namespace metal;" + +// "kernel void k(texture2d o[[texture(0)]]," + +// " uint2 gid[[thread_position_in_grid]]) {" + +// " int width = o.get_width();" + +// " int height = o.get_height();" + +// " float2 uv = float2(gid) / float2(width, height);" + +// " float2 q = uv - float2(0.5);" + +// " float a = atan2(q.y, q.x) + 0.25;" + +// " float s = 0.5 + 0.5 * sin(3.0 * a);" + +// " float t = 0.15 + 0.5 * pow(s, 0.3) + 0.1 * pow(0.5 + 0.5 * cos(6.0 * a), 0.5);" + +// " float h = sqrt(dot(q, q)) / t;" + +// " float f = 0.0;" + +// " if(h < 0.4) f = 1.0;" + +// " float3 color = mix(float3(0.9), float3(0.5 * h, 0.5 + 0.5 * h, 0.0), f);" + +// " o.write(float4(color, 1.0), gid);" + +//"}" + +import MetalKit +import PlaygroundSupport + +let frame = CGRect(x: 0, y: 0, width: 300, height: 300) +let view = MTKView(frame: frame) +let delegate = MetalView(mtkView: view, shader: shader) +view.delegate = delegate +PlaygroundPage.current.liveView = view diff --git a/chapter18.playground/Sources/MetalView.swift b/chapter18.playground/Sources/MetalView.swift new file mode 100644 index 0000000..b8c4802 --- /dev/null +++ b/chapter18.playground/Sources/MetalView.swift @@ -0,0 +1,40 @@ + +import MetalKit + +public class MetalView: NSObject, MTKViewDelegate { + weak var view: MTKView! + let commandQueue: MTLCommandQueue + let device: MTLDevice + let cps: MTLComputePipelineState + + public init?(mtkView: MTKView, shader: String) { + view = mtkView + view.clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1) + view.colorPixelFormat = .bgra8Unorm + device = MTLCreateSystemDefaultDevice()! + commandQueue = device.makeCommandQueue() + let library = try! device.makeLibrary(source: shader, options: nil) + let function = library.makeFunction(name:"k")! + cps = try! device.makeComputePipelineState(function: function) + + super.init() + view.delegate = self + view.device = device + } + + public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} + + public func draw(in view: MTKView) { + let drawable = view.currentDrawable! + let commandBuffer = commandQueue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeComputeCommandEncoder() + commandEncoder.setComputePipelineState(cps) + commandEncoder.setTexture(drawable.texture, at: 0) + let groups = MTLSize(width: Int(view.frame.width)/4, height: Int(view.frame.height)/4, depth: 1) + let threads = MTLSize(width: 8, height: 8,depth: 1) + commandEncoder.dispatchThreadgroups(groups,threadsPerThreadgroup: threads) + commandEncoder.endEncoding() + commandBuffer.present(drawable) + commandBuffer.commit() + } +} diff --git a/chapter18.playground/contents.xcplayground b/chapter18.playground/contents.xcplayground new file mode 100644 index 0000000..a93d484 --- /dev/null +++ b/chapter18.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/chapter18.playground/playground.xcworkspace/contents.xcworkspacedata b/chapter18.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/chapter18.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/chapter18.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/chapter18.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..ce52f92bfc3b8951779165b837675e3697634090 GIT binary patch literal 11344 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 KGmZ_GjR;V_r-ch}$ z`arc=wMDf}wL`T_wMVsIbwKs0>bx4Nb?R2??&^N(VQRPfNp-#YP4!mwHuZM(PW3_c z5%p2^arH^{DNTY#rO|418iU59v1k}gh9*bTRdc_lho(T&SJPiJP%~IFU9&**lIC^I zTbj2u?`n2wj%bc*j%iM4zR-NBIj#9db6Immb4_zY^Q-2z<~PkBTBwz24cgAy0a{l3 zu=Z)~%i6cK+q65hyR;u^_iFcRk7|!;PiVi;eyKgJ{YLv+QgTwSq{5`yq}fSxlNKhe zOL{+PZ_*b@HePlGBsBBo`%@B)gOS$uA~1CLc(?uE+WWJzp=>tMppEPOsNz z=zHk<>ig>l>IdtK^dt3U`Z4;kdZ*r{pQL|CKVQE@zgqvQ{x$vU`Zx6(^&jfD>bL86 z>UZn+=+7Fkp|zoxp}%2(VUS^zVT@s{VZ5Q-P-&<(_zgkBRKs+`qlS5gCk;;-o;55s zEHON9Xf&)hyldEO*kagb*lpNj*k}0IaMbXX;YY(o!)3!&!*#<=qr@mPT8&x8BBR?l z*;sA#8K)TM8J{&SGp;r6HGXFN+<4r0(s;`Fi}9-Qy78v*mhp}$!6Yz=OcImcWHgyg zR#O{OhN*|CmnqMbZ+gHq&NSXsZmKj@oBXDrX{u?u=^4|rrp2ZursqwKrZuK@rk73I zO*>7yO?yoHOdp%RHhpXQ&UDW7z3B(jRnxDg+os=4f0!j^xmjt}n3K%O=2UZ`d9-<~ z*=a5}SDGi7r_2=AGuB%~vdDOKZzu%TUWS%OjS@El*hHTNYXt zS)Q{jwXC&#VmWL%ZTZe}&howGXUiqa70WftA6AJ~ZB4T3ttKmDZEbC9ZEsDrmRYA* zAGa>FF19YUF0-z)zHNQay2-l5y4||Vy2rZTdcu0jdfNJ}^*if1>jmqN)}O7nZG4-< zmTenmtFg_rEwrt))!Q0ut8DMu-nVVGZLw{$?X(@R9kP99J7zm!J7>FK`_XpMcG-5t z4(!;TU>Dd$c8OhU?`F@p_q7kO53-lrefFvLI{Qrf9Q$MT$L&wppRzBoKW|@dUukc! zZ?JE+Z?*5R@3!x?e{BEMe#ri{{fzyb{et}``z8Ao`!)Lwhtgqjv~#p~q&m_anT}45 zo{l_6zN4?Bzhj_duw#V7=?FTeIUaP(bj)^y9P=FW9Sa-_9V;D;j@6E}jt!1?96KGm z9eW)69ETjY86LxDM2v)Cm<%S9>BwX;c}xM*j~U1mGDDaO#=}fug3L6gj(LoEf|<`e z%`9S;Fw2>&*HuGDGJVldY0O3D`BHuhw L + + + + From 54d44001bfb5be80c8c5f8d017c459bd32978da7 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Sat, 1 Oct 2016 13:01:12 +0300 Subject: [PATCH 07/20] added chapter 18 --- .../chapter18.playground}/Contents.swift | 0 .../chapter18.playground}/Sources/MetalView.swift | 0 .../chapter18.playground}/contents.xcplayground | 0 .../playground.xcworkspace/contents.xcworkspacedata | 0 .../UserInterfaceState.xcuserstate | Bin .../chapter18.playground}/timeline.xctimeline | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {chapter18.playground => ch18/chapter18.playground}/Contents.swift (100%) rename {chapter18.playground => ch18/chapter18.playground}/Sources/MetalView.swift (100%) rename {chapter18.playground => ch18/chapter18.playground}/contents.xcplayground (100%) rename {chapter18.playground => ch18/chapter18.playground}/playground.xcworkspace/contents.xcworkspacedata (100%) rename {chapter18.playground => ch18/chapter18.playground}/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate (100%) rename {chapter18.playground => ch18/chapter18.playground}/timeline.xctimeline (100%) diff --git a/chapter18.playground/Contents.swift b/ch18/chapter18.playground/Contents.swift similarity index 100% rename from chapter18.playground/Contents.swift rename to ch18/chapter18.playground/Contents.swift diff --git a/chapter18.playground/Sources/MetalView.swift b/ch18/chapter18.playground/Sources/MetalView.swift similarity index 100% rename from chapter18.playground/Sources/MetalView.swift rename to ch18/chapter18.playground/Sources/MetalView.swift diff --git a/chapter18.playground/contents.xcplayground b/ch18/chapter18.playground/contents.xcplayground similarity index 100% rename from chapter18.playground/contents.xcplayground rename to ch18/chapter18.playground/contents.xcplayground diff --git a/chapter18.playground/playground.xcworkspace/contents.xcworkspacedata b/ch18/chapter18.playground/playground.xcworkspace/contents.xcworkspacedata similarity index 100% rename from chapter18.playground/playground.xcworkspace/contents.xcworkspacedata rename to ch18/chapter18.playground/playground.xcworkspace/contents.xcworkspacedata diff --git a/chapter18.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch18/chapter18.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate similarity index 100% rename from chapter18.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate rename to ch18/chapter18.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/chapter18.playground/timeline.xctimeline b/ch18/chapter18.playground/timeline.xctimeline similarity index 100% rename from chapter18.playground/timeline.xctimeline rename to ch18/chapter18.playground/timeline.xctimeline From 9a34a3ced102bb4b956c4565e41000b7e972caf3 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Fri, 25 Nov 2016 21:32:52 +0200 Subject: [PATCH 08/20] updated to Swift 3 --- ch01/chapter01.xcodeproj/project.pbxproj | 16 ++++++++++++-- .../UserInterfaceState.xcuserstate | Bin 22924 -> 22741 bytes .../xcschemes/chapter01.xcscheme | 2 +- ch02/chapter02.xcodeproj/project.pbxproj | 20 ++++++++++++++---- .../UserInterfaceState.xcuserstate | Bin 17440 -> 16997 bytes .../xcschemes/chapter02.xcscheme | 2 +- ch02/chapter02/MetalView.swift | 4 ++-- ch03/chapter03.xcodeproj/project.pbxproj | 20 ++++++++++++++---- .../UserInterfaceState.xcuserstate | Bin 19763 -> 19398 bytes .../xcschemes/chapter03.xcscheme | 2 +- ch03/chapter03/MetalView.swift | 18 ++++++++-------- ch04/chapter04.xcodeproj/project.pbxproj | 6 +++++- .../UserInterfaceState.xcuserstate | Bin 20119 -> 19862 bytes .../xcschemes/chapter04.xcscheme | 2 +- 14 files changed, 66 insertions(+), 26 deletions(-) diff --git a/ch01/chapter01.xcodeproj/project.pbxproj b/ch01/chapter01.xcodeproj/project.pbxproj index 6cbc653..2d19679 100644 --- a/ch01/chapter01.xcodeproj/project.pbxproj +++ b/ch01/chapter01.xcodeproj/project.pbxproj @@ -51,11 +51,19 @@ isa = PBXGroup; children = ( 29400C7E1C3AEE1300345568 /* ViewController.swift */, + 297F43031DE8C78100638FC8 /* Supporting files */, + ); + path = chapter01; + sourceTree = ""; + }; + 297F43031DE8C78100638FC8 /* Supporting files */ = { + isa = PBXGroup; + children = ( 29400C821C3AEE1300345568 /* Main.storyboard */, 29400C851C3AEE1300345568 /* Info.plist */, 29400C7C1C3AEE1300345568 /* AppDelegate.swift */, ); - path = chapter01; + name = "Supporting files"; sourceTree = ""; }; /* End PBXGroup section */ @@ -85,7 +93,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0810; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29400C781C3AEE1300345568 = { @@ -160,8 +168,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; @@ -204,8 +214,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; diff --git a/ch01/chapter01.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch01/chapter01.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index ba92cabe6645acbd44ae86a22125b3d9d32e8a48..457e0b6ff122a8164c90cb0f9eae839f61210ea3 100644 GIT binary patch delta 12607 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 delta 12750 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 diff --git a/ch01/chapter01.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter01.xcscheme b/ch01/chapter01.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter01.xcscheme index 2adec09..eca02c6 100644 --- a/ch01/chapter01.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter01.xcscheme +++ b/ch01/chapter01.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter01.xcscheme @@ -1,6 +1,6 @@ Pum}7A_JSY5KJXLx8SDoKz+rF({0ICFE`uxJD!2*mf_va0_!~S2FCc&faxe@= zKq-_%6^wyKm;_A$XoktK8mtaepdY5fnlK$^zz<*}*ci5eZDBju9(I5oVGhiN-Cz&+ z3G5FG;b0hm6!P$MH~~(CLAVH(!Bub_+yFPh&G1{e3;qCqf(PMo_zV0UUVs@Xeb(nhNA%b6n%~+py_B9T!3by`REI@04+gfXenBTmZKHud$b4r zfcByv(LVGO`Wfv<2hc%u2pvYp(8&P$1)W9b&}DQ5T}8Li1N0odKrb|BLu?)vz zHP+xbti>+u#vbg&K3ok~$0;}ie}L=adbmDrjz7Y!a9i9C=i+WS4|m5sa8KM97vLg1 z0*}O_Z~#+09)FG};3;?po{Q(<`M3m^;y@W*idW%Hcr)IDx8iMh7v75x;lua{K8nxa z|KPLuJpL13!k6)FdCp=xF}A}DL5q;&n0krE|JTya@Dx%TngvsQn@s)23MD> z$JOT=a4oryxK>KNoU78V; zkVa>|p;eg*r>7 z$`~*pe?U=o-=d1G0nM_977Q#3P7B){=)?%xWal)?&dKY20*F935Q8j`56mk;SC9>I zKrZM8@<4ac1N5X?s-y8Vf$C`@HBci>S_zWCC+yppeF{K7&>s|16E(AML-uJ;3+Vtl zf@WsPWUYG^46c`#Gq6XGymHZ)R3TA==M?ibqRN8oSGdNA@P6uPb z_|Wn=YAptzQya}}(>y!BZza)WFdfKC!4xnROrv({pw3b-gUK_Kx|j@Ync-e5v)h3A zz*h{upl&LuBwPfR0rPUO7%TzBpahhHGO(0-sF(U^HCmmfQ2%nU9IOB$}i}f zT{yIat)!g-N5E0$m}B5LH~~(AQ{Xgc9Q-1(m8dzbM_bamv|+GTOlli&7WhiRui!Uu zj@GA*Y15Fh7r;eEx|&(!Qpd*K^7uT$?OFbMy|!&y_v@Ws6mn+cqP#u>Ds*ZBo0q_*uo=y# zeQEzn2I>!CDp?+cpnbEv?&XY(=_7W5&|f8CC)nj3 zx-8h07SMh)qeH9w9z82*)|b;%m_847@AB608HI(}LrY;E@Po8UmOUZMI!l(&%*ut{ z0oXUBULRUi3=8PM|4+REA@z#jKstyH{YSkaaQHh?j({WSU^;|J`8G`&)5pwxN3+rJ zvr3wp5Wng%rFaGThFD{(`k!&%hNr zmgzK(vh)xF%I*+QrZXKS6+Yezf6S642N&v$5iMAtmcV@=?ae}PvQ9+c&v1WmzAl-- z0}R6Rb>={&uMfc^ZzK6Aoj@}y4mc5V>q&TuPNY-*aqAiQYo&|IJ@gwqM<>zAG^3?4 zoyy+v<{$9#zh1q{UY$xajOl%s0G8wa3F({gUI@6i;B9yZ-lfy&3>u^}%iw+Z7kmI8 z(phvR-A@lN;O>+fgQtWYYr^LU0rN8W0=|T=;A;dBq_gQ9I+xC)^XV7M5JrUI-h>25 zNEgr&hW$FUj4ov?@rhsVfK6jA_rF_P1T#YjmPF%UY!)d3WX zG|V9T*wYoJ|7_Gp4MQ8NX@lZ&DJ$`gnxa6*(4SfE%?yqeFG)k$s0T1FML8%JbwhcmJN=4opd0De z^qZxqC(37SN)qZ#H_^>3`&eW03DP`l)=J?tx_})4Jko`&|tcSZl&9TH6!C& zq7i5$tH*EZMeDqxQnoS*q_N7vev}6(qOf@};^}tUzY2)KGxQlag~p-r3^3m@5bvNr zWy!q3+A*r2RHC<`iNIHeCZWk_3YtoH((mbB`r}(XqZug3D(o)0n>GselIZHaK`@$w z=CbuY^at9geVd-F#p|Z`%EBsl2bJS{O9|XaF+hce%GPDvCg%rEE2XyN6?TZbX$e>j>G0lX#a}mQ&rZ_ zRC)fj{JAn>&!dYh*wOFk0zFTEFA1Gk&ObA_H7cVix`uAB_$n`o=qA1RCY7K&uz4xE zi|(QO^bdNOUVEEP&_ndNYK}lp&{O&+y~N;GUv6xLUSU{u8zYSA6?&CsyxVIV(`WRn zntHGhi{GJ(U~I3Kv)v}wXmAu(GA*ziE9gynt0WYi<#CxAydxjc^?$cyZ?wlcY+_w2 zj>idDj}x&08*vi7NAJ_W=mYwY{!Je(2T3>?Td)<|upK)X*T+2kl!s$^IFpCp@Ng4D zOpW+m4nJntEyJle4cEXm=@a^tKBLde@O$`uHgeRVFL>zVVOt*dV+5vzqpk+HaY*Kd zxDkCxUzgw}xG4|Wn5<>!{-+VcEm_F7p|67djCEqFu4jhUc?hy(HG^JKCH5auX62oL6=n1>N1cqksm!$=-VD*B+{ zFQ$|LkH`G$tB>dWv~cmv*uzvf{g53M}3@zBeR?@jzTC^mIz{w>~7 z2{Qa04-IcnhIfZ-{5{^oLn9B9|FQ9p_~(%I_Tis+n8ZU<3Em&FvAL>^lT4MG9m6O8 z_4a4@bh)i9%p+EFlKt0^J%8h&y{bKb#~1KLJcoxa9y)pGD7Rv*H=!0D++da)ui)z; zn=QoGn8A4HF2Og@ARc;H%Fk@uCcCglUQzIZS(kGU-+!kW#Sif_R$TDk_z_r(pWvrF ztj5C>+M0){Jgl)4KgTcdOZ*DI=3y-!*5x5X#)mv)Q(_ea5K@7F>RGb-Oe}A3dUCYt zAK(yC#kN07mR`PnJ6TqBTT-#jTB;Aqw-;FCiYnBKitU=g-If*}6^Uc6B{3wHsELM$ z@A2?`9@gezoid^&I$$Eq&FMVMpmlio0rPAf>pYK@xI#oWVkZv5ELe|+^?BHUhYib! zn|K%z%Lk2k*f>Pgq?~AY@Kc*U@E&2s{(sNFKQbQ_}MP6#gU9im_yAq$SUW7RIs_lfz&)20D_g|0+XQl3k%Kqse@uZMh6v z9;N1&%i!}>8(DdDPtuD8Hp%BWOj)63=$+W$t)h`@vu7&d+@Ml8JR=ol6ho451HI7 z88W#G7}W`9p`w(H45W-KCChlo5@a79_6@do+0)jLweJKtSx+{Ej{S;<{fo&)9u9a{ z@hugK7Y6Ugqy+D|V(NcOzGvMU*-mzl@5oNFi|poM5f2CQkl~4`K7@xumytc>2eOy^ zNcIs1d7 z&_vs~Ud2pHek13W@Gww5d!SL|_mWU&R-SLk#dmmKBA4G)_8MVn;LWTV8yaQEEpmr7 zxa2ku#}t#hJp7C$n*N@IcH|*>3FIrt-{cW_OrDUZWWO_lS3UQVqd7G&mvSmDhGY4g zxpX!U=ah09E{@aka4rv7_AO;bdgbktV1Uh+az-wRGjV1vnTPXu$aF8`;R+tEq5XqL zyecj8{}()5P|CSE59j3}s|$;GxHx1$b1*SAK6utQCQy^B9Xiy`IXH&!wD>*sn@~dvNR)VHs06pX-3JC)otq>-!gbRd5VOg7kZrMZi*+u#qHGL`imd&G3ukwK9#;_p* zL{jvo73RjXb``AUCU6r&HD)spx3XgTPqOExQNV?osVywqH>^?x@azhpMhE#cWneBh zFSB(~c2ORMKnT>p0PO5muO_I&uH$#G5_}w=V^{Cj@lAI5{uirpkMI+cz^>Nol2)V* zyH0OUI+Bk`7t)m!u*>uTEUgV@d2Bct$?nvrkPYk(+`z80yK=+1ncPBd30K0Eacj9P z+-~k??lAXDfV;#!=U#HJ!(bQ=bVH06fVS8aGVP|1iVUDny zaFTGIaDi};W6O};cHQh$Sq0})e^lgsv~M9 z>Lltc$`WOZaz%Nf9-@5F5YaHv2+=4J6^#~+5sej%7tInCi?)l7if)C6hpWOJ;WYx` zAB5KnZxG%nyh(WL@XYXb;T^&|g?A1g623TmZTPA1^Wj&+uZ7f*ZM zw&Fr@k$8}Jh+uZeGnUx;5t2qMf8_J}4C z?IJovbc*O4(IcWLVo=18h+z?9BBnr{g!b##J28mtbl6WLONfSvsNmogZq?@F>q^G36 zWPoI#WUyqYWVmFEWQt^-0s$F=?Lj4=?v*iX|c3Sx=gxKx>~wcx?8$mdPI6mdO~_i`iJzY^t$w> z^q%xD=|kxw8Ii@v^fIf=FRLYcUsgv}Pu4)zNY+HwM%G!@T{ciQLiV|Af^4E}vTVL= zp=`0NL{=tSCfg?4Bl}6VUv^LyI4t{Bc0u-s?2_!d?56Ct?5^x-6pE5YDWgZ)qV`1Xk2)RoRL;o-a*|BRQ0-J5R2^0wRUKEIRGn6xQC(JDRb5xzRNYqH zRoz!Th*88iV;aWf#PpAu6f-ZTEM{5EikMX~Yhu>LY>oLgW=G7E2#0Fyn3u237OJkSDE|2{xc314rv8Q9t#r_$4EB0>e{n!U;p*mb0p_Zs+YPq_B z`a^Ylbw~Bb>MrW8>Kt`}y1#mWdZ2oSda=4#U8-KHUZ-BK-l5*9-mTuFKB_*hKB+#f zex!b_QE6&u8fZFevNYM6Tuq*)hbCY1iKdUHK+`{<8K9YqrnX8$v zS)f^@S)wV??9d$4+|;~|i-|MG)r@NqmlHQCE*Q5eZe!fnahu|H#_fvxKJGx=!MMY5 zzr>x1I~(_B+@-iHaS!62#6639p@mwk<+K8Af;L0jLi>@nwYIIcy|$w^SKCY5TiaLL zPg|%B1hiwcW3}V8leJT|)3rhEGVPbz?b_YiJ=(q6{n~@t!`h?T^V+N0huWvw=h~M# zq$9d8olqC2v*?^Ux6Z5c>(X>Jb?@mq>PG0c==SS=(OuD9)7{YB(%sSB)BUA;7?0z* zctL!4d}O>VUJRahE^)vK~^(*wN z_3QLs>A%+R(C^ak(f_FbS${zPJkgxkCh^n6g^8;Y*Cwt{+?cp2aZBRC#8Zi96VD|E zE+qbucsKE3;^V|;iLVXFz!?OFXoJPj%#dlwG4wF>GW0PN8U`AM7={^!8^#!>8)g`S zhFOM1hGIjRVVPmGVYlH2!#=})!y#jYG1_P_CL3)=r_pDuZcH`SFlHDV8FP%E7$+KM z7&jPyGM+M?H(oSeGF~;_Fg`Fo3K*XnUl?B}!6Zjgr=$r<8CQmlxON?>SO9>Dl`o@O*73i zEif%M6`MAgzAnZ(#;h|N%qDZP*=qKf>ziAdTbl!I%x%rN=Dz0s z<|6YT^HB2$^EmSa^JMchbI?57JlDL`yxhFfyvF=687AXoE?Jn|G`W3p$K;Qbvy#h_ zze?Vi{7v$fI5-eR>lEN+X}Qr+UWd}JA78EaW**=*Tm*=IRvIcK?G z`O|X6a^3QmvgZv0k*^u|Bpwv%a(e8@5H*q&B%tX^XL`Z3dg&R^66iYhr6=Yhi0?Yh~+X z>tf5c<=VR2dfNKihS|p1CfFw1rrCnFS+){enQfUZu+sL}PVA9(nO$L5+0}M~-DJ1e z?RJ;lV{c~fY9DJ~Y+qqtZC__!Z~xYQ%KnG_vi+LYWCs+v#;ybNZdboa3A`opYS?oeP~yoTbiX&W+AZ&aKYv&YjNhoqL`8oM)X6 zT>_WFmFRN2K6JHrb#QfZ^>lsW>g($7Dsl~Sjdx9V&2Y_fEpnB**0|QXzI1JO?QnhP z+T}XrI_x^)I_5g>y6C#(y6OttaNTk}a}#%z+u%02EpEHp<@UO(yHnjY-A&ys+%4U$ z+?nq7?oRG5?yl|}cW?J#_cZr%_jdO&_jM2QNIca%H9fUFO+4*9T|C*IZk`^VzMlS` zBF|vYP|q6AKFyrESRCY)zV!Hta2wO%Ra+76fZ41>zsp z5ftgdB0I7pD5xm<2#AOa;)1vUf`AC3qI{Fq3cSzz{_!Qhrn%?LoS8Z2T-TX1`F=XA znGK7Q$!1~8Vx1G-S=_E!xEMW+O3+|51dTvr&{#AMjYkvEWHcSkK(o{BhNP$#HgLJTf1G2&pfM(DJ@*p4DLuYsdy1-*l2tA<}^nt$cB=m!^Fb>AU z1egeuU@}aBXCVv>M3@RQU^dKwd9VR&ZfK9jwHe(C6VjH$&2hPCRxGB!T zxj2NI;pVsn&c|(WC)^cx$31Z`{3Py&pT;G403L#e;gNV0o{Xp9XK@%aJP*&u3-Cg` z2uJV>cqLwg*WxXBE8d3p;(d5OJ`~1p;kWU7_!RyKpT=L{bNEaAJ-&u-;Xm;`LP!je zk~pFy8loeq#7F!jiv&oJWRs>OhqNW_NC9b2I*@Lp2Pq^^kRmdKl#`)k7#U7RkP0%A zj3HymBr=UmCo{-QGK(xEi^yWKge)g3$r=)_CN*Ru*+e#zE#y_QhrCJNB5#wU zIYmAvXUP}j9Ql%bPktajlAp+Ra)bOr{vdyndo-RZsfs33Ej3UhHPI&2M(s2}gEX5q zr8zX0hG;X|o_3%eX(!s5K0>?DuC$2up?&F-bTA!4%foai9ZSd2@pJ;6NGH+BbSj-m zXVC~>ujx1R zJpGnlpx@E&=@0Z0y+*IooAegFL+=VmkO(n?R4@vuLYj~+n1m*RS?FUCtb$Fj3l1Se za0)>oTWBie2(5)qLTBL-p^MN}cvR>n6bXHVzQU72nJ`EgEDRAUh0($|VUqBiFi)5- zED#n75n;LTys$!eL3l~171j%zB6~?|a-G>DcgR%1$nuzLXP9mVjgh6YH0EYuHkHle z%?sHg=8BX^45^CF1?>xmj2zdkWNi81lB$uFPx6MIB?G#a3@95OnJC%YvOjNVKd_vO z@+-?q6ezY>k@#p?Rmt$)J64gz(0sH2Ekui$hk02h^VOjx zD1w%vWz5eyvSDmE-+#-bDb3M~s217Rp_kBV^fFq5s!P-T4dwz z4d@k?%UW~)aV_t6I^y>aT}tPQg_N=8{J4>9mn<$uVK{3Ht2c zb$-s;-S2!3ef96EzGel?)u`oL^j%bNgte?j-?R4j1sBofsNfRoP+h+~*Z&=Z*U;^# zv9D*L8|W8w6a9*Au}-WrdxUjiUD>1SxSj8yj{NgabeG$?8#D0FayB$-?c_B95I~OX zYe51rAca_vvBy|<_BiXo3fDp$#3L)Rf`avAy_k`|`|x2$wWkw72gVxEgMsyCPq3oM z`joVGV1gz*X8#Gd!m_Gb-eN|fUfl}$!$(oXfE5j|1{>?koM#{doV>*aZt#E?GQkJ_ zNE3OFIK=v~A?!&uxLA=D3CoisZk?$Vf+$c2+0YbnAeZ%LC2SxoV+p6BIkezfT0$#m z-M90=vWlwmLFHwYy*gJ6EE~_BV#Vy~Vue1-bRWT$Wn5I5;WT+$n=+gVsK)}dg?15l zTsoC$d%CFS5Y7h!O<4*_NQPfcJG*(5fZP2taZ z>{-S`C?(2lm6anaJCqOSm?*Cp+`b~RPybs9OatQ@R@C64nP~VL=2YMN=he_S_kj-c zANang{(IvdBCwoe3zot%#+XZ{Y%b$Mvn` ze+K@3n|;pCvI`tj%VT!w8ns`CU$~jz23u7PH`$9^I#BA%gWuryX!9NRQZ@X+Rx?-6 zM@z~p8VCK2F;dmSJ&Z80m)ROtU5g3ohy_-|Cwi0H=aUm8G{>e1IBioSmU$%#IS(UuQ1;m7Nn4n&(C$Pc(TlH(_E5$*$?$l^Gy^dLLL zP_ZIEa>SMzIUeWqDOQH$71{b5ye~BV<<3n+{l&c*G z9y|yaMNY(PZAaL_dQ!mUcqpgFUOl?j;PPln=KP3?9}hQ``rW5?Z;ih-XH-PsP*lbUcH-&;G+cV8`n? z3_IdEJdpGFj!*E=b49*Qm>kB7QDDveI9Q4~cB}C+_F*-*xFO0H%620wMvoj`)<74J zjvUySXYnfhQX`V_YWC4TNXFIt;Dc*$Ej!IV`4`1_9e(9O9O8|56Z@Ej&oFyY*RnxX z(PNb*Z}Q>#b4z1XZpS+x8nX-UW}mXpn7vPr^1(wI$83LS%mK`ke>5jIDtR3rj&A7< z_C+;5!p_xii94@w6vut<$o|B5KRy~=@jLik_9gq~{)*qn#~+&g1U|{WVqf#%y{6E2 zz#rpJ9}<6tKWFFJw~Ysrg0cZ)1`jT)KR#OW`qZxxeT=`tU*m7Mi_h~|xPZTlJf`eo zy223qj$Qi%|A2qwqKo(vzRbnv@m0vfKclB22bA5ySJ=<&`v-w>9pCr|7(cNe8i3Id zJ-4I4_zmB|zq23NMRw``6BvZn1LN|;!03MZL1eIcR6Mj`63>@>6+HzW^c1_wcl0yk zhgcrXL=}zZ3w(zO^$|~!iMCkbh)j{_B4M>Gt{ac28j=!4&cBTjw>mb4=!v0NVQK8h zt0!ZmMD6QH(ukdt6-g&1(uA0ag;xBD^fZ5fR?x;h&Or*po|IaPhV@J4)AL*$aFO(fIm19xP;RUc{Bq-|uL)j^6C+DNM=+Q>^y zr0P+ml4FBBBZ9n|j20n|?~)fUIbR(Kd$t28!o=hRnijW{eVhv$L z6hR?^lH)>ZYag=YmE}DMNHUu|_dkZrBlAU2i;%?Zyx>_lyS{tGZ%-|VkfjaaZHS!b zdE}54BBZc{kI5?hL^K4+i{vG;n!Ma+blLE-`npI2g9v&NbRwkRx3@W~eQ@gQ{saHe z0I4PGqK>O0Yeg`MkXl35M+c?xgPW^&L!}pS+KmlIHL{g#iwv`v$#$|MvdEIxb|=~O z5UY^A%p9u#?wg^EH0^F97*KLm( zZxUWuJY=@tqGoFvHCxnWrFY3+4_SsHD&eIB1&S%5l=8R@iO^hxmLjwkA#W{>p;8)4 zWmGOgTM-@+p@#^)Mdv?KwjHk+1E^$@t$aN;M7Q7R8FZdT|Sf@z{+}$*TI;o3t^S2YB zK!o-pbf}|Vnu%|9y=5 zC-iAQTJnD`egG}yD$7K8LWH8I%4lt;b6Nbu=&0zR;dBJ8pd&?iQiOgY^cUf&I{FN) zY}hepr>F1lcw*Z_?cIvaYlZry1OmY+jVqW!!#wUOCyfEsl!-9#VPDT^uzG2+qD#Fq z&$%pFv+4Zk{B!7B`W&4n0$(C0yTKw1siO<%Lb`}@GA|clm6+-YJgP@j(`peac(3bjZ`L}xDXM!t-9TTV8$}o;0;j-A5k}Y1&2$Uh zO1FtnCBhgH#)>eJkLu>BRPWG(s!fNz9Yiq zYI;lrUUoegd&e7gJLP_CY9hnD+V&sPPdWF~Q}iQxntn{r&`(4Ni@?pr8Fs1&(?poQ zj($czr)TLG^c?+Cgc%~t6k(PK&xycoG@q~ZUGIYMj}O*k^fJ8?UCvJ;%&w+aMVJ%K z5Q$~uN0smrcwpzMvJssNM%NQAy+MCjBf{KHMAk@$jDiqJRI} zkP=P%0tkd(ga}xKh1CL2V2e0oUCB&;LWmVqNVP$b334G$h!+xsL_r}aMOY$2M1-Xx zEE8e52+xbassDuyf|^%OHX&Ki3MqmPaf*!=PCQaqiSVKbFNv_4KieY%eAgW=Arska z1-IZ4ydvOvWQkBK!W$w)io=B%pKj6L`M=Z|x<*0HIWb?IP?D;Z?riyg*uRxiI2?=}R{Y zBLyD7JY08)u$#F`k;#UU=_8?vJ7J74cIUFdNF3f%?^9vCFrojymoo(=RVB5&iQg&q z=C_Re=^wlblZ9zK6#1r~6~aPWK@@oS@vZL@VL#u!2nR%XZJkg6t%RAvEPm-@5%IBE|wudefXf*xC5HK9l3cvDqmS<`TM5nt3|VaXHS3Nx$9N0imG*Wz{8 z-V)(Z!wQ!Q%NiC_RwFEp9tssbM-D8RU@ECHg_>svOx+(<4832k)yJl=lHVtxc!rs? z;dwQ`OQ1wpBXIX~&vNB&bBAJ{J?srd7+KwbLEQtm6gD=r9etSlm0=E+ZiQXSCX@}# zuPhx>KDMm#l(1FU)~m3pq^gVok|G^4BR9XUZI0TIljIEfmRu&c$X%WT2^Dyzi=zot z!SCq1@w@n;oKh?3C|XIY_;vhvegQv+6Wn~xXp8w({4#zGzmC4oq0wCE$6XTtI{*l zUt^`Q8L>@c+r}2ec8Kj1`$%lp*lw{;#`cdbjxC8TjV+5E99tgCVz^+1DRT8 zl38RnS%%Cd^T=Auy2!f8y2}b>y<|_wN@NwX(XuhJak9y>XJt$_RW?sHU$#>AlI&$! zjjT?#PPS9FOSW6KSGG@fQg%-Ewd}m?JJ}Dii?Um?JF-7yf64C2L7pI2%GL5@d5T;w zcgS6GkK8BEk_YAC_VOO`VtI+YR9+?@EH9T2laH5AluwpFD`)bl^6B!K@^$jV^0V?= zaWpPH&J&j#*DS6@T&uV?artpw2xN5zkg564f9pB_ImepUR|_(Sm@#$Sp5IUIjI{+IY)<8LRp5`qaW z6Iv(aCA3W_Na&DInDA7>z=S~wLlTB2%u1M(uq0te!k&aP3Ew7sm+(Wv#e^FPHxp4J zPNa#FM0KJjQJbhsY?jzIu}k9E#7T+k5)UQ5k@#)mHHAbWRmc=^iUfs1p;9C%k`*Zm zy~3ynDw-;C72#%z7K&DiHi~>jJ4Jg%M@45v7sVjO7{yY>2E}2;NyP=lZ%Vn+p=_xv zRQ6N$R~9RWD9e?@lvTwIxmLMRxmmeYxl_4YxmUSgc}jVc zCj+7qR8o~p6{pgujH)!1No7`9RavSWRY=u5tZJjmSG7~MR~4yBR28bxsxhi@s>!Nn zRZKNiwMg}XYMpA6YKv-{YL{w{YM<(W>bUBx>TA_`)dkf>)n(Nc)z9iUb*6f#dYpQ$ zdY*cLdXajGdZ~K3dWCwW`bG6N^$zt;^=|cE^?vnh>O<-`)JN2BsXtL)Q~#Bel$4$n zZkkk-G(2fs()6TRNpq6sB`ru=l(aADXwtEy_mhq%olH8F^hwf%q{~THl73FQp7dMN z?@50q{grf2NM*#8#Eg=n>AZC z+cmFhc4>}ij%zMz?k1-s=OnjHE=n#-u1FpgPOeO@N*)K=5GurdopR`xC*R(fMnx?c)>6y|eWn{|ul(KILM{<&-Nrs#EIpI-@R4XVRH(`D&`x~96;x=y-6-7wvFov53po1vSf zo1JZ5~~_<`|+@eAXZ#;=X%jXxRh z82>QdHU6EdP1U6uQd3jYQ!`TCsoqpyYAAI;>fqGHsVh?tryfoHDfLcTOj>N3JS{#g zF-@7KPSd1W)9h&(;WT$zW?EKSc3N&)v$XDMBhn_OElzto?US?{X@953q{pVq)8o?< z(^Jy*>8a_abW6G|y*Pb#`kU!j)Bi}nX95#7#hT(wi6*5f&15o}O;%H>X_TqbRAm}x z+GRRoI$=6x`q=cT>8$BX(>JE8rt7AgrrW09O?OTAnn06qR+D~Bo@=td$wjl$>^6tY zEzGUW`Q`$12XkL@sd*$yNGwuItVLyUSh6imEjgBuCErqD>1gR}>1!Ei8EhG98DSY^*=E^iIcj;|a@_Kv z<&5RCu;r}foaKV$vgMvtYR$0vtdCjCtd-W$)+*~*>on^;>q6@i>oV&KYqhn`y573c zy2ZN9de#`fyTk6Z2kaf~;qLZAdvAM@z1%+BKGI%kA7kHXKWKl?e!_mr z{;~aY`#Jkp_HXRB9N0k|)FE-G9chjx4y(iAa5=n=kfVj8wIknA;OOY+?C9+%a`bid zcdT{1>e%Jjhz z7S|)LA{TSbaV>GJa&2(!aP4&McI|cTcfIL4>N@6n-*wz|()F3^yz8>-H#c$u;vVL%aF242c8_r{a_@B?bzgPg zcHi^Fc@jM;kH(YY(R&;or^oHd^i1~5@htHy^Q`c!@~rl(_iXfR@oe|(^z8PW@_g@= zd#zrt*Y6E_n|kxSeZ7OdL%k!sqr9WNW4w#KE4}N(-tFF<-aX#^-hwG9SzAk=ZM=D6?;7S>~wBNtv@V=VZ>!oR|4R=8KsxXVzq{ z&0L?kD|1igzRcG$@A=|wLR>;g5Y^`o8jgEGku??32&!~dcGwEv9%Q~z22 zm;P`37yRG*fArt*-_6owd9w1edS_K+&Emg(X6?&*BkOS1$*gl(7qWiHx|DS#>t@#N ztlzWlX8j$=3Um#W1u6m)0+R#bz|_Eu!0f=>!1ICCf$BhAV0~a~U`JqAU~gc5;M<@g z*fQ8Y*frQYSQ;D}91$E9937k(oDyWgX~7x61;ItZ<-ywE#^9FV_TbLof#9Lw;ow`r z@X_Fj;Hlsj!HdCb!C!*6f_H-VvT?SMEzOo?E3@_4=A2nMb8{j&)j1n-w&fhmc`xUK zoRc{p<($d+Ea!`yi#b2#T+O+jb2H~w&Tl!t=ceVh%N>#XeD0du4Y@mVcjX?+eLMHP z+;h2K+iG> T|GlgJB{cj9(D1-NLu>vYb)*%3 diff --git a/ch02/chapter02.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter02.xcscheme b/ch02/chapter02.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter02.xcscheme index d27fa5f..9033806 100644 --- a/ch02/chapter02.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter02.xcscheme +++ b/ch02/chapter02.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter02.xcscheme @@ -1,6 +1,6 @@ R5r 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 Hn+yLB&-yC& delta 9096 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 pwIJ(a*1fFzSr4 .size + vertexBuffer = device!.makeBuffer(bytes: vertexData!, length: dataSize, options: []) let library = device!.newDefaultLibrary()! - let vertex_func = library.newFunction(withName: "vertex_func") - let frag_func = library.newFunction(withName: "fragment_func") + let vertex_func = library.makeFunction(name: "vertex_func") + let frag_func = library.makeFunction(name: "fragment_func") let rpld = MTLRenderPipelineDescriptor() rpld.vertexFunction = vertex_func rpld.fragmentFunction = frag_func rpld.colorAttachments[0].pixelFormat = .bgra8Unorm do { - try rps = device!.newRenderPipelineState(with: rpld) + try rps = device!.makeRenderPipelineState(descriptor: rpld) } catch let error { self.print("\(error)") } @@ -45,11 +45,11 @@ class MetalView: MTKView { override func draw(_ dirtyRect: NSRect) { if let drawable = currentDrawable, let rpd = currentRenderPassDescriptor { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0, 0.5, 0.5, 1.0) - let commandBuffer = commandQueue!.commandBuffer() - let commandEncoder = commandBuffer.renderCommandEncoder(with: rpd) + let commandBuffer = commandQueue!.makeCommandBuffer() + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) commandEncoder.setRenderPipelineState(rps!) commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) - commandEncoder.drawPrimitives(.triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) commandEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() diff --git a/ch04/chapter04.xcodeproj/project.pbxproj b/ch04/chapter04.xcodeproj/project.pbxproj index 428e017..758c724 100644 --- a/ch04/chapter04.xcodeproj/project.pbxproj +++ b/ch04/chapter04.xcodeproj/project.pbxproj @@ -96,7 +96,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0810; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29C87D3C1C56E93A005F4615 = { @@ -172,8 +172,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; @@ -216,8 +218,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; diff --git a/ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 43b33571ca043b2c6c693bf99b6f025cc19915c7..591b49723d066956d2534cdf7403cee7276494b1 100644 GIT binary patch delta 10262 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 diff --git a/ch04/chapter04.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter04.xcscheme b/ch04/chapter04.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter04.xcscheme index 56204a9..dbdb0d2 100644 --- a/ch04/chapter04.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter04.xcscheme +++ b/ch04/chapter04.xcodeproj/xcuserdata/marius.xcuserdatad/xcschemes/chapter04.xcscheme @@ -1,6 +1,6 @@ Date: Sat, 26 Nov 2016 12:09:04 +0200 Subject: [PATCH 09/20] updated to Swift 3 --- .../UserInterfaceState.xcuserstate | Bin 19862 -> 20173 bytes ch05/chapter05.xcodeproj/project.pbxproj | 20 ++++++++++++---- .../UserInterfaceState.xcuserstate | Bin 26227 -> 26187 bytes .../xcschemes/chapter05.xcscheme | 2 +- ch05/chapter05/MetalView.swift | 22 +++++++++--------- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 591b49723d066956d2534cdf7403cee7276494b1..004c588f758cd7518904452d6b914d07dfe3fb47 100644 GIT binary patch delta 10131 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 Gi~bMscjy`b delta 10034 zcmbVxcU+U#7x#150|WvIBO!wjqCi4OSP29|2&h>1!o5*ZaaVDV+^g1I*Q0gRS{d$L zXWiRc+q!D2t<~CEYptzy)oRtgH=wnC-rpbZ=j8**^W1yxz2~0u{ho8~CddLVkPQkz9Z(m% z1)6}Spc!Zj+JR1BAb1-L1tY*nFcyph6fp1(m;z>inP3i>3zmToz;f^*SOLmG1*im7 zU<=p^J_6gocCZ8N1iO6TC^!a=gA?E+_yn8+pMtNz*WePk488&1f-B$__yybszk#b`mcc1-Dx3zV!x?ZUoCV*7bKwHG5WWYO!4KeaSOwR> zweVxO2kwRY;C^@j9)ySBQFs!54!?ls;05><{03fyH{eh3CVUG2maI_YlOrVxM_Qyq zdK7~U$c!u~30YAF@}NBAMfs=z)j@SpQ`8JKM=elC)CqM)T~Hs?7Y#r|5Je14M3c~D z^bVSiW}$b{Y&0J&Ma$8Ls1jA7HE1o`i}s=Y=m0v14xz*72s(;RqU-1f^dq|ALqDOL z=x1~b{eo_zU(p@(8~PnRL{Bil5X*2dR^w=_!CI`tR-BA&*p5?hDo(>$*oE`37r%uY z;D)$4F2b#GN8BCv#sly`JRVQLK1?yg6Y(TG56{OEUVsq!%e6{mB3_lnf)| z$pqr_5lSYL_sAl$m@FYn$@^p(`G71Z>&SYtfovq($ab=a93V%?338I0CTGZ5a*kXi zUy&ckkK_jViQFXj$pi9`JR*ORXXH6~A!0E|REptZgs2nsVvHCkCW^_TLv)InVxH&~ z^Th^YE3v)URqP?kdyDAZc4FA%OI! ztLQgUj`#;?v&|YH64Zn?-R1~c2AVz)9@0j%F*UcSl|Sc@;QzTG1PL-BSa>2l70fGE zP}}+H*XKfIx$uHEquE~yD}`0UY9SZ^0EN!NdfI|Er_t0UbqduafgswFwyFTZAcPjt z*3{On#n8e1N_v*HE$mfVHh5@k0v zJ5&J;&;lLM(~h(!?M3@ZUxn@qs|Df(b2+F@JC%b3+F2?O(_52-2^GK!l4%!OOp{+K z4^lw75MBXNK^pB!yH$V;;TG*K-3n`|&H2g{@Z5M>5+$YV1=0XcFgbGwe2TEb)mcd|n^~>OH3NP0yUD8Ep0>)G~y)C7Mw+Zl7 zKM&)wMrlrTl(btJBb!{^HoRs?Om#CK2Bu51A`+w&bCfhBLKiT*T4=O1D5hrMkO-x8 z$V$v$9(d31u=zj&3&27;mX4$2>4Yk<2rLFmz*6d?lrlO|YM~k@u}D+mO0do^zY44d zYrtAMnZ84((5Y2mJ=nnIH_>TyI+veOEnhz>E^#;5@0b4=>;ZehK01rOOJ~zLRp0