From cbf5d69f1f17fa14a781dac9025d269db8059a06 Mon Sep 17 00:00:00 2001 From: CTurt Date: Thu, 23 Oct 2014 19:44:43 +0100 Subject: [PATCH] atan2Lerp --- include/DSGM.h | 1 + include/DSGM_atan2Lerp.h | 44 +++++++++++++++ lib/libdsgm.a | Bin 484322 -> 517586 bytes source/DSGM_MD2.c | 2 +- source/DSGM_atan2Lerp.c | 112 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 include/DSGM_atan2Lerp.h create mode 100644 source/DSGM_atan2Lerp.c diff --git a/include/DSGM.h b/include/DSGM.h index 3c4af6c..9256c38 100644 --- a/include/DSGM.h +++ b/include/DSGM.h @@ -35,6 +35,7 @@ typedef short DSGM_ShortStructLabel[0]; typedef int DSGM_IntStructLabel[0]; #include "DSGM_3D.h" +#include "DSGM_atan2Lerp.h" #include "DSGM_misc.h" #include "DSGM_texture.h" #include "DSGM_quaternion.h" diff --git a/include/DSGM_atan2Lerp.h b/include/DSGM_atan2Lerp.h new file mode 100644 index 0000000..756e5a6 --- /dev/null +++ b/include/DSGM_atan2Lerp.h @@ -0,0 +1,44 @@ +// +// trig.h : Basic trigonometry routines. +// +//! \file trig.h +//! \author J Vijn +//! \date 20080130 - 20080210 +// + +/* + dsgmLib adaptations: + + - Only atan2Lerp was needed, all other trigonometry functions are + already present in libnds and were removed from this library + + - Upgraded the code from C++ to C +*/ + +#pragma once + +// These things may already be present in other headers. +typedef unsigned int uint; + +#ifndef countof +#define countof(array) ( sizeof(array)/sizeof(array[0]) ) +#endif + +#ifndef ALIGN +#define ALIGN(n) __attribute__((aligned(n))) +#endif + +// -------------------------------------------------------------------- +// CONSTANTS +// -------------------------------------------------------------------- + +#define BRAD_PI_SHIFT 14 +#define BRAD_PI (1<%;8)1)ZfguZM*jFK}24xcg5tRvoiaRjs zunD--s&&B?MXOYOt*=@Iw5@fi)TR1XTd7*twtm0gx#uPmq_+R}`~CyxKF@i!^PKgb zd+s?m@BXseu@}2&c z39%nAzj|4?{x5=iTDADM;qf7(CygCHciNIw@z5y$gBKe?NBX?g^OjeSTeNDWAU1Bw z)kWB%O@ zo#=o0*&(XkdFUaVJ|Gdf!wkuq_+Nk4%Mn_a*#B!+*1;!C`LruGH##*sI(p)v%MS$i zUJ*Tbc2;}D|~w;{KF*_BbzQyyt9`grET(hKW;8`{?-3UXWa)n5^%olVg_ z^@Mv8|M1D~1z)#5oj1SkXwDUBSA?zz4q7rJ)Mp7PM{?TI+Cpu?^@-C`Wp3=UrrefL zi?JiGMf5B@^4YR&=Ug3~u=MKD^P z8=~_@Z;s9%eI$+7hTz0t!>Ea)Mnpp`xh;7ueOd>%u4{cEDftIm#H)Gt)hMD!V&hWKPPrRKfbGl7wn$nQpG6m+QGKt`h5EK4Dn*m zqt^zfjutmY*R_H3M0CZvdo=G*EIL;7%{u^E!(z~wLc>ZM*75uVLt`o6Eu=3=0*@*IA&L}Z5|qZu39?2+pVqbqDn_$o4Xk~}WD;l8 z%1|B)aY-kgS`qa~@;8DnuS)Eym0@{P;$W>@y67mR8_srOvP5LPjcm4&Yi(qQMnpq~ zO^Vn^iH!`fkq2z#FpW4si=XQ;j7_rbdDI6^JNZWm||z&vg}I56B)` zzEWNT@!AhT+Xf@GZv#0%j9Ip=M=FfnZK~f2Cm+n%qGno;}r2v^ph~|9Q7zPCw6|R?4DBlOPL*z~>=^?~Ka3jq54*3GP{XlyI+)*SB8;+Ra zM}8MVEVT~`3NmP3<{D95JXWTvZd!jwiV%f;66cJRWwAXF97KC}%Sj`V(k+NLGk%Z! zn)XiztpFCqs8&!<`~Z-l3EuZlm9`1rL#-YS=62ysRLI$}mQ4j~6* z7D@ny&=ThM6k^)4B_tA!$>wRx7A|E}q7>u=;WphsW*kpL?2xR4VvSP#sjYZODaz)V z$H0RK2b~G&Ld<&IQh9>piDJfipvmXtLPV!43-8+&p3@di+vUYj7zA_tig`l5EX!f) zVyGegyFJkUwWKjL6*!*PONeoF{MSl*55(%}!88=PJrwm%g_gNWmO$2RHlRRezl6H! zGLJsaegG<6<`eZ#gaAVzmO#`E;pvDuXCb9C6HW*`B1eJXzW^78fGt*l6wfS$%l=2@ z5=uM+!tM@S81Af4F&p1DHOk2Bj~I#4DnP&H@%9BBs16&{Z zcPP9_dzSb#63GPz<*)eJ2QadUxoI$+6TTiO$Mfu;p>?T?n0q-oYuf9S;vk;HX~~CB z#z>Cg**}5Nd1CI*nbd8x!U0&Dp6vzkMG`q8Dq{9BF%u|hqUABB)t3X1@=eUW5`@sQ z(_xYWP&N@U_br$XokyI#%ObYCjA(9MAqm@1n%OKtF+cI~XqhMHC5}#WPCYn#j0~DS zpG=n-E{Ou2k@)_%GWU#`PGJOw_=Y+gG99RaSxHgc)MnRMTwg=x@Z4H-xid8Z;uc{} zvVy)68utm&0?FZC@#LndUs+C+8=Q^fS90%x#pzz4H9TjLEW>e=*y- znEVJpmN#+TWEqaJ!pw+y50NUxERv2}sHLA+Iz{%2-3>h{ zCK7yt;1K88X{)=&ZHnDYaQi9P_bT=TTZLARDAGiN69|S_`qhdEFYs^-p3C#MF7Rs#eN07ow4IN7GmSYv&h+)OL z=va`9+17ZMp$w~&=2-m6Rm=O#R0Js|5%4x4#ng_9nra&&_j<*hLau5#sC%2u`-zoK z)xI|Hw;(t~Rl6UbfM25gZzfodkReuyb4B6x4)6Dz@olSj749Q_EkYJJt3+XSxD%J0 z4Hh>>_OQ-urb*vUW!U!f3;0nE8MsbxDnFWk)DLpuN6dEQBtOXhSALLZ`%#F*ixHe+ zYTS%_h@Ot%5*G``iBCoFsyIZN<0j*?5&Wd(n;@=ill$T(X&l|x+p;LuMEMLnIGt3w zMULwwCfDKBBHtD{^Iwac(W9`cw3vb#u?9i;#7os6B@ z25VAP6P=`kZ2fj6*)5GztLbXcoj|~qRgU-*_7UT($sSUmunW=s2oAB*MR=EDPZ7MM z@W*M=^NQ9?@EdPp`QMzy@;3+P&XSo%jMMd75bROcQnDtq99ifd2O#@L8V8Q`pmWf$ zfA(Nv4qUDgcJDTP@#H$D2oFo6>44KmS+r<&nG_H0;fPZmuq@n<^Er~}L z%KDt!rWN!s);AjSB1SmURGD8mqt)|zeq|zOk?bvN4~|+SGqd8)4GAWOZ8cL9t1gf$ z9g~gt)=$GXu9x2a%mC-OBLn8OoB-HmV^3j622wX0mpVG}7AA(TmtEx(2WPF9-KFDo zZ#+_4=s4V#*ngocaisbZ&l8q)Nt^(5mUY3yP5i0aBG+5MM)XMpTU>>%$R^C-v*W?j z3SHrmNYu})kPOr z23lGgN~{X;8pttTj`$+PdB0?ws|Y_o=(|K3W>pJn+gpy-1pD3!A-)E5V9IGi-hpR; zR1Jd~zI<@_W%8$)vBf3equ|yOVm=hpaEpf565`qPb{)S@$Dh*i=QTX4;ai%2LdU<+ z&{1mHPbGxCh!u~CUYb#@VXYQu*72D-K8FyFF4y$)bo?S6-$)3D0g!r?Le?!-_+D?3 zqdfmw6a08uphHD{5+nA=`}Okk04z)AnEm?qtByZ4zSMDbiCSnz%W)h%oYrQX__-(& zy#~K2dRD%@WmK=X^BcPvnOnl+x|&_HzI{y=y^>SZ7VvwGp+=~oU!Aw5sU@c=)KavC z{O?}t(v;oMwRL*RC?P9Hh>0^t&g>q!BF`8R3fI?-NN)=r4vxtE)ra0Z*>6NBJ$&TD zQKKCFJmK{4me{Bl-unE*5u+MLnMI=K({Fu-6~;CPmJJbhAnZp#KgBO9uXY?Wa-3(n zZgGF;Df6D|dpPwQe{EVU_=|KSb9C0FUH&WE4Atef<^8LOuS^$y2;C@%$quC zTHW;O8Tm84vp%2o=ImdbdHb9z=APZsIIrh?=Yr!49$UC=(OHX!o)u_4-g;okhO?W_ z$zJ--(mR$dU*2!US1TS{xjuI8;8kC)dhonut4r6sv*w1ijpzUK`~&OeT@YOV)cSKS z%(>_n7oB}^`i6rWX2(R^Ep4TE%(sfelv~hd<;y8T%)vuFe|K0wIHc=VFCHeY^`IGq z2ZHL5p2H9{N?gEuG?3zO{?ZM~g)x|OlyGst;c(wawReaQT*j;Ee49ewLDw+|eH;{b z6%F+T*)e__DIVv0NZ;XcyEsgm&LzuNQ|!ONGhT*qqjwq6v*E4Le;CozXmbFcJ&YwO zuxgB)PrMr?My)3L5=!Fl0c z^HSO~#=@F;WgG4ku3@+sT$?g)*vj}^#;-tGn~D95pN)&#tWj6WqA;>qfYS3Yio{tJ0@zIHoHHDv&t^tgI`1&+4}xpeg*D!hEibd}u>)P&-Hfo4$D)%O_C6s%{6 zp!=LzaLw1caGh{3olGs?TH?!yJ3zlcxR(<*K?lBqxXVY8mGnI3@sWHk@l;{ZrhAnK zCR1;LgFW51%P$e}{}i6M?~wbzR_imueW#>~>93~7T`J=74+qKpGZjhoM;WzNW$C_8*$(?3M^U*Cs7S;=kg49UJSav1s-Yl2zuXVV#c(T4 zdiL~2GJ4Ir8*Xk)Zz*DpjaRmfxhemC9VmKZ9ab z%B8UXZ{+lo|9~eEe?5)Xs7O!$uR!t)P-2z-yT}=+A~hmFS3QGd9K_UEcNF+!&t#d0 z!t;N_RHsOmsqlYK+fx<8^#2AF&oo&HsZ{^Z8JVdP%JLs$UT3LD*uRR-ov9+l{xfK8 zj*67|)6q{ob1fJAS5v2jk(e0dzW_!(^HrVK`gbzb1u8PaUqhvZDl!_YV~8wLk$V4a z)M=Fs$mKZy)2zRp#APy@`j=NuVp02Aw}u#-uVG?_AO z9mIma0bK;^ASHu;g1e5O2{M}0WniS7ISmoWw$P8@5QvK4SQM)a`oVStKLrk1Xp59Z zn=IMZBa|%yM+B!R**;$6-x0hN6bN&%F=g3(mhj3G6#g^Z62U9!gfK2b$)ue3ro~?y zhIH^Ei;t@e?!eU%yd78A+D%&*eh1ksnR5AX#JaqNBvYm%ylAVw;DTBU=W_(902U{A|1W8 zJ?%xTh}*0vQiIq}`%~-&irrbmLUF<;4lgNpvFvT1_SZu!hY95bVnCVh-f2K`sV}hs zC}ro_6rrOz6sE+1{Xn|3pe|A#P`-IxC@dE0gRBdbj_k4mqA3rlq)q0>lhVf9Y%U8y z@t~pabQf^50~5)NLc> z1u_EO;Z%5u^q{(hr2LBXZ0|piNXjduht%yP@`;8#q8*M%;g6E)| zwj7qhb&%hB*by8`{$aH6R%Y_^?I5R_Dc{aVwFDi!1S1$TwzVBbnrqPzwzsuybOiqj zt$5pEqyiZ*m3Cg^5eRb_e4~_*P)+MBsep8jtkg zrS^m+GbJEzM8y9ca~+gy4MN?^qFB`2lgYP$lH;5d0GsiKL-kI>woAngv z9`6RyvnxTzBw-TNy*UHnOjg(zcpuPvFZjMR%f?hxoiEs7!1Gil=(nDSeq} zCovK9*1)VUi@hepn}wF=%jT>v%ljG)hPD`7PX`pWFlO=QKSuVOD590h%q7DJDMzA9Tzje@@F zPNSf&pT*Uqps%LWDCp~-Gz$89-H#-4ig=+H7*2epe1qJj8{5CHry5T<4$>8lgTA33 zl0AkQs7)FPeWL<1!vOWg6 z9Hx~+!%TVjG$6Uu=Sb)qayBLCY)-wFn6Mv+8VP+9JB@_CNu5SQ-(;1vH4^$tehIBy z76e8@pcn~pjafsXZyF78B=pVv2xK)9`et#Yu|`7QY-=RU_V{{y2Z0>=kVBJra)7FD z4%LkRK|Hl49dm_rN=1Nl<1`JAHK<>IpbrRcvkKSzT3ou<#&88?6hKN8snz-i&I6wN z9p5o~pF}hD5B8>EYA1}Xp!n04g6lR{;hKL5F5N9Nz~H+-{Z=5}Mha#Gl?4}*&7?_F zq*GC{!H&7l#9QVeaeG==I==?75&WLi&)S%AH?27vwZVG?L#!=Enx=B zXd&!n-}Uz;-pxCnmdhy<@&42uL!{zUBw6eoO_wVF2E3=YjtZ*#mHAf8TPFPdT*yIr zE-SShIq3^2w@D*zll|ZLh^5wl5XceKnA>!r&I~~phOlnkW)Oq|ZV!@usb)+{AFiasBpHa)9k4t#Z+ocWgB4T?OiHwYq_$+Y?& zH;}$XN-ax4IcoNZzOTcG98Oth`8_C(z&v))a<1P8<`Yd{4<3V>l5m?r8zL^Yz=~C< z4EH1QY!K3K#)Y9>jL)kTKfx`;{ixg)MEdFf0Ogquk&3=3a`$8ML69m2qEUEONcvwf z3AR(pBxcQ`0*?+NrCi~a&$Bl)bw$>#T?FZLA`43;D$R|e@;dk<8+w3Z31pf;1zwo< z2qb2F=Ng`PVuhI#|IN;R@H!nY%(1ejU#6=_ zapLH2WY<`a4goH{mEiTcmS?oIBZ~U<$tgKB+N+za%AAPEbl(h=KAu{t)XVxl`rSKT z#-rYJ1c`A8q;FCbI^{YVYk!kp(V=X;$*=6t7@q53+u;v|EU@@ZfC9zv^to)_$MLk; zVh}7xaN^k(Pu@h=Ssa2kg-#&2L!mLsxBqAn?|5hqE1*QF&&3^}1eU3Z1nVs-!DR}a zNMKo=08IU8iHj3_k4%`4fcM7)w2TLdDTJ#mGJ#r266eMC5wQ$UBDfNPRtT?Fc+EaS zE5S*?)NeYjmgR|>B2EX=g5bn^|1g9bEnF>^MYiC)%m2Bw1^K3o(>!{N_I4CT7L{vEVpl(9>i(X?&%`BpVUNA<%pK zHxZo@{}X?hBdZT~KV%p(rF|=O;=p9buSUKrWC2#Uq^sOz1j>!`BZxR$wJu{!qfr|% zMn`58<`=H19A^xQ81)fcEBY4X7l*NugSqs&)sAk7`@fN05}$nQ^e5igWcuQB%Y%un zXSj0XH)f3=w;?#<6Emn$9sO5>DGJB6KAwKD-!p8 zZ@9Z+t#UvOhS>QlR#IUDaLFdI7Q3oY{ambmOSd6&qVZ^685*IxM`Dbeq`=Q|Sp@pC3 zOT0u{eUHQm8ab!O_Rq5u<%eP7`W`}5s%#{tGX7Ex?uzQIyTMxTR{KdWT))CHT z!}+YlzP?6R=k@S+4Aaexw+(OX!hxvcCk4C~*C&3_7jG#Hj1pZE!@D?QXyQ+GaSSgA zfeCA>6Y{lVq1H4(Oow#u`0&4VDN3qQQM_6dFH}b*Ivtuw{9?P&4a3cCFyO$gnLXd( z#gvQ?H$mRp2_=bibXm~=y?=*Cwr07sOV2nsu6MAV_so`1;FVpZw z4Ik3*aSfl>@Kp`p(ePsp|EXaL$3mnxTf?)sZbHIpP1va6wHof$@D2?h*6?W!U(xU_ z4gW{OZ#4X;h8dW+FrAQw`5G2;-bO|rO&FkIorc_IOa7S}o~_~a8s4noy&68Q;qw~) zTEllW{8YogYnY_h( zX&C#RM*gVb=Nh6XDTn+Tj?}P4!^Ijd)o_)DT!dyuuGVn7hC4LetKm;97!!O3qr#IK zKC9si8Xnc~eGUJlA=jd)XQJN{Vi{3EF1;|GtzkC}xeiEry@t~iMEx(;gf$v&)-bN& z2@Sv3Fb87=4V7rfcOZ;kqTx0TAJ>q(63Kr{!*4VUdO&CY?@9!)RKwvKPSbFOhFdh; zt>MiY-l^gJ8a}4sVGW|YXqbwp3p$peVOT@%0wlds!yy`u z*6?%o#O~c1EJfh)S8vb2FHy+|?r$ED4okpf; zIA23r*+t?d)SaX&&|B3UFrh*K-ZE2;)rN4fR2s;0_1t(oY4 zhnagYc$559J`R}u{&9IQM~*yrzFMhsOn-o5nk8 z%k_?$K?jdt=yRxu9@nGL}?ueU> z_tU}c@t|>gNpAmt;l*IJYiHnq${Mw6=eFuZ&o_+OF&+z@8y%0Mp}tn{g>%mSz9@f$ z9I)v?YIv>mEfKxN(F>0|TJMh@&1p!xGIT7sJ9K9LpX!d~MEZ3Zv3Hbs`-0rh2LE=Y4j|yduAj&B-~30)<-RccbDJ^O*1V_M&XQ+w$nS^%u%x0qeXR8DNiBb2VgsiFX5D;T@Lj$Mmb z&ri@Gsg3psmBjeJ7&(D-%6^DYiiN_A#Hzm-WwEky+)rg;J*c&qXUaVeH0K__MqiMH zM5{rx+$f|Qa}c%MD5A0bjFzC2$R3P7$!Gy}OBsC&(Z1tpzc-^LCFGP5t%6&0q9VrF zXvVOR*`EX zxm4wN+#=HF@g+cI;>4#$#8t)hzv@Kx38P?6^4KK*9o;tC)cQy}aX)$c$P z3yl|mRLz~8SZJih>RX|Yg+^{St{#Ko84HcX`;EYDJlOO{l!vvBSaa}(6UG^i%H;Df zJcTnNbmJ&>EGB8K4#juHB@%0nRhcp|darX@;;nvW%E6hR8`U!QC=$e?5W!-&X062$ z+l&AP=<3JDvKm1zqRmv?$pp6Agnh)?6k`H`Wnr?V4>=%~+SCsFv8guuG9V$PJcW&XtN?sA(*7l2?T6yhFBBZ=Oi{WvEfUj zpgZ@rI8n&1qGG!wo!Cx~sPaAWx{a3)czKi;i&Jf!vwGMphnwqZH3y5oH6BV=TgmTz*qNI6(ucihwejmd?P`n- zR3^@S#JN1N?>y&qj?I!A!kwcBVJCEAh2Jc4JSr0_(;Ox8(Rla2mb$o4?Zd3Zi5HAQ zxhLTZn5E8rxH&(S82+MBGYVgK(~B=a9L(-(mg3712ZvRe z?-eFVWFH(h**w8HN5vxZPop%a>L5N6acumRDX&!)T^}9Y*rC!K9qh;E(7F)~Lkvm} zZ<-&iZOCi!Z5h&N?P(s`)E!zK8kn{yjeZT)N~0PY6-uLAX~e#Lt)eNvlgg-QAAh=$ zTUXlD(+IW9XenuGi54}6T5QL}jzYL*V2gApye+y*<^I;T0hRpGr+W_8hTat5h+ zj#WmHmd|sl!*+RCw3e3o=rggL#`a=LaT-2f-9$`~Zf$wD#o1~0b2xec?`s}KcnF~l zA$c?PiHG@75vv-zhhI(G6*^{QWL<>{4Tb|@%dPLy-pT#m7@p+}TaG;z{VMIL+!#rl zq87;&9-(s37Ohusqo#kBQx|oIo!j5csl@i~QBjxrT8Z%aoQ`l_T~pN9o|5@(&YL-& zZ8E++`Z02z9_}4>caoYFP04&S2PdGmIpS4c!vBRUNDNdJfX4J7eP-pH)(G)hp0eK}YIJdOBJ}OU=>(Eqkp~Wps ze0tQO~r1J zAPVMPkUJr-K{)r#n^zTT5I4^o9G)?{GVj(FjN(Njip6^^@69Wi--4~8@6Ep;cVb@A zf&~k1UC>rEQOuH&@GbM-Tac1C_X=lb?Br6t=0LY_Zv4I0($*bOw5)jE?(DFPznSBV zf0yHmznJ5WFKEr#W`N>}znYU0zqK{AeJ3Qn@sD#H+kA1k!?oMFbBOAt!iUZm_SHFd z?TVT^-Mg)RU=@^aw+FSp2_w}G7L+ae>gbf6yU;qlXtQiT*C!S7i{+q`%q`L?U-%6rG<&g9acxN-Lb?+APHN+ zQ&$~M*}Vz<%rat2z6$qtAwdt4wqp+O{dj$ z?p?z}KJ-8@3d=U@sT&lki-z)!xA<9yT~LRW4{ti)#C^tnw|kpsdrDkv_3cdE<=<^R z74`|cUvfWF+}bl7ZZQs2KH+)7JP;atIGWs_UP+6EIBM;Kok8JjmDuNLdvm`u24tD& z4ov(&^e<^^6=fstOr)q`F9yWjKFC>&KjpZ>-{m;B_r#zzB;0vut5ZYUXKHA3U}$?! z4S|j2U^xB-TRzA zzZ%pUqqCCwW6wMeYtF5Xopy_)9E<%VxsZXLI|<|VjCOm4;h|xF-H7&~4&z#^u5X@W zCk1VDE+54>{Mm}uIBD#{XGCsv?hM>Pmjk;poAO%HcICAM5z-Md5Hb<65V{~_Bjg~2 z5ONXn5V|6S5xOCCS3_jXewc5;2ZWOA)Y*D@Yqa&_oJ|LIMemP(p7YNfapQBXyMf6# zhd&deR8Li?9c_{&(AjN)-rP3Yr*Cjp2a`MNqTNH)7+6u=tpCxCno%?;)G<$ZE=T(N zVP|hP2N^hBOUn%TT~S);CheQ(3jQrA+`R9&CjVr;3@bC9a0me#JV zMJ>tmkmquoeuok3XY{P^Q%9xJrXEVENGlaL?T6BWQz-Q_x@w)grjXLf);c*&$DwoU zNjeV03HJh8$KT{@%(dq(vDbV}U0dHn*GgVl`SH2M<^zKscHZp_N5al+uI<)MJ-M3> z(w(%Z2cL2IGi6u2QIeX`f>n zkOImIJhnUSV@wxQi(fBt+Q*p2QHHM#oc1v$Zud0ikYXQWQm;om?%%)_9%G7G=a}Aw zE5;vT-DRC);wDR%b&hE{v|ZLYre5&MHF7>>$56mJ# zjxoK7e7LP+OkC%7TgRA=z=C^X>}3j1M;dPXNYi6r;7Ai!EqJ8K-EpMJ-EpMJz5aJl zR41C;9VeRH9VeRH)`_Njn97w`p_E(=xEQ~Jv+k>RGp?SCV;kt)4cu?5jx-tE$>>h- z)v1fy72W1=b)_C#6>g67>#60i^UH zD!j8$F)8gQoQ^}!plC|pKgWQl>_p=Tde2!4S+#N9yL2wd))6P~GUC<|C+~9N))6P~ z3gYUBlXoQ#W2qBP-gAj!^D<3(R~5lxDn4L_t%kSDbddZ!qvf?vIN^~M8>8=()G__V z^z<$j@%YaJ$@?=EN%eD)!+W=i1pQvri}xNC$?|6~a<7Vn{5+%XwNE%*i2Ql&6HcwD zU+?|O19igbmvAXSzr3*rB;P7y54jK{%=JUzqi>loFC>CJ@B46R0vdb?{4^Zg0x&Ns z1|?mZdw9kv<6@W*8IPm1WybBuog)JaS6J{co`eVH&D^G)IuKcImc73t~sQp`RSg>Tmhv;9yMT{Q>E<4pA_;IYZ(WO){R@uxG@ zDf%!MH}soR6~pv@ih?qy$%`SCs!m9mGgU%aeixmar6OTJ7YofZRixO@0}SRI6)E%c zwTx*WiaN~lX;H;L$bV0asoIC4JWSO-6xD-D_Mxa;nzIi@y-uB0bqZjde=FAOS*5-ioCgAcU?L+=1b`oSxro4t1Xwc zotCz-NO&G9>piIWwp(07WO2i~FHT>19x7`JvgNy;Wr7%9Y)Rjx{{Sz01uyhMWIBA8 z{d*khk~a!PX)~4m)m@|wx>M<$@p%wqDT#5 zKfRb@3n+Hya25(q0c3G7^4-O2b6Ev$dH9Mw@Q@vgSe5_mE1OrvNfNzBV3o39%4FXdetXLbPmp zPp9(-X~#veLzOYedFRvm#cOm3_`aD$Hx1fvwSv6;e$mPns$G3qy53=c3Hj@zs z$-bv3n6e4fi0|1~fO~I1@%WxoX4P%Qr_V#(MEZY|?(xNVjMk^mL;Zw|m&mZrL;3W1 zs4DpDdxdoCJe1Eq55?4cN9Ti)?(n@wH!}EnHAlvLXy80l#sM@hoQKM|8G>yajf@K* zvN@9RJ;*o?l`(<`!*CudxL#Xpm89cwC&O>GNK&o+`hswAg#e`E%ZDz(_;n}e^9EZxN zgx;$$o`=e)LRVAgp)z>5R-cF3%3PbW32CG@A$`*qklg9ue-eG&7gUEbg}Uka(p3cK zp(y9ekdHtt&-8VdeBIKOy9#^-7XBsuFO(UeV|1G4LH^w)Yb&)6R71X8xeP4-G^*I= zp}6_T7gpzpF&Hz_O-XtD{5+j6UvW}He?p=`|A)BxiX}^i=b`9ufTn#tB)4H?rW(Q9 zskKfR>0Nm+kw=LXiVUvTm`50CNXN*CLDaYf&ZHLe12ri`gQ+EaMFk6~rLdq3r1m66 z1F5};d3@)K)ZWBWMP`;iy*Ko{^C0WbI1Hljjz-n^Gj}?XzUjRk`S)kNK|L?~i9cK2 zYlOjlTK*iSmKhENcxuS|F8F~o%gEg6~P$W*Viyxdb1 z$YMXu@YbTO2eNPD29GT7E@U>4a~p6T!J@Nn^ErqatEmy{4??CV(ES)7vK?qYf)%ij zUP`c1pr6In z18<5y$vHqalgg%D`Zb(g zHWs2j2j9SuVv5k&Yzk9k!b~7)@C{5U5u#;l z@C{6(9S**MnYVx%Q-g0{mKr71;2Y3Ku)25xJsyTcHhsvZNnuQYZeR}ej2xh8H7^29 zqtqJ+VNO!i4155B+x!^UZeQY(&kG2D2S_;|RbCq$*cILXa=nR3CqFvlZUbjH|A+gWtgZQccQZu1Dq8OUs~kP?}Lg2lHYhu$}sau1>?{{p&K z!um74y*PxG?gO1iu!8MJu!0>&u!0>&u!8ys*44C7Mhju@C>DNS;@!L(>5x8x#pj-2 z#hpm9*t?EpU3nkyp5B;~3aa~AN3eqZ4kP2`Ayz7nV120aLzmnp`@eBJo$vn{$lXz6 zZu2ng7(MC25LT|+d;x^Wb0{mv6b^uf1G^Fmmakc+;{`l{WwAsgj|USSXDc~wJSv!{ zV+HdyQm8h`F5LzPaL^eS$66)bsHIg*6!nHz631XcEgpe7lf^{g4WC$hJPlMvIqu8r z+9jf7#R`9cfkBQXPedwESH?7D{~_96TZJfD1#7D{CL))?yfKSZ<9D`@iYg(6i4wZU zAA#J%txu&>agoiUCpXv0K1>{hOf6A{hqhkI@v{39XY6$5#Cjh<5z1=HMPLNw1Vfu4 z)(1N|s_CPg&<9&QEOcTS{-T6JAt(BruOoPq+*eucM?2lg>wOh6DQg)oL)3Ecao809i!%9X4Z_ks2~> z1@?m{ng1P1gCEcBHv+Wn5EKJgs$T**teE{W;Q*(t{k%Ya2c-HzxYd?8(JnCn5;3(ENkGhKRt9p>Px{foC?NQ$vfB@S1VK*!+Rhlu zT$RKW$kmXkGd75YeHd|6sE{-I0;rN`rD2x!Mj(T2ftXz!)OrnC^$2q2oF8a$uX_!d zT44ysVbMc~RS+F&eNw&lF3`GwrsJZApPg_On~c#7dk>5G{R_E@ZKk*nE^<|jc))-a)llux<#QlU?}7j3N0gg zr9w-IUPV+4V}lPnQ2$pVD)+1kp?Kn;{gmaj7s#tb?ga7$kp2$=sdx&P2!_Cl=Yepw zr{X9OE)7+@0pvj<9{_oq$O#~BBv|ns5Keq5TquHBMACs=3Z&W*L$R+%i)f(}*Bk>~ zRTe)CqAH80F>A<7t|y!z6kC*nk*yW}0J&1uuCeWjSPhxU3VWfz9Vqge8e8F8D+S~~ z6LnHUZnDOc&^WF%7TFqQkW)U5p#qs&LAAISpa4mX{JU%g&YhIP#Xttz0?A6pS^k#R zE4J2+w$^>rIh)e+e1%O{*K-LWv-~+fuP#)6~lLM=>5QhLFHwR z8hh~9b3~P7Gx%UW>~x1h`A*I|K49g$;;GwO;%49dd@z@PMOugb$t_%8ZvFOES@1yV0$&DZ?qMjuoaF_fz0IctcSvJrJ$_; zBMtdi=EJa7Lyldd${~KG!hupdFWK&dSdGG@=WO$IPGQcm{;QbVR~mSw^t zUUw*k>!8rlxn@$BjAY@rVvv4bNk8#JX)=G1E;XrCA zX3gkgoYI{GnwrvWC&DS+^F%nM`;-W$bh(&#t0`R_5l-or5#f|BL4;GfUjR{^hF>LP z$C1};>#pnjWAIdMm{6@DQ`H3OUuj$hjXRXa)3!!82r7*M)F4yWol>}(rKuD?w-uUf zg@sfgGg*OuA>nJKP#n=dU7Usahf3l`YLKfnRI7ay8rI}&hOP04oy03Z2HOJ3N-skR zJj|S~wUs`yl_bh&uq|LI#jNaOtx%|SylbDbwemO@=KW9kMrLv{VJM(#Fs1v#RzPkn zg?>!N7SKwn%&MVO2}AO_9tFAxV)b@1^MKTlo2mR3I}+AtqX(u}*0`YHK{$DG4&Q#*j*sE~j%ZLDZhPjnK5?nzk1ArHPvM zMG}qsJUC19pmW%|^Z82I|S6az>0P=UqEO-g@W?klZ39NP!rSYi2<{c)s`-G zGRn$56cFQZ{tK)uHLUUlS5HRw3`1p&SCwUPa2u%Q1drpkJ@7aF1EU50f>I-7-6mgq zpU#89>GQboefmWXp!12Qt%U%Cdb!9i8(oBm`m)g(n2}&($RlzwC}}t0!q6_qeJW=x z!W7c`sJw;}Ap-{&Iwa1BB2n*S@;;ExI0xl`zo0}v&KQGC_{!vY@c4|uaKTru@aDgx zT7yl$Mxj^-jwT#4@xhi1weyATJ%28Q#l$HlhL-b)=g&=?@tv!|{-DwHG$|W0B?j_f z0lsWh;Y*x#y5ms&$=^0A==gLI=CB=K3&O73(o=iI`xD#3w*{1y{l)3c0*^8ULA>0u($ezQlw9ZAEaU#B>59ceQV;EE${BOzK~Rz zxOuGX>ck?2fp0j?bcQi4vp6;UxDwiS4dR$2bpFE9KuTc}Nh*Ejcb8Z^gRMWGgmI|- zkQS&zue?MGM`+t9I8$pgu(|{1+dl<0OlN;a$EmO39oa6;?Q|Y&L~^>Aij+%Ll+Myz zt87Q<9INj>)$wCg7?~0`y=Uge#xSQHf6fUlN%^4vy3<(g5~FaoJ}K8u=C2_sVMS=v z6`)dTO6H=Ewfhgpbj5WE>B=3SRp4Y1jbDrzy|KZrvOQrZx_ z7BvQP+$7;j1Q>;A+_M9{@g{^6F%5r4M|sZZXGx?Pag$L752fN}62&Rv9zSHF8fdkDcN;;Adeh~g0?C?OIkOyYW*NWv+J zG)c)-wxn%)KQwT!j0v~Urg`V24L80GqtdcP>3SQ2Pn8Y}a!N;$r6{5zu>@(BxrYQ| z>PL05kh5_X#rk>{MX^(2icPx+NE-s=nr+$(K;A{bnMs@UEs(z}(nJDua&Tu8T&>V% z0@fC&$vRB#B+sy19{bM>@Br_BloAD*Qqo_#VwC0D{zuI4mqauPZ^}<9Ynvmj*E7sO z2Wf_#AJ!^A^NV63Sg6pc1biWG{k5KC*>WW?k-!$1xK9c2hD>W^N@5ZL&lSU00$aG_ zuf0*0W}Nu+S#{TawnY~{KsOO_JJH?{p)G!G4P@J_Q=HGJZ5moJIVnkP2vnFM9@+%i z&YKgx22neIOl(4uRwFdVA+)z-Mz~J)gO)rS#5u{5b7F|?LYcY6g`FEc6I+}t%7{xz zuI((j6pZD`l8kVxu^XR`>(r6>#UV~J+8tfX1!*h!3p$IoLF}?*QAXZSg!6wWdCJsi z;*<{G28NwztdoPcgLBG)Bjc2*bNTX=1(l1Z+v@*dy!)!sU5-jR%603W=Ok zCUqQ)Q#wb+DKkn_c1AnplMKtb*uV7dl(}M3Kgvkz7Y%si^wMZ zplLpVvV7J^1aEO>#klwPIfMXif7_-b%tpXkCuv6zQZ?P8lH$Rf)rC6(rP`AMonME_ zz-`g9QiQi%9dm`NigCAz*OG3nA%nMVD;P=KSS?v)2ob8D#NKv&%(W7K*-RN4L@6#4 z7yb)LJj%IjS;|dD81`>uV{!9B+`lYeIe%c1G^D*RqYZAWS*w)LYUfNKGxn)S7QeDf13b}KY%d4 zBY{r#k%yC7MhyA>VWFSwIBh4A!sL8<0JV0-Wn}E zhfw?Do}Jnl{Eb-^PZLKFPW#`OSsk*9H6EdfFA+}F>zTFH`XQmiowDS%-eHJFIL>u8 zlvsMZGcVS;f2?dz+#U-#x^kSv-HP*e_4_^It6&qeG6I?gyM223CD@lJ_7nomo@{HU zg4V8$8~(}aCCU6#vwy@ohsqye&p*jH-+(0h&R1?fqE26DBH(d_;90C`;4cCb{071L z)`^|ZJP7a=QY!i_{?;fej1OPO70m>b6*`50tJ$497-f0V1CM+hzYn$`tsIvVr;+cFOuO&(6!q&vhMQ>RHpyk$xJqb9M5gC$(67PAp^K zA(1FEPqAjinZEk*L|ZLF`@a>e8!ean#JR^5{SmD{3#mSP4SjnIC=(HS+)ya~KJg*3AZJRoMik>nx zGCF&#%WFFrr%aU$zUsoL^2r7*EUpLfl!X~1=OmvjCBEJ}WvP;J2mz0h1guS@b)r2j z@=uu;GEPp)%KyvYoYFlqPMQ4 zB>hYElUgGSieFL1&_XcNOEfl_a5F;ZvBehVeTLFq5OCA5(-kJ-Jc*rj@4;UH692Ta zLSWf%AK0kC1D8n|<)1TJ$i2ky$Ts{0qQ9|71n(m7US+dSAnsL;HxpzdfQ{6wUoqmt zEH*)-#ZKji^ke!gx)S6XB$r#)BV2^ghOh4*9hMx?unT>89($dac|7b zj$!q({l{g;AIi0})so~bkl`9H*AwqTxEp~h%!d)|AGhRwgzyOhxBS|_^;pZ;fY64p z17R1pQtt(F3j)`Z?4M?;9db60i$`3{;2Mn=Ar-;?(Z+rR$~=j17~yGzXA!uBWdDB1 zLr3N^PO{OwB*Wab$&HxR2sKIcWSZXdtkQ@=hPx_fBFs*bPp0uh-1hHLo-sXyz~_Z0 z5xC;QzkSMQhc^)3Lf~_Q{Y$2COW-F6ClEeE-~)vHI~C7?{$L{TNy7fcl8JnTuz&14 zZ3x#R+=#%ha`PzI9t181*uQ+ty&?$QyNo|x!Z&t;v(2TL!f;+~|7;oZY7sa?ZRA9r z^G;50DE!2~P#6OKWQ3_&j?-6ex!sW@PZ`@Vr<=(#w|ZjiEs0M2GK4J%HzMpn;5m)A5Z*=LSHM3*_yQpn=?p@s4%@W(z!xGcPU1g+1Rg#{_)n$Z8uSb`XqWXZE6yoJ8pObUdl7h{ECSEQ$$TmE)i}r;kJ>_5WYa* zSy|pW`B?yd>pXyO!Z;|^zbqPa!RNyNW$_6wZ5X5Q*WtClZWvAn!h z7zx)rIU=@p$-+e|5XEg^^{ORj&0V@?wH3qcU)?*5BAHoHP;gpd_L{=n8HJ@YD$D1d zHg5Ilro#v|n$lPp0Tzz5W97se7458svrNM{tCpe>BXzN{CSv$%L7GjS;z;4R{jr(G zv~r_Y#F!ST9Ji@5zi_5;e)-85EUu$PFH>1tPOO#~tz^@O6~xlXwJ`diX)_wmYFLBl z^4cQEq)}#hq{ztfOgDn7tBu&w@`#ZYF_!W=xVmq_ScImgCdkfX8r_-NyvU}8g1!~q zw>1=WFX+2w+F8@iLaYhwNNo@BXGZLJL2YrTc%e!a{Gn$-x~R6Odx0_Z5{T@LT>`?p zB1X^m;>w7HGehqR7TVredBxCz?rZuY(S~ivi264a{13$98GVg(I(L;){y-`3R`?$k zzRRW;AlJsZ5&SKpg1&}7Vyun~H&P<1F3OGA`H_mA#`zIa)#nr~Q0&VBASOkcIeNNGQ z=vQ*{sptzA8?5FKK{7F8E(@Z7{?3gwsbAH_fW4j{$ zWdnNYW^~d>dnZLhnhB-*6#wXkh}B^=^?;%tIf;6|qP~(u9R~{!$XZYS%<_uvr&XX( zF%^^YjQM9zYMr-okvQ+%RjU{GtB&t~FKquwtl};c+Q+ZC%U7&gHg75Zl+?n+(Ql2O z6$_VeAe*{q!D=yS<*FsC7mc5{a^;fcXU(l1Et1q$ub{|^Rf)>)j6D8ft(5$;mX2Su zboKao82#4Otg8`o=i<*&^{d8T#af1F{O0$&_*X7jy`WVrUh;q1Iv21i$~2B2fpbt) zL`204iHJxSOvSuqDV7>(E@76ME20omz)?U1bDv|TR_0@_xJ+votu^zum1d%qt+uw6 zU9@t$X^E9)wwc{8n(q6b`Jr?<&jY{tzwbNm_sz^V=bZWG%=Z-)<(Kw$4s8z~;?BR- z{8uH}L|hx)NvWIz8~n{%6bH+43#Zt|0=^0RuB5@kw2I&tVv#wFsJAI z@K#IvG^e^YQ&{)*4UXnbrNQFsz1>tkwXnDZ04hZS>j zW_SnI$sHR=x4FjVG_G$%)iM8z)5K$O4RRM-qbQtKRG9Bf9~bC+b`r9P+)67bBO@Zt zd3|djF6H-YRQc@4PP2cr^2@8#k_$^potQhrFS*2)s(b}ERc4mtLI2oR4T`a5?j6<*8~yE^6G4AUpxAA^PRs4qNIu#YNQ<`0+kx?A1s2=4;Z!;7rTY%M zY;^8~7X8lJ^aGiN8nHWeSag<~QITux0&h|yCu@tpQ%hS*1?kn;lD+Pl6M7Aap6Zn( z$Gi4bsE^Stwd1_V`BrX5bn4ks)X}?FrL-Ixy|Ph#ebk4uO4g*I(LLN+E0_9u6yfGd zyuGoP&6&2vAM^$j-w@?w?GEqapKf&wbEY-7A;s#PV2iMBVRcc}iC?7z>MTPyn}y9r z6Ax@HvoCZupI&rCQXsO2&u%R{gI_WGqrL6&w~aTZc-aVVOz|~$X-x4z^$2}ccVa5+ zEIu9`(JU}xw0(&W)U=353fp?u*-^y3)EFnebF~b zVLNQ4sbMMp-i7r;i#y$8!&){g_Btr+huglk?woIdPl7&QStDmhTKHt=_1LhuY<*Ys zUN%mME$DF7>o&GI}(x8?emVwT#UdeC-R-;4a~>zzjVpZtw}#&m*O9P#hi zucm!#-Nxo6_}l_)98C8yIVC(}`aK$#bZc9&r5Y0n(u{}HjL<`j^JzeeAKS?3@vMJz z_4Js*&faJJjU$TeeAP+ngl+eCi22<+fX?fp2JZm8HB~h{bI-nA<$0eNfA9v_AVd9m zp5HLVS!13z!JhVGl%2M#;nQ%rZBEpAULROgC-2vlihD_R!XxlBjJL+)76^yH@laz6MTM+@g&6LKPrz@*B=07W zcCl`|h@+rxnP}JQeu${M9pWs}@~(tC;M?#RJY~FDfw9(%#bl^42c<{CNw5^&DR#E? z?DAA`sc<07hRf`9i0Z04N_M&0+}ThaKDXT+T8_1D3V0t}>kMBOK0Fk#W+it^sF??( zyTRV@Qm8Rr>GJ zsI?Z1N$_Gg5N1N1H;S7AHPEEAMqLoyxekpEdKKIVpM$T!ca0&fco@Ui@C2NT#-|oBq@lanx6u$ZalSFIfTFuV`zpw4jlzkq7k(&|?f)#E9~ z!glZ?*bDZDBcb{iwcgl(y&Y*mk6?=VuoCJaE7@1T$KZDOD%=nI*%_|*;V=i5Kz9yA z^Y2E#r+aQ%A>7VzF&^rjK{^AfZ%=v(48l9$3Rnwu(@yap!_VMX(4ErI{Gmqn)}cUk zzlkw09;(YucD?0@?i`0k_4!F>!0X_6sKHX@*L^mz63&I{t}}bcSA$_CTn}sEF6hpE zXo(J@)m5j&_7fJD?O+N_hlAlYa1tzcX~+Lj44dF~_%jUHgI6jj7M=$$gqK4NAF8

