From dd1f08d959271dbdfac7d38504bb6ff838660afd Mon Sep 17 00:00:00 2001 From: original-s1n Date: Thu, 29 Dec 2022 14:32:28 -0300 Subject: [PATCH] Adds sprite drawing example --- examples/sprite-drawing/Cargo.toml | 7 ++ examples/sprite-drawing/ferris.bin | 83 +++++++++++++++ examples/sprite-drawing/src/main.rs | 154 ++++++++++++++++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 examples/sprite-drawing/Cargo.toml create mode 100644 examples/sprite-drawing/ferris.bin create mode 100644 examples/sprite-drawing/src/main.rs diff --git a/examples/sprite-drawing/Cargo.toml b/examples/sprite-drawing/Cargo.toml new file mode 100644 index 00000000..2bda7898 --- /dev/null +++ b/examples/sprite-drawing/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "psp-sprite-example" +version = "0.1.0" +edition = "2021" + +[dependencies] +psp = { path = "../../psp"} \ No newline at end of file diff --git a/examples/sprite-drawing/ferris.bin b/examples/sprite-drawing/ferris.bin new file mode 100644 index 00000000..f2693b41 --- /dev/null +++ b/examples/sprite-drawing/ferris.bin @@ -0,0 +1,83 @@ +ddeddddddacddddddddddddb]\bddcddddddddcdddddcccddcdddddcdccddddccccdddccddb[ddcdcccccddddddcdccdccccccccccdccddcdddddcccccdcccccccdccdcccdddccccccccccccdccccccccccccccccccccccdddccccccccccccccccccccccccc`cccccccccccccccccccccccccccccccccccccccaaccccccccccc^ccccccccccccccbbcbccccbccccccccbccccbbbcbcccccbccbccccbcbbcccbbbccccbbbccc\ccbbbcbbccbcccccccbbbcbbbbbcbccbbcbcbbc[\cbbcbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbb^\bbbbbbbbbbbbbbbbbbbbb\`ccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbbaaYYbbbbbbbabaabababaaabb]abaaaabaabbbabbabaaaaabaaabbaaabbaaaaaaaabbaabaaaaaabaaaaaaaaaaabbb\_aaaaaabaaaabbaaaaaaaaaaaaaaaaaaaaaa__baaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_`aaaaaaaaaaaaaaaaaaa``a`aaaa`aaaaaaaaaaaaaaa`a`a`aaa`aa````_`aa`aaaaa```````a```aaa`a````aa`````````````a`a`````a```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````^_````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````____^_VW^``_```````````````````````````````````````````````````````````````````````````````````````_````````````````````````___^^^^]]]WX^_`_``````_```_```_``````_`_`__````__````_`_`__``___`_`__`_``______`________`___`__`_____`_____`___`______________^^^^]]\\\\\\^_______________________________________________________________________________________________^_______________^^^]]\\[[[ZZZZZZ[]^__^____^^^^__^__^^^__^_^^___^^___^^^______^^^^__^^^^_^^^^^_^^^^^^^^^^^^_^^^^^^_^^^^^^^^^^^^^^^^^^^^^^^_^^^^^^]]\\[ZZZYYYYYYXY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^YZ^^^^^^^^^^^^^^]^^^^^^^^^^^]^^]^]^^^^^^^^^^^^^]\[ZZZYXXWWWWWXXX]]]^]^]^^^^]^^^^]^]]^^^^]^]]]^^^^^^]]]^]]^]]]]]^^]^]]]]]]]]]]]]]]]]]]]]]]]]]^]]]]]^]]]^]]]]]]]]]\Z\]]]]]]]]]]]\\[ZYXWWVVVVVVVVVW]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]][Z\]]\]]]]]]]]]]]]]]]]]]]]]]]\\]VS}T~]]]\]]]]]]\[ZYXXWVVUUUUUUUUUV]\\]]\\\]]]\\\]\]\\]]\\]]\\\\\\]]\]\\\\\\]\\\]\\\]\\\\\\\\\\\\\\[[\\\\\\]\\\\\\\\\\\\\\\\\\\\\\\US}T\\\\\\\\\\[ZYXWWVUUTTTTTTTTTU\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[\\\\[\\\\\\\\\\\YVZ[\\[\\\[[[ZYXWWUUTTTTSSSSSTTT\[[[\[[\[\\[\\\[[[[\[[[[\[[[[[\\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZZYXWVUUTTTSSSSSSSSST[[[[[[[[[[[[[[[[[[ZXR}WZ[[[[[[[[[[[[[[[[ZZ[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Z[[[[[[ZZZZZZ[[[[[[ZZYXWVVUTTSSSSRRRRRRSSZ[[ZZZZZZZZZZZZZZZZWS~XZZZZZZZZZZZZZZZZYTZZZZZZZZ[ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZWQ|R~YZZZZZZZYXXWVUTTSRRRRRRRRRRRSZZZZZZZZZZZZZZZZZZZZZYYZZZZZZZZZZZZZZZYVYZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZYZZZZZYYUQ{Q{XZYYZYYYXXWVUUSRRRRRRRRRRRRRRZYYYZYYYYYYYYZYZZYYXR~YYYYYYYYZZYYYYYYYYYYYYYZYYYZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXSUYYYYYYYXXWVVUSRRRRRRRRRRRRRRRYYYYYYYYYYYYYYYYYYYYWYYYYYYYYYYYYYYYYYXYXYYYYYYYYYYYYYYYXXR}OzUXYXXXYYYYYYYYYYXYYXXXYYXYYXYYYYXYYYXYXXXXYXYXXXWVUTRRRRRRRRRRRRRRRRYXYYXXXYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXYXXXXXXXYXXYXS/JwQh2SNxXXXXXXXXXXXXXXXXXXWWXXXXXXXXXXXXXXXXXXXXXXXXWWVVUTRRRRRRRRRRRRRRRRXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWXXXXXXXXXXXXWXV*Dn6 +FB.MTWXXXXXXXXXXXXXXXWWWXXXWXXWXXWXXXXXXXXXWXXXWVWVUUSRRRRRRRRRRRRRRRRXWWWWWWWWWWWWWWWWWWWWWWWWWWXWWWXWWWWWWWWWWWWWWWWWWWXWWWFm0 ML. +5UWWWWWWWWWWWWWWWWWQ}RWWWWWWWWWWWWWWWWWWWWWWWWVVVUUTRRRRRRRRRRRRRRRRWWWWWWWWWWWWWWWWWWWWWWQ~WWWWWWWWWWWWVWWVVVWUSVWVWWWWWWVW(Ak4 +EMMHP %NyVWWWWWWWWWWWWWWVTUVWWWWVWWVVWWVWWVVWWVWWVVVVVUUTRRRRRRRRRRRRRRRRVWVVVVVVVVVVVVWWVVVVVCi9ZVVVVVVVWVVVVVVVVVT;^ 5X%@$c=MMMM@IsUUUUV=a*"I@$1QRVVVUVUUVUUUVUVVVVUVVVVUVVUUVUVUUTSRRRRRRRRRRRRRRRRRRUUUUUUVVVUUUUUUUUUNz,GqBh32P_TUUUUUUUUUUUUUUUUDk%BG/ ) *>cTUUUT'Ak@ FMMMM>I +'@iTUUT9\k IM@ CjUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUSRRRRRRRRRRRRRRRRRRRUUUUUUUUUUTUUUUUR>c'@B_F[DAfUTUUUUUUUUUUUUUUU2PNJML>B4TRTTKv +< CKJIE8. +)% >bLxR=a:LMB4TUTUUTUUUUUUUUTTUUTUUTUUTUTTUTTTTRRRRRRRRRRRRRRRRRRRRTTTTTTTTTTTTTTR?d"9UKu7sWwY4THQ~TTUTTTTTTTTTTTTTT+FsdMMMMD](BlO{R(Bm2 Ct G. 'C + %lCM> %=fTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSRRRRRRRRRRRRRRRRRRRRTTTTTTTTSTTTKw7Y2?Hq5nR{\{\bI3STTTTTTTTTTTTTSSTST)Cou MMMMMGG *";z"6- +9>@AAAA>2 $N8 {#0 =/ > /OSSSTSTSSSSSTTSTTTTTSTSTTTSTSSSTSRRRRRRRRRRRRRRRRRRRRSSSSSSSSTO|@g(Ck-I4T>qUz\{\|]y[4T2ItSSSSSSSSSSSSSSSSSS(Cn%7MMMMM9}#&P_$@KMMMMMMMMMMMLJD3 [#>QSSSMy@`?dP~SSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRSRSSSSPDm/L|$g*;MMMMMKKAFKLMMMMMMMMMMMMMMMMMI;k +7YQLx2Om&)3 9 :^SRSSSRRRRRRSSRRRRSSRRSRRRRRRRRRRRRRRRRRRRRRRRRRQFp1P 5>Fn3cJvY|]|\|]|]|]{\{\x[2R3JuRRRRRRRRRRRRRRRRRRP0RB?MMMMMMMMMMMMMMMMMMMMMMMMMMMMMML<\,KE). +JMz")ErRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQHt6W*FNGo9cJwY{]|]|]|]|]|]|]|\|\{]^F5WQRRRRRRQRRO~M{O~RRQQRRN}#=+>MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMJ4 A'/ J@7 %>hQRRQQQQQRRRRQQRQQRQQQRRQRRRRRRRRRRRRRRRRRRRR,HeAf:bIvX|\|]{]|\|\|\|]|]|]|\|]|]y[7YDM|QQQQQQQQO~6Y)G-#;#+I%?i9]IvPQQM{0CMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMF) #i. + ,J{QQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRqU{]|]|\|\|]|]|]|]|]|]|]|\|\|]{]fL3TQPPPQQQQQ6X&EB8&$&@l?fN}Lz )rIMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMML>T&@lPQPPPPPPPPPPPQQPPPPPPPPPPQRRRRRRRRRRRRRRRRRR|\|]|]|]|]|]|\|]|]|]|]{]|]|]|]uW3SJKxPPPPPPPPO~-N. +MMMMAp 0)Dr hJMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMI+ )EtKyO~Ee=PJuPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRR|]|]|]|]|]|]|]|]|]|]|]|]|]|]y[>c7AjPPPOPPPOOM|'DWJMMMMK/ E7 2 , +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMML97 +&C=)B/ 95GvOPOOOOOOOOPOOOOOOOOPOPQRRRRRRRRRRRRRRR|]|]|]|]|]|]|]|]|]|]|]|]{\{]S=/NOOOOOOOOOOO5Z7MMMMMD?j;EFMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM@E6M+ +$>hOOOOOOOOOOOOOOOOOOON~It>`9^NPQRRRRRRRRRRRR|]|]|]|]|]|]|]|]|]|]|]|\{\rVFrONNONONOOOO.MCFMMMMMJ;ICMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMDI9 ;k-LONNOONNNNNNNNNONON~?f*;c|$$!HuNNOPPQQQRRQQPOxZ{]|]|]|]|]|]|]|]|]|]|]{]vY3IM}N~NNNNNNNNNNh&kGMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH; &<(A:D@_1TL}L}L}L}L}L}L}M}+J|0 MMMI4  @jL}L}L}L}L}L}L}L}L}L}L}L}L}L}|]|]|]|]|]|]|]|]|\|\|\|]mQ0RL}L}L}L}L}GuDqEsIxL|L}L}Bm5Q. +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM4 z"LMM> +DqL}L}L}L}L}L}BnL!HMMMAAlL|K}L|L}Gv>g2U$?k1SL}K}L}L}L}|]|]|]|]|]|]|]|]|\|\|]tW:]PFtK|L|L}Ix$@m . "">4Z)Fv2U(Hk&d- +DMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMIe9MMI#1SK}K}K|K|K|K|.O. MMMM:!ErK}Jz>h(DtI%9&5 q"=hK}K}K|K}K||]|]|]|]|]|]|]|]|]|]vY-H$=fK|K|K|K|9_S@D>3 %S'cU(ZFMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM>AGML\6^K{K{HxJ{K|K|+L=MMMM9 2Gv8^,2Wt :HMKM!5 +EM2  BoJ{J{IzJ{Cq$FMMMMKa'DLMMMMKl5[J{I{J{J{J{|\|]|]|]|\|\|\pT=b0#?jCqI{I{I{I{I{J{Ds"dCMMMG93 w!LMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0 %#$%JMMMMMJR4 M:jHzHzHzHzHzHz{]{\xZZC 793YFwHyGxFvGyHzHzHzHyHzHzHyDs2X [DKMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLC=>EKMMMMMMMMMMMMM(kKMMMMMG2  6N!=jHyHzEu;f'Ew$4 MMMMML?&?(]s  .QGyHyHyHzHzGyHy{\nR:].">lAnGyHyHyAo@nAoGyGyGyHzGy>k$@p +- #V> - +MMMMMMMMMMMMMMMMMMMMMMMMMMMMK/ )#z"CMMMMMMMMMMMKiGJMMMMMLLI> !=9c)H}&F +@1 FJLMML6Z8y"%CtFwGyGyGyGyGyGyGyWA/95]GxGyGyGxFw@n@m@mFwGyGyFx0T _/ 6, +W%h/ GMMMMMMMMMMMMMMMMMMMMMMMMMMH$ACMMMMMMMMMMJDMJMMMMMM`v!8IM=5 +n+ / x! M&ExEvFxFxGxGxGyGyGyGy$Aq@oGyGxFyFxFxFxCr@nCsGxGxDt$ArL :KMJ. +a1 * 3 1x!FLMMMMMMMMMMMMMMMMMMMMMMMGYUUU557oLMMMMMMMMMJE==>wwx557**,ZZ\y"LMMMML<GLt - +<HLMMI/ !>3ZEvFxFxFxFxFxFxFxFxFxEwFxFxFxFxFxFwFxFxFxFwFxDt"=kbEMMK& +) JMK/ bnw!kp/ AKMMMMMMMMMMMMMMMMMMMMFsbbdAMMMMMMMMMKk5 MMMML0 G1 :AFILMMMMK;d3-Q0UBqFxFxEwExExFxExExFxFxFxFxExEwEwEwEwEwFxEwCsDvEw(H}WFMML. +u JMM<}#GMMLE6[%EMMMMMMMMMMMMMMMMMMMMeRRS6MMMMMMMMMM- +@HMMMMB> EMMMMMMMLF5 _ %Cv@o;g3Z/T0V6_>kDvExEwEwEwEwEwEwEwEwEwEwEwEwEwEwEwEwEwEwEwEwBr>kAq5]1 AMMM> ; DMMI]EMMMMMMK9b1 IMMMMMMMMMMMMMMMMML71 MMMMMMMMMMB9MMMMM1 CIHMMMLE8{"%.SDvEwEwEwEwEwDwDwDwEwDwEwDwEwDwEwEwEwEwEwEwEvDwDwEwDwDwEwDwDwCu@p?n82 LMHHk2 MMM<RLMMMMMMMMI. +cCMMMMMMMMMMMMMMMMJ+2 MMMMMMMMMMM3 #4 5 LMMMMMw!^3 5 ;70 e- HMMM2 _MMMMMMMMMML8XBMMMMMMMMMMMMMMML5 +ttuaaa:MMMMMMMMMMMLA57EMMMMMMMt NOL: #;i9dCuDvDvDvCvDvCvDvDvDvCvCvCvDvCvDvCvCvCvCvDvCvCvDvCtDvDvCvCvDvDvMMMMMMMMMMMMMMMd((*3343 FMMMMMMMMMMMMMMMMMMMMMMM0 8+O;iCvCvCvCvCuCvCvCuCvCvCuCvCvCvCvCvCuCvCvCvCvCuCvCvCvCvCuCvCuCuCvBt0W))KCv)K`KMJ3 =1 'DMMMK- +? JMMMMMMMMMMMMAn/ KMMMMMMMMMMMMM2 (MMMMMMMMMMLFDMMMMMMMMMMMFIVy$)SGwCuCuCuBuBuBvBuCuCuBuCuBuCuCuBuBuBuCvBuBuBuBuCuBuBuBvBuBuCvBuBuBv?p#Bu3S*:]08d?o<9MM8, +.(MMMM=6BMMMMMMMMMMMMMG#- +LMMMMMMMMMMMMF@ EEMMMMMMMLF5 p4 $LMMMMMMMMMMEJ=ecP1 !>nBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBuAsBuBuBuBuBuBuBuBuBuBu@rBuBt7b/KMy9pT-LWBu1XLIMHS=MMMJ4 A2 MMMMMMMMMMMMMIR(>MMMMMMMMMMMMM:&5 +>MMMMMMI;%,3 MMMMMMMMMMFc/ 6 2 +3]5a=nAtBuBuBuBuBtBtBuAuAuAuBuBuBuAt@rAuAtAtAtAtAuBuAtAuAuAs:i#Cw.K'gM{\^F0WBt2Z. +ML)4 FMMM=>, +VKMMMMMMMML>IM>7> &MMMMMMMMMMMMMM@z"6 +9 &CMMMLD:(7 +BMMMMMMMMMANFF=wtfUp !HGB^]R244;j4`@rAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAuAtAtAtAt4S2]DxZ{\wX2RF>n:iBM3 ]KMMM* m ?MMMMMMMMIO. +L&H\PKMMMMMMMMMMMMMMLKKLMMMMK\'''>>>WLMMMMMMML6, + +|{jydZMH0 kk]z{utd@@9'F.V@s@tAt@tAtAtAt@tAs@sAt@s@sAsAt@tAtAt@t@tAtAtAtyZ|\{]{]ZC,RAt-TdJ<}#MMMIG'LMMMMMM?* fJ2 &Ll> HMMMMMMMMMMMMMMMMMMMMMMM) 888===5 MMMMMMMI) < XBA8{vq:#zygwvux||k7984_@s@t@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s@s|]{\{]qV%@P=o@s:i1 HQ- +MMM>2 FMMMMMMFG{"R 61 LJMMJ:/ . +3 :DLMMMMMMMMMMMMM=CCC%%&CHMMMMMMBar!w#{|ixxystf rvvwxxwvg,Q?r@s@s@s@s?s?s?s?s?s?s@s@s@s?s?s?s?s?r?r?s?s|\{]vX5V.5a?s?r 3>/ 5 MML(5 MMMMMML5 |# 1 L&MMGey", ++ +cb8IMMMMMMMMMMMJf---CCC5565 MMMMMK4 #-(#ULBmnaqzyiml_``SNOETSI{vwvxvu 6b?s?s?s?s?r?r?r?r?r?r?r?s?s?r?r7e'F{ :h'I7e?r{]sV<_2-T?r?r;k +6+T X8MMGA + + AEMMMMMMBf,[GM) <I5 %/ 3 &,aGMMMMMMMMMMM@*$$%556,,,%JMMMLBr <<823/'& !/.(AA6SSGlj\~~juxytlvwwv*Q>r>r>q?s?r>r>r>r>r?r>r?s>r>r0VO9/nKmIJ0'+OZC'B)+R>q?r?r6d2 99:9MM9PQM++)$LMMMMME5 qCI.=&<KMML, +>MMMMMMMMMMMM<J"9 , IMMMG- ++44-TTGccVml^ttd}}ksuvxzyzwoo`NMBaaTnxuwy,+%"Cy>rr>q>r>q>q>q>q>r>q6dH3'tO!vO"vP"sN!^? +51\>q>r>r>q4aVWOij`kkcHHD9MMt AB`JMMMMMMMMMMMMMIDGMMMG2 >   [[Nyyxwwwwvvxyxjj]980edVuzvvww{DC9;k>q>q=p>r>q=q=q>q=q=q=q>r>q5dE0sN!vP"kH`XSiH#cB9j=q>q=q>q9j+P??6rrgHHB7ME,32.cbW-,%//*QIMMMML1  #5 MMMMMMXAMMMMMMMMMMMMMMMMJ@, +1 AA8}}kywwvwywxxzuml\A@6geYwxvvuvxuzVVJ)M;o=q=p=q=q=q=q=r>q=r=q=q=q=p,T2 kHO4975gEvP"tttup,Codd[VUJhgWwn~nrwccW0 M3  QPEzywqqe/ LMMMK8+*DMMMMM1 cEKMMMMMMMMMMLG<- +YFF  GMMMMME8 'i- +<EKKG9'&)v!4 #"!*)#^]PlyyxvvxyytssaTSH?>5ZYM|{hxzxvuvvwvuwuwzyihx{|{|||||{}z֌<;8V<kIvP"vP"vP"vP"}|z|jtx~|huuvvwn ]:PPGu991pKMMMLC..* LLI1 MMMMMM3 $5 +N+ 5 7/ mOHDWVOEE$7KMMMMK(N9JMMMMLB~)]XNyxxyystsdWWJCC9XXKuuduyywwvvvwvvwxvvwuxvv|ʹs~zy}||||||||{~H< nJvP"vP"vP"vP"z{|ن0/YXMyyRRFaaWxwx}22* + RRJ))"TTHwvet==5;MMLAutcyEE8%%"440CD=BB;??:..*""\\W('#l?LMMMJ/ 'iFMMMMMMMMK5 H=3srgfWGGji\owywvvvvvvvvwvvvvvvvvvvv|21+ʻp|{}|||{}|~{{~k8& qL vP"vP!vP"|}}ͽr + "!vwwJI@MMCx|yVTI +<<8--*%%YXMyxhuyxy~}m7 ?MJ=}lzllbFF?vr||k(("(FMMMMA) _GMMMMMMMMLLH%%$ KJAqobryvvvvvvvvvvvvvvvvvvvvvvvvv{CB:ȼu{{}}|||{z{z{wH?(tO!vP"oK}|\rqbxw{dcV..*ssmtsb""LLAXXLyyh{zwuvxwy`_S5 +;E.yyhw++#$#xwfxwxrDD9)1 GMMMKJMMMMMKB4 (pFiiXzxvvvvvvvvvvvvvvvvvvvvvvvvvvzJJ@ey|zz|}|{{y{}z}̀ aAvP"vP"||piDLKCyuvxmBA9OPJu..*jk\yyvvwxxwvvvx770"w!~~pccW<;3pwvxwvylj\**$< ) <E1 GMMMH5 ^WWLxywvwxwvvvvvvvvvvvvvvvvvvvvvvyQPFNz}|{{|}||~}{|U<' uO"vP"{|܃0,vvwvxxddW220XXR#"EE:vwwxvuuvvxwvv~}mee\0/*SRHwxwwvvxxyuhhZ10* + +!pMMMJePOElwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvyYYL{L}|~~{|}}z|{z|}}s nKvP"{~w}}kwvxvw|vvf--'zyluxvvvvwwwvuwuuygg[[[S aaTywwvxvuvvvvxx}}jbcUDD< }#MMML+ ZZOpzxvvwwwwvvvvvvvvvvvvvvvvvvvvvvvvycbU~N}{z||z؁aVn}|}{ل:4!dCvP"|k//)34.mm^xwwwvv{]\QeeWxwvvwwvvuuwwuvxz??7WXP lk\{vvxvvvvvvvuuvvx|MLCf>MMMK, +?@;uywvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwvvf{rH{y}{|}MyVmlYUUIyywvwuyqpa<<3tyxxvvxxvvvwvvvx}|l))$JJBnzwuvxvvvvvvvwwxxxyfeX< 0 7LMML5 .bbWxwxyvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwsD?+ς}|{|}}f[B,[A,hJ4\J.{||sk>5\|{{|VnN6`CaDcG1k~{z|tDP4vP!|ׄ1,unDc}|j""suvvwvuw{oHG>66/}|lywuuvxwuwwuvwy}xwuuwvwwvuvvvvvvvywyxtsbIH@&%"oFAF7HMH)YYLuxwvvvvvvvvvvvvvvvvvvvvvvvvvvvvwy`aTqi;}|zx|VD,aDZ?0"W|z}uFQ5vP!ǻtx UQ3ZvddWzxhwvvwvvvvwynm_))#`^RxyuvxwuwwvxwuvvxvwxxwvvvvvvvvvvwtgfYRRGoo`w|{k7 4 6g- +>>f77.uuvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvsrc63|}||{hnO6aDfI2d\<|{wo@T7vP" eoiGrxjvxwvvvvvvvyqEE6ppa{wuvvvvvvvvvvvvvvvvvvvuxvuvuvwwvwvvuf,)Ӏ{{{{|~x`uS9rQ8 +{||؁82 hFvP"yUR9  %#;8(77/vwvvvvvvvvvvvuuwzwtppxwvvvwwwuwxwvvvvvuvxxwuwvvvvvwuuvvxvu~~lzyi}}ksxywwwvvvvvvvvvvvvvvvvvvuuwywxwwvvuvwqpb75!ك}}||||mlL4lM4 ||y# +nJvP"z|U +"xM63qpawvvvvvvvuvxxwvuwxxwwwvvvuuwyzmNNBvvvvvvvvvuwyvwwwvvvwwvuvvvvvvvwwwvuvvvvvvvvvvvvvvvvvvxvvwxvvvvwxxxwvd ~}zzyzz|jjK3wU;-~~l+rN!vP"wz xGzF)&DC;}wvvvvvvvvwwwwwvuvvvvvvvvx|pUUKZZNxvvvvwxvuuuuuuvwxxvvwxvvwvvxyxwvuvwvvvvvvvvvvvvvvvvvvxvvomu|{xvvvyqųl|}}~hnN5zW=1"|V?)vP"vP"rjC׎jf?JD*~KyI31puvvvvvvvvuuuuuvvvvvvvxzzkRQH+@Mx81>(twvvvvvuuvxxvwvuuvvvvwwvvvvvvuvvvvvwvvvvvvvvvvvvvvvwwvvvxml^.Ks9Jk9JY=jk]uv|{gYWLOI3}O~{{}wσ^V3E@1xU;lM4-.*eفA; V9vP"vP"0,kg@ünhK=9!}J}IQJ,omMsvvwuwvvvvvvwvuvwuvwzthhZBH7@b/_GtWHp5qpcyvvwwvvuuvvvvuvvvvvvvwvvvvvvvvvvwvvvvvvvvvvvwvuuvvvwwvvwzy=?6Ag0wYwYfL>Y0??.]wۄsyz}~ޅj|wH|pFpOuŹm{ +iGvP#uP!ĹqW`+&1-|uDL|DZtwwwvywwvvvwwuvxwxtZZM/C#U?qT{\{\]EXYKzwvvvvvuvvvvuvwwwwwwwwwwwwwwwwwwwwwwwwxwwwwvvvvwxxvuvwx{~}kbbUGF=%$!mP{\|]wXOq8{}vs|x{~}u^/ sO!vP"hFuwb&! \V4yFJZrvwxuvuuvwvvwvw{yxh/9&V@xZ{]{]{]mR4<+vvvvvvvvvxwxxwvvvvvuvwwwwwvvuuuuvvvvvvvvvvvvvvuvwwvwzz~}l^^R,,%50{tFh]U@{]|]{\vXWb3څ}~}z|~}{}׀yԄVO,U8vP"vP"sN!}|~߄܃҅_RM2 +\U4zIYqxwuvuvvxwwvuygfY3N%mQ{\|]|]|\tU/I"wvfyuvvvvvvwuuvvvvvvvwwwvvvvvvwwwwwvvvvwwvuvwwwxxyzxtqtsbXXL,,% TL0Xοx܇}4N#wZ|[{\{]fL]~}z{{|z{{z}YdpKvP"tN!I/}yuQju~NsIW}݊ͿwVKF'" B>%b^Gyxcty{yxvvwwwx[[N@d/uW|]|]{\{\uX;[+ji[ywxvvvvwxxwwxyzzzyyyyyxxxxxxyyyyyxwwwwwutqmzyhtsboo_eeWWVKIH?;:1)(  +*%]U3Yu݅z~z}߈b]9bH|\{]{\z[I`/}|||z~}~|}||ކbgbHL2vO"uP"sN!J7'~gojOhYRĹr΃Ћn]W1 881WVIrrbr|xxxxNMCIr5xZ|\|]|]{]rU7W'edX{vxzyyyzzum{ziuueml\edV]\PWVJQPFKJ@GF=CB9??6=<4;:4;93;93;93;:3<;4=<4=<4=<4=<4<<4;;388132+.-&&% + +   -(G@ia6Qhʻyo}{}}k0M"zZ{]{\{\]Ed|z|||{|zz||÷ufyI\A eDW;c_G~hrvSwSro^rNezDi|Fb˅ҁômXb[<&! -*%TSHdeUmm`;;4P};y[|]{\{\|\qT,HXYRup|{jsrcih[_^RSSG??5)(  +    +95RM0f`=unE~vK}PSTTTS~R}Q|P|R{Q}SSUX[^`dfhõlȹoͽsuyՄމ|~|~||~y}|||||ۄIF'bH{]|\mR-I YT2݂||||||||{}}ǁaz߇hZRsrY*7asrrss^Qa6{|{{si}W#!)^Fz\|]|\|]|\oT4L"me?vmHvnG|sHxK~OSX`ekmoǸrs|قބ~}}}}|~||yzr}}}x{|||||]@d/{\|\{\V?Ϳvy||||||||zz{|{{}|{nQ|srkrrphXrKmyGmn?}}}|||o5K&jN{\|]|]|]{\qU;Q&rv~||}{||}}}||~||||~|~||z}|}}{{{~}{zz{|~||{y|~|||||||~ȹu& wY|]|]z[<_,O{|||||||}}}}}~z}|}}ntVhvA]p~ۅ߈߃zz~{}Z8X'rU{\|\|]|]{]tV1M"e}}|||}{}|}}~|{|s|~|{|}{{|}|{}|}z}z|||||{{{|}}{}}|{~{||}{||||||}~eL|]{\{\dJIC'݆z{||||||{{z{|}x||~~z:K9HG>p}|||}{|yك|KGo4xZ{]{]{]{]{]tW6S$e|||||{}|z{|||||{{|zz{z}~|{|||{{|}|~{|||||||||{{z{|||{{|{{|z|||||||g`;Em3{\{\{\tW)5{|{|||||{z|||z|||z|"=g&%RPDrpQT~}z|{y{{{}cb8V@z\|\|\{]|\{]qUD\,k{|yy{||||||||{{|}||}}|||}}~|||||||z}}||{{{{z||||||||||||{z}{|}|||||||~g)rT|\{\z\6T&t|||||||{{||}}z}{|y >>4DD7@@6))#-*b߆~|{{}g=J#fL{\|]|]{]{]|]kQQ^2˿uz}s}|}||||||||{{||||||||||||||||||||||||||||||||||||||||||||||||||||||}|݄TL,XA|\|\|]Fn3μq{}|||||||{|z{||~~i BA6ED6DD7DD8=<3 rjCځ}|{}zsIDl1sU|\|]{]|]{]z\bHgd9}~|}z}~}|||||}}}}|z||||||||||||||||||||||||||||||||||||||||||||||||||||||}~ɹt4K"tX{\|]U?m~|||||||{z||||||%AA@5ED6ED6ED5EC6CC8..'zqFՂ[Lg1gMz\|]{]z\{]|]xYQ~>4ED6EC6EC6ED6ED7DC8'&o\Um6hLzZ|]z\z[{]{]|\rUGe0e|~}{{~|{|||||}}zy|}|||||||||||||||||||||||||||||||||||||||||||||||||||||z{}{|҅# <_+dJD?%}||||||||||||||||s{ 9c<<2ED6EC7ED7DD8??532,!?c-iNz\{\{]sVaIxZ|\{]jP>L$ĸuz~|{||{z|{||||~z||{|||||||||||||||||||||||||||||||||||||||||||||||||||||||z[)1O% ʺu||||||||||||||||k,O;;254,//(('!6W'hN{[|]|]wY[DZByZ{\{]bICG'w|{{{||||{|||{|{ۃyqڂ}}y|||{{{{||||||||~zz{}|{{~}{z{|yz~|{z|~|||{|~ӂ~zz|}||{|AZ*rU9[* umC||}|||||||||||||sBD=[_W2tpJddL(ZBxY|]{\z[cJIs6lQ{\|]{]bIFH(z||||||||||||{~{}ĶnƁvv܂~{|}|}}|{||||zzy}~||z||{{|{|~}}}|||{x{z||bɭϰہz}{{|y~uEcJ{\uWBg/ ŷqzz{z}{{||||||||vqff߃ΈQ]9kP{]|\{]oSGo4\Dy[{]{]|\kP6=Ͽw|y|||||||||||{|ľé~|{{||{||}|z{}كu܅|{{|}z}~}}}~{|}||z}}z{x:S'xZ{]{\yZ[D1P#(CSK-քx{}}|{||||||||{wkWYPۃ}؂Z]5nS|]|\z\YBCj1qU{\|]|]|]wY,Gkx}}|||||||||||x}ŷvx΀{z||||}z{zcvbήl݁~~}ehkme{܁}||jҵ׵y}{z|ZR>{]|]|]|]|]{\wY6W&zrG}{}|||||||||||dc:Ҁ}|McG|\{]vXIs5ZCz\|]|]|]{]{\R=~P|y|{|||||||||||y|mnՁ}|~݅vhjåh{{|Ͳܼuk~~غʾq}||}ND*eL{\|\|\|]|[|]{]pS'?Vxz|}|||||||||}nIo4z\|\vYDl2gM{\gM{\|]|]{]pTCG$ց{}}{||||||||||||}{toȼwuk݀|{~_ͯzlֶƺs}}|{݁! pT{]|]|\{]{\{]oSuXlP!5Xޅ||{}}||||||||}߁XZ4rU|]z\Fn3iN{]bIdK|]|\|]{]Lw7h||||||||||||{}}}{bǫkpäùuh|z~X̰i~|}|}qT|\|]|]|]|]|]uWU?{\lP$:yKۄ|~~~|}||||||~ĶqP}:{\{]YB]E|]uX7X'z[|]|\|]sWTX2܆|||||||||||||{~j}~{|}~QK-ozz~ӁYЍ˧Ŷp}||}/+hN|\{]|]|]|]|]|]P};qT|\pT0O"YS4}zz}|||||zyKoT|\pSIs5{\{]P};W@{]|]|\|]WBa~|||||||||||||{}}|{|||݁ke\9z~||{z~PZR9֥׺t|zz|}oiCWA|]{\|]|]|]|]|]iOS={\{]uXIs5/-fބ|}|{|||{ԃNe1{\{\Nz9qU|]pT$;pT{]|]|\z[;O%|}|||||||||||}|{|}|zz~~µl.,y{~{||yՇc`D&$̩~~re`B~||f5T&y[{]|]|]|]|]|]xZ:]*wY|\|]z[bI+De^9Ĺs{||||ònR;{\oST>|]|]Mx8>b-{]uX{]|]lPunI~|||||||||||}|{|}|}{~Ŷq߂vqDj}{{}}~|}|an¦IH?BB8ͪƻpy{}Մ42fL|]|]|]|]|]|]{]V@X@|]|]|]|]vXS= d^:lߐ||{{ \ No newline at end of file diff --git a/examples/sprite-drawing/src/main.rs b/examples/sprite-drawing/src/main.rs new file mode 100644 index 00000000..6d8e1658 --- /dev/null +++ b/examples/sprite-drawing/src/main.rs @@ -0,0 +1,154 @@ +#![no_std] +#![no_main] + +use core::{ffi::c_void, ptr}; +use psp::{sys::*, vram_alloc::*, *}; + +// Width and height must be the same and be a power of 2. +const IMAGE_SIZE: usize = 128; +static FERRIS: Align16<[u8; IMAGE_SIZE * IMAGE_SIZE * 4 as usize]> = + Align16(*include_bytes!("../ferris.bin")); +static mut LIST: psp::Align16<[u32; 0x40000]> = psp::Align16([0; 0x40000]); + +#[repr(C, align(4))] +#[derive(Default, Clone, Copy)] +pub struct Vertex { + u: f32, + v: f32, + color: u32, + x: f32, + y: f32, + z: f32, +} + +psp::module!("sprite-example", 1, 1); + +fn psp_main() { + unsafe { psp_innermain() } +} + +#[allow(unreachable_code)] +unsafe fn psp_innermain() { + psp::enable_home_button(); + + let allocator = get_vram_allocator().unwrap(); + let fbp0 = allocator + .alloc_texture_pixels(BUF_WIDTH, SCREEN_HEIGHT, TexturePixelFormat::Psm8888) + .as_mut_ptr_from_zero(); + let fbp1 = allocator + .alloc_texture_pixels(BUF_WIDTH, SCREEN_HEIGHT, TexturePixelFormat::Psm8888) + .as_mut_ptr_from_zero(); + let zbp = allocator + .alloc_texture_pixels(BUF_WIDTH, SCREEN_HEIGHT, TexturePixelFormat::Psm4444) + .as_mut_ptr_from_zero(); + + sceGumLoadIdentity(); + sceGuInit(); + + sceGuStart(GuContextType::Direct, &mut LIST as *mut _ as *mut c_void); + sceGuDrawBuffer(DisplayPixelFormat::Psm8888, fbp0 as _, BUF_WIDTH as i32); + sceGuDispBuffer( + SCREEN_WIDTH as i32, + SCREEN_HEIGHT as i32, + fbp1 as _, + BUF_WIDTH as i32, + ); + sceGuDepthBuffer(zbp as _, BUF_WIDTH as i32); + + sceGuOffset(2048 - (SCREEN_WIDTH / 2), 2048 - (SCREEN_HEIGHT / 2)); + sceGuViewport(2048, 2048, SCREEN_WIDTH as i32, SCREEN_HEIGHT as i32); + sceGuDepthRange(65535, 0); + sceGuScissor(0, 0, SCREEN_WIDTH as i32, SCREEN_HEIGHT as i32); + sceGuEnable(GuState::ScissorTest); + + sceGuEnable(GuState::Texture2D); + sceGuTexMode(TexturePixelFormat::Psm8888, 0, 0, 0); + sceGuTexFunc(TextureEffect::Modulate, TextureColorComponent::Rgb); + sceGuAlphaFunc(AlphaFunc::Greater, 0, 0xff); + + sceGuFinish(); + sceGuSync(sys::GuSyncMode::Finish, sys::GuSyncBehavior::Wait); + + sceDisplayWaitVblankStart(); + sceGuDisplay(true); + + sceGumMatrixMode(MatrixMode::Projection); + sceGumLoadIdentity(); + sceGumOrtho(0.0, 480.0, 272.0, 0.0, -10.0, 10.0); + + sceGumMatrixMode(MatrixMode::View); + sceGumLoadIdentity(); + + sceGumMatrixMode(MatrixMode::Model); + sceGumLoadIdentity(); + + let vertices: Align16<[Vertex; 2]> = Align16([ + Vertex { + u: 0.0, + v: 0.0, + color: 0xFFFFFFFF, + x: 0.0, + y: 0.0, + z: 0.0, + }, + Vertex { + u: IMAGE_SIZE as f32, + v: IMAGE_SIZE as f32, + color: 0xFFFFFFFF, + x: IMAGE_SIZE as f32, + y: IMAGE_SIZE as f32, + z: 0.0, + }, + ]); + + loop { + sceGuStart(GuContextType::Direct, &mut LIST as *mut _ as *mut c_void); + + // Clear Screen + sceGuClearColor(0x00000000); + sceGuClearDepth(0); + sceGuClear( + ClearBuffer::COLOR_BUFFER_BIT + | ClearBuffer::DEPTH_BUFFER_BIT + | ClearBuffer::STENCIL_BUFFER_BIT, + ); + + // Draw Sprite + sceGumMatrixMode(sys::MatrixMode::Model); + sceGumLoadIdentity(); + sceGumTranslate(&ScePspFVector3 { + x: 240.0 - (IMAGE_SIZE as f32 / 2.0), + y: 136.0 - (IMAGE_SIZE as f32 / 2.0), + z: 0.0, + }); + sceGuTexImage( + MipmapLevel::None, + IMAGE_SIZE as i32, + IMAGE_SIZE as i32, + IMAGE_SIZE as i32, + &FERRIS as *const Align16<_> as *const _, + ); + sceGuTexFilter(TextureFilter::Linear, TextureFilter::Linear); + sceGuTexScale(1.0 / IMAGE_SIZE as f32, 1.0 / IMAGE_SIZE as f32); + sceGuTexOffset(0.0, 0.0); + sceGumDrawArray( + GuPrimitive::Sprites, + VertexType::TEXTURE_32BITF + | VertexType::COLOR_8888 + | VertexType::VERTEX_32BITF + | VertexType::TRANSFORM_3D, + 2, + ptr::null_mut(), + &vertices as *const Align16<_> as *const _, + ); + + // End frame + sceGuFinish(); + sceGuSync(GuSyncMode::Finish, GuSyncBehavior::Wait); + sceDisplayWaitVblankStart(); + sceGuSwapBuffers(); + } + + sceGuTerm(); + sceKernelExitGame(); +}