From 9c9aef37c7d584d3b015186fb60689525afc3b9b Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Thu, 3 Jul 2003 06:38:57 +0000 Subject: [PATCH] fold CroppedSprite functionality into Sprite more work on Rave --- .../Graphics/CombinedLifeMeterTug frame.png | Bin 160 -> 4498 bytes .../CombinedLifeMeterTug stream p1.png | Bin 2673 -> 2809 bytes .../CombinedLifeMeterTug stream p2.png | Bin 2058 -> 3578 bytes .../ScoreDisplayRave stream level1.png | Bin 2673 -> 1953 bytes .../ScoreDisplayRave stream level2.png | Bin 2673 -> 2094 bytes stepmania/Themes/default/metrics.ini | 60 ++++-- stepmania/src/Actor.h | 2 +- stepmania/src/BGAnimationLayer.cpp | 18 +- stepmania/src/Banner.cpp | 10 +- stepmania/src/Banner.h | 7 +- stepmania/src/BannerCache.cpp | 8 +- stepmania/src/CombinedLifeMeterTug.cpp | 16 +- stepmania/src/CroppedSprite.cpp | 146 --------------- stepmania/src/CroppedSprite.h | 37 ---- stepmania/src/DancingCharacters.cpp | 2 +- stepmania/src/EditMenu.cpp | 4 +- stepmania/src/FadingBanner.cpp | 7 +- stepmania/src/FadingBanner.h | 3 +- stepmania/src/GameState.cpp | 27 ++- stepmania/src/GameState.h | 66 ++++--- stepmania/src/ScoreDisplayRave.cpp | 35 ++-- stepmania/src/ScoreDisplayRave.h | 7 +- stepmania/src/ScoreKeeperRave.cpp | 15 +- stepmania/src/ScreenCredits.cpp | 6 +- stepmania/src/ScreenEvaluation.cpp | 6 +- stepmania/src/ScreenGameplay.cpp | 2 +- stepmania/src/ScreenRaveOptions.cpp | 55 ++---- stepmania/src/ScreenSelectCourse.cpp | 2 +- stepmania/src/ScreenSelectGroup.cpp | 2 +- stepmania/src/ScreenSelectMusic.cpp | 18 +- stepmania/src/ScrollingList.cpp | 70 ++++--- stepmania/src/ScrollingList.h | 31 ++- stepmania/src/Song.cpp | 4 +- stepmania/src/Sprite.cpp | 176 +++++++++++++++--- stepmania/src/Sprite.h | 20 +- stepmania/src/StepMania.dsp | 21 +-- 36 files changed, 450 insertions(+), 433 deletions(-) delete mode 100644 stepmania/src/CroppedSprite.cpp delete mode 100644 stepmania/src/CroppedSprite.h diff --git a/stepmania/Themes/default/Graphics/CombinedLifeMeterTug frame.png b/stepmania/Themes/default/Graphics/CombinedLifeMeterTug frame.png index 18503f1675dabd92d415dcfefb10f98a41cc899d..524e8ec8c5d317556c233e4109a2c1998d0a04e3 100644 GIT binary patch literal 4498 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 delta 86 zcmbQFyns=$Gr-TCmrII^fq{Y7)59eQNHc*j2OE$q+QzFgQ88GDLCn*|F{I*F(vScD k?U^~4Sp=AS7zGj-3KwvHW%`v94phqE>FVdQ&MBb@02QYc_5c6? diff --git a/stepmania/Themes/default/Graphics/CombinedLifeMeterTug stream p1.png b/stepmania/Themes/default/Graphics/CombinedLifeMeterTug stream p1.png index f1477ca2353523d4ee61bbfe6fe74e9e174545a4..f1367a57e1502335b9b4d5d9b6c52e7d4131272b 100644 GIT binary patch delta 2205 zcmYk7X;4#n7RCR0Sx6)_5s_6TDalGUKwGqBco9Jv1XD^Y(gFcR7B^f_N5vOFP+OS} zf^3arq@C7wVRM5KBy1r_Fo7Upm0eIoltmCj-Z0;$>YT6l{OZ=Nd%jqHTQ0L+VoAgT z0FGPNJxrs8BD~4BPVZU-^TUE~LxQj~(0(Z@8mxxFfCHcRHux7N?D;ElEO zKInPx+qlCm+@WUfpq9G`(bweEtLAj6IGy#J4kc$XyRC-(rk34W#cr)(>vmMLv=uCE zB}?;?^}2%9RL*L8!EF2w^HmwMp_Hk5&QLyO)IDL;K4vU(R4uBAt|+8e7IOPF9KDjG zuVXd7U^SL8s*4#_#SBFuilXUDvC-*NY|#JNmHeTX-TS|-pWNZUGd&G^3<2l$jiUe% zhJ7}R0?u?gUaK-o5|X__#pXiMZa}|nUAyh03iq?Q84a>x-(^%q^Txg*V_h+uIJ&$u zN~U+7Akc4*Z{&{~MAi?+eQ#Jk;jFUo8Op36H~%S<#Zhi2*yf;gbbomY7ihCZ@#oOIXF;YL`jKt`cdVs0QK!G3&yWMk&!FdUPbQTR%oC* zn&uljy{wb^)&A=`|K<9!)HQ}XJn{!7abN0e_hy|#h{p+%0(v?Oh)G5BbCZs*)pPp> zFy$3S^|pSOMvC^g6fNK#t_0JESNxvocJBAo9Ot}nEk5@IX~2HvO2Xv~E7j;& z?(Xa-YXqJd)m3pkg4o7z$yDev3Kc*5A<1bFMX3{Gp{4RdjcRhlp~k_Jp!AJRW{@N0 zB0!PSU6crhk`g8vRc#k1wz7n~fSpfg-pWRN9?h&jrSZd*PcNZb$sdc}FBx^~ zX+-1V&?JlAh`=JLVy)b@;GnV6h?-*^Nl>#HA`SvqY9L^V-3|ML_4BVz5D3R)MMf`o zNw=#}Uom%UxSUo)mwTee67mjKOU~M{esG~sr7#Wb4-OZi$eyhJSM+-e8~R3ZG+$YA zE>akim^kJj1U5@)7tEB}vTDT{yc(2wZrQXKs%_o}Iy9fr34D|R#2aS1)*)i(A|y`$ zm|BP&;VnbaBnVueJejZu3_#vuvH>k@h`sqGm*GapHZDZ&$9qQqTLAuiPiq{=#W5JNE_Zx-U$2>DOVE`9@fc8YRt8uTm{$QV2RyEmK-c} zjS(Gp)cWnF{spp=pNb%XqcN#^G=EjQ(F4ggBCdPeDr1*M^+v`%%*}JgU$SyDfpC;% zEF1o@T+B|OJ?kEL1u9-;*`POuzQ{KtAChhGmL;Q#2n8bX2Bd^K5eE1tqM|zaMI39_ zi~zzq1Q1<>3E?+LdxNBnAl;QwM4UseW2n+>IILh6wRD?ZsGLSU))3_I&YehlnrNyw z70nW{VQlt1n)tZSm5_?)3q5zx0-Q@h8|K}xwLEaaoO{t2TuMx9SvX;Yw5ODXedKe5 z3=>;gLrXWA3j87t;e^B*_(daMdsnk2=Q@p;P#_ zH_2R{Pj|}0g6Rqqfb7mW4`>;nj1-?^tD2T<7M^}Ucy|hoeH5~A*>WB)nQdoE;r>5P zPrA67)~p6W8$+@G29kRRLv>Ia)Mqd$z}eW&Mn{Fd`05bj!6L#UbAIBcme!|q%BT^6^ zuElm9EjZ^hVNq&@``JVVvfI}r3@ajvV#M=Uy9@D!gqpRytya>D`sIY}a`Y*Ba10(p z#1&UjTmGnLNlQe^R2KCLCXjFw^AAjbsp#ra*Tt#Of%qPjDR2!*%vhEsND80wSnX&k zgsxJ}wx%|zh-~vC()(fZ859*Qp%G$jrxE*7s-)e_Nd_+k0jQo5NPtTedJTE60v82w zlU~E|kxI$gC5zXfpi2u1kbf5NS3BN`qh>B#YTcnJ!k%$zC>R41e^jisF@9kE({hm5mM zAuBc!^8k!*_7K|+m2MgQ5GPK<1kZL5ova!g^{j*aIDPRo)W%v^Lh$#vIGfvVD5YnuKuQtg9u+*dv#~vDz&>Zd zL4^lVT`PFHLuTixxMQl`Qa~9=>Rcyx>C<>f<~JNw5jnU@VXQOk+2`@_$cDPly_Qr3 Z_&#IrOd)o-+biGwq!84QA|`36~s>B zZK9mmOY9+b6V=2n;vM1u@ekrXVn6XNafmPywL}eZkT^^<5cR}|#0Nwj(L{Vq{FC^I z_>?$C93}oud_o){T8NWGGjW1APMjrLi8I7$;sSA==pfD!?SzTANPIqv}(GknX)Bk@86c_L4 z0rOwNf&*i+Zm7z?c4+mn(*6<8M+=r1@5UYZb$(RLfX5NDg^h)~KG3?pCfyhKxwN<= zx%1_KThq36#?rXjK~7)8`oU4OnP) zc+$Wy6*i5%u08%vzXdI`+jDVzxTVvR@?JAO$Qm& zVt@5ddAgTn)f{J;s9-={GF1cLK*0jm%P?|46;4Qj^%PPS4V-=2zMkEtGkldn!+#9b@ZLy18}Nv~JTi z>JI4ZUe_bf{VWZ`n!r-Gb@#_i?{v?rH_E$Kj@TPdw{=@fl#?@4|6Hu{RXt{qwH}Gu z0+r{*X|*Htb}I@@!*ksgtx2Po%ws8k!Q(`)m}h)_#xzUVBeR$nJWqMSb!|eki%_QC z2Lk?OHJX$RWn+F_F0DQuwXAmQJ=)%8^|niBaF@2{%R-l|waj0BHBL7%DB_gC4x)Cm za6d(OLi5yF12r?^A5E~ER*{mBEbS+Coy>ps7wP*lQNl)x`pwMuTc9e2nQW1?wbN7P z=wzNz$bf`W*}ju)4(6reNEdx-QFXK-Qf<6$ACa(@L0_c=&)5#JRg_asa=}g01?iIhXQ~GEw=vlmoKSGe;JB~N;pszlbZG9OIT`*1otn)aRzeQPMdh27OAFV9bg;g8 zSRL(UTmHIz{WquISG_9a*?p3gRc=0B8p&O?o6Z^H66<4z++DGXx|O2ol1~qpIe1B1 zZI$*%yKPqKwAvAM*QqX;St&dWjXc<=zM46~#ounYQ*!6A+|V@f54BQzOYP%2cQjtp zAa<5D*c~&7gv|vLQ`0OyDRF&}cyyOta(4d7O39?Uif(JKBSxp-o{Z^C(eG)Fd`2i? zfm7&(bKa6|ZW^0yp{dDcPdqM%Yh0VB&=j6|dDXDD>e)=wkAbmbf%J;we-CLGY7?)# z^^`fgwz;kuIy+;wOlm(#x1*zQP0DET?u443@2EpKOJV1LmBsPccxUGq{1t}-YNxgTD*tR_?)u2ktY=0g zAyp18Z*;lYMc>oE43U|)bz6w!&=r9b;tsBKR5Tfr3a*r~vfnbQHo^biiQ2S&wXtKc z=uIbqQju>}Fmk!`*O{W{+s~NNZ_%^dUYGWj`AaIEsU4JOxa6<5SXpT;881SHM}64& z5%~>6$hse>+v+e~*|OvF!k9(+@U!fSRVmZEOisRT?yqGyX{yIt-1t;dTEdFCPwwX! zR0S^mUF{>1sP%tZ9+ zS$6*Z;e(Jpq}hnZv3Q<{zY-AX`&-V;S@rY`w7s~cqN?JNdb-5u zUV2%P8&_HpKUx-3)w;n|2%cwoHBNOYJ9%C3$h(e}GZK=&ofogqzbT2_e%e$Pow{^K zQgB0cg1>35xPETlbz7Nc*toaSHMT!ba$oIMowK-1o4QAD`(R2|lEY`;2G2g-T)E&y zws}b%!p5OQ+xu$Y^3HhQY4?PHD3`t;dW$6GeVWeey3#x9Ri_5LTbe}2dZ$nsH%n;F z{k^Sg5cXV8SLUF4$$7I_OP{mheR9L_@2;0;76;@xxPQoE|E95^{hsxOPQp!B8+*N^ zprhm!$Fbt={pyy+LCwaN%(iH(+F$XAalub7S#8+R)+y2p-@Ju;w`4vs^$m@`t6?D# K!T-|6=lusepx^`m diff --git a/stepmania/Themes/default/Graphics/CombinedLifeMeterTug stream p2.png b/stepmania/Themes/default/Graphics/CombinedLifeMeterTug stream p2.png index 478b4cc3aa37933fe4b1054a5100bd6d36144ee8..7ce31b97da2711d9a5623b588e42da93e66f75cf 100644 GIT binary patch literal 3578 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 VXD+%zZh1lpnQ7UnM^eO!{{pE{zy<&S diff --git a/stepmania/Themes/default/Graphics/ScoreDisplayRave stream level1.png b/stepmania/Themes/default/Graphics/ScoreDisplayRave stream level1.png index f1477ca2353523d4ee61bbfe6fe74e9e174545a4..9dd82278eada425ef4ff8c30b42c94d70e6ab831 100644 GIT binary patch delta 854 zcmV-c1F8J+6rm507YYyv0{{R3>4t~8u^~nTe*+{*L_t(|+9Zw95x_7ALi2F{@j6PP z=~vNuCyH>$gX=88b|>g)CE`fgM3jn18E4f+8P-Z~gFTlhkt5EOPc|!?F+qRiCj4lb z_Dd&z0x&VgH~_;i2s}DP?f;)@Wu&&_A;<&B2M;5M5H4qZAkhi-`S+=08jzQ(*KMIGvL-Sz*PK)av2%_a{*0(a)G@6NXq|%9rTR> z4S+ocvH|Q|Aded=#sCn23o6F}0E9us&Hul(i5psqF>$5k9L}wRh+csy<$mOB2|7nD zB(sAoUNU@yJAUp3N7DM>E4l^Xi42kee*i%c=yq%R|5F{WrHNMo1zf{%=1#WJeYg=n zXv%_YmtM*^+clI4MHZz#^nim9%;oM1ASPI_LIZ^nVmdgIkUatq^KWpIfzljMr+r6Q z`X7=8AhC=T7L5OaNdX#2{}DmT01!Y-$PNa(6lCPr{|s0GCp_qo6)+;D0Y;d=e>oV? zR51RB#v7Q)4GTbk0AfP6pAqf`G%Mi2`5z_$iS8ee(ESfh9I){I4-BRs$R_-UWg|ug z;yU-h_Gye`q5Y<9}H4L2)`L#W6zN0kH>J2|xfbf!z8PUIIYF z>MH}5c>ez%p$+Obj{nds0iwad!U*;#*MCNo^b1Q_uuw%Z86bd|AR!LTQJ}O6lH|rn z1OLJ9{?7Ox8rra|h?IP|7#Lx({SB4~kwO*f4kYh@^#cSD6LJKDN;`N)e@2ZBh-yw~ z2yr2mByfj*Lj({PBRF=DZTt@ld`5Vw17-mP5UeBw7Y*PL0GC{MvCI|Qm03asE8+%^>VLrn*J1-84v-4NfBGL9C=3i-jQ@YY4g8NVj{y>Qj7Uxc2q0(_ zK>W%GjarCXVgCQlfEl1D{$gZ=+6qfUu&4q9pzv2{QecF51r}mp01!YB2Y`d|KRl5@ zV&gw*cz`50kqm}A5Gcj@A8IaC3owauz?31c@00G1VOEVx#VYwVFrYgEKlLhX4c+JPp9gC=e4A1#pG`Ibn$q zn!3Re1&IPs8h~hql~RmQKcd+VPGMjFL(OMIDtiC|2vHP&WrW+q$PLd*e_t6O!4diIKT<}4q%Uwbgvvm3CI|oo5EDF&b0bWJWJSjRsJZYzQYj0K zb`Gf1zM~{;P#S=iy8n@qA}}dH1L;2^NErYEhzYfffs|GtrC0$c1GcJ)5h)G83nLD+ z(h6EgLPGdI(7Vt81PCA|e~hgEpW#2&at|6d4DiYW=<^?puoC+}BSPXoFdH)bU_hw? z84#%qwTuA>ASQ$oXlVwrh#T%=w3G~Ge1p1?0~V!_(g`WCq7+2ja3}v~fS0*Y6#xOm zgcL@|#VZ4PB0vgyMrdUO_9oOzKpVLj|HDgi)LQT>Bpq_Y>_June-J=SAh&)+spr80 zSmOErf0TL~T<5|nE)We47D#=@gO-THXy1wp&`WeAH8mYW>7|W z75oE5k`Wqr&>{>{f9il)009Im3Bg4Jq}9O)jsnL2SQ8+yqGN>BivN-02T`G6HtM*c zY2!bl#^#236d-_@P>YcNP*WMvasf2Nzr$+c|0s z00G2=a3-ip$M_%Gj74PM|44NaCnLOl$%RxrfJ?&v&{iZPe`?Uf6fq(tZEzGol>h_~ z6Ri0IiHQG@GWP3#j3k5_gV5Jx%Ml0?=a_0Pxhys8BVnS(EGa%Xa zA0;LkkxT~5d_z(XZv=dUoA93jp5y=j=LWauz{M{k1H5Sp0RRESgebUR)j3cx_kS!c zsQ)NI3(jA*$WUr@S>QJ8&>0j1M5E`m48QyLTHzO z3+@?g9;osnf1C8N8%GpSX z=s#M!M1vD5!-LKmakJR@sPz#)w`M{)cG2y1J> e$^n1?76Sk~m~?XX!{O%u0000{eL_t(|+8m9`5x_tQLi4cy@>0sK znp02*f5;#&j{6|4^9UVzmb^}tiiI$mA~JHQD8AvXY1B$7r;}loIiJ!SaqYTxW6nOB zPguq;0MX-)0x%52P^nv!`yVyX?NzlyBQWSY_)^0X0)N!3D9Q}(ox3_YGpdgcqQ`HL ze}|qEF`LX@JC2rj`4vD+3fl&ks zZ73JW`;VmjKiEOv(ESPa7&imdxj-H_e^iVCAb^;l?go31kpU74pfmti_@5JE#DAze zASnfs27dg9X=a2`H=XBcmN=P20RS_1R$CWQUHKK7}o4I{QpyB z*CDR%EJ9N48pvcs3EL{g>72rvZQfVnPl8MtC5g`4JwU|6vl4 z1pfnCfI_neEW&{$A;S-36aK>re-cIp`kbbfHrb5{)eSs z6sLodJR{T{5POi700hv0rvZQfVgd!$S9l=|jjXQ>SW^1`{|I+O1Bc^3f3#2l(cpMt z1cx-&e@2uX49i=vXhkv^Ab^-4Q4TFrK)Dqp$&HZ+|APbWJL7+7bi)cGr1T4^qakSo zmJN}j73vNo?|}6K1P~K)3IkO*@S+SgIY3l%LPLlPsW68-^cy08xEL9Jphz-86A!c& zft0&o7C-}wVx5H6xu#QYL9R-!mWK0H0000CI|Qm03asE8+%^>VLrn*J1-84v-4NfBGL9C=3i-jQ@YY4g8NVj{y>Qj7Uxc2q0(_ zK>W%GjarCXVgCQlfEl1D{$gZ=+6qfUu&4q9pzv2{QecF51r}mp01!YB2Y`d|KRl5@ zV&gw*cz`50kqm}A5Gcj@A8IaC3owauz?31c@00G1VOEVx#VYwVFrYgEKlLhX4c+JPp9gC=e4A1#pG`Ibn$q zn!3Re1&IPs8h~hql~RmQKcd+VPGMjFL(OMIDtiC|2vHP&WrW+q$PLd*e_t6O!4diIKT<}4q%Uwbgvvm3CI|oo5EDF&b0bWJWJSjRsJZYzQYj0K zb`Gf1zM~{;P#S=iy8n@qA}}dH1L;2^NErYEhzYfffs|GtrC0$c1GcJ)5h)G83nLD+ z(h6EgLPGdI(7Vt81PCA|e~hgEpW#2&at|6d4DiYW=<^?puoC+}BSPXoFdH)bU_hw? z84#%qwTuA>ASQ$oXlVwrh#T%=w3G~Ge1p1?0~V!_(g`WCq7+2ja3}v~fS0*Y6#xOm zgcL@|#VZ4PB0vgyMrdUO_9oOzKpVLj|HDgi)LQT>Bpq_Y>_June-J=SAh&)+spr80 zSmOErf0TL~T<5|nE)We47D#=@gO-THXy1wp&`WeAH8mYW>7|W z75oE5k`Wqr&>{>{f9il)009Im3Bg4Jq}9O)jsnL2SQ8+yqGN>BivN-02T`G6HtM*c zY2!bl#^#236d-_@P>YcNP*WMvasf2Nzr$+c|0s z00G2=a3-ip$M_%Gj74PM|44NaCnLOl$%RxrfJ?&v&{iZPe`?Uf6fq(tZEzGol>h_~ z6Ri0IiHQG@GWP3#j3k5_gV5Jx%Ml0?=a_0Pxhys8BVnS(EGa%Xa zA0;LkkxT~5d_z(XZv=dUoA93jp5y=j=LWauz{M{k1H5Sp0RRESgebUR)j3cx_kS!c zsQ)NI3(jA*$WUr@S>QJ8&>0j1M5E`m48QyLTHzO z3+@?g9;osnf1C8N8%GpSX z=s#M!M1vD5!-LKmakJR@sPz#)w`M{)cG2y1J> e$^n1?76Sk~m~?XX!{O%u0000Load( sPath ); m_Sprites.back()->SetXY( CENTER_X, CENTER_Y ); break; case TYPE_STRETCH: { - m_Sprites.push_back(NewSprite(IsBanner)); + m_Sprites.push_back( new Sprite ); RageTextureID ID(sPath); ID.bStretch = true; m_Sprites.back()->LoadBG( ID ); @@ -553,7 +547,7 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer ) { for( int i=0; iLoad( sPath ); m_Sprites.back()->SetXY( randomf(SCREEN_LEFT,SCREEN_RIGHT), randomf(SCREEN_TOP,SCREEN_BOTTOM) ); m_Sprites.back()->SetZoom( randomf(m_fZoomMin,m_fZoomMax) ); @@ -584,7 +578,7 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer ) unsigned NumSprites = m_iNumTilesWide * m_iNumTilesHigh; for( unsigned i=0; iLoad( ID ); m_Sprites.back()->SetTextureWrapping( true ); // gets rid of some "cracks" m_Sprites.back()->SetZoom( randomf(m_fZoomMin,m_fZoomMax) ); @@ -639,7 +633,7 @@ void BGAnimationLayer::Update( float fDeltaTime ) for( i=0; iGetActiveTexCoords( fTexCoords ); + m_Sprites[i]->GetActiveTextureCoords( fTexCoords ); for( int j=0; j<8; j+=2 ) { diff --git a/stepmania/src/Banner.cpp b/stepmania/src/Banner.cpp index 21cef3738d..0b7a5033fa 100644 --- a/stepmania/src/Banner.cpp +++ b/stepmania/src/Banner.cpp @@ -45,12 +45,12 @@ bool Banner::Load( RageTextureID ID ) m_bScrolling = false; TEXTUREMAN->VolatileTexture( ID ); - return CroppedSprite::Load( ID ); + return Sprite::Load( ID ); }; void Banner::Update( float fDeltaTime ) { - CroppedSprite::Update( fDeltaTime ); + Sprite::Update( fDeltaTime ); if( m_bScrolling ) { @@ -129,3 +129,9 @@ void Banner::LoadRandom() Load( THEME->GetPathToG("Banner random") ); m_bScrolling = true; } + +void Banner::ScaleToClipped( float fWidth, float fHeight ) +{ + m_fRememberedClipWidth = fWidth; + m_fRememberedClipHeight = fHeight; +} diff --git a/stepmania/src/Banner.h b/stepmania/src/Banner.h index e4999de9f3..f12ef900a2 100644 --- a/stepmania/src/Banner.h +++ b/stepmania/src/Banner.h @@ -11,13 +11,13 @@ ----------------------------------------------------------------------------- */ -#include "CroppedSprite.h" +#include "Sprite.h" #include "RageTexture.h" class Song; class Course; -class Banner : public CroppedSprite +class Banner : public Sprite { public: Banner(); @@ -27,6 +27,8 @@ public: virtual void Update( float fDeltaTime ); + virtual void ScaleToClipped( float fWidth, float fHeight ); + void LoadFromSong( Song* pSong ); // NULL means no song void LoadAllMusic(); void LoadFromGroup( CString sGroupName ); @@ -42,6 +44,7 @@ public: static RageTextureID BannerTex( RageTextureID ID ); protected: + bool m_bScrolling; float m_fPercentScrolling; }; diff --git a/stepmania/src/BannerCache.cpp b/stepmania/src/BannerCache.cpp index 490e5c7bcc..ea22a3176a 100644 --- a/stepmania/src/BannerCache.cpp +++ b/stepmania/src/BannerCache.cpp @@ -10,7 +10,7 @@ #include "RageUtil.h" #include "RageLog.h" #include "BannerCache.h" -#include "CroppedSprite.h" +#include "Sprite.h" #include "PrefsManager.h" #include "SDL_utils.h" #include "SDL_dither.h" @@ -243,7 +243,7 @@ RageTextureID BannerCache::LoadCachedBanner( CString BannerPath ) if( WasRotatedBanner ) { - /* We need to tell CroppedSprite that this was originally a rotated + /* We need to tell Sprite that this was originally a rotated * sprite. */ ID.filename += "(was rotated)"; } @@ -300,7 +300,7 @@ void BannerCache::CacheBannerInternal( CString BannerPath ) bool WasRotatedBanner = false; - if( CroppedSprite::IsDiagonalBanner(img->w , img->h) ) + if( Sprite::IsDiagonalBanner(img->w , img->h) ) { /* Ack. It's a diagonal banner. Problem: if we resize a diagonal banner, we * get ugly checker patterns. We need to un-rotate it. @@ -403,7 +403,7 @@ void BannerCache::CacheBannerInternal( CString BannerPath ) BannerData.SetValueI( BannerPath, "Width", src_width ); BannerData.SetValueI( BannerPath, "Height", src_height ); BannerData.SetValueU( BannerPath, "FullHash", GetHashForFile( BannerPath ) ); - /* Remember this, so we can hint CroppedSprite. */ + /* Remember this, so we can hint Sprite. */ BannerData.SetValueB( BannerPath, "Rotated", WasRotatedBanner ); BannerData.WriteFile(); } diff --git a/stepmania/src/CombinedLifeMeterTug.cpp b/stepmania/src/CombinedLifeMeterTug.cpp index d263173fee..1ef3811722 100644 --- a/stepmania/src/CombinedLifeMeterTug.cpp +++ b/stepmania/src/CombinedLifeMeterTug.cpp @@ -18,7 +18,7 @@ CombinedLifeMeterTug::CombinedLifeMeterTug() { for( int p=0; pGetPathToG(ssprintf("CombinedLifeMeterTug stream p%d",p+1)), 600 ); + m_Stream[p].Load( THEME->GetPathToG(ssprintf("CombinedLifeMeterTug stream p%d",p+1)), 550 ); this->AddChild( &m_Stream[p] ); } m_Stream[PLAYER_2].SetZoomX( -1 ); @@ -40,13 +40,13 @@ void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, TapNoteScore score ) float fPercentToMove; switch( score ) { - case TNS_MARVELOUS: fPercentToMove = +0.02f; break; - case TNS_PERFECT: fPercentToMove = +0.02f; break; - case TNS_GREAT: fPercentToMove = +0.01f; break; - case TNS_GOOD: fPercentToMove = +0.00f; break; - case TNS_BOO: fPercentToMove = -0.02f; break; - case TNS_MISS: fPercentToMove = -0.04f; break; - default: ASSERT(0); fPercentToMove = +0.00f; break; + case TNS_MARVELOUS: fPercentToMove = +0.010f; break; + case TNS_PERFECT: fPercentToMove = +0.010f; break; + case TNS_GREAT: fPercentToMove = +0.005f; break; + case TNS_GOOD: fPercentToMove = +0.000f; break; + case TNS_BOO: fPercentToMove = -0.010f; break; + case TNS_MISS: fPercentToMove = -0.020f; break; + default: ASSERT(0); fPercentToMove = +0.000f; break; } switch( pn ) diff --git a/stepmania/src/CroppedSprite.cpp b/stepmania/src/CroppedSprite.cpp deleted file mode 100644 index 753a602117..0000000000 --- a/stepmania/src/CroppedSprite.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "global.h" -/* ------------------------------------------------------------------------------ - File: CroppedSprite.h - - Desc: The song's CroppedSprite displayed in SelectSong. - - Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. ------------------------------------------------------------------------------ -*/ - -#include "RageUtil.h" - -#include "CroppedSprite.h" -#include "PrefsManager.h" -#include "RageBitmapTexture.h" - -#include - -CroppedSprite::CroppedSprite() -{ - /* By default, crop to the size of the image. */ - m_fCropWidth = m_fCropHeight = -1; -} - -bool CroppedSprite::Load( RageTextureID ID ) -{ - Sprite::Load( ID ); - CropToSize( m_fCropWidth, m_fCropHeight ); - - return true; -} - -void CroppedSprite::SetWH(float fWidth, float fHeight) -{ - Sprite::SetWidth(fWidth); - Sprite::SetHeight(fHeight); -} - -void CroppedSprite::SetCroppedSize( float fWidth, float fHeight ) -{ - m_fCropWidth = fWidth; - m_fCropHeight = fHeight; -} - -void CroppedSprite::CropToSize( float fWidth, float fHeight ) -{ - m_fCropWidth = fWidth; - m_fCropHeight = fHeight; - - - int iSourceWidth = m_pTexture->GetSourceWidth(); - int iSourceHeight = m_pTexture->GetSourceHeight(); - - // save the original X&Y. We're going to resore them later. - float fOriginalX = GetX(); - float fOriginalY = GetY(); - - if( IsDiagonalBanner(iSourceWidth, iSourceHeight) ) // this is a SSR/DWI CroppedSprite - { - float fCustomImageCoords[8] = { - 0.02f, 0.78f, // top left - 0.22f, 0.98f, // bottom left - 0.98f, 0.22f, // bottom right - 0.78f, 0.02f, // top right - }; - Sprite::SetCustomImageCoords( fCustomImageCoords ); - - if( m_fCropWidth != -1 && m_fCropHeight != -1) - m_size = RageVector2( m_fCropWidth, m_fCropHeight ); - else - { - /* If no crop size is set, then we're only being used to crop diagonal - * banners so they look like regular ones. We don't actually care about - * the size of the image, only that it has an aspect ratio of 4:1. */ - m_size = RageVector2(256, 64); - } - SetZoom( 1 ); - } - else if( m_pTexture->GetID().filename.find( "(was rotated)" ) != m_pTexture->GetID().filename.npos && - m_fCropWidth != -1 && m_fCropHeight != -1 ) - { - /* Dumb hack. Normally, we crop all sprites except for diagonal banners, - * which are stretched. Low-res versions of banners need to do the same - * thing as their full resolution counterpart, so the crossfade looks right. - * However, low-res diagonal banners are un-rotated, to save space. BannerCache - * drops the above text into the "filename" (which is otherwise unused for - * these banners) to tell us this. - */ - Sprite::StopUsingCustomCoords(); - m_size = RageVector2( m_fCropWidth, m_fCropHeight ); - SetZoom( 1 ); - } - else if( m_fCropWidth != -1 && m_fCropHeight != -1 ) - { - // this is probably a background graphic or something not intended to be a CroppedSprite - Sprite::StopUsingCustomCoords(); - - // first find the correct zoom - Sprite::ScaleToCover( RectI(0, 0, - (int)m_fCropWidth, - (int)m_fCropHeight ) - ); - // find which dimension is larger - bool bXDimNeedsToBeCropped = GetZoomedWidth() > m_fCropWidth+0.01; - - if( bXDimNeedsToBeCropped ) // crop X - { - float fPercentageToCutOff = (this->GetZoomedWidth() - m_fCropWidth) / this->GetZoomedWidth(); - float fPercentageToCutOffEachSide = fPercentageToCutOff / 2; - - // generate a rectangle with new texture coordinates - RectF fCustomImageRect( - fPercentageToCutOffEachSide, - 0, - 1 - fPercentageToCutOffEachSide, - 1 ); - SetCustomImageRect( fCustomImageRect ); - } - else // crop Y - { - float fPercentageToCutOff = (this->GetZoomedHeight() - m_fCropHeight) / this->GetZoomedHeight(); - float fPercentageToCutOffEachSide = fPercentageToCutOff / 2; - - // generate a rectangle with new texture coordinates - RectF fCustomImageRect( - 0, - fPercentageToCutOffEachSide, - 1, - 1 - fPercentageToCutOffEachSide ); - SetCustomImageRect( fCustomImageRect ); - } - m_size = RageVector2( m_fCropWidth, m_fCropHeight ); - SetZoom( 1 ); - } - - // restore original XY - SetXY( fOriginalX, fOriginalY ); -} - -bool CroppedSprite::IsDiagonalBanner( int iWidth, int iHeight ) -{ - /* A diagonal banner is a square. Give a couple pixels of leeway. */ - return iWidth >= 100 && abs(iWidth - iHeight) < 2; -} - diff --git a/stepmania/src/CroppedSprite.h b/stepmania/src/CroppedSprite.h deleted file mode 100644 index c27cbcc3d7..0000000000 --- a/stepmania/src/CroppedSprite.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef CROPPEDSPRITE_H -#define CROPPEDSPRITE_H -/* ------------------------------------------------------------------------------ - Class: CroppedSprite - - Desc: The a bitmap that is cropped and zoomed to fill a box. - - Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. - Chris Danford ------------------------------------------------------------------------------ -*/ - - -#include "Sprite.h" - - -class CroppedSprite : public Sprite -{ -public: - CroppedSprite(); - virtual ~CroppedSprite() { } - - bool Load( RageTextureID ID ); - void SetCroppedSize( float fWidth, float fHeight ); - void SetWH(float fWidth, float fHeight); - - static bool IsDiagonalBanner( int iWidth, int iHeight ); - -protected: - void CropToSize( float fWidth, float fHeight ); - - float m_fCropWidth, m_fCropHeight; -}; - - -#endif diff --git a/stepmania/src/DancingCharacters.cpp b/stepmania/src/DancingCharacters.cpp index 7733fceb37..1f2cd991e3 100644 --- a/stepmania/src/DancingCharacters.cpp +++ b/stepmania/src/DancingCharacters.cpp @@ -37,7 +37,7 @@ const float CAMERA_STILL_HEIGHT_VARIANCE = 6.f; const float CAMERA_STILL_LOOK_AT_HEIGHT = -14.f; const float MODEL_X_ONE_PLAYER = 0; -const float MODEL_X_TWO_PLAYERS[NUM_PLAYERS] = { -8, 8 }; +const float MODEL_X_TWO_PLAYERS[NUM_PLAYERS] = { +8, -8 }; DancingCharacters::DancingCharacters() diff --git a/stepmania/src/EditMenu.cpp b/stepmania/src/EditMenu.cpp index 1f6850a071..8e18d904aa 100644 --- a/stepmania/src/EditMenu.cpp +++ b/stepmania/src/EditMenu.cpp @@ -83,11 +83,9 @@ EditMenu::EditMenu() } m_GroupBanner.SetXY( GROUP_BANNER_X, GROUP_BANNER_Y ); - m_GroupBanner.SetCroppedSize( GROUP_BANNER_WIDTH, GROUP_BANNER_HEIGHT ); this->AddChild( &m_GroupBanner ); m_SongBanner.SetXY( SONG_BANNER_X, SONG_BANNER_Y ); - m_SongBanner.SetCroppedSize( SONG_BANNER_WIDTH, SONG_BANNER_HEIGHT ); this->AddChild( &m_SongBanner ); m_SongTextBanner.SetXY( SONG_TEXT_BANNER_X, SONG_TEXT_BANNER_Y ); @@ -258,6 +256,7 @@ void EditMenu::OnRowValueChanged( Row row ) case ROW_GROUP: m_textValue[ROW_GROUP].SetText( SONGMAN->ShortenGroupName(GetSelectedGroup()) ); m_GroupBanner.LoadFromGroup( GetSelectedGroup() ); + m_GroupBanner.ScaleToClipped( GROUP_BANNER_WIDTH, GROUP_BANNER_HEIGHT ); m_pSongs.clear(); SONGMAN->GetSongs( m_pSongs, GetSelectedGroup() ); m_iSelection[ROW_SONG] = 0; @@ -265,6 +264,7 @@ void EditMenu::OnRowValueChanged( Row row ) case ROW_SONG: m_textValue[ROW_SONG].SetText( "" ); m_SongBanner.LoadFromSong( GetSelectedSong() ); + m_SongBanner.ScaleToClipped( SONG_BANNER_WIDTH, SONG_BANNER_HEIGHT ); m_SongTextBanner.LoadFromSong( GetSelectedSong() ); // fall through case ROW_NOTES_TYPE: diff --git a/stepmania/src/FadingBanner.cpp b/stepmania/src/FadingBanner.cpp index c76e1664b4..3598ad6979 100644 --- a/stepmania/src/FadingBanner.cpp +++ b/stepmania/src/FadingBanner.cpp @@ -32,10 +32,10 @@ FadingBanner::FadingBanner() this->AddChild( &m_Banner[i] ); } -void FadingBanner::SetCroppedSize( float fWidth, float fHeight ) +void FadingBanner::ScaleToClipped( float fWidth, float fHeight ) { for( int i=0; i<2; i++ ) - m_Banner[i].SetCroppedSize( fWidth, fHeight ); + m_Banner[i].ScaleToClipped( fWidth, fHeight ); } void FadingBanner::Update( float fDeltaTime ) @@ -69,7 +69,8 @@ void FadingBanner::DrawPrimitives() bool FadingBanner::Load( RageTextureID ID ) { BeforeChange(); - return m_Banner[m_iIndexFront].Load(ID); + bool bRet = m_Banner[m_iIndexFront].Load(ID); + return bRet; } void FadingBanner::BeforeChange() diff --git a/stepmania/src/FadingBanner.h b/stepmania/src/FadingBanner.h index dd29eb3d18..d0a33b9055 100644 --- a/stepmania/src/FadingBanner.h +++ b/stepmania/src/FadingBanner.h @@ -21,7 +21,7 @@ public: FadingBanner(); virtual bool Load( RageTextureID ID ); - void SetCroppedSize( float fWidth, float fHeight ); + void ScaleToClipped( float fWidth, float fHeight ); void LoadFromSong( Song* pSong ); // NULL means no song void LoadAllMusic(); @@ -38,6 +38,7 @@ public: protected: void BeforeChange(); + Banner m_Banner[2]; int m_iIndexFront; int GetBackIndex() { return m_iIndexFront==0 ? 1 : 0; } diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 76ef00cbd2..33cf81a47c 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -80,8 +80,8 @@ void GameState::Reset() m_pPosition = new NoteFieldPositioning("Positioning.ini"); ResetMusicStatistics(); + ResetStageStatistics(); - m_CurStageStats = StageStats(); m_vPassedStageStats.clear(); for( p=0; p=0.5f)?RESULT_WIN:RESULT_LOSE; + case PLAYER_2: return (m_fTugLifePercentP1<0.5f)?RESULT_WIN:RESULT_LOSE; + default: ASSERT(0); return RESULT_LOSE; + } default: return (GetWinner()==pn)?RESULT_WIN:RESULT_LOSE; } @@ -462,6 +471,8 @@ void GameState::RestoreSelectedOptions() void GameState::LaunchAttack( PlayerNumber target, Attack a ) { + LOG->Trace( "Launch attack '%s' against P%d", a.sModifier.c_str(), target+1 ); + // search for an open slot for( unsigned s=0; s m_vPassedStageStats; // Only useful in Arcade for final evaluation // A song is only inserted here if at least one player passed. // StageStats are added by the Evaluation screen + void GetFinalEvalStatsAndSongs( StageStats& statsOut, vector& vSongsOut ); // shown on arcade final evaluation @@ -173,39 +204,16 @@ public: void RestoreSelectedOptions(); - // used in PLAY_MODE_RAVE + // character stuff vector m_pCharacters; Character* m_pCurCharacters[NUM_PLAYERS]; void ReloadCharacters(); - // used in PLAY_MODE_RAVE and PLAY_MODE_BATTLE - struct Attack - { - AttackLevel level; - float fSecsRemaining; - CString sModifier; - bool IsBlank() { return sModifier.empty(); } - void MakeBlank() { sModifier=""; } - }; - Attack m_ActiveAttacks[NUM_PLAYERS][NUM_INVENTORY_SLOTS]; - - // used in PLAY_MODE_BATTLE - Attack m_Inventory[NUM_PLAYERS][NUM_INVENTORY_SLOTS]; - float m_fOpponentHealthPercent; - - bool m_bActiveAttackEndedThisUpdate[NUM_PLAYERS]; // flag for other objects to watch (play sounds) - void LaunchAttack( PlayerNumber target, Attack aa ); - void RebuildPlayerOptionsFromActiveAttacks( PlayerNumber pn ); - void RemoveAllActiveAttacks(); // called on end of song - void RemoveAllInventory(); - int GetSumOfActiveAttackLevels( PlayerNumber pn ); bool HasEarnedExtraStage(); - PlayerNumber GetWinner(); - StageResult GetStageResult( PlayerNumber pn ); bool m_bAllow2ndExtraStage; //only used when "Allow Selection of Extra Stage is on" diff --git a/stepmania/src/ScoreDisplayRave.cpp b/stepmania/src/ScoreDisplayRave.cpp index e9516e95de..ecb95f3d14 100644 --- a/stepmania/src/ScoreDisplayRave.cpp +++ b/stepmania/src/ScoreDisplayRave.cpp @@ -19,22 +19,23 @@ #include "ThemeManager.h" -const float LEVEL_WIDTH = 50; - - ScoreDisplayRave::ScoreDisplayRave() { LOG->Trace( "ScoreDisplayRave::ScoreDisplayRave()" ); + m_lastLevelSeen = ATTACK_LEVEL_1; + for( int i=0; iGetPathToG(ssprintf("ScoreDisplayRave stream level%d",i+1)), LEVEL_WIDTH ); - float fSpan = (NUM_ATTACK_LEVELS-1)*LEVEL_WIDTH; - float fX = SCALE(i,0.f,NUM_ATTACK_LEVELS-1.f, -fSpan/2, fSpan/2 ); - m_LevelStream[i].SetX( fX ); - this->AddChild( &m_LevelStream[i] ); + m_sprMeter[i].Load( THEME->GetPathToG(ssprintf("ScoreDisplayRave stream level%d",i+1)) ); + m_sprMeter[i].SetCropRight( 1.f ); + this->AddChild( &m_sprMeter[i] ); } + m_textLevel.LoadFromNumbers( THEME->GetPathToN("ScoreDisplayRave level") ); + m_textLevel.SetText( "1" ); + this->AddChild( &m_textLevel ); + this->AddChild( &m_sprFrame ); } @@ -42,6 +43,10 @@ void ScoreDisplayRave::Init( PlayerNumber pn ) { ScoreDisplay::Init( pn ); + if( pn == PLAYER_2 ) + for( int i=0; iGetPathToG(ssprintf("ScoreDisplayRave frame p%d",pn+1)) ); } @@ -49,10 +54,16 @@ void ScoreDisplayRave::Update( float fDelta ) { ScoreDisplay::Update( fDelta ); - for( int i=0; im_fSuperMeter[m_PlayerNumber]; + AttackLevel level = (AttackLevel)(int)fLevel; + + if( level != m_lastLevelSeen ) { - float fLevelPercent = GAMESTATE->m_fSuperMeter[m_PlayerNumber] - i; - CLAMP( fLevelPercent, 0 ,1 ); - m_LevelStream[i].SetPercent( fLevelPercent ); + m_sprMeter[m_lastLevelSeen].SetCropRight( 1.f ); + m_lastLevelSeen = level; + m_textLevel.SetText( ssprintf("%d",level+1) ); } + + float fPercent = fLevel - level; + m_sprMeter[level].SetCropRight( 1-fPercent ); } diff --git a/stepmania/src/ScoreDisplayRave.h b/stepmania/src/ScoreDisplayRave.h index cf8fe544c4..94aece2f5e 100644 --- a/stepmania/src/ScoreDisplayRave.h +++ b/stepmania/src/ScoreDisplayRave.h @@ -15,6 +15,7 @@ #include "GameConstantsAndTypes.h" #include "OptionIcon.h" #include "MeterDisplay.h" +#include "Sprite.h" class ScoreDisplayRave : public ScoreDisplay @@ -26,9 +27,11 @@ public: virtual void Update( float fDelta ); protected: - MeterDisplay m_LevelStream[NUM_ATTACK_LEVELS]; + Sprite m_sprMeter[NUM_ATTACK_LEVELS]; Sprite m_sprFrame; - BitmapText m_LevelNumber; + BitmapText m_textLevel; + + AttackLevel m_lastLevelSeen; }; #endif diff --git a/stepmania/src/ScoreKeeperRave.cpp b/stepmania/src/ScoreKeeperRave.cpp index 47f522f227..335dc94517 100644 --- a/stepmania/src/ScoreKeeperRave.cpp +++ b/stepmania/src/ScoreKeeperRave.cpp @@ -43,12 +43,12 @@ void ScoreKeeperRave::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTa float fPercentToMove; switch( scoreOfLastTap ) { - case TNS_MARVELOUS: fPercentToMove = +0.02f; break; - case TNS_PERFECT: fPercentToMove = +0.02f; break; - case TNS_GREAT: fPercentToMove = +0.01f; break; + case TNS_MARVELOUS: fPercentToMove = +0.04f; break; + case TNS_PERFECT: fPercentToMove = +0.04f; break; + case TNS_GREAT: fPercentToMove = +0.02f; break; case TNS_GOOD: fPercentToMove = +0.00f; break; - case TNS_BOO: fPercentToMove = -0.02f; break; - case TNS_MISS: fPercentToMove = -0.04f; break; + case TNS_BOO: fPercentToMove = -0.08f; break; + case TNS_MISS: fPercentToMove = -0.16f; break; default: ASSERT(0); fPercentToMove = +0.00f; break; } @@ -60,11 +60,8 @@ void ScoreKeeperRave::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTa if( newAL > oldAL ) { if( newAL == NUM_ATTACK_LEVELS ) // hit upper bounds of meter - { GAMESTATE->m_fSuperMeter[m_PlayerNumber] -= 1.f; - newAL = (AttackLevel)(NUM_ATTACK_LEVELS-1); - } - LaunchAttack( newAL ); + LaunchAttack( oldAL ); } } diff --git a/stepmania/src/ScreenCredits.cpp b/stepmania/src/ScreenCredits.cpp index b657bb0293..3abbbff92c 100644 --- a/stepmania/src/ScreenCredits.cpp +++ b/stepmania/src/ScreenCredits.cpp @@ -21,7 +21,7 @@ #include "ThemeManager.h" #include "AnnouncerManager.h" #include -#include "CroppedSprite.h" +#include "Sprite.h" #include "song.h" #include "BitmapText.h" @@ -190,9 +190,9 @@ ScreenCredits::ScreenCredits() : Screen("ScreenCredits") break; } - CroppedSprite* pBackground = new CroppedSprite; - pBackground->SetCroppedSize( BACKGROUNDS_WIDTH, BACKGROUNDS_HEIGHT ); + Sprite* pBackground = new Sprite; pBackground->LoadBG( pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathToG("Common fallback background") ); + pBackground->ScaleToClipped( BACKGROUNDS_WIDTH, BACKGROUNDS_HEIGHT ); m_vBackgrounds.push_back( pBackground ); Sprite* pFrame = new Sprite; diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index d02fb4b460..af12529699 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -282,8 +282,8 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName, Type type ) : Screen(sCl { case stage: { - m_LargeBanner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); m_LargeBanner.LoadFromSong( GAMESTATE->m_pCurSong ); + m_LargeBanner.ScaleToClipped( BANNER_WIDTH, BANNER_HEIGHT ); m_LargeBanner.SetName( "LargeBanner" ); UtilSetXYAndOnCommand( m_LargeBanner, "ScreenEvaluation" ); this->AddChild( &m_LargeBanner ); @@ -323,8 +323,8 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName, Type type ) : Screen(sCl { for( unsigned i=0; iAddChild( &m_SmallBanner[i] ); @@ -338,8 +338,8 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName, Type type ) : Screen(sCl break; case course: { - m_LargeBanner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); m_LargeBanner.LoadFromCourse( GAMESTATE->m_pCurCourse ); + m_LargeBanner.ScaleToClipped( BANNER_WIDTH, BANNER_HEIGHT ); m_LargeBanner.SetName( "LargeBanner" ); UtilSetXYAndOnCommand( m_LargeBanner, "ScreenEvaluation" ); this->AddChild( &m_LargeBanner ); diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index c99ac8b8e5..df452e4151 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -90,7 +90,7 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) : Screen("ScreenGameplay") /* Save selected options before we change them. */ GAMESTATE->StoreSelectedOptions(); - GAMESTATE->RemoveAllInventory(); + GAMESTATE->ResetStageStatistics(); for( p=0; pGetMetric ("ScreenRaveOptions","NextScreen"+Capitalize(PlayModeToString(play_mode))) enum { - RO_HUMAN_SUPER, + RO_P1_SUPER_GROWTH, + RO_P2_SUPER_GROWTH, RO_CPU_SKILL, - RO_CPU_SUPER, NUM_RAVE_OPTIONS_LINES }; OptionRow g_RaveOptionsLines[NUM_RAVE_OPTIONS_LINES] = { - OptionRow( "Human Super\nGrowth", "25%","50%","75%","100%","125%","150%","175%","200%" ), - OptionRow( "CPU\nSkill", "-5","-4","-3","-2","-1","DEFAULT","+1","+2","+3","+4","+5" ), - OptionRow( "CPU Super\nGrowth", "25%","50%","75%","100%","125%","150%","175%","200%" ) + OptionRow( "P1 Super\nGrowth", "25%","50%","75%","100%","125%","150%","175%","200%" ), + OptionRow( "P2 Super\nGrowth", "25%","50%","75%","100%","125%","150%","175%","200%" ), + OptionRow( "CPU\nSkill", "-5","-4","-3","-2","-1","DEFAULT","+1","+2","+3","+4","+5" ) }; PlayerNumber OPPOSITE_PLAYER[NUM_PLAYERS] = { PLAYER_2, PLAYER_1 }; ScreenRaveOptions::ScreenRaveOptions() : - ScreenOptions("ScreenRaveOptions",false) + ScreenOptions("ScreenRaveOptions",true) { LOG->Trace( "ScreenRaveOptions::ScreenRaveOptions()" ); bool bComputerPlayersPresent = GAMESTATE->GetNumSidesJoined()==1; Init( - INPUTMODE_PLAYERS, + INPUTMODE_BOTH, g_RaveOptionsLines, bComputerPlayersPresent ? 3 : 1, false, false ); @@ -58,41 +58,22 @@ void ScreenRaveOptions::ImportOptions() { for( int p=0; pIsHumanPlayer(p) ) - { - int iHumanSuperIndex = (int)SCALE( GAMESTATE->m_fSuperMeterGrowthScale[p], 0.25f, 2.f, 0.f, 7.f ); - CLAMP( iHumanSuperIndex, 0, 9 ); - m_iSelectedOption[p][RO_HUMAN_SUPER] = iHumanSuperIndex; - } - else if( GAMESTATE->IsCpuPlayer(p) ) - { - PlayerNumber pnHuman = OPPOSITE_PLAYER[p]; - - m_iSelectedOption[pnHuman][RO_CPU_SKILL] = GAMESTATE->m_iCpuSkill[p]; - CLAMP( m_iSelectedOption[pnHuman][RO_CPU_SKILL], 0, 10 ); - - int iHumanSuperIndex = (int)SCALE( GAMESTATE->m_fSuperMeterGrowthScale[pnHuman], 0.25f, 2.f, 0.f, 7.f ); - CLAMP( iHumanSuperIndex, 0, 9 ); - m_iSelectedOption[pnHuman][RO_CPU_SUPER] = iHumanSuperIndex; - } - else - ASSERT(0); + int iSuperGrowthIndex = (int)SCALE( GAMESTATE->m_fSuperMeterGrowthScale[p], 0.25f, 2.f, 0.f, 7.f ); + CLAMP( iSuperGrowthIndex, 0, 9 ); + m_iSelectedOption[0][RO_P1_SUPER_GROWTH+p] = iSuperGrowthIndex; } + + m_iSelectedOption[0][RO_CPU_SKILL] = GAMESTATE->m_iCpuSkill[0]; + CLAMP( m_iSelectedOption[0][RO_CPU_SKILL], 0, 10 ); } void ScreenRaveOptions::ExportOptions() { - for( int p=0; pIsHumanPlayer(p) ) - { - GAMESTATE->m_fSuperMeterGrowthScale[p] = SCALE( m_iSelectedOption[p][RO_HUMAN_SUPER], 0.f, 7.f, 0.25f, 2.f ); - - PlayerNumber pnCPU = OPPOSITE_PLAYER[p]; - GAMESTATE->m_iCpuSkill[pnCPU] = m_iSelectedOption[p][RO_CPU_SKILL]; - GAMESTATE->m_fSuperMeterGrowthScale[pnCPU] = SCALE( m_iSelectedOption[p][RO_CPU_SUPER], 0, 7, 0.25f, 2.f ); - } - } + int p; + for( p=0; pm_fSuperMeterGrowthScale[p] = SCALE( m_iSelectedOption[0][RO_P1_SUPER_GROWTH+p], 0.f, 7.f, 0.25f, 2.f ); + for( p=0; pm_iCpuSkill[p] = m_iSelectedOption[0][RO_CPU_SKILL]; } void ScreenRaveOptions::GoToPrevState() diff --git a/stepmania/src/ScreenSelectCourse.cpp b/stepmania/src/ScreenSelectCourse.cpp index 8c74ba27ef..377d1e7cca 100644 --- a/stepmania/src/ScreenSelectCourse.cpp +++ b/stepmania/src/ScreenSelectCourse.cpp @@ -76,7 +76,6 @@ ScreenSelectCourse::ScreenSelectCourse() : Screen("ScreenSelectCourse") this->AddChild( &m_sprExplanation ); m_Banner.SetXY( BANNER_X, BANNER_Y ); - m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); this->AddChild( &m_Banner ); m_sprBannerFrame.Load( THEME->GetPathToG("ScreenSelectCourse banner frame") ); @@ -415,6 +414,7 @@ void ScreenSelectCourse::AfterCourseChange() m_textTime.SetText( "xx:xx:xx" ); // The numbers format doesn't have a '?'. Is there a better solution? m_Banner.LoadFromCourse( pCourse ); + m_Banner.ScaleToClipped( BANNER_WIDTH, BANNER_HEIGHT ); m_CourseContentsFrame.SetFromCourse( pCourse ); m_CourseContentsFrame.TweenInAfterChangedCourse(); diff --git a/stepmania/src/ScreenSelectGroup.cpp b/stepmania/src/ScreenSelectGroup.cpp index 05c614e61d..2fd279c82e 100644 --- a/stepmania/src/ScreenSelectGroup.cpp +++ b/stepmania/src/ScreenSelectGroup.cpp @@ -113,7 +113,7 @@ ScreenSelectGroup::ScreenSelectGroup() : Screen("ScreenSelectGroup") // these guys get loaded SetSong and TweenToSong m_Banner.SetName( "Banner" ); - m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); + m_Banner.ScaleToClipped( BANNER_WIDTH, BANNER_HEIGHT ); this->AddChild( &m_Banner ); m_sprFrame.SetName( "Frame" ); diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index e22b908395..3df13bf634 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -44,8 +44,10 @@ const int NUM_SCORE_DIGITS = 9; #define SAMPLE_MUSIC_DELAY THEME->GetMetricF("ScreenSelectMusic","SampleMusicDelay") #define SHOW_RADAR THEME->GetMetricB("ScreenSelectMusic","ShowRadar") #define SHOW_GRAPH THEME->GetMetricB("ScreenSelectMusic","ShowGraph") - #define CDTITLE_SPIN_SECONDS THEME->GetMetricF("ScreenSelectMusic","CDTitleSpinSeconds") +#define PREV_SCREEN( play_mode ) THEME->GetMetric ("ScreenSelectMusic","PrevScreen"+Capitalize(PlayModeToString(play_mode))) +#define NEXT_SCREEN( play_mode ) THEME->GetMetric ("ScreenSelectMusic","NextScreen"+Capitalize(PlayModeToString(play_mode))) +#define NEXT_OPTIONS_SCREEN( play_mode ) THEME->GetMetric ("ScreenSelectMusic","NextOptionsScreen"+Capitalize(PlayModeToString(play_mode))) static const ScreenMessage SM_AllowOptionsMenuRepeat = ScreenMessage(SM_User+1); CString g_sFallbackCDTitlePath; @@ -55,7 +57,7 @@ CString g_sFallbackCDTitlePath; static void FlipSpriteHorizontally(Sprite &s) { float Coords[8]; - s.GetCurrentTextureCoords(Coords); + s.GetActiveTextureCoords(Coords); swap(Coords[0], Coords[6]); /* top left X <-> top right X */ swap(Coords[1], Coords[7]); /* top left Y <-> top right Y */ swap(Coords[2], Coords[4]); /* bottom left X <-> bottom left X */ @@ -98,8 +100,8 @@ ScreenSelectMusic::ScreenSelectMusic() : Screen("ScreenSelectMusic") // this is loaded SetSong and TweenToSong m_Banner.SetName( "Banner" ); - m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); m_Banner.SetUseZBuffer( true ); // do have to pass the z test + m_Banner.ScaleToClipped( BANNER_WIDTH, BANNER_HEIGHT ); this->AddChild( &m_Banner ); m_sprBannerFrame.SetName( "BannerFrame" ); @@ -584,7 +586,7 @@ void ScreenSelectMusic::HandleScreenMessage( const ScreenMessage SM ) } break; case SM_GoToPrevScreen: - SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); + SCREENMAN->SetNewScreen( PREV_SCREEN(GAMESTATE->m_PlayMode) ); /* We may have stray SM_SongChanged messages from the music wheel. We can't * handle them anymore, since the title menu (and attract screens) reset * the game state, so just discard them. */ @@ -593,12 +595,12 @@ void ScreenSelectMusic::HandleScreenMessage( const ScreenMessage SM ) case SM_GoToNextScreen: if( m_bGoToOptions ) { - SCREENMAN->SetNewScreen( "ScreenPlayerOptions" ); + SCREENMAN->SetNewScreen( NEXT_OPTIONS_SCREEN(GAMESTATE->m_PlayMode) ); } else { SOUNDMAN->StopMusic(); - SCREENMAN->SetNewScreen( "ScreenStage" ); + SCREENMAN->SetNewScreen( NEXT_SCREEN(GAMESTATE->m_PlayMode) ); } break; case SM_SongChanged: @@ -912,8 +914,8 @@ void ScreenSelectMusic::AfterMusicChange() case TYPE_RANDOM: switch(m_MusicWheel.GetSelectedType()) { - case TYPE_ROULETTE: m_Banner.LoadRoulette(); break; - case TYPE_RANDOM: m_Banner.LoadRandom(); break; + case TYPE_ROULETTE: m_Banner.LoadRoulette(); break; + case TYPE_RANDOM: m_Banner.LoadRandom(); break; default: ASSERT(0); } diff --git a/stepmania/src/ScrollingList.cpp b/stepmania/src/ScrollingList.cpp index e98a94b915..631ef1ac47 100644 --- a/stepmania/src/ScrollingList.cpp +++ b/stepmania/src/ScrollingList.cpp @@ -120,15 +120,20 @@ void ScrollingList::StartBouncing() m_RippleCSprite.UnloadTexture(); m_RippleCSprite.Load( m_apCSprites[m_iSelection]->GetTexturePath() ); - if(m_RippleCSprite.GetUnzoomedWidth() == m_RippleCSprite.GetUnzoomedHeight()) // rotated graphics need cropping - { - m_RippleCSprite.SetCroppedSize( 100, 100 ); - } - else // flat, unrotated graphics need widths changing - { - m_RippleCSprite.SetCroppedSize( -1, -1 ); // default image size. - m_RippleCSprite.SetWH(EZ2_BANNER_WIDTH+10, EZ2_BANNER_HEIGHT+10); - } + + // ScaleToClipped should detect rotated banner files and correct + // accordingly. If there's a case I didn't think about, feel free + // to change it back. -Chris +// if(m_RippleCSprite.GetUnzoomedWidth() == m_RippleCSprite.GetUnzoomedHeight()) // rotated graphics need cropping +// { +// m_RippleCSprite.ScaleToClipped( 100, 100 ); +// } +// else // flat, unrotated graphics need widths changing +// { +// m_RippleCSprite.ScaleToClipped( -1, -1 ); // default image size. +// m_RippleCSprite.SetWH(EZ2_BANNER_WIDTH+10, EZ2_BANNER_HEIGHT+10); +// } + m_RippleCSprite.ScaleToClipped( EZ2_BANNER_WIDTH+10, EZ2_BANNER_HEIGHT+10 ); m_RippleCSprite.SetXY( m_apCSprites[m_iSelection]->GetX(), m_apCSprites[m_iSelection]->GetY() ); m_RippleCSprite.SetZoom( 2.0f ); @@ -165,7 +170,7 @@ void ScrollingList::Load( const CStringArray& asGraphicPaths ) { for( unsigned i=0; iLoad( asGraphicPaths[i] ); m_apCSprites.push_back( pNewCSprite ); @@ -400,34 +405,43 @@ void ScrollingList::Replace(CString sGraphicPath, int ElementNumber) } else { - CroppedSprite* pNewCSprite = new CroppedSprite; + Sprite* pNewCSprite = new Sprite; pNewCSprite->Load( sGraphicPath ); if(m_iBannerPrefs == BANNERPREFS_DDRFLAT) { - if(pNewCSprite->GetUnzoomedWidth() == pNewCSprite->GetUnzoomedHeight()) // rotated graphics need cropping - { - pNewCSprite->SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); - } - else // flat, unrotated graphics need widths changing - { - pNewCSprite->SetWH(BANNER_WIDTH, BANNER_HEIGHT ); - } + // ScaleToClipped should detect rotated banner files and correct + // accordingly. If there's a case I didn't think about, feel free + // to change it back. -Chris +// if(pNewCSprite->GetUnzoomedWidth() == pNewCSprite->GetUnzoomedHeight()) // rotated graphics need cropping +// { +// pNewCSprite->SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); +// } +// else // flat, unrotated graphics need widths changing +// { +// pNewCSprite->SetWH(BANNER_WIDTH, BANNER_HEIGHT ); +// } + + pNewCSprite->ScaleToClipped( BANNER_WIDTH, BANNER_HEIGHT ); } else if(m_iBannerPrefs == BANNERPREFS_DDRROT) { - pNewCSprite->SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); + pNewCSprite->ScaleToClipped( BANNER_WIDTH, BANNER_HEIGHT ); pNewCSprite->SetRotationZ( DDRROT_ROTATION ); } else if(m_iBannerPrefs == BANNERPREFS_EZ2) { - if(pNewCSprite->GetUnzoomedWidth() == pNewCSprite->GetUnzoomedHeight()) // rotated graphics need cropping - { - pNewCSprite->SetCroppedSize( EZ2_BANNER_WIDTH, EZ2_BANNER_HEIGHT ); - } - else // flat, unrotated graphics need widths changing - { - pNewCSprite->SetWH(EZ2_BANNER_WIDTH, EZ2_BANNER_HEIGHT); - } + // ScaleToClipped should detect rotated banner files and correct + // accordingly. If there's a case I didn't think about, feel free + // to change it back. -Chris +// if(pNewCSprite->GetUnzoomedWidth() == pNewCSprite->GetUnzoomedHeight()) // rotated graphics need cropping +// { +// pNewCSprite->ScaleToClipped( EZ2_BANNER_WIDTH, EZ2_BANNER_HEIGHT ); +// } +// else // flat, unrotated graphics need widths changing +// { +// pNewCSprite->SetWH(EZ2_BANNER_WIDTH, EZ2_BANNER_HEIGHT); +// } + pNewCSprite->ScaleToClipped( BANNER_WIDTH, BANNER_HEIGHT ); } m_apCSprites[ElementNumber] = pNewCSprite; diff --git a/stepmania/src/ScrollingList.h b/stepmania/src/ScrollingList.h index 0453a0161b..1f638d5bfe 100644 --- a/stepmania/src/ScrollingList.h +++ b/stepmania/src/ScrollingList.h @@ -13,7 +13,6 @@ #include "ActorFrame.h" #include "Sprite.h" -#include "CroppedSprite.h" class ScrollingList : public ActorFrame @@ -42,25 +41,25 @@ public: protected: - int m_iBouncingState; - int m_iBounceDir; - int m_iBounceWait; - float m_iBounceSize; + int m_iBouncingState; + int m_iBounceDir; + int m_iBounceWait; + float m_iBounceSize; - int m_iBannerPrefs; - int m_iSpriteType; - int m_iSelection; - float m_fSelectionLag; - int m_iSpacing; - int m_iNumVisible; - float m_fNextTween; - Sprite m_sprBannerMask; - CroppedSprite m_RippleCSprite; - Sprite m_RippleSprite; + int m_iBannerPrefs; + int m_iSpriteType; + int m_iSelection; + float m_fSelectionLag; + int m_iSpacing; + int m_iNumVisible; + float m_fNextTween; + Sprite m_sprBannerMask; + Sprite m_RippleCSprite; + Sprite m_RippleSprite; vector m_apSprites; // stores the list of elements (left to right) - vector m_apCSprites; // stores the list of elements (left to right) + vector m_apCSprites; // stores the list of elements (left to right) }; #endif diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index 3772c95f5c..27789b495e 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -27,7 +27,7 @@ #include "FontCharAliases.h" #include "TitleSubstitution.h" #include "BannerCache.h" -#include "CroppedSprite.h" +#include "Sprite.h" #include "NotesLoaderSM.h" #include "NotesLoaderDWI.h" @@ -705,7 +705,7 @@ void Song::TidyUpData() continue; } - if( !HasBanner() && CroppedSprite::IsDiagonalBanner(width, height) ) + if( !HasBanner() && Sprite::IsDiagonalBanner(width, height) ) { m_sBannerFile = arrayImages[i]; continue; diff --git a/stepmania/src/Sprite.cpp b/stepmania/src/Sprite.cpp index 07b18dadc5..e7d38584ab 100644 --- a/stepmania/src/Sprite.cpp +++ b/stepmania/src/Sprite.cpp @@ -30,6 +30,12 @@ Sprite::Sprite() m_iCurState = 0; m_fSecsIntoState = 0.0; m_bUsingCustomTexCoords = false; + + m_fRememberedClipWidth = -1; + m_fRememberedClipHeight = -1; + + m_fTexCoordVelocityX = 0; + m_fTexCoordVelocityY = 0; } @@ -193,14 +199,18 @@ bool Sprite::LoadFromTexture( RageTextureID ID ) m_States.push_back( newState ); } + // apply clipping (if any) + if( m_fRememberedClipWidth != -1 && m_fRememberedClipHeight != -1 ) + ScaleToClipped( m_fRememberedClipWidth, m_fRememberedClipHeight ); + return true; } -void Sprite::Update( float fDeltaTime ) +void Sprite::Update( float fDelta ) { - Actor::Update( fDeltaTime ); // do tweening + Actor::Update( fDelta ); // do tweening if( !m_bIsAnimating ) return; @@ -208,8 +218,10 @@ void Sprite::Update( float fDeltaTime ) if( !m_pTexture ) // no texture, nothing to animate return; - // update animation - m_fSecsIntoState += fDeltaTime; + // + // update animation frame + // + m_fSecsIntoState += fDelta; while( m_fSecsIntoState > m_States[m_iCurState].fDelay ) // it's time to switch frames { @@ -217,6 +229,27 @@ void Sprite::Update( float fDeltaTime ) m_fSecsIntoState -= m_States[m_iCurState].fDelay; // leave the left over time for the next frame m_iCurState = (m_iCurState+1) % m_States.size(); } + + // + // update scrolling + // + if( m_fTexCoordVelocityX != 0 || m_fTexCoordVelocityY != 0 ) + { + float fTexCoords[8]; + Sprite::GetActiveTextureCoords( fTexCoords ); + + // top left, bottom left, bottom right, top right + fTexCoords[0] += fDelta*m_fTexCoordVelocityX; + fTexCoords[1] += fDelta*m_fTexCoordVelocityY; + fTexCoords[2] += fDelta*m_fTexCoordVelocityX; + fTexCoords[3] += fDelta*m_fTexCoordVelocityY; + fTexCoords[4] += fDelta*m_fTexCoordVelocityX; + fTexCoords[5] += fDelta*m_fTexCoordVelocityY; + fTexCoords[6] += fDelta*m_fTexCoordVelocityX; + fTexCoords[7] += fDelta*m_fTexCoordVelocityY; + + Sprite::SetCustomTextureCoords( fTexCoords ); + } } static void TexCoordsFromArray(RageVertex *v, const float *f) @@ -298,7 +331,7 @@ void Sprite::DrawPrimitives() if( m_pTexture ) { float f[8]; - GetActiveTexCoords(f); + GetActiveTextureCoords(f); TexCoordsFromArray(v, f); @@ -402,13 +435,6 @@ void Sprite::SetCustomTextureCoords( float fTexCoords[8] ) // order: top left, b m_CustomTexCoords[i] = fTexCoords[i]; } -void Sprite::GetCustomTextureCoords( float fTexCoordsOut[8] ) const // order: top left, bottom left, bottom right, top right -{ - for( int i=0; i<8; i++ ) - fTexCoordsOut[i] = m_CustomTexCoords[i]; -} - - void Sprite::SetCustomImageRect( RectF rectImageCoords ) { // Convert to a rectangle in texture coordinate space. @@ -438,19 +464,23 @@ const RectF *Sprite::GetCurrentTextureCoordRect() const return m_pTexture->GetTextureCoordRect( uFrameNo ); } -void Sprite::GetCurrentTextureCoords(float fImageCoords[8]) const -{ - const RectF *pTexCoordRect = GetCurrentTextureCoordRect(); - TexCoordArrayFromRect(fImageCoords, *pTexCoordRect); -} - /* If we're using custom coordinates, return them; otherwise return the coordinates * for the current state. */ -void Sprite::GetActiveTexCoords(float fImageCoords[8]) const +void Sprite::GetActiveTextureCoords(float fTexCoordsOut[8]) const { - if(m_bUsingCustomTexCoords) GetCustomTextureCoords(fImageCoords); - else GetCurrentTextureCoords(fImageCoords); + if(m_bUsingCustomTexCoords) + { + // GetCustomTextureCoords + for( int i=0; i<8; i++ ) + fTexCoordsOut[i] = m_CustomTexCoords[i]; + } + else + { + // GetCurrentTextureCoords + const RectF *pTexCoordRect = GetCurrentTextureCoordRect(); + TexCoordArrayFromRect(fTexCoordsOut, *pTexCoordRect); + } } @@ -459,3 +489,107 @@ void Sprite::StopUsingCustomCoords() m_bUsingCustomTexCoords = false; } + +void Sprite::ScaleToClipped( float fWidth, float fHeight ) +{ + m_fRememberedClipWidth = fWidth; + m_fRememberedClipHeight = fHeight; + + if( !m_pTexture ) + return; + + int iSourceWidth = m_pTexture->GetSourceWidth(); + int iSourceHeight = m_pTexture->GetSourceHeight(); + + // save the original X&Y. We're going to resore them later. + float fOriginalX = GetX(); + float fOriginalY = GetY(); + + if( IsDiagonalBanner(iSourceWidth, iSourceHeight) ) // this is a SSR/DWI CroppedSprite + { + float fCustomImageCoords[8] = { + 0.02f, 0.78f, // top left + 0.22f, 0.98f, // bottom left + 0.98f, 0.22f, // bottom right + 0.78f, 0.02f, // top right + }; + Sprite::SetCustomImageCoords( fCustomImageCoords ); + + if( fWidth != -1 && fHeight != -1) + m_size = RageVector2( fWidth, fHeight ); + else + { + /* If no crop size is set, then we're only being used to crop diagonal + * banners so they look like regular ones. We don't actually care about + * the size of the image, only that it has an aspect ratio of 4:1. */ + m_size = RageVector2(256, 64); + } + SetZoom( 1 ); + } + else if( m_pTexture->GetID().filename.find( "(was rotated)" ) != m_pTexture->GetID().filename.npos && + fWidth != -1 && fHeight != -1 ) + { + /* Dumb hack. Normally, we crop all sprites except for diagonal banners, + * which are stretched. Low-res versions of banners need to do the same + * thing as their full resolution counterpart, so the crossfade looks right. + * However, low-res diagonal banners are un-rotated, to save space. BannerCache + * drops the above text into the "filename" (which is otherwise unused for + * these banners) to tell us this. + */ + Sprite::StopUsingCustomCoords(); + m_size = RageVector2( fWidth, fHeight ); + SetZoom( 1 ); + } + else if( fWidth != -1 && fHeight != -1 ) + { + // this is probably a background graphic or something not intended to be a CroppedSprite + Sprite::StopUsingCustomCoords(); + + // first find the correct zoom + Sprite::ScaleToCover( RectI(0, 0, + (int)fWidth, + (int)fHeight ) + ); + // find which dimension is larger + bool bXDimNeedsToBeCropped = GetZoomedWidth() > fWidth+0.01; + + if( bXDimNeedsToBeCropped ) // crop X + { + float fPercentageToCutOff = (this->GetZoomedWidth() - fWidth) / this->GetZoomedWidth(); + float fPercentageToCutOffEachSide = fPercentageToCutOff / 2; + + // generate a rectangle with new texture coordinates + RectF fCustomImageRect( + fPercentageToCutOffEachSide, + 0, + 1 - fPercentageToCutOffEachSide, + 1 ); + SetCustomImageRect( fCustomImageRect ); + } + else // crop Y + { + float fPercentageToCutOff = (this->GetZoomedHeight() - fHeight) / this->GetZoomedHeight(); + float fPercentageToCutOffEachSide = fPercentageToCutOff / 2; + + // generate a rectangle with new texture coordinates + RectF fCustomImageRect( + 0, + fPercentageToCutOffEachSide, + 1, + 1 - fPercentageToCutOffEachSide ); + SetCustomImageRect( fCustomImageRect ); + } + m_size = RageVector2( fWidth, fHeight ); + SetZoom( 1 ); + } + + // restore original XY + SetXY( fOriginalX, fOriginalY ); +} + +bool Sprite::IsDiagonalBanner( int iWidth, int iHeight ) +{ + /* A diagonal banner is a square. Give a couple pixels of leeway. */ + return iWidth >= 100 && abs(iWidth - iHeight) < 2; +} + diff --git a/stepmania/src/Sprite.h b/stepmania/src/Sprite.h index 38de9bbaa1..86f00e3143 100644 --- a/stepmania/src/Sprite.h +++ b/stepmania/src/Sprite.h @@ -42,15 +42,20 @@ public: void SetCustomTextureRect( const RectF &new_texcoord_frect ); void SetCustomTextureCoords( float fTexCoords[8] ); - void GetCustomTextureCoords( float fTexCoordsOut[8] ) const; void SetCustomSourceRect( const RectF &rectSourceCoords ); // in source pixel space void SetCustomImageRect( RectF rectImageCoords ); // in image pixel space void SetCustomImageCoords( float fImageCoords[8] ); const RectF *GetCurrentTextureCoordRect() const; void StopUsingCustomCoords(); + void GetActiveTextureCoords(float fTexCoordsOut[8]) const; + + + void SetTexCoordVelocity(float fVelX, float fVelY) { m_fTexCoordVelocityX = fVelX; m_fTexCoordVelocityY = fVelY; } + // Scale the Sprite maintaining the aspect ratio so that it fits + // within (fWidth,fHeight) and is clipped to (fWidth,fHeight). + void ScaleToClipped( float fWidth, float fHeight ); + static bool IsDiagonalBanner( int iWidth, int iHeight ); - void GetActiveTexCoords(float fImageCoords[8]) const; - void GetCurrentTextureCoords(float fImageCoords[8]) const; protected: virtual bool LoadFromTexture( RageTextureID ID ); @@ -71,7 +76,14 @@ protected: float m_fSecsIntoState; // number of seconds that have elapsed since we switched to this frame bool m_bUsingCustomTexCoords; - float m_CustomTexCoords[8]; // (x,y) * 4 + float m_CustomTexCoords[8]; // (x,y) * 4: top left, bottom left, bottom right, top right + + // Remembered clipped dimensions are applied on Load(). + // -1 means no remembered dimensions; + float m_fRememberedClipWidth, m_fRememberedClipHeight; + + float m_fTexCoordVelocityX; + float m_fTexCoordVelocityY; }; #endif diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index e2cc3ea4e4..2d0375910e 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -100,6 +100,10 @@ CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /D "WIN32" /D "_XBOX" /D "_DEBUG" /Fr /YX"global.h" /FD /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /D "WIN32" /D "_XBOX" /D "_DEBUG" /Fr /YX"global.h" /FD /c # Begin Special Build Tool +IntDir=.\StepMania___Xbox_Debug___VC6 +TargetDir=.\StepMania___Xbox_Debug___VC6 +TargetName=StepMania +SOURCE="$(InputPath)" PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -2153,23 +2157,6 @@ SOURCE=.\BGAnimationLayer.h # End Source File # Begin Source File -SOURCE=.\CroppedSprite.cpp - -!IF "$(CFG)" == "StepMania - Win32 Debug" - -!ELSEIF "$(CFG)" == "StepMania - Xbox Debug" - -!ELSEIF "$(CFG)" == "StepMania - Win32 Release" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\CroppedSprite.h -# End Source File -# Begin Source File - SOURCE=.\DifficultyIcon.cpp !IF "$(CFG)" == "StepMania - Win32 Debug"