diff --git a/build/systemMenu_RED/Launcher/ARM9/src/bannerCounter.c b/build/systemMenu_RED/Launcher/ARM9/src/bannerCounter.c index 179c3f63..6b7a0783 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/bannerCounter.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/bannerCounter.c @@ -33,6 +33,49 @@ // bannerCounter.c //=============================================== +void BNC_incrementCount( BannerCounter *c ) +{ + // TWLのみカウントインクリメント + if( c->banner->h.platform == BANNER_PLATFORM_TWL ) + { + if( c->banner->anime.control[0].frameCount == 0 ) + { + // アニメに終端しか存在しない + OS_TPrintf( "BNC_incrementCount:Only a Terminator!\n" ); + return; + } + + c->count++; + if( c->count >= c->banner->anime.control[c->control].frameCount ) + { + // カウント値がコントロールのフレームカウントを超えたので次のコントロールへ + c->control++; + c->count = 0; + + //ループ及び停止の処理 + if( c->control >= BANNER_ANIME_CONTROL_INFO_NUM ) + { + // コントロールが限界を超えたら無条件でループ + BNC_resetCount( c ); + } + else if( c->banner->anime.control[c->control].frameCount == 0 ) + { + // コントロールのフレームカウントが0なら終端到達 + if( c->banner->anime.control[c->control].animeType == 0 ) + { + // アニメタイプ0ならループ + BNC_resetCount( c ); + } + else if( c->banner->anime.control[c->control].animeType == 1 ) + { + // アニメタイプ1なら停止(一つ前のコントロールに戻す) + c->control--; + } + } + } + } +} + FrameAnimeData BNC_getFAD( BannerCounter *c ) { FrameAnimeData ret; @@ -40,12 +83,26 @@ FrameAnimeData BNC_getFAD( BannerCounter *c ) { ret.image = c->banner->v1.image; ret.pltt = c->banner->v1.pltt; - ret.vflip = FALSE; ret.hflip = FALSE; + ret.vflip = FALSE; } else { - //TODO:TWLアニメーションバナーのデータを読んでフレームのデータを返す + if( c->banner->anime.control[0].frameCount == 0 ) + { + // アニメに終端しか存在しない + OS_TPrintf( "BNC_getFAD:Only a Terminator!\n" ); + ret.image = c->banner->v1.image; + ret.pltt = c->banner->v1.pltt; + ret.hflip = FALSE; + ret.vflip = FALSE; + return ret; + } + // コントロールデータを読んで、現在のフレームに該当するデータを返す + ret.image = c->banner->anime.image[ c->banner->anime.control[c->control].normal.cellNo ]; + ret.pltt = c->banner->anime.pltt[ c->banner->anime.control[c->control].normal.plttNo ]; + ret.hflip = c->banner->anime.control[c->control].normal.flipType & 0x1; + ret.vflip = (c->banner->anime.control[c->control].normal.flipType & 0x2) >> 1; } return ret; } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/bannerCounter.h b/build/systemMenu_RED/Launcher/ARM9/src/bannerCounter.h index 85a1df89..d1fc4586 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/bannerCounter.h +++ b/build/systemMenu_RED/Launcher/ARM9/src/bannerCounter.h @@ -29,7 +29,8 @@ extern "C" { typedef struct BannerCounter { - u32 count; + u32 control; + u8 count; TWLBannerFile *banner; } BannerCounter; @@ -49,12 +50,7 @@ FrameAnimeData; static inline void BNC_resetCount( BannerCounter *c ) { c->count = 0; -} - -static inline void BNC_initCounter( BannerCounter *c, TWLBannerFile *b) -{ - c->banner = b; - c->count = 0; + c->control = 0; } static inline void BNC_setBanner( BannerCounter *c, TWLBannerFile *b) @@ -62,16 +58,18 @@ static inline void BNC_setBanner( BannerCounter *c, TWLBannerFile *b) c->banner = b; } +static inline void BNC_initCounter( BannerCounter *c, TWLBannerFile *b) +{ + BNC_setBanner( c, b ); + BNC_resetCount( c ); +} + static inline TWLBannerFile* BNC_getBanner( BannerCounter *c ) { return c->banner; } -static inline void BNC_incrementCount( BannerCounter *c ) -{ - c->count++; -} - +void BNC_incrementCount( BannerCounter *c ); FrameAnimeData BNC_getFAD( BannerCounter *c ); FrameAnimeData BNC_getFADAndIncCount( BannerCounter *c ); diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index 5b0fa852..b346cefd 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -79,8 +79,10 @@ extern u16 bg_scr_data2[32 * 32]; static void LoadBannerFiles( void ); static void BannerInit( void ); static void SetDefaultBanner( TitleProperty *titleprop ); -static void SetAffineAnimation( int cursor ); -static void BannerDraw(int cursor, int selected, TitleProperty *titleprop); +static void SetAffineAnimation( BOOL (*flipparam)[4] ); +static void SetBannerCounter( TitleProperty *titleprop ); +static void SetOAMAttr( void ); +static void BannerDraw( int selected, TitleProperty *titleprop); static BOOL SelectCenterFunc( u16 *csr, TPData *tgt ); static BOOL SelectFunc( u16 *csr, TPData *tgt ); static void ProcessBackLightPads( void ); @@ -200,27 +202,33 @@ static void SetDefaultBanner( TitleProperty *titleprop ) } } -// アフィンパラメータの設定 -static void SetAffineAnimation( int cursor ) +// 中央2枚(banner_oam_attr[2],banner_oam_attr[3])のバナーのアフィンパラメータの設定 +// flipparamは左h,左v,右h,右vの順序 +static void SetAffineAnimation( BOOL (*flipparam)[4] ) { MtxFx22 mtx; static double wav; - if(cursor%FRAME_PER_SELECT == 0){ // 適当に波打たせてみる + fx32 param; + + if(s_csr%FRAME_PER_SELECT == 0){ // 適当に波打たせてみる double s = sin(wav); s_selected_banner_size = FX32_HALF - (long)( 0x80 * ( s - 1 ) ); - mtx._00 = s_selected_banner_size; + param = s_selected_banner_size; if(!s_wavstop) wav += 0.1; }else{ // 適当に大きさを変えてみる - mtx._00 = FX32_HALF + FX32_HALF*(cursor%FRAME_PER_SELECT)/FRAME_PER_SELECT; + param = FX32_HALF + FX32_HALF*(s_csr%FRAME_PER_SELECT)/FRAME_PER_SELECT; wav = 0; } + + mtx._00 = param * ( (*flipparam)[0] ? -1 : 1 ); mtx._01 = 0; mtx._10 = 0; - mtx._11 = mtx._00; - G2_SetOBJAffine((GXOamAffine *)(&banner_oam_attr[0]), &mtx); - mtx._00 = FX32_ONE - FX32_HALF*(cursor%FRAME_PER_SELECT)/FRAME_PER_SELECT; - mtx._11 = mtx._00; - G2_SetOBJAffine((GXOamAffine *)(&banner_oam_attr[4]), &mtx); + mtx._11 = param * ( (*flipparam)[1] ? -1 : 1 ); + G2_SetOBJAffine((GXOamAffine *)(&banner_oam_attr[0]), &mtx);// 中央左のバナー + param = FX32_ONE - FX32_HALF*(s_csr%FRAME_PER_SELECT)/FRAME_PER_SELECT; + mtx._00 = param * ( (*flipparam)[2] ? -1 : 1 ); + mtx._11 = param * ( (*flipparam)[3] ? -1 : 1 ); + G2_SetOBJAffine((GXOamAffine *)(&banner_oam_attr[4]), &mtx);// 中央右のバナー } static void SetBannerCounter( TitleProperty *titleprop ) @@ -241,27 +249,14 @@ static void SetBannerCounter( TitleProperty *titleprop ) } } -// バナー関係の描画 -// 思ったよりVRAMへのロードが高速だったので、 -// 特に難しいことを考えず表示するイメージデータだけ毎フレームVRAMにロード -static void BannerDraw(int cursor, int selected, TitleProperty *titleprop) +// OAMデータの設定 +static void SetOAMAttr( void ) { int l; - int div1 = cursor / FRAME_PER_SELECT; - int div2 = cursor % FRAME_PER_SELECT; - static int fadecount = 0; - static int old_selected = -1; - - // デフォルトバナーをTitlePropertyに埋め込み - SetDefaultBanner( titleprop ); + int div1 = s_csr / FRAME_PER_SELECT; + int div2 = s_csr % FRAME_PER_SELECT; + BOOL flipparam[4]; - // アフィンパラメータだけ先に設定しておく - SetAffineAnimation( cursor ); - - // バナーカウンタのバナーセット - SetBannerCounter( titleprop ); - - // OAMデータ設定 for (l=0;l/dev/null && \ - $(MAKEBANNER) -d -N $(BANNER_ICON_NAME) $(BANNER_SPEC) $(TARGETS) +$(TARGETS): $(BANNER_SPEC) + $(MAKEBANNER) -d -p TWL $(BANNER_SPEC) $(TARGETS) # diff --git a/build/systemMenu_RED/PictoChat/banner/icon/msk_pictchat_icon.bin b/build/systemMenu_RED/PictoChat/banner/icon/msk_pictchat_icon.bin new file mode 100644 index 00000000..5b2734aa Binary files /dev/null and b/build/systemMenu_RED/PictoChat/banner/icon/msk_pictchat_icon.bin differ diff --git a/build/systemMenu_RED/PictoChat/banner/test-utf16_v3.TWL.bsf b/build/systemMenu_RED/PictoChat/banner/test-utf16_v3.TWL.bsf new file mode 100644 index 00000000..1049cbbd Binary files /dev/null and b/build/systemMenu_RED/PictoChat/banner/test-utf16_v3.TWL.bsf differ diff --git a/build/systemMenu_RED/data/BGData_Launcher.c b/build/systemMenu_RED/data/BGData_Launcher.c index 63ba70f9..459ede70 100644 --- a/build/systemMenu_RED/data/BGData_Launcher.c +++ b/build/systemMenu_RED/data/BGData_Launcher.c @@ -6,12 +6,12 @@ u32 bg_char_data[8 * 6] = { 0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc, 0xcccccccc, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0xeeeeeeee,// 0002h 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,// 0003h - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee,// 0003h + 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0x11111111, 0x11111111, 0x11111111, 0x11111111,// 0004h 0x11111111, 0x11111111, 0x11111111, 0x11111111, - 0xffffffff, 0xffffff11, 0xffffff11, 0xffff11ff,// 0005h(\) - 0xffff11ff, 0xff11ffff, 0xff11ffff, 0x11ffffff, + 0xeeeeeeee, 0xeeeeee11, 0xeeeeee11, 0xeeee11ee,// 0005h(\) + 0xeeee11ee, 0xee11eeee, 0xee11eeee, 0x11eeeeee, }; @@ -66,6 +66,6 @@ u16 bg_scr_data[32 * 32]= 0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802, 0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,//23 0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801, -};// Buffer for screen data(背景の枠) +};// Bueeer eor screen data(背景の枠) u16 bg_scr_data2[32 * 32];//スクリーンデータ2 \ No newline at end of file