s zTTlTb;0(AB*1#=rC)^Kzfh}wx0k@)1b6iPZ3n#*xVMR3O|6B}<;c~bdZi3IjH{elt z5=Pn+Z7Q%8%!FfLE-Z#s8g)P`%*Wu)acKG#^Z^)d-*6Sz750Q9;0>@4YV-ib&x1?g zQ}9F4KA67Ks0#`_gF#QIOY7lzv9D->d7^FQ4D2EFeDpn{#XX4L0Jn&?-VXfx(TDJd zPO_lK!c}0ZXo>owGek=;44s7@gU&(cp-a#+May%mXdAZ>do^~)vxj`EaXbz;dk)_& z(GutZbR~EPe;quG{X5a(enL04Ya>;-C2S+w`YEEtU4ZWI`tA7ZF?KnI z5f;E{u&TAre_L@bhP&Z1_yAljT0!eX+v085pNB7Ee@C>q{pe%(^}w{&Yi!ra@;4Jr zcW9&Y-ztzSgYkSE{RzAbJre&II3D}Wq9yzb_66{6?3&q3{!Q4QfjhA83$gI7Xf^tj zfD`aL?0$RnREe6178fsCg;UUd@DD&|;?IURU@s6Y&n@WCECOzacjCBLw7~V)H^Xh% zUxRhnKZD1y+w>Xk`mymIQ{VtN%45hk8AF+9jq5MyMd%vQw)8&qBk0FO?OM_H$WH9L z;U4S5iKwdohn+vY3R%FXQ0R8|1-K6{~YXh!Nu4ghR?w_ zMLpzoSPNFrarg}Zk?p+-wHM8wjP3^qidOMI;lB=@E83nc5G{WNdX8v$=A#{>d;UL! zV>ON^&`+Uvz&)ZRd`q-~kBOG>OY|B1;T=4GtZ4oYFj=(qQ}Orh!1+IzfT1|X5I7D! z75{Wtfqj8!2^XUOhW|nM5A2&oi`$CcgMVKKo&UBapAc}AfFB5GWEb1=w-hZwYjm<` zTb2g<;2(fL6MHti0egXHd2T_6)E%Kj^DrzU;9m3w{2S3b@xOrHhyMfk5%#Y|E9iT4 zl#QLEa$1PCL7hbNhq_=$C!ilXlYnc`dH4&_RrnWSuR*VaFJRw|{t$kF{dxxc?8Q8PYGvI9OccW`W+tT~ctI=EFe$nzD6l3i8e~IHq*r=12ARyYV zibE&B6nHW02Q%Q+a5S6%^F=GTP_(?2qCWp`BVYlJ8qormqu1i!1Z%OsC|cYr==bq| z43A>}QM9;I=%$ILt=u?cNDJ*`uo|5&THrtehQh0{PlVI4&w?TB)zA?w-)j7i!_C-t ziB`@#iJbp+1RTck6Z}QAM9n%It)i`Ad(rF{h?b~3`ZD~(;0WwDiWZlHF2O&ubI40P z8^-Mz6KA$?_iT8&z}I(;V3vs)LV22Lj{K0MBCB@=o0pYq7~Q)-5os$eJz{-=fYKR z2Yl7#6?Q`l!zb_rJSBFsUj%pc3T^|ftH&2+m(aG8+=^V~e7Q2bZOEd1nqNB=b8mD% z^p)tV&|}dP(BFB^Py_o=#H?f3iR*{zLBEoEOaG$Hd^;lregT>v07bn`QewO=w={CP?o7!V9`d^B-X<(nM^N)(^ICQXm)_2}&$Kl*R-=&?b zBcMe_ZNlgNRrM3hraLxWeSB?QT41>5o=v?x@N!?~p6%`Cjjjkht-LQU4lEk>D^KZv p12)V`@7lFr2XZ5AX4h-h1TYyZfPnpwoeVUhC^{tp!x3K9SS delta 20141 zcmb_k349bqzOL%&xssVAlXH>`$>bme5<(6xr}44_U>RM1@w z4BCJ^!TSPb#oZttpv&s6*8=M5uBhnxRu|9J^?2)BdEeJl13_J%@0cIe-~Xppv0OO|iczN(k{=A(E2+bs2xH5I!Jf7DX#ay^nSP-_3Gxswx8@1U50yVY zD=a;Vp7AH~gJnvL(0@v~$0qbMCD@bs|Dmm;qr^`t*VGGZkcWR&o;fJ2KT>S{9}xee z(*CBfeWy(RuHZ-cSH=k2e^cz|)$IS7rMG4rt+85-+~Jzn_;jLnwK20!i`jpJ&4_Ze zEgwIxZDmV`A$Qoa_P^#iXo((L8otZ?{-)4_Nf+92Q|pBp{@xj`(NMlNDSmRKKgJ(US`x;rPoqiTpW69 zPao~TYUA)Onb>`gRX$}4RtDws;HS+`rOmH6ma-{!lXp{G zam!3^K?@~EQ#xZiy`6C@TfE+jT8^h}4a^VBuXrit=GYzJx5Vx6uB=UM@;0S46*L#0 z6Jtg5Oz%aeBogDHX0P}D=5u4*-^>{EgDOa8_Hiu@!P1)M)>Z|)O^r2kYbOQLnrd4` zLCMix%^AH!e{t-VllO{Zvo~g3Ftd7Q)vSrp&C_c{!8fnxG>d|-U$@}+#p}ax{Ot89 zwNt7ynx-KBl-gbuNlgim{^#rUwIVyMslHa?Xx}&dv0ztVd*HUf{ee#(AGSmkeDcQH z)|tY(djcZo=q$^>b&9@Teb+1Ak2VhV zT6gUgAI+Q?7}4}X$Eb;W#bq-WgLZc;7mo()9hapqs`w=KU|?!xYuubldE@wwP0$<+ zjO*y^xGZQY9}P?tqtpDps){+4PsTdEt#MN;tK$v^$^(-sMSj{*xvlfO&Y_)Fr?u1V zsOanKJa3cL87(VHnzS-oLH99jyQ}otF%KO}H(Qr(wyx_vxy@<4#(K!T*Lq$>|LDH3 ze($~1s?_SVnzUM80W;sL)QzDonPIGqm4&X2y3o5&@Wc___r=OPqP5TZ8FlG0U0&V2 zG+hozl4adHi{*%@{xA0xVn?PB<7Az-T8O|IR z5G|%+GHMzpC&}R=;E>3}cpSB5uywmk{Ume&^08XXlU4OHV6yS~2)Q(P4Q#5HScNc& zwGm=Ngt$IJY*U1&j*p1^5h5=_42}>FMTo`^Qk7p$Tpu4#o$JEf>;P5 zaK2p#hN{Wy5o!#Cdm%*g&DcWJJ)JJZPKX^$<68N1m=Avsva1nf_!}VZA@LH3M?r|X z&p@3F+Xsc*A|Izi0&0Dcc1{o=U3h?M;IABt%^XLVN~$ z8|}Bs=sqwjfNTi0lk?C|HstC+M~s%+WGB^S5Kf1B45cGSf$Ibp@WSpXw6-2LxFGa) zQJTvO5jS1cET<5!^)vo9MivI^VCQGY?vay6qo!%#hmzkbA7J_d4NyLM6ff=2smb?)I@@^r|bMosJ%7$8u;H2jJ8+JdQeJicC5kxUu{DQs>cb2a|N`wMIzoR=8Q~0 zPxRRWi8A2n{dEt6yU;{gu>Xuf;|BtiZ$RVClgo1pO;+)%Nv?Ze>3LCh3}HFGndk1yv4oqQ*PHHpT@S;ZZU z!r?WUPNK0P3c}|oYEh>-AKH9@EqfQ``6!8DU8(OJEj2}FwIk2fvQDPfQwX zLwVHwXdcx5>pZAEClBMznKC7K996xHVii+EddNZYYZRN_@8if8kSB`5~$=R>#1Ul^p3}Q^rl3ey?r0;)1$NaRknKEyK$mxk(`X?cC zMDfa>M2JJ-06S?HDb7Wph}hPEtwYho3L9~jsZKj{yL0l`^cRY(RX*d=E=9MhI6s3 zOgWJ`(6ZK_WohzTeE!}sj=yJQ8w(f9esWm%4U1($qA_Bw#S>cgsmpj`om?Sx zW5A`dPa0F?9B_1uemx(Qd`$6o(rK)?6i>`V$}s0SYZT%GRHP$7UudkV>hji z8lg|O=GkKB3DKTld`i)Vwov(vdD`7=M%O}1o_4g&SlWr?UNi8F6Gm4xOx|w~oxCy6 zT8B5j6`|;xa!W)af!sDgWd)| z5G^5J1U?BpFhlWtMQ-h$zCl{_l0=-os3M$l*hdXOmjE@)z#b-IO8l6@!wN6&zHXzu zJ0Z9_4|>cOf(kb(+(OiZxJ&U5DmH+^{?- z`YJ(bSRjTFVK`Y~6A=w)QMg9oRZ72!h=4aLe!JrDC8A*uD*j<2CR>M;{D{d1h4{S^ zyrJ-2Qz66$L?q(N4?E@%!H-gW4G|SgRD7etMMT)GSGbi3yPK8%HYIU*-nCk7`y-d3y4o<~E&0({bXIzOZznF9DKzIwzrAmPM_bEoI2%i*6D9#Ig31TJy1#>ey?&$K!7H&dE4cA-5k-@s}l)ZwhQ5 zBi^{|WJUA5mOrJ`$G+r!J#MylR>qdV@rp@-<0+ojVY@wUJ_Eq>oivquL?&GpZ>Tf~m%Qg5E+_m%pp z19C9e^X67QFy@0}6@hyKy?o=xX8uWTpB$*I7#EmWaXKw1KK2gttrp|VNPT^w*?wQW zxgPv>%b37*h}75T_nq&PgBWR?HhBEl4~|)|Kzeq4^t&yzomkK^GvnEcaC?mRwg-Ch zH-HZsGZXX-+11^Vpg$6e6H%I@Pu6DG9T@*cqR5>u;*GI4ija1aS)lS>o_2BY9#Jf1Xaks+7c%!$T662=rdnkR@2pMB&d3s?mx5y5Ij4DX0 zaOKIJS|aLw1ux(-gJda$;WRRsMkCm88kr2Xn`|D2FquX6ZL(SP%^_QW$_vLcejeGp zJZkbuUIz`6CXfylFt1yz}{3jYT7&_7a6b{cO3UMdI1+pG1 zJ_T};)`6qBNYS4QhSdKiq7PEP=8S$IvZVgsp`XG4Ys~=d5rcm02pUj#Nmz#v;S~^@ z{N_S06pAvE)4Tk^O+2 z4tvk7Xw@bV@l#=J7bS1O)BcED15t?!!5zybBbM9_e`lfmEkq?_V?Y;~bSbB-akYOz ze}va7%DQ{!>l3wkXWyLBNt>>a(j!X}_`+Ot_9YwHoiz);aTgB~)i5eKYZR83_B7<1 zcv&}IxyQ-06UYniJ%k3dfV024U8K5fkO?;kcOjg@0r#&7e~W z<4kfAp$f$!+Jn1D)ENi*>sgts#46f^Ehm@fkf+QlE+%W9J>%>CdY5g*BF5{*3-PLer(K#ysxku>}XqUwCM+ z{T86vX7bq1!%7~qc{sn3$5(myuBOy-QQHNx9oN<8U9qyCTc(=;|cn zkgjLiULJz)M#6|&FXtP!D*f*<)i^6WNt`i&uKAw%c+;Z$&5PAR=s{ za6kV=A+Hhg#qc9mb`Po1PejWkBXOF(C^9SP?wqD);R|i|Z4322_^R9eY_tC7?1+}1 zaJ!$oPXB}xl}C5#r^YDFknqIk$XohqzbyOZFzf0>_&$_q{c3@-7}~wB!}=(na7#B@ zR}D@bT=v7Wp`qry#4>nbY3R*8`3c(wAZ=W815L;mNh01Df5@6uxZ;<(&*4k<^)jFJ z{-*FZ&!(n)li%H>Z{t(?WRu^w;&Ef`A!|`^T%hye4f`yisGD`)o3USdzqAZaEcR(z z?r)3mth&L(}I{#aKK-%mH} z`}CLmpglfNiFuRH*HCfgzTJVioo?UMicH_)iu(eO1l+zk6)B)&Lq6Y>inyDTebXvp zwnX`6RqP4KEpFfV3isyD?9qYS1M#xWo0yIXOy#`5LZLS`i09HPo2mm1Vsc=1+C7zW z`)pyER}pwAZDU}z81h=>;>wD7K~Vw5K7VfD%6aS3W{dXJiuv{FojDtt>hZ=hTOMgT zGVhA{N9OAbDi>^6@aqK@!}GK?DOiqYJ|-Rb>2eWgA6a+=x8ecB-&44x_|tTK9iE34 z-P*FOO=!~g5EObntTZ3qNg;70U}B@c3tz1_$23i|;(;dg8)=i*VoK~67#M|vmiBx z&Tn(p_Mt*wO>b*^$zY*((A(NxRx0$huaI0t>3TX_S5bN;oo$%<@t7Y@|1P#!I+~G` zO8lU;e3^JAx(5Rwn3)T)YgAJNQV>Y#n~^4 z0z@@0>=5>)Bk2{jnsh5^4e~X@zKpaEIq2o2ZBaB?Q7y5;>WHHFV$gV}*BR5kvKvfv z0nT{7{VsVYM6UB8vEL&L5ns5jMq2iJC0%sa`{;E0eJ0~@%|v$g`%T8>Y9h18Wa3=c z(`T>AB)YDm&jVzF!t2sm=YwW!pNr2W`#zKLyS_jQ_FtG8;8!9X-U1oRu{KudG;>^f0FpTA*cpve?^%O$ExIb1iDZkS2qP=5k7KsH3mUz$Nec1vp1PGoo;fN8XCjU27S>Kr(>C^&u-R zG#QtRcaNjL$;7$%)yFZwWD;E?*@$8@n%BiuI7f+@lFyY*pE7(b6~gaA|AQN7a`~>s zj4;@=D|X#MyCEhsP`H_^W2kIn-kI>3;+P`8VcNH%>l{-h`&78zAv4WX=&oCt!gT2Y zxLl=VW|{RQx?0iqj@c#?^ttY5c5_TF*R_QCG@4AI>m)UE!zs8L>C|L0LtS-b=9^c^ zaMw-Dbb-l~yDnufEi{=*R|&ITWHME*%?#Zv%h2!(T%WQ}m&lWBf1QYlMtUsf36eNL zJSFC3lyz3>X2Ts9$$rq;bjFF3&goNN;Q2c$5*|(frRN_|Yo3>&#>KP}xjE;Q!3MTX zowR)ttr8v|S|B|SVly0!iy?yXH}G*Tnj1E5-b3R&(^!W>dTuhW(%oU(ClSQidR^Fd z1$QENxII94=0Y!p-iQV|S9OQ=tG}k6ZzIC9z>IYwGpI=Tnd&zl2SZ)^y%jnq^F-!Q0&E3o{k(w?N#=yh5C9JiGggEq! zGsIk_)I`FK=z^egD?0@&me-{7s?G37vhctxM7-v_VlRl~HNv^U98B@WE`^Cm>UR8^ zx(?yI+0;3a3=+Nd6r>5iV`jIXsawMta^4YUQ5nqc_P`>TkjA9$&0w!skrW3b=Y8z^ zNKU(RVVA_3k{Fov-cklp3jL)>)STM`v|ye|w57$qOF<-zWw3|L+@fqE;Q*pK_w!t! zcVvPCDFvMmn^o&JFmmh+08&UnjJhs{u>@1B`KUA+|ylU1n;L~PY^SR=D zMzUh(Cdz+Dxx;+MIG?3F#+k}yJx_U@`MhzyKzXv0tMJa>Q|>jNJ!hc(Y`*dIQO3w#tVHRtEcAdb_W|KLX_PaJIHJi(XX zy1DZ(>g)%bEuEd~HO~_WAL=}edIRw2#83C^MB|S`YxVpLxxCbQ_)43n5WZJHYxm4R zp0|VQ5bhH8k}ltZXY{o&(48@IB`S3N2PDooYy*OU`OI^AWPT8wCfqc1#>*PmrRvU1 z$;8v{L`BZ5Fg=@ew!8~+j6FP)Hk~Ic`Xw~O>r9mrx4r8Z43ln-cfz%vz3h{G-s>)I z266T>tsJhk@Ns6CnxHG?a>R^t@nUx7N_I^mVl!hmV>^4xJ)q-VQE}&^il`0|<#DkI zQEL>XN3B(qL+G3mMa3t;QhyZ@qkHkIkb`7gboN!@0MR+-Gy(ylbAu!qA-XpyN7N-E zI**h~#3#BuPr$>;`@|JLg_Sz*Lr1$3`s1iOxv|2P$d`48lTT$=viYnL`mfPht`yc5 z?{mkL^4uQ-gT&9q76eH!oFgQmEX zheDF*EJFXdQ%Lhk&s=T#ELiC?F{Ze^zheRpcjkpKK)<>Dk!HKI%vNKN)-e9Mv#Vhc zFWvn%0nLHeT^Jsy5FhdZA5zYN*IgWztAW>D5-~FeUU%s^1FyR*tW^WAd*C?(uX~U= z?s5i!f!E#lH0nsYm z$~pMDE6>!=!Ph-D%%VcHsp?9arRi*cjX45Z)!^%{?J@YeN8bdyB-WM0z^r-Hogh-^ z&%xJy{sAhPYZ7f~G3jFv=HTnDH*<>&zV6BA48HCu8NB~wc<^=SC1Hz93OhoiunsMS zp~Hi(dpZMg@O94`3^Q}^bAav~ z%I1QMq1Cb=4(Uw@E%aaEa*2&u1A$Ga*mo@sy?B723*Z<9a(L{J2SH=)9gOoGTp_XN z%>a$Jlmmzz8+#C1n|>Ha-%%XQ0O2U{j#$s%AacG9*Vy<*zMuu22}mwBfiZRA_#H(4 z*kr1l!*LPErYxtGb3ctzm(j@iXUfw^JDe5FIi0l2d4jq4NXI!pp**7)z88!Ti9pR=5y z`;+eFG}w?L8u^`k?};5S0#)WZlX2`R^B!>7>u`{DSUty`C<|#tW!Qi_5Od8a{l^-yuUk`sy&p&0WEsu; zFk^ml=Wtl(VRfGSFwI{c7Vb?Z2W;M2#c(OM&n1e{Hj8{S@<7JIT`WZ33Y=&;g8T(w z!zru+^b4R9^hciu-ovx0Fnq?;L~ie?|s zt@k^OI*Hm2up3Ob91q;MLr+ekp|-i9fM-xnVoQ@a+JW?o1t8qHthpZGb#f!dK^l9S@=6^!Y6g8x93#!flNGC1ZcVbJ9+` zc2Hu#^dKDZQDHG`Z93;T#oU}6H;-dWu?IGB^GU{pV8CKd;Owy74yL4qc~}tK{wsMU z1ThD3U^!#PrGV1&Q3<|8+((N&5S%z`v7q$#=xcn6cpkFSS5YB8MKF)jmAEeODZ-BE zrAHyhrwGzzf8=Fb+ky)z{3&AKM+o3C7Z=ziy+$HkG3Y`HSCQ^D(l~vWULD%iw>ehI zYV+$vY!<#h42U)!y<1NW4d{27F>r}qG{YawFBg8beGvNvaeWuzdxl5G+seJh7;`6J zwpElQ@Y6(2ksOt3?mL9#IVQPhzhcm^xAFG9dU_GIaa$bNr3h<&e(uwQg;9PFA87j; zqyJ`2_w_rQ3nLZuU{j2fz3iD*^Mi|Vc(3ImVQoA})Fh3vfx zr1|sX7&fUV)SzHppK!)n`yuPeXRW86V{JKWZPuTUP%eQgzbgDnV4qOPMM*!DkzAEJZ!tdU&C)ey}?F zuz!lr@q_i5X3(?#hpL2^`I~@aJxYw&+!oU7L;B>9UX1>sY!*svM83iiR#4brjQ_jU z7i{cvI-$jz+1A+(}c#!7r zAdZirSVbMr7ReV)b_Q9J!J{}h1bA9F$h{MhOs9n0yC~7LfrMr{1@HF|n%e^@_!uQ# zSwgr%l;@V`p(h|Ve|O<{4+=i{5#Hf&j!m(q4hOa&4!3r+K-0th7}6==2M70A;pQgv zBSaiDss;T%q=JrXLPVJ4u| zoeA~7iWJn_#O6DKws7m1Z^+NE{80CQ46U#GUSvjHh*EtfY1MvQ`aiAV-;c?7OHeA# z#0+=D3S6fMd+sSXw-*sC_?@;h(lV6sjE2*{xxt2i89yEpXXPBb?^Cui>QXYkU#Q~del#f6Z~FV zS9l{Cbs?LbD3w1cl4J7}8~$aSdn(RGW2Aj3W6y~uGj7~rOFRF^UFpV=qlT`LGrf6+ z4gXB{m~-84e9Y!Gnm5=J6X+EAJ&XAfwx5T;Y)4((KCf-j%4IFfml?|*vXmP!pIgdP z$|{SRv57-eP98UYZV!v{Vtt}<;1N9rqb1&5@w4R0gaKJuBeIj*v;8@}N=DSyj*QDL z?lZHvXzqv$YRZc(YljcqvTN7wkr_FeBP@wEmlWh=wU4zp{ZJGD`sHR?I*M|*J$1x@ z42#EaS%H13v3|=ce@6CztPG3WZ)x)n$jr*7&n5m0OLUQ?Bgvm{>F^KeV_D-zDeALJ zi^BS<@xqJtS8S^nEodvNG(K6bUu4qDR~j={=%bC3Wtz=sIBHMR=XJEKGCGgivyDHk z&|^cIC)If2s6C4x`pQa;kB-_Kqb_V&xvFjS(xuB67&XW2+l+;e=~=F`JyEp4c>9?B z?zC3(PmIN+Go3iMW#OV_Z7pqUj4j9Q1C8BTw&ZT_Dt)Mo8h63mDPw0$nOZ;AnAoNd zF-E^^A8EwT#>ej9%l7S|r{aXq|a$DmCY ztrDwRmazt7gn1Xt@*+%O%zY%vmO9oT{WeSfgOXt+CczpH)O zs+Pse7A^Fn-;BZzy-$yese3^OcJCOsZlglibF7bz;`Zl@Kx*$68C|-b=RR2~#8Kpj97LQE z8`ORJK-{86?0UJtc(KqHXLK&IL>Vir`ZSqrJY&^I86Wqz<&J>4`Qr)TR51&MJ<1&! z&A{;})RDg&I0uC%hWr+z;5}RBnES!5LD`_hM}UzZU7wFIK=Lo6{1b&Ii(%du#-~NL z$*#F`=PjByzh&-)r7deiPsWY*Mg%RT7m5gdVQc%+ko2S(_YSb7pZ!DsV{@#%f}H3_ z#dB5^Mt(XcKStqJBKEy(BPI*6n}{>TSs?j+ihr00zsHoE4Wiv|mHeoZzoz6T!t$Uw zM~zD36d1!S#!wd#t08#%G%-mbaxk|Yv$HXJiF_r;^<>%&Q&^>tCxLM|Whc&6xK!cA zCSqXb8KS|J3cD0?Zch0v3hz{SpF%DXQ-4_Da|-{U@NI=3D*Q^JhAWPKZekEbniBA< z8x@?&5HC@9g+ko^rhJD&u3^ybfWl}#sK9d#ikPFYSm6kTH43K#gEU;I1Q#p3Tp>4T zQol{%Jqq_Kd_>_%g`X?@4~3@{a#?_JTnbYZ=32Pg14W4vj8s^wkV_)eU!m{@g*z4A ztMFF}xu{Qju1*l&PFS?Vut)R*1z6Q!!lO7=={|Cn%h%uvy_Ug>4G?m+h=zy~3>ucPQMg zFnE_D_9{HA@M(oFC_Jg~FA6_Y_?g20Q0T&a%!$B?>Q7$PFp1 zfUAMT8x``;5y|t<0g3#KMtoS|V+xNbd|u%zMBe}09YcqY74k3m$n%Q`(WNk1p)|0NNIM-+ct;Rzz_-d6kvivLvc z|4{sCBK#9DlOg63k$92fM-X}ck0XJA7bt^iif>T-GKFgt?o#-q!Z#HDRpA#3C8lHM zsZy9q#5^=Z@nyg$8epUqc-K4mrk=vP~&l9+U^*m{y@qI@-M1>|Ddgk8ZND25-iAD=7-7A?`r3AYQ6Gu3 x|18i$kverts) free(f->verts); diff --git a/source/DSGM_atan2Lerp.c b/source/DSGM_atan2Lerp.c new file mode 100644 index 0000000..58e690d --- /dev/null +++ b/source/DSGM_atan2Lerp.c @@ -0,0 +1,112 @@ +// +// trig.cpp : Basic trigonometry routines. +// +//! \file trig.cpp +//! \author J Vijn +//! \date 20080130 - 20080210 +// +/* === NOTES === + Multiple atan2's present. Select the one you want. + Best performance tends to be with atan2Lerp or possibly atan2Tonc. + If your division really sucks, use atan2Cordic. + + This module still needs a header for some system-specific basics + before you can use it. Specifically, ALIGN and QDIV will needs some + extra effort. +*/ + +/* + dsgmLib adaptations: + + - Only atan2Lerp was needed, all other trigonometry functions are + already present in libnds and were removed from this library + + - Upgraded the code from C++ to C +*/ + +#include "DSGM.h" + +// -------------------------------------------------------------------- +// MACROS / INLINES +// -------------------------------------------------------------------- + +// Get the octant a coordinate pair is in. +#define OCTANTIFY(_x, _y, _o) do { \ + int _t; _o= 0; \ + if(_y< 0) { _x= -_x; _y= -_y; _o += 4; } \ + if(_x<= 0) { _t= _x; _x= _y; _y= -_t; _o += 2; } \ + if(_x<=_y) { _t= _y-_x; _x= _x+_y; _y= _t; _o += 1; } \ +} while(0); + +// Special-case division because I need a little more control +// than divf32 offers +static inline int QDIV(int num, int den, const int bits) { + while(REG_DIVCNT & DIV_BUSY); + REG_DIVCNT = DIV_64_32; + + REG_DIV_NUMER = ((int64)num)<= 0 ? 0 : BRAD_PI); + + int phi, fa, fb, h; + uint t; + + OCTANTIFY(x, y, phi); + phi *= BRAD_PI/4; + + t = QDIV(y, x, ATAN_FP); + h = t % ATANLUT_STRIDE; + fa = atanLUT[t/ATANLUT_STRIDE ]; + fb = atanLUT[t/ATANLUT_STRIDE+1]; + + return phi + ((fa + ((fb-fa)*h >> ATANLUT_STRIDE_SHIFT))>>3); +}