From 51f8dfd5220521f3fd870c4cff04b7c202c73f38 Mon Sep 17 00:00:00 2001 From: Michel Fedde Date: Thu, 22 Apr 2021 17:49:42 +0200 Subject: [PATCH] 1.0.11 + Windows now have a default icon ~ Changed CVector.Set(params float[]) to CVector.SetRaw(params float[]) ~ I hope, the text rendering is now fixed. ~ Mouse2D.InWorld(Camera) now uses Camera.CalculatedWorldScale. --- .../SM.Base/Animation/InterpolationProcess.cs | 2 +- SMCode/SM.Base/Drawing/Text/CharParameter.cs | 3 ++ SMCode/SM.Base/Drawing/Text/Font.cs | 13 +++-- .../SM.Base/Drawing/Text/TextDrawingBasis.cs | 9 ++-- SMCode/SM.Base/SM.Base.csproj | 4 +- SMCode/SM.Base/Types/CVector1.cs | 2 +- SMCode/SM.Base/Types/CVector2.cs | 4 +- SMCode/SM.Base/Types/CVector3.cs | 4 +- SMCode/SM.Base/Types/CVector4.cs | 4 +- SMCode/SM.Base/Types/CVectorBase.cs | 2 +- SMCode/SM.Base/Window/GLWindow.cs | 7 +++ SMCode/SM.Base/Window/winIcon.ico | Bin 0 -> 67646 bytes SMCode/SM2D/Controls/Mouse2D.cs | 2 +- SM_TEST/Program.cs | 46 ++++++++++++++++-- 14 files changed, 78 insertions(+), 24 deletions(-) create mode 100644 SMCode/SM.Base/Window/winIcon.ico diff --git a/SMCode/SM.Base/Animation/InterpolationProcess.cs b/SMCode/SM.Base/Animation/InterpolationProcess.cs index 83b6de8..7fa1bc8 100644 --- a/SMCode/SM.Base/Animation/InterpolationProcess.cs +++ b/SMCode/SM.Base/Animation/InterpolationProcess.cs @@ -84,7 +84,7 @@ namespace SM.Base.Animation private void SetTarget(Vector4 vec) { - TargetVector.Set(vec.X, vec.Y, vec.Z, vec.W); + TargetVector.SetRaw(vec.X, vec.Y, vec.Z, vec.W); } } } \ No newline at end of file diff --git a/SMCode/SM.Base/Drawing/Text/CharParameter.cs b/SMCode/SM.Base/Drawing/Text/CharParameter.cs index aec2380..6f9661a 100644 --- a/SMCode/SM.Base/Drawing/Text/CharParameter.cs +++ b/SMCode/SM.Base/Drawing/Text/CharParameter.cs @@ -27,5 +27,8 @@ namespace SM.Base.Drawing.Text public Matrix3 TextureMatrix; + + public Vector2 Offset; + public Vector2 Scale; } } \ No newline at end of file diff --git a/SMCode/SM.Base/Drawing/Text/Font.cs b/SMCode/SM.Base/Drawing/Text/Font.cs index 9a66924..9b2383c 100644 --- a/SMCode/SM.Base/Drawing/Text/Font.cs +++ b/SMCode/SM.Base/Drawing/Text/Font.cs @@ -47,7 +47,7 @@ namespace SM.Base.Drawing.Text _fontFace.LoadChar(c, LoadFlags.Render, LoadTarget.Normal); pos.Add(c, new []{(float)_fontFace.Glyph.Bitmap.Width, Width}); - Width += (int)_fontFace.Glyph.Advance.X + 5; + Width += (int)_fontFace.Glyph.Advance.X + 2; Height = Math.Max(_fontFace.Glyph.Bitmap.Rows, Height); } @@ -56,7 +56,7 @@ namespace SM.Base.Drawing.Text float bBoxHeight = (Math.Abs(_fontFace.BBox.Bottom) + _fontFace.BBox.Top); float bBoxTopScale = _fontFace.BBox.Top / bBoxHeight; - float baseline = Height * bBoxTopScale; + float baseline = Height * bBoxTopScale + 1; Map = new Bitmap(Width, Height); using (Graphics g = Graphics.FromImage(Map)) @@ -72,6 +72,8 @@ namespace SM.Base.Drawing.Text g.DrawImageUnscaled(_fontFace.Glyph.Bitmap.ToGdipBitmap(Color.White), (int)keyvalue.Value[1], y); + Vector2 offset = new Vector2(keyvalue.Value[1] / Width, 0); + Vector2 scale = new Vector2(keyvalue.Value[0] / Width, 1); Positions.Add(keyvalue.Key, new CharParameter() { Advance = (int)_fontFace.Glyph.LinearHorizontalAdvance, @@ -79,8 +81,11 @@ namespace SM.Base.Drawing.Text Width = keyvalue.Value[0], - TextureMatrix = TextureTransformation.CalculateMatrix(new Vector2(keyvalue.Value[1] / Width, 0), - new Vector2(keyvalue.Value[0] / Width, 1), 0), + TextureMatrix = TextureTransformation.CalculateMatrix(offset, + scale, 0), + + Offset = offset, + Scale = scale }); } } diff --git a/SMCode/SM.Base/Drawing/Text/TextDrawingBasis.cs b/SMCode/SM.Base/Drawing/Text/TextDrawingBasis.cs index ee25586..ab6e358 100644 --- a/SMCode/SM.Base/Drawing/Text/TextDrawingBasis.cs +++ b/SMCode/SM.Base/Drawing/Text/TextDrawingBasis.cs @@ -109,7 +109,6 @@ namespace SM.Base.Drawing.Text float x = 0; float y = 0; - var _last = new CharParameter(); for (var i = 0; i < _text.Length; i++) { @@ -144,18 +143,16 @@ namespace SM.Base.Drawing.Text } var matrix = Matrix4.CreateScale(parameter.Width, Font.Height, 1) * - Matrix4.CreateTranslation(x, -y, 0); + Matrix4.CreateTranslation(x + parameter.Width / 2, -y, 0); _instances[i] = new Instance { ModelMatrix = matrix, TextureMatrix = parameter.TextureMatrix }; - x += Math.Max(parameter.Advance, 6); - _last = parameter; + Width = Math.Max(Width, x); + x += parameter.Advance; } - - Width = Math.Max(Width, x); Height = y + Font.Height; } } diff --git a/SMCode/SM.Base/SM.Base.csproj b/SMCode/SM.Base/SM.Base.csproj index 7f23c7e..5e201f9 100644 --- a/SMCode/SM.Base/SM.Base.csproj +++ b/SMCode/SM.Base/SM.Base.csproj @@ -151,7 +151,9 @@ - + + + diff --git a/SMCode/SM.Base/Types/CVector1.cs b/SMCode/SM.Base/Types/CVector1.cs index 1dcb6ba..b2a80f9 100644 --- a/SMCode/SM.Base/Types/CVector1.cs +++ b/SMCode/SM.Base/Types/CVector1.cs @@ -53,7 +53,7 @@ namespace SM.Base.Types } /// - public override void Set(params float[] parameters) + public override void SetRaw(params float[] parameters) { X = parameters[0]; } diff --git a/SMCode/SM.Base/Types/CVector2.cs b/SMCode/SM.Base/Types/CVector2.cs index 521458b..8063c6b 100644 --- a/SMCode/SM.Base/Types/CVector2.cs +++ b/SMCode/SM.Base/Types/CVector2.cs @@ -87,9 +87,9 @@ namespace SM.Base.Types } /// - public override void Set(params float[] parameters) + public override void SetRaw(params float[] parameters) { - base.Set(parameters); + base.SetRaw(parameters); Y = parameters[1]; } diff --git a/SMCode/SM.Base/Types/CVector3.cs b/SMCode/SM.Base/Types/CVector3.cs index 3281510..64231f0 100644 --- a/SMCode/SM.Base/Types/CVector3.cs +++ b/SMCode/SM.Base/Types/CVector3.cs @@ -82,9 +82,9 @@ namespace SM.Base.Types } /// - public override void Set(params float[] parameters) + public override void SetRaw(params float[] parameters) { - base.Set(parameters); + base.SetRaw(parameters); Z = parameters[2]; } diff --git a/SMCode/SM.Base/Types/CVector4.cs b/SMCode/SM.Base/Types/CVector4.cs index 368e870..2f88938 100644 --- a/SMCode/SM.Base/Types/CVector4.cs +++ b/SMCode/SM.Base/Types/CVector4.cs @@ -66,9 +66,9 @@ namespace SM.Base.Types } /// - public override void Set(params float[] parameters) + public override void SetRaw(params float[] parameters) { - base.Set(parameters); + base.SetRaw(parameters); W = parameters[3]; } diff --git a/SMCode/SM.Base/Types/CVectorBase.cs b/SMCode/SM.Base/Types/CVectorBase.cs index e740a39..2340b84 100644 --- a/SMCode/SM.Base/Types/CVectorBase.cs +++ b/SMCode/SM.Base/Types/CVectorBase.cs @@ -52,7 +52,7 @@ namespace SM.Base.Types /// Sets the values of the vector, by providing the values over an array. /// /// - public abstract void Set(params float[] parameters); + public abstract void SetRaw(params float[] parameters); /// /// This triggers the event. diff --git a/SMCode/SM.Base/Window/GLWindow.cs b/SMCode/SM.Base/Window/GLWindow.cs index 43a55ff..51b9016 100644 --- a/SMCode/SM.Base/Window/GLWindow.cs +++ b/SMCode/SM.Base/Window/GLWindow.cs @@ -3,6 +3,7 @@ using System; using System.ComponentModel; using System.Diagnostics; +using System.Drawing; using System.Drawing.Text; using System.Threading; using System.Windows.Forms; @@ -138,9 +139,15 @@ namespace SM.Base.Window Loading = false; Loaded?.Invoke(this); AppliedSetup?.Loaded(this); + OnLoaded(); } } + protected virtual void OnLoaded() + { + Icon ??= new Icon(AssemblyUtility.GetAssemblyStream("SM.Base.Window.winIcon.ico")); + } + /// protected override void OnUpdateFrame(FrameEventArgs e) { diff --git a/SMCode/SM.Base/Window/winIcon.ico b/SMCode/SM.Base/Window/winIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1036f8f58d54bf81e8a5e13f238d5debf97029a0 GIT binary patch literal 67646 zcma%k2bf#cwYBXjl19^e@4fdvp5mGDxZC628}7aL-f_n^?l#5-_l_}!B|4sukXVDCw9rS zcI^`0rAwDg3Qx&NbzTntZ~wY><%OO8$vOA)osZ4)?xVa#$H(%%?(btBcjI*~(bu>? z*2i+bOP6j+Ty?3bzYuV*Ep_qJ?8VgM!&Dy z`^bAZUgLakc`wJc`foZu>jUpCpI?72*XTN@KfCKYy1uL2Lw#PKd+b&?&p&*0 zzgAz*uj%+_9-C24yC0kD9yXfmWYoucG{+jxhkqA+pY?P4*!@1pJ=6C|-y?kw&2@V0 zcuw74b^rD21Rry*!|1?6#JqrUcG$NHSXUasq?f9A1_?w?PN zjc6?OeKN=Te#^b>cwXNd*Li)fHHI21xnAQYkBvC7Hnu3wiGH|Y?0lW$yy%1zOLe`* zP+e!<#~ou{)A{do{=5(SKIWYM&Ib3+qru*sH}~1xM|T@@zt`qG|uH z2Xwrs&pCL&O-GGR=RzE4GMc#4x#kIp$~==!?djz8;8=3< z5Z?RKy!UTVzNZKd3U?>Ad@RS64yocOQr&5+u~>M{7p0yNeBO#`dF&AL8X3*|nDNn)5OW?!2dCcyBM4 zczKa~9hfWo78}<#Z7{0jV}rHeTSJ^`Io5KlkB_4%*J^^*Kae2PG<2rdw zEzim8MR(-=lwNSue^2v<<_E2Z#$PaoU~FMIUuN;`TkUV+g-#scX7f({;5l{_A_`!oui+ejlSJ=6ONZg{}LsVCasu`?0ysb&a`JkLEL&=UsnW z|9$*Wa_+o<`hleTn;R-c#B+xt$oOdo7q#GzMM@8-E@0 z3x%WL+~g)bc-(BYpoN&WaBSt+YNK#$vqYiEvjIK23_z`CF`u_NuCwwrR>*66a8&Qd z(dd%V2jL9i2<=P6&uDIN>4L;05;Le+;XHGahMItUxBS82-!Wg*_r?_y7*23;z{Bu# z-CKjROE(^Nz2GIU(f?eSx*nV7WbF97!P<4L(HlML_jY}b&X48uxPQNHU3hO8!_&7j zcGq#7i{BOR5?irzu|aeHm0c54!AIll!nh|fZWE08yo|m0xEIIXHXC}&DCdZGZ_j2F zcBw}1uEY2qaeQ81r>^I*9LR*H}q@W|7Pc77yitnQi=Oc^89;>=gIBL-Z>iFl^++}DTd1hb8XjR(-vsF zElzy<5W9Xp6d5V~iCup_9>C)PGCGb&cn?H!mrM-qItfi)rMymG+mF}F>-zFKc`v0i z97UI$`oLqw6C4#ca5Qm*eCFy0_`ne-c(eB4ZQWL82~MpE%%>hWas_1*5+}Ingqxjo zwi&G(a&J4@x5mbGPV0p`?ivq$o>xDl_9F<(KX*OQ@B6TGnh%T~xOD4bcCWE#JtbDx zWi;;M+jWfX7Q^wJj>$B)D?2CF!sUX2v1`Gm56=tUg0o;dkXQ}m*iIR2_rYKpDMNVd z5*vnF%aPNy5Cgl8LwncJd|j-%PF^>NqTk0yy{G7p{0*fK{5!oI`k=UhpFy}m{7(aq zyA%65i`D5HOw4HV2I{={1?CL4`DNCSME5vA*AO1211@`a*9Cq2FgcEO#}oj$#R;%@7L zyKr+KN?(fDsbFrfR(KPmp~QKZLxyt{8Q~@)eSI*}*N##4G&FQ;LRpsvjO{W9y)4DN z){YT;PF^qXGlcIaIy2bE2kji?Z;6hHKJ*oCaN`BhP2mLj%#ET497TsEUeta;@&@;M zf;U*lcu{;pV`M9h--Y|bj*ZQmQSPa`F6hS{ZC~Rdy5oM{;Np&`iwoTG?{ozp8ZPNP zcGfL-9ngPI=W~+FNo+)}=P2>K+#BIc!M&cgtZ`?K#$&Oso*c!03+9T)dG8J8V%I|{ zg4b}nP2oI}$D@exXb~QdC7xq=JkHO~W7jy=*B3p#OXve~FsbVT4DcMx*9Y=iyL#;? z^*(l`E22Y2CzLKwAG9v`C_U7?pnZgV=4RsF#L?)1#EQBOA#oygfE=LsKw<<{f3^>- z4lGpuz{Llqrl@VdBi61M;X!>cSh!!~vO||H2reD}{lBo6=UujMbUm+_xxa)XMjiOCf1V&{}WK2~Lug1N!lU_I90ON_@8 z!wGyWGSSZ$ll&<%DzRg-478^5HNHyZJ;qVS^0C$l>H_sZ zxJ2|}D0M)%LHP=Po&kL9&IzrIF*P3;J+LxP6u)3qI-qg|jlUyLu+6UtE@JISVgeWT zh6^M{G{`gQ>yZaaQ4M&bctxSQ{R2jV>K<{Vm4!mf%SG zy5qF>?@bP0NxQEm=E~*;du1yU(>Zc8>Vn~T<(sGmS}Xq z;Qa8>#s3;-ZSUF!wJmBaH2)i&aOsG#WsSJj4SlX7?(TZ>ApTmPI@-K^o>FhWOk&SD z69?CGRM>OWxtxya#a~K(ExMZeqr2$WxbPRe-Q_`Dco^5a&Ka9Gx*#h$Z%&y(kc@0FjYz1KNx zUgBlpddc6!zl+U_e>c8e**p1FI9G5N%*RtEQYKL}-rAN0Z^2q&%yCX2h2va~^Md>_ zk64S$casG{0es#cL#!2u>6)VQK;eJ^mU6y6fTDFp-cxi*^kEuB^x+YT=z{nc%?rN# zjEpIT6DSfpDm|bsNM5Pq10NO7C@$dlttSuYJVE;d6&DEpk{@t>iE&{=O-QjLCip-2 z1U2WVbwKHhn?4x5F#2G0!S&eKy^ID+W5+Iia6RYZc>P{FrgYbYea8EPedOSXQ;pJ z-$56IheQt~rW8Gp{6caGi4Q~%gbVsndeaZIDSyD6k@rCSf#`t51yV!ozyn^EcQ}tQ zrrMzc#`d*u5X^OqV9py((0I6bLF3&~M>Kvetc|_9kNVhPZuG-oZeD91ck5DRPqi|i z*+%TYR-8}FCBApn?lj-`pv?>RQlC>cFL51x`e6Ea@ukA0%HDYo1$VJ^;a>6Iiq{>O zi+zg--eSuJYr#}xsY8}=6j>e|h~*)HSm6-!cu`|KQ(OK7ylgg2V~p8?+wyI^qMn${z<&A9P*GN7WB>zR0+M zI?&w_6G+`i=AmWYS$qNIeyO+5;_8qRYqzdmw9|*gh0Z#Wjt`C98$K|4;j(+}3k=`8 z?Au`a;Mkep^=q_l82e|8KU-l>%-!pFweEaR+n1W1<$TrN~HG9U6qyj&Y6K@rsZz zv@j2h?V5^_U8ZAk*DV<6-Avp=l+I{93Zza^AE*b5s28Gh^QZ%J`B*q%CS^MH!T1Ih zFOmyH4~$PxTtFRAaRI-()R20r96@xz#vI7zs2v3acv z23w7_t{--`cXN%qUg&cV^Zzb;*D;{c1+6m%ckSn0w$HwpX6chLdA*78CC+ok_rzYs zc+_{PrS&BCC4Nze4M;$@z+~8iQVgi##6^gmFIQDh6ooIta_UZo?RlDYWkd>PwJ% z&y^fk5dUSAr4*$L92Y8GkT}Aj2h;%-BXFGT;Dhmge$;8r1w)DdV9G$^-(UQJ&4=+1 z^8?~7JRmWFiVHbPJW#<=#e`m*S7toWn9$En2aGOg+zrlVGb41Ux~{=^dl_{m*zvx>N}pCKeV{II6kX_`2jl{y2Q!Gh z@PUpK{hhJFDC&WZ3+&7l?MeswP!F6uK)jU>aIALdfSOlkp92l>Fn4C-}`IY49Q+8-EB*LE-XJ`8hnuFMh?OZ~iUYI+jqOK$IO_u}W= zv2Q2tCdQLkX&htwiL~<}wD|(szdx}T9q^zoLY7oU$}HNW}|^52y#O_`vuCf5rxW+8@yVM^F!h3)(5d1AWK? zZ4{Y@ZW3QW>?J0wChi?#Lgt1QehHxlN5S6d6P&)m#Rm_@hQa|xF9h3;w(r8*@V*&c zdSLjZ(kITB*dL(JSG7#3XGxA{a{DF~=ecV3QmfbTy{^+r?yRtkz*r~ zVSG&l=aGt34A8IJXsqeF8xuTcV{u?1-!oLnCgQ(|$Loo^_>XmzH9QthFnVD4K;lt} z4@3`UicfHG!6fp6_=7RTf25lZ3?LWur6?Vs9w;4f!~=>4s0-y3-tX_3Tkow2uVh{* zJm4M^x?)48emJl;oX~}_qB+(!?6Pyi`R2S!7Yrw89nj}l-|@0+qrd;oy^il5>zVvc zIA3zR!D9CuRbIy!U&VNWJw;+@$+IP%pA{I07UCU5{DlKV?9_pQ!Esor?!DN$7AM{g zdlrlp&V0O+SnndXyVMwp-BDp$cy2dkPgJ-PIo=r=j%j{ni0zh&(yk3y*>xx8bX$YT zzLnIWFeTeKZsq%nK8P+jIf2Kb2P#Gozd(_^L2?EaBT@%u1q4vP{Z$=l67hdP2Z+7s zfQtuQI#5Fns3P{l0}=~RzLT7wCc@}|;BIt5`vWH@IBnh7yenofyl-%KjSu3j^F93VOnLKzVptM0qz^}(p9Q*iKi8+>0Nd%S# zpgDj#VEwSn>fg61 zwVlAaW9s05hv2S#zWcQXXC2oWdpGv~uy{}OK+WNLd3_+UzHq+8`lhy{YI+ju5p$_| zDb82^o^~&_TSrds%e5I;aZ5FTJW_-2_cxYF3Z9v%3*=|mUmg7OneC(QE_2N<93 z9@o4318wix_VwHX*THa&jrU!duMpc;bzSO#%yUcrB6B#Vj_<-=*K}mAMrtFaA98`{Ko8>IK>X`CI%5H)1CkTiZZjT??5G1KCg3QTEBsw{ul>I~Hum3H4@3v# zT*vt&&HJ*RO3&Ym?VH-3%JHcKQp=Y)9I59Hbj;bwe4SvgIG?x+=S!_#>Zy{?3*Rg3 zRW2uad!WkIH!_x!IBQ%;9CLzHc+&Pg!}FCigrs0wWCXcfFb{LtHf>$-HaN?8BrXbv z9pe!hiMO0P8W*ibIhJ#WVxuw1moZ?sbQE=~!>Vq(u(;b6jJEYA?$LORIwB&vu$Ouu zy0D8PdLTL=@xhkxFb5Zi9)v1?u!?%1bs&h}HHhCih~GU>`GTqR2b28+9Pxl3>xIGt ze&hjP)<}F=BeQe<&=Ctz2WlzR6sZr<2Z(&n8u9!d=|j10QDfY#n0g9k?Hf)0hj^M~Uq*H#r_3 z4I{^hzsT|U7$u?)%Y%xM;E{zyk8I5KSVs58;M4)?fy4t-iNDeTj-!43nH&1CHsXt3_MvFA z4@58OK@0ss6XSvIlp5k+MX7Ldfc5oqdt_>74sd_$;sBQ(2+kU77tfn>oyYpXYR>Ce z_L^Kzc)x~mp7iW!-gnh^1bdmcl{p+!$Cnzu!k)G-^;@auNL~E_>>1aqIt}e!@;CAE zlCRAP(>b9hdB7{W9G-DCNDs-v>WDaH@5aUj@1w;3SbUVi`2_JknGgdro+Q@tSdHp9 z)_Ht_kGF*}T+X5^J$|t8pD-oVJND*BSJ=hyX;i$PFf?S|= zKy!hc4yc$Q1WTz4;tLcHC>;pI)PO+NI|FGaS_g*N{ZZz(8!f(z=?8onPx+#mI?zD; z>nKtesH6_)SU@N_%zBXw`-pD}Z_GG8bD-req{h9^1wTFM4uFSR+b`)w4#U2-^y zwY+$C1153KPd?;m#YzV6-8 zxt{LHmHB(|`O>o?yzd_C%iNvG?;nai{k?F$*uB)_q-G=7OWv+?xG?(Na4ZU!ngH>q zcqi1uJH0nT!V9q~DoNS8wrh?1=|sUdmN*OE`uGfSe=;c!XGD0cAICe6WsE0xr0`xB zA;}{L^&b7O&+`m6dmO|V%P7W@3H&>8Eg3{DE-6R>~&& zf(>C|%nev;3=L&GAUY7j+%T9iVKD0hL97u4v0fa6@&3WA`(#)9Gp^gI#c0LBBHBih-LGt#rG!M_t1XnoLnp#6dN>n_{x81HHQ@R0Qx zmBjv2$@fgWFEzdf*7tP0uWes=U*@=+KA*NPdEPX~JiYW{$eg-+tf&0Fa6awbV6W>o z8hew!NgThI_qls;ispcbB3N<;!8^GbJ;Ji^c%0a;#`+BL77?sP&L+p>Y?799$q5kA zk7abplRQ41n8Nx*DN;Q0k4E6L5sK)*A)^QU zjQgky!UMaVIuJn}h#oNqz{tkTu zwzF>LPd@Nden2?D_yH3OR)`;vc+g_|kQ`8`@HaZZQDbfVzRN$j$M+rW-^Ke?_Dm~n zU)JX6n2&SQlIxo}Jy}mB@xJu9i0y0MXRnTf_f5Pf{S#8#amQZbd}a57J#Aj>zBBfc zvkUeT$4d;qG$H}PLFw=g%77)K4=nk^VTrBAil|h@=kB6+gu(;itYwC=Rv60qKp5{0W1PTH*1waGZ>d7Jpl6X7`v!*i_Q5dU zK<0%0+7B=mXq8xy@&E@gCMdP|oUMziw|3wF>VWbI;tw1?p|ky)c&~#_ko#q=J#C-s z@pQ~D`JVK(OAn9OzSMc7Ki3uS+f}wor;<|`j}#-rqZApQC0OgZ7w0|iVuR;nSQywu9ZSX&)REJPi8v`- zKs`84J`g=PLJm4iJ~$W?!_OXr{gge_fnAY|3CIQ8$N^g@n<(p<)2vZC5Y8BwzKt@Q z^WP1&a&+^a4i92q6aH_k3k1`b2C^;?fPu^l`;rIR3x+``g^f^mA4an$>DU~7K4S6sR#|phIdE~tog%W zt(*#LVk6eXWGZeqn9F#iM@&H5*EN3c?~LtB%&+Qv%Jy|H zhtu|nz0B)KeOLN+oHZWC`<;1T=4(x?FW5_tXJS2fyVtcFlgmXhPm5OZ+<~}6cLUU zVRFGi<_j(!h-Q9B9bg@4EAihPE;T50DtnVFF8Q+K^+G)vNojhL1M2tK*a&~%Y1?ccI_&8fZ=|v1BMr5G`4Q^ zz;J-9GiV5^XUuOoukwAdeTuAg7VejMUFqSHwRckEm0VxhzSQ{KdEc4m>zcmQb%pl@ zdmZluYwVfdNt`e9Fvji`_71z(xx2>x3C4J*8K+N)%!W0r0M^J7SgWSP*0cz=^uE}b zkWcKzu9JvmGO;Dz4!J_yucW7GA>LQg({VLDgU_e)IKv^CwBKTKT|ElDx?`5tYTWU9 z8E3t2VS#N0@y(%cNhi;wQU_8QFQhoR;ADcN(?V2vn&jWM84zm4#zcm%x@>u@GTFijzzsl-<>moZJrwTyIJ%gAtw z;D0S6lh0*o$;hVtma)d##I<=%nBlb&FL?a|*Svm+rPdAnTm_6BGbtI2FVdVkaE5vy z{y^(MBK0HzN5}(`mk19$MjhA}9mDu0hB^>K|IfY__8o_Lm%+=6*auvKNBmm|BkvCl zImy1lXx0Y9Srd>xIM%?4|47ya6bCR4koh6Q0on(!F3g;;k|MbvDQ9^ zJXPZ%_R^0fbGK64ll}|geewB<_ldv6ds4Sm*eB@P-RVS~*Qs1i;ycE5r^vlcQN^%D zmBU8g@6&rN?0wfGDx34QNhQSG;GIT%i8&u%qrG1z_SZ8raU(N}qewO-M@vR7$2?+O z$sXKR#yqVG|ChX8!?WH$!E)~{j7LhyFWK}lS_jT49Y~{IGA`((1DXe@1LT1Nl>O9! z?U9L?5mZ2%&!Wxe5c_I)g**q(gty>D+aDT!o&F$>HL@tigW=?WP;x*pIUo?DiNE3i z@_>^A$OBFE0je&{IG~auxnQZqcAs(JKxYgfzQCOaR7~i|^N78%dzl-MJrK$LhsE}# z-lx`WaCEQr$vQV#>!fNu^!u_lLt=j8_a)cYwy$gZV*3*FnLJ|S`^|>;-of(=)bzn!bH?d;ua^1N4chhEM%G*hlY&Z`~XWOYMR4X<5WQjd*L! zZz#-(J8k_2F&DW>+;3*(@|d_2`x}}0lmh1RbX4$h}$(HD>hD53{~zt(|doFo^VU_NpzK9TyAz`P}y^Vxam?vo2|FXArPTNl7P z{AGB?zX^YG{;=??tPLknxb`3@lKEg5{XS9Cq4FJ`@;J&pSOjvo~rNB_9fR7-hYfXZ(@Cez0~qd?e0nHfaG=V z`P_xnL>y1fLP=~DeBx^1lRE^yV-LW0@D9WjjKsdQO2zSl`^~H@Vok{+=2&13N(Y1s zo=(kFI&d~Qo%pj3K{>@d@kBxzzgq@z&qcjG7Zxv(9C&+I!Q1~yct!mhUU9#Nf8@_G zF7yyqhb6Ek5W|{46!XCd_P~UZ1476F!St(~8{quVDB?ey(#|;|=@*l^A*lyR94H*1 zeSnYfztjR=tq4wy6ua-%P2=uSiUe(x3i8nQ$0Vphm(Y>bE}KgO^o z5RDa~k*o`bvo08hxxt}~1A;Jx^8*v917oQJBP0$a{=xxzepuIo>WI0X8+OKl_si^I zwTAZ}7~ODp^1tBkZQUd}zq6l{@t)#-#{AB>kN8V3pRB!>9?r?cU-~y?ErhI*k$hkJ zqmAE}zFb}B(SF|*@4IR|V*7%oZWXZ_yh zT|_A){`s)_EM>lWk2R~;iT!UC?>7V;!Sc{X#sqQL63M={@Mx@KPPmdafn{8ivWVF0 zx^S>#elP&z6bA%g7&%}d=ZK|8q>XyegB;*q3ov;=nayu?&+^Ii0hTU`^PMq(@V}!c z(2f5qxEC_H|7C6avS)#g`=zf-`nYA?j;vvleN`mxlevBA>3M{{U)JbI+$VjHODM8l zLiv5#zxaKf>oevf?@P?*&ifMcnYlZO_ng>E4bRQ)O$13VY4dc*3%xlN7 z7kE5|S!dvPmUr=<^+Wu?@=L7u+d$s0C;k<Wn03brED5VYKmS_TE%Zee zauU~&+AO88+1J1tLfoTXg_YP_B7TCzpi7t>vJyKuZ?!8rj`<+_*;GCl#k?Sr9Kf1T zXgE25bz#m8sQJM_&JB?RCPiL3Gz>>uy} z(l6rh`7(->c?ZZ|T=ymRlek~-mz-bl7w*?NziWP9>OCFfKH@LjPyD4HR_1r4M_bld zNR3x`-|6=q@xIjfbi6O~wXQiFRm*kYuj_Y7SwH`jcJK+=YW7ufx)|lV0PVqBXg07)|&{k}WEW%^4iP#qt$9oa0^1*Ga32cds zA_thda2Vr2$J`KgU?%aON|{6*P(FY#-RF9$T#dau z2blQJtuL7Pv*tHl)q5SjUwV2q_v?L^BHp|3)g1_c| zsq^W6Y~g-qu21ZR_f4)ZG2dzC_@|R&aV#YUN7FdRmdPHEZ01n8oO8`%oi#53Pv)^+ zpGO_YPAAV-ATEvAi~W~QM9|W!2wrv#!M)aEQSLz8BGz~FiYX-&IWEU@d6gWiDYcY( z#t1$6Ik^v%Z5oEyW?-mwCVp#s7av*g;}6#NaM|a19FCreqX~VnJbWM;{RSb_XCQ)Y z{Sav5-?p~F&o+X6>Sy5_`x<-_{;0$j^$Ylf+~z#~9;}V%&pa>%hnW)`WKOW3`0rs& zU>9YF)CGzEM%D&pZeW$n4RMZe5wV|7nMLfUQ6>}r@r(l`4;V@g&^~~9fbjvef5Bh! zzzPcS|E|;)FkA4~{I5r)590qFb}zo5#y4Nq@7^{wA6buV@KwJ@nYx>%gpYjg zqZT^#x?K=)J_ECsnj1cNG6v0022&7*Kpso8Qy$#>A_h9E}k9iGt z#&*rY2iT)Dh?uA21m~8IF((xK4-x;zSQFUCn!s-2FLmK<#9z-1g)=AJD z0UCet0gM3{2TC5$kM`fjI6%z{6aQM`Zt_5t2UzXbd(}+$R6aobfJ0RL?}mT5B|`E( z*=twDeoo&{-Z#Eq=6MBwm+zOHU+<3~alh&3)3sjB{Zj8SbGs()+s%A`Q(P$KCUAZ$ ziR=H81CW;%fDB4@W*~C21CgH_gd$>JS{#Ck(oj@agcAF3)YnCzsXh|TO;PCC9F1PB zF=%PdLTYhe1m_M#VEqDwY`BZC)wdDadmUC54aYP2HFz$+0{8N(DYZQAP9gSrJ(;7A zBkps!AJ_tn@mYlR_Cxp&pU?1x{Tuwn=R@4|`7!$Xu0)!BDiZ9I5N#iaaQg&=246r( z;vcDZ|AD~Vzr#QMJ^01H0pExh(KF;Q)%2~RR76#S2{PW(9Qg9lg_ z+)vpPBlt&QJ7o*!h#v3(>=l{I9+4Te|0xuS0me`y4-_BJpFTkK2$BODiGQ8d&OA{2 z0Kvb^YJa0LER%Vl;Q;1?9@Y-=pXdVD^2vTJy2nfA`N{pVF5Sd_;`^oMCwrX8{s!)I zJ;ME_k6Yq?!C%#SiM?K9$F+FT?0bm~#-#W_v?ll?Gtn0*Nq$I8_D5QZzrsE%BM>=R zK`6+j?N4=-($EZEXceE~WkFjYR0I zvk2e$BEqJgLKXGlY*ByWP3#M5@qA%D$0j^q&`NB^u|I7-eAGBHn*JqN83$MCQLEwD1#z6nui9%nuNl$Qn-6PtiN{ z3^qnjq5mpkO(2_bLZ-?I4gM!s7dlGp53@FWkhNjq0Pz7kiTw@-{u?Agj8eq#t&%j*D;{*f2p^B zCGl5t{j&C0=l#0oD{GWxJ%_vRH}!t$?NWIk?O*D>(!;-+v7g|-IwA;jqp7QLerQVc zLq?(cLiy!daSc=@F;{N%^s zN?!U=B<|df!l@H6m^(Wb1Nz2M;?X`J5iLDykx)7UAw5?kV*3vfNgjwCxD887$Ky_6 z4~6~nf_-5ty%%e&_M?}#l2%`>!B)oy(s2`&}{0#QSPsh2`a$ICyc!7Dz(`nhdCcyckCpcFm zHEY5D80QHE|3jQ7dW`nJm-fGl^TdMxR@(n2ii!c)C!+d8=m!M<+2jBd1B_EKKmc`< zc_2k%K#2jQFGS`8Ysdk*7OZsO({lglQn7hu_fq?ldXO9U%Q{l_d2!Dki=*yi@R$Bh z>GRP09V-0E0kSuq#C}rmm)KAFe#!f2`-?&YFg=pG8S9I>1Uu3aY{c4!LhSiCH-~kL zHr5Je`eEy4Kb$z`j|=AmaP@K^Zd?n*^{YX+cs>{xo({p&=fbE9VYqTB95=2<;JLez z)P*R#`ip4%>eW~tvybm|0;Wz*#Lz*>7&bT+ExlTZ(F8=yzkukyFC%*9S!A`Y#;LNA zc)qBa*tg)>{C4K*^B7C5;QY!Oevb`!)&DKr_xlE4P+kjo7b61pqAct>@-qI4^ztu| zRQ(Uc7JQ6oK8}e04U!}7Vp8OB9Ecx?3+Z*ZnpKX=8O6AiQNYK!tU+u1&l3ML4*XA2 z2ab{dkB|cn(f$um_7Q*O1E>Sri2Y^<{;P@q3X1fIEg%O7{?lpyk5EhAbmhz z+P{hcsRQ-w4{*nyG2qu_zF}>~?zJ8`@OR{Zfa^ z>1RmH{3~MPUqfN|CCrQ3j#DZ9a3!k=H&{2gp2eC#Rw-+aMZ`a!9KgCD=OCU+%cKwB z{1D|ddj@=imXcf8wv}z{KCnwp_>lvR|p}Z?0?p zvL;>D?`!;J4?fu+Q}3%dF_8NigtIR>#)kX^D{Y)YytA{|7uMT`C5wG<@PH3apR&`= z?by59m-umCzR7;XNqC?Bt1b`&%Yrbmi2aZy?2E}^zf^V%4&<XZH#Gs9*7LceNw|5Px!@Jn+xKN)>ZELp9$AX2)-i}oQt+R_xd0UdcE+Fm zfr5Vv`@;cyTn> zG&QhpRYuBA+j#DPT4_c7-`!&=W-)vw3ezN1%5dUdXH9#7_QZ)9euTK1QT#ddLwpwYHQr4991RU$qqf&~D69Jt1%)3XEA@}4in@V~ z@hfpYb2RgazPOX$%CU*~*Af3}++h9i25ZRIIgfCKb4iyuhiveFI*oIK>@RsTh4aG{ z;eZpw|ER*BK7jZ?MjqJ9I6%b!n5N zcG`Y_N^k0b#$W1yzRUsatO3|1{zI8hz)s`;oiTu5Py3hOHWd81mh8N;f5!e||AN0W z_80!A-|rj9y(uEC$d9v--z~_=wqRg?3pQ`G5OWKCv0!e)mQ6PLclHAg;$CQV+zW;I z+=_V4`^R#`eb1CqztTIlZCTqa&Yf1>%F%Mv2Ak+CXDZc+EJU3vEnAO=AK91 zpq&_4LF{8UV^-8o+=+Yze~bD8KPmYK8rr@^UC(b(R`EFsGu}Z?>Lwh z!FaByAICO4ThN2}v#!WI@>XsoZswNbI_t?&Yre{Pg)5v_yp+i~fs8E1fYe9ofN+4q zKZW>93@G^12OMG?Ao%YS{3Q=$F0hrg0Eq$Du@W!W)-n4UX`eARJJYiwXZlMpiV&N2E{=S$D7^y+H+zvSrA6Z}ojhRorrIUVA!>bk7y z-Y6@=p1ygQL*C!8HXrBD6*4X?!B1ZL%<)0qa5K1Giv!j}4fexC0B~ z_v7#JtnoDd6HP<^N$md<6~!N-DCIRwO1OY0vz9Vv7>9esgDL%Sx2PAMEo`PV;!Z(# z+-5#`i?yVitS8opO83RxU6#nFZGt`08f0V+1HSu507+?|cpU?S#S)3D^Mje<)9Z>kQFK7tYj0~U-^rjB9k^|iFucQtz z|3{h4|8_&cU~5-{zo$)czw!MQwj}$-YTa^VfAh*8GXTte+PAWxciFFY7L~ z{Yzh$*uU=U5d5VtSK}{zJkrC#z71k8^Y=2BC)lgG9MG4*xa@9{l;Iq83}W5hpE zU3VWPslUY5)LpnyI2$jNj=}S#Ly7$W+$-sW=ZagY15J3gsDXM>hi3|iKWj=iSyR4| zTS6iJIYqdVP5e2}?8IMU05|+kNDe?BAa$TaH%U#(843RLzl*gNV! z!v7)_)=2qHhIh)m^!|f_e_0^+->>w-^l6^tb1&@M>xDhLys?^?&m3vR*h1ES!x{ev za?Y3g8pwW$vKP{7wMUEW!=&+-y)&flyN~N+5772y9i_7WIEVeKwOAT|S%V?H_|lJk ziGA79qbdD)(yOI!F`(f+Oei~v%asf9eEE31 zP(A|Bm$lS%o|JQd13QfZ>(Hk!JM&Hj45aBFP3xuL3;0Hsr}Ao z{wM2s&AgB5?^pIO`)tWROYHBZ-HZJnjA6Z>_AhI##r_Td%i1e#|9TyU^yEulw)Ey| z{KfXAZ%1t3U|&l7Wj?18&(Rj2liD6_^Lk?g_KvN`rj-pieWDdV{!wrI`(NAf<(H%I z_1BZ}*{AdIo0o6lAG5y0=l#FKEB!t|U7tfJ?YRf}10O?s@9j9=vI2K1M^O(3Q2O9r zSsR`!CH^Iic(%B^#-I9jyRZ@(e{w*639ix~T_HDJCI?*P=e+ZIsQ?vBW=y{yz#UI5)hQed6=k7cwg(0@K(V zG@0u~#<4$aB>O{$PzL&kptoNznz@H&y*&ukK7p*6k41%@b0@^V)av_TMOa3n;BQ3N z|F!*hz@N6?C!h2Eam@Qg!t`D)^7}ca_A7f|%l?M4$DQCW`&|kCvge8Hg(Q1mDEsHW zD6&U}?4Kg|AK*G^vHzpA{o`Cqdy=uA_wk#qL5G_lGc7G(8Uhm4*Zu)1k6u2qe|a~0(N za=vF7@h>C(CA9xy+J7dFsH^{OsrW9nLTo ze1bY~lJ%hD%m+38$vDV)f&H8p*d3dIM=9H4;;~8a=iKmW>cDdLg)F8lpv-1}&@`?W znG_s}agwKe3m6rnLW;d4JiHU;oaD!k@X{NbXrTj{B6zp2xD+rM7?K&)T2N z`#SMg{$KBxpZcdw|8zPlg!yB*hBM`6{N>DaMqDXyN|gqxT4V0hUnG>`c&Jn_!| z!dstxiy!>yQ;fRx4vLoCKwj@H$nHt}d#pfu^KuMnTZywRvvIeQ_Fuu+Pw+3}yiqAR zptKgZsRK8O{|&*vpbS^316Rlam)UD_i9B$DI`92afCeZ zIOl~9BqU>Bd=mChc5-dYwiwnmqT{hHDjut&;;@4KL5sp;F`qImp#-C2^3l8BI+P69 zi1D(U~)f=e_SZ> zXV0h1{Tcjq{4e;+zGSjzspS6(e_}8AEB-hBU*WI)zr=qX?4Q10$A8BDV_o*2$oc%F zMCSgo2GiiL*W+9vZ)*H?f3Eat-eR3a`n3f6XNmn?=HYkq8;O4lIiQU`fY_I`6N|~% zlfpTjluekPvI8?R_F{U@;}}r+N7T;x7Z%?J-umcU{NddK2} z;39e8JbB=0>g_q|z!}zqo}ip$zvwaIe>f?P_@}Y{k&1l@DcBvKj2&@F*czLJ&9TW? zACrV->>r&~*p5;C)}m$bHsthLg#e0Y={R^c%!6gwRoIUI3cgq0M&!+RQE>E^=-zu3 zy4wR$;}f9pSN3o7d!;U;m3=@C{+IZVcCYpl}w|b+{wPky5~>U_vyV7WltR0H%<0Pkv(%{&kPm+ah{Tq$MznL7MvA@IhAg5AhVM)|#Op4fuDKXnI zEq)JHC7;F*(|?PJeZN8VVxZSn;N{n8|IeSp!Ts~_qgS5A^*?-s!fSs*-qhpBX7yqPWyM@FZF-fn^=A?QTDCY zJ--@%-SaE^HER52pR;9@RovfX9rwAAy|A`&-vj0U75=RC5&uIm6931r=O>o=AN@b= z|BTqb8~zs=_i6mOE=TZJz4_9kT|)may_%KOfm+&s1M%-c>4`ge16XgFz_^KXdcmtP zF=PWKhi%2w$X$3k=7;z=;Y+-k|2fJg{0k+s{}(DK%Xj}LYsky6VBRd&uO{M+w_n9i z-}yV1-un{@7e0mje#__&=93HNAgyUOmNn1BMe4va)h)PP$r@lq18z|dZj{#HI=SE~ zx%l z^z!FE=Ds0lWDHnK>^tD^6L4H%?-u_#@uv>7g!GsC?*YNT(p&bOW&Mxh!r#>YrRSUY zllwLP-20sIpUeJ(9DRSX7q8wcQ}#sKMUj1SWSg7*I;@ju77 z_-WQiE-*g2NI!Xne0ha7bB%KK&sj%4k8I_Jd~ab9Ev z#s{urjJyRiLigb9i2uN6QD5PmxQ|fL=UWs{{uc_yeUGBy|HP6<-o%;dEYylY@hKz>;K!F_zU+72gn*AVsA#S^&ehkS$o4Et}q7xf8hDn3K`7~($qd*n0k8&~yr zTxr;VlWXQ+&GLzuJ!>S^uN#8*{xXO<@G{Q*>fh1*?t7>@`U*-W??rx}`Q(Dx9GUbOj*Q!lgF`oB_lWJ-HsuIbj@g6p;}2j6{Ym|lV@T|~ z7QO>F!KZpEY}x%`i?4w-z8Y5Ax~=az_^@x$_sB2ccj=D^pq&R2bHP28zPlnG_ z7Hg{$Ffl9ooGMWew!ozYhVqame{-Sw|`&e8?xBL(?{{XhvER;|6{Nh zJ>a?zng8XQKQsR)^FJE@HtK-`zbS8ikZb_Nq5fxMs0_4(yYU!FR_G;eX~g2w)5sNc$GdMWXKf z1!asyMv?<&One-3G8!?Rd(l3^bwU$D<1jin8pDYFpnx#+^$S58dB2&qU(dL&mU94A zw0(#D6aTOg27l%I9r2&L{g+$(2kQP0{kvqc@38cL$?w$Y{tv-le%r`_KYhSt?pvv9 z0K|U*_cWCK?F4_>2UqsKlYQ`H?-SV*OZGz9M>#aGt z7Z@iC{+HQHb2X!gk1P2eT$35l&X{Br_nw%@Imu~^N#v)x>`up0AsN^V3FQ)4F!doY5bP z7x!b$Z~(sgY8~GH`#ae9n@`c}_0Q4c7oVW|>YFHDa}7DeHzK|F0wlN2LwwULM0cNt zsG3I*Q8f`^Wn&OpItsys>_yBQ#NNOG@GqYTKiaqdtTPB;UsB+SUn7t_9>mx!h*$^R z{i_L!vR7YXpZ9`$4S#^kx08 zC+mMbX#4f#epl^J=Kp-ZF87aY^YEhm3-3F`>Hnn;K>KI^Un%i-^#03lo6B$63jX}9 z4(5Nl|4ZX9zhf|t*vme~vahx5YdfF#OAILZuciq8vhS7PFMDAL{^A2}5hh`bZ4oZm z?%@wUf5qSIpW`#%uh_fwHQo>S1jmDaz&?(fsNtMm#l-(XF(r@lJQGU)hATyz@j~Sy zJYP8t&)1B{-5w)wbj<*4-qZ&(XZFUmtNq9UgIF^>fp`D*0p`8&1^WH*OSDqD|KMC5u8wH{J--3X8xZsfbszx%Ppa- z0bBSx<=XyL4T#vQIY5q51CTw+WpBz66o~=kHw|PTTb%>QZzTnB4nX$Am)}YVWeg~L zqH@1v_Or-7ID0v_EqkKK9ytns^1t9O>*i%|oipr_7W~gKFFKi!M;@u-dbb9yXKiI% z%DG&w$!xF;!!+w^T(`c6H>`ibUu_@bBins^V*e7K`hJN&_`i?tfqPIBd<>N}U!rX6 zzfj1SKX2T>(A@Ynp3K?KdhSv@Uoji^DktGy^=NXyFkI?C04I;MVfpf&ShTnoIiNrB zAAT91P`B$GI;g_Ex z?&qH%_LWZ%^V5$I_40>^c=2xt|KSG+yZ64rKaTyYg!nr320S_!r! z=3-+)HrB;wVpVJ!mPMyv5!Z~*Ujogc&g`cT6mRPoPP2NxOJL{kEw(SG_+4^^UVEYsw+VA62;{OxB z-=mg$rd1OE((DgVG~}PiC;r)#lD_|i6L~*i9e+9TpNo6tQ*f_h4DMA8!@ZhzJloVC z7xr=;$i`;OnAwV3H+wrcU?lb6IzIm5W32o0*XT>^dr)fL{ZEuq3aAG;Z+(pn>Ot!7 z?jwo5B7u4k`*ZdR{^TP>{^)Or_`wILc#icY^1zZ~uVOnf-!ph4_7!q(;nX7ROv&f^ zha7B9$i#-YboLpgU}bbNmPRIEA@?|)D|>~6MqvtT{}WmJ9~%_L{=^Wp)9(9`_j_^f zx0!a|VCMcgYTwVff2;2sRnhs8hW8Z@xcPq*1628>a_yh>ve>`uEo*u}8i>2(04fF~ z{t^S27;pmde}vdimmGljFQEO)Ue~hM?Hb}Qd!22f$lh0vvY%l$=d@%W4A~P!@ITBs zucMs%I6?b=oO^n#4C=u?vnphA@1-p6!IbM&i)ydFSm(7L&wKwIuX8Q-Z@k~ZFD!q+ ztJXL1w)F$NXa5NQ?*9qS`~48*err(@uoXp7FCnk(J7kai7cxhEkMsfmjorDw;oQw? zJXbQGIxv;>{Bf-7565$r?Rc(+{o!?eaCKTw9NgWA<;$9|Vr47-^5;JI$9?*Ne~h9I z+{LT!e2lGceu-JM`@zJ$j#BZ~S15V&D-^tOAEopSwXc4P`k#G_5#;tc=YNm2kG+gX z*WJd!StoI%ej*ODZgnuT3&>b|>fJ(WESF;!;`nOUCNxMDA&qfF;C! z0kNOMy8m?6{U0IrRF65j;&t9vD51$ z?t1J)0VqRe&qKnyc+Ra{3P*39FIMKLf<7Q@MC=Lza5#ypCNtl zKan>4d!!8dZ>%W!58N(T!};5VlzN zPrI)n{*~6Iz?SB$`kYyipsRPVoZ`vaEDK91d;se&OZ)F4fS2h#>ZJfv6$#srqzCm&YjV_k0p}JYU8SxcAO2ua~(0(rrBEeHM#t z>#;Ft5st=8!?o1;%n1ik#&LdZF*5B7kuK|W!tWua`CBBn{}V}+A(dZn9%eoJb{0~I zeep!%Ka%(l;XF=%&gb-IO}{6et!~A$-J5Z~ZzCSvQiDm8Yq5TPJ^uP$4}9@?8}5J6 z7xzCOgdZOtj@zR~;zs*OTIUMes=hc^*$YpWw&024Mx5fj zYA>cRhZJ zi=Ovz(CaBI@!W=)_9@II+87hoGcTxRO+eORHxv8b?6aPSL4k9TXlJjd?{dVayo>nW z|Ajbmeq8If2@X5#B$pcOF1ugjf&-&oz@P4@7zdx?F^~dF=zPMQ52N!C4;c3sbh)%9C@D;e@84>>gB`zAB+!>bs+MabT+O7kl(JA-?-PmT_?X+ zGKw;e_AeYTjrh-^7!Fv*UbR*1SzF7`zmeZ#3wdlucn)?3&&De2I@EUSjRgMI&i`)i zJb<*it~?J7qI05~rpb-SsTovoUxrRvmu?|mQLUw{Aq3HRJ{ z&mG-jx;fYK^XBaq-!gYvU{_ndV-B^vWVZ00=L#2KCu&$D7(`A$Ie;qWgmvt_7Y9bb zfpOGTt}?YbD^16owWdSPbM$}tN7DiPJ3Rc)<`H!NwZ5Cd|4Fc4g3Lw0eh@kQK@(ZS zA7|dF9L-wZNb?T4{5$o-%sWFH&Gk7A)D%~n`3q{y(Ia)#57nFB{nKD%i21wUu>QAx zjCu3n(dP9rW6W!fqs%LV={ZzC0_+>j&B`I>`oMZ~t)kXkp*HMA)~heEZh3*+|9R%K zXPDQX?AjCE7xoXDgRJ@OW8Hr@y#RJ%7q@}^7Ift)?BzOJ^VNo$57qoo^9A;wqwaGi zb)VCy`I`j(*7k$FVn6x*MBNv*zhHZq??t+AxuE?Y&hESUUosC|Fa-Voy?V>*+$r^% z7yj}A$^*y;*m)p(O*9W&fDL#I{Fh?`v`1|%wTT<~teg4F&%oQ~s9V~N9XnDo*<8wd z!EA2%Ja)dnsZ1Mgj<>jK-f8h2^Ys>Y&1>lUv6ffN(;3g0?X4#e7qDhVTyzs3d5ak7 z^WC(sO8vLkXVbI6+JM)4j-r-ogXu>8w=^5cJ7G$z|C=ct_a`eGdVfT1=9AQEE=A@N z1I$3CAQP$G0efn??qH+uRQa{MT55V52AelWG?=4LSDM+gA2JIUR#HP)N&QHb`Nw~# zMrzG>Z?oTL;xO}tQA5qELx+IGdBj+m}{*4Tw(3!CDwp1v-Wq9wZHS^ zvd)41Y4(F22m7O}`yXb_e?QpoAr{&N_S^A~&w%}Au-}NyT*LSG1mELwTk~0D=G&TI zXZuz2E!!{rM_S!y-w(R!d_Q}?GqQePQ_!I*=(~*pr1!G_8oj;;9)$b)tRB7=G}Q;_ z9HKE9I=7bEe|}Ho1HgU}pJge0R3H1*;J<;-y9r;lm3VbK{_8~18gnD(WzJLC!}(eR z%tpp9r@e2!lSUpc?R(~Gi?__d%wzOeSiroXlAHjw^7zJUW%Sg61H%8-gRG@9SCS2Q z6&vsxd#=9FbEG-jWtVA#?QfI)gelIyY)WeXU`p`+CG6oi+~Ym!vzHQ#K6yk|4!l};lGu6(k9|1>Hcc$=SuKj#`n31?{yyd&qDVf z;k(wJp9x?;CfnJ5_5P6V*D>0f|ID1b4P9yqEdJK#%Ln-V-`@U*_+Mj?VR?0|1!tZi z4)F6pcNV42q|}*Y;}G?pa`OP4W0>cB0G~@|7_7oKt;0_}#XMy*^VOrR*N~gNZJuhr z7oEpGrrj~$OZ$Zt>Hg)cTjm%&kWRI)ARoZqh)(R0!Y95&T;w=F?Id&KTMtr8(@p&s z)pvz`mOUEaKqIwNdrjx8$4pVy3R6^g-4xaQ-V~4gAEu1l&)IHQ(Eo+VEb4Qo!hwm@ z>y9;V4;X2_STUTMy`kpqiow+Iu#e**aIa!7Pc`-2b=a6mRc7;|0cPsde&(^q`k9~p zxS#p#Kld~L<+J|gHy^VewYbW>(pYI;Zm2}}A2K%|8f0!%3^dmUl!N^Mu2%n9sBf4y?pSt!93*fgIHy{P(4-tDLL8-7HL7 zYrc{81M~B=Uz?w{_#5&#@0+uQ`^XDc;N$6u(Lp%?>Y~B_68K-n28aXKm>*s5+ShZS z91aY^4phSdbdOk2`rk2YnJLU#VhZ!Gm_qjF7P4orPwnr`#qO7=$)CgCjA_*8PejI2 zr#lj9q+XA`Tl58ZtD+vMHE&Y8@#Y}*aaC5CH>;`Tti=vJUT)^i>SHENf`iw3n~(pt zH|vAF%xAypW8Qrce>7~Mxm{ObZdT!|1`YuG{$StFyx4~tk6yja1?m^iTkN}|``y8w zIzMt9hsk>h`+ejUCF7I$$96zmpa+1(I-dK5dyO^erDfy+mL0m4# z+W>x_`Vs5As=0iYh4`W+#H1_8OFT(ldSgMkxsmybS)8`stZly2yx;t1=9g*z$$ZfA zZ_J&XubUHX7Be3#V?L;JoXX$;xd7te^N8$#IG`SSFEKa18gZaM@jwL}Knx9_Evedzue_ z#6Gl{1I(?O{^rI*^#7{p2ljo4_xhO2^c}otvG0NI3wvt(Sl>9tTGvtVKM4N9eh(tu z-%eg^E4V+6Yyf+!`{@1S$P%z$fM1;p{xiW}wto^am-hRPMx^`B_G`Zv{XdcF%m%K_#= zFJK2Qg8wCQBI1C0>Rm1CgDs$rl0IuU9~{Wu`YJe3$6mUPraO6`yv#W!Klgyi@Avnn zfEb_`JUIX0Zua9%Wlz?4WE4V;M&BXS=~JgezqdE2AAW=S4AtztUQS=Xa%wj#kb&&u ze5k^_T3K$6&+2U+ozmTm8rj|4zS+(E^{={_|M1rjn*aDw5A(%s{g~(XWvrRbNH;er#YFmzj`%&;e#G2Ou@}7G;bTGTYeh1iF-6u!73A?|JyqVMe zB6OdAAILoLpG|!ID6!U5bWOH@EVg$f*h}{n_sRBK?7@bd-_;cCgY8d@7I)@=ssp#W z&vnuU-~*;%16U7q`C!?Ap{?9mgk!KXAb4B;J=VH=q0R0Z^#>Oj;5bA z)0;0b-)a7V`BmB{<~tcbF((SQk`G|6%R1&h*0T;!(|VZt)}!P+#DP;_e+D^c?SOm% z9Ka7;rY=ss*RPgQL&+M+b!@;5)&*~Mt6@Lo1~W2m1O2zAo80V8^kMnbGx)3N*? zu(zk!i#d@!*`tw0_GQt(vrj!zON~BtdVMRIAF^kgI=$Cax7{Di2T;3Rj#LaVuVB-! z4)1GL&+TT04(V!EEbnT*_ua1SD=IS|{fg^%*wevY)Tx#Kc7GMQvlZk~mLLnk|8rn3-B+&% z?e*7Q-_hVdBIrJNNcR=@$@Ww4F)fPqjZZh`&5o!)*Aal|G z6}h$ML@R86+I90+&HvVXGxM(5Q81UBU`N&k*waFf+a0W7?_y13FKZh%F9Zh;llM5v zC=Q(R9B}afd!<+x5eF`*k5(6PpdYpX-7Fgj7pAi&euCb651X9KM@&w;ADA3`KrZrZ z$J^9|lAGx{45>$I-~)A;^yzqoeB8^_6$<;8nWt&5hTX5xmmdFp>Fe8%y<7P6TmA9p zLwcEcW6DfbC1(#T?QGutW+(QRbuvHwQD^hUKI~J!9_07v?FRPe*t>j&J&YE6YFnlE zN05WmJ2~v>^T-;wun)Tb6l-KI=3|dP_%8?h$G~2Ge-8Mo&(AbOeqa4QlYU>lzBK3a zw*R*^`K5KP*9ZD;eSXk;ANM8jxB8#Zedh-p_Ts?c>;XC0fXn!RKf5(SX9F}B&{=e2 z!Cz<7>3ph3sXLlY{n3W(MdsNS2eJD*V|aj+QE9} zE^-5V*yE)Bmj_wvupGb+oFEq_4xGjpoFx`G&z#@|IB>C3%z>Bat#zfW9Q+5Ft?iD} zckxkVyvZ*5vdQWFnU&QYzslb0;q1XBKhuMGdXFmedDh)-_aufS7kiu9vd@#3yUiT^ zc5ex}CiWUyVZZqe2|oQgwtZ(^S8PBhQ&~yv>cx)c+wXNW-+H%$dF3>{{>#C>m#}9) zpT(Y-2JEfgQ{yV^_oMfFI(@M&@a zAuqH8{KbL2;sE*KgYZBcIOgMlldOfEW?p!fy%6V#1uO@!0hc=WLWsAz^rx>{g*nvm zc~iptKbtcCX*igXn#FE)1pr0{cP98{O*8JiR;fHP+s4f&DG|^xPyb zceAI2Tw_o0CT_pp%gHtNo?q*Y;MdR7Z*tkhPG-P>4ramp_S6ZsGvEA1JM;Ey9n1?8 z_>A-?K11(j~4+ZS0ecgr4-yyvx*4t`*K0RK+eJwg4?EX^LPZjgc z_qsn_y04fIpC4lWM)dujn4djf)%ooPCjEY72R!D%|BDNe?@#!A>j$EHmlK-MW+uHM zvXl=Z4$ztq{d|yN;6D=l6$?(F#&`<${}F7!Q|TMbo#x**-)i+EVnO;jQk$yzz?y;* z)`#(P*F{jABRA6s^hPfcT|ADc^Mlj*%u%{swD2r)yq0pl8tu=NTx0KndBs{_hd~?%LXdNdH|QAo0Q3|9Bp# z`!xIjwP6FP4f(7Z{A)c2hG;Ip?;n-UIpyI0FtrC$!GCqe3iA2iHy5*CA}`4NmHM>h z$P?rQbjIB}#N`ItUYRm)0P9oSM*UmPo2yK z>ZC4GCwIQ{1T&LdQdasA^~bSb-e!wQlUgp*P=E z*5IzP2j?oahF8hWSs_<*MSHZ_gCOi*B8GpF@e)4$BDVc(|1vXYPJMn0<{0*yp+*+0%iZRp`F3-%cH*^nNqgKSgbno9pr2 zfcyz%Q$7ch1csJjt&u>Q7uWJk1N4hWjZZQUTH~Kk1 z#07l3@JCW&z@YmPH^hYpnoTH~#r}}&o#0O#z&SIr0mJ~Z0nQKTd{TOmVgnw}m}lN> z^>rHy=={1x$Pz?(A)RO8I8cNgC?-Elk2BUdwvp@J0SAH|P)sNe9Ksif18#oEK6&y) zr{KV8YGlr02hLF=cfJ!jwob#%x{?#7IK6?s+apY7(br7YgPf(*<(KrGTuslFLCh1% z5&Q+Y#Fx7EW*;_jJ8Lml!2Tuj^4gaz++Rd4GjG4lyzLS({6#Mp@ayO4PqL?XM^o3g zt?AQ;y2b+~<}2^Cp-*8O^NqKtZ5l!kCv;xe@59&c0r%bPdEROLz4RXJ(fN(&{CZ?H zc3;@rxgIuu5xPH*IttD8W%un|AKZi8AMSNu{XMPjvnErWkx752ysfeBJFJ84Z^{LG z2Bgk|vly!fa6AvR`tLcAycP%O5z!qVK#zzF&c<Txd)Yz-X1ALv{>osG5+{B2AC2M%Kc zj#3kIjCkOL=fEjAaGE-~GjQNsr{3(D-(@;vJ_-JHCX+mHCiB2d&Q*E3-C_EzRp1Bu zn@h|cE|W{T%(~KL)?hEQ|MD{HF_*~8OD>X|zet|$BKevN$P3KfB`_09oI=Of zRpJABw=v_!7Mq(lis?I5WZwOHvAMk;+hwt*moIw13*2|0^V`7PVsG_cu|BpC>{mtD z^Btl0^T0hB@5}B_0RJ(>dXe2n@9VAZTkJLGr@w2rjv=l~`uNmq`2_Snh}ZvA8{qg5 zu($RfA0Up%2GApNlZ^w21vMXNzz)a{G{S>X!~x@o1I2;K$fM)~W+FPfZUOjP4uF4> z19qJV{F5Bedht#~9I*ZX9vpxJ2gwzbN4xEAmr{TcS4l7J`-hR$osNuYY zXH7=OpIZ(rE`0_2Fo1q*ob5$@(|=svw2|6G-o zM{hSjr;o;9_uc5ue?;eP9N;;SV(Yyfu+Ng$Ar^44U|nXH(&|>3-*OxXet)*hpm36ZKxY#%^2B{umyYZ2m6^H9zYI} zFLXR$egy}PbB@Bv4&CW7Qbld_63*D+Ou&p8w EmygWYcK@FKYK_DQticjDo+poR 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 literal 0 HcmV?d00001 diff --git a/SMCode/SM2D/Controls/Mouse2D.cs b/SMCode/SM2D/Controls/Mouse2D.cs index 2690cef..fcac15d 100644 --- a/SMCode/SM2D/Controls/Mouse2D.cs +++ b/SMCode/SM2D/Controls/Mouse2D.cs @@ -28,7 +28,7 @@ namespace SM2D.Controls /// public static Vector2 InWorld(Camera cam) { - return InWorld(cam.WorldScale) + cam.Position; + return InWorld(cam.CalculatedWorldScale) + cam.Position; } /// diff --git a/SM_TEST/Program.cs b/SM_TEST/Program.cs index 0ffc516..95e70ae 100644 --- a/SM_TEST/Program.cs +++ b/SM_TEST/Program.cs @@ -3,8 +3,10 @@ using System.Collections.Generic; using System.Diagnostics; using OpenTK; using OpenTK.Graphics; +using OpenTK.Graphics.OpenGL; using SM.Base.Animation; using SM.Base.Controls; +using SM.Base.Drawing; using SM.Base.Drawing.Text; using SM.Base.Time; using SM.Base.Window; @@ -27,16 +29,54 @@ namespace SM_TEST { Font font = new Font(@"C:\Windows\Fonts\Arial.ttf") { - FontSize = 20, - CharSet = new List(){'H', 'i', 'I', ','} + FontSize = 30, }; + font.RegenerateTexture(); window = new GLWindow(1280, 720, "0ms", WindowFlags.Window, VSyncMode.Off); window.ApplySetup(new Window2DSetup()); window.SetScene(scene = new Scene()); - scene.Background.Color = Color4.Blue; + scene.Camera = new Camera() + { + RequestedWorldScale = new Vector2(0, 10) + }; + + ItemCollection col = new ItemCollection(); + + DrawObject2D textTex = new DrawObject2D() + { + Texture = font, + Material = {Blending = true} + }; + float aspect = font.Height / (float) font.Width; + textTex.Transform.Size.Set(font.Width * aspect, font.Height * aspect); + textTex.Transform.Position.Set(textTex.Transform.Size.X / 2, 0); + + Vector2 fontSize = new Vector2(font.Width * aspect, font.Height * aspect); + + Material uvMaterial = new Material() + { + Tint = new Color4(1f, 0, 0, .5f), + Blending = true + }; + + col.Transform.Size.Set(1); + + + DrawText test = new DrawText(font, "Level Completed") + { + Material = uvMaterial, + Font = font + }; + test.Transform.Size.Set(aspect); + test.Transform.Position.Set(0, 2); + + + col.Add(test, textTex); + + scene.Objects.Add(col); window.UpdateFrame += WindowOnUpdateFrame; window.RenderFrame += Window_RenderFrame;