mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
TWLアニメーションバナー対応
・サンプルとしてPICTOCHATのアイコンをTWLバナーに変更 ・SDKのツールmakebanner.TWLをビルドしておかないと、PICTOCHATのバナーがビルドできません ・バナーの白枠が見づらかったのでランチャーの背景色を若干変更 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@544 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
5c183b6f10
commit
2c5b3337da
@ -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;
|
||||
}
|
||||
|
||||
@ -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 );
|
||||
|
||||
|
||||
@ -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<MAX_SHOW_BANNER;l++)
|
||||
{
|
||||
int num = div1 - 2 + l;
|
||||
@ -280,23 +275,68 @@ static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
|
||||
banner_oam_attr[l].charNo = l*4;
|
||||
|
||||
// 位置およびエフェクトの設定
|
||||
if(l == 2 || l == 3) // 中央付近で大きくなったり小さくなったりする二つのバナー
|
||||
if(l == 2 || l == 3)
|
||||
{
|
||||
// 中央付近で大きくなったり小さくなったりする二つのバナー
|
||||
G2_SetOBJEffect(&banner_oam_attr[l], GX_OAM_EFFECT_AFFINE_DOUBLE, l-2);
|
||||
G2_SetOBJPosition(&banner_oam_attr[l],
|
||||
BANNER_FAR_LEFT_POS - BANNER_WIDTH/2 + l*(BANNER_WIDTH + BANNER_INTERVAL) - div2 * DOT_PER_FRAME,
|
||||
BANNER_TOP - BANNER_HEIGHT/2 );
|
||||
flipparam[(l-2)*2] = fad.hflip;// フリップ情報は一旦保存
|
||||
flipparam[(l-2)*2+1] = fad.vflip;
|
||||
}
|
||||
else // その他のバナー
|
||||
else
|
||||
{
|
||||
// その他のバナー
|
||||
GXOamEffect effect = GX_OAM_EFFECT_NONE;
|
||||
if( fad.vflip )
|
||||
{
|
||||
if( fad.hflip )
|
||||
{
|
||||
effect = GX_OAM_EFFECT_FLIP_HV;
|
||||
}
|
||||
else
|
||||
{
|
||||
effect = GX_OAM_EFFECT_FLIP_V;
|
||||
}
|
||||
}
|
||||
else if( fad.hflip )
|
||||
{
|
||||
effect = GX_OAM_EFFECT_FLIP_H;
|
||||
}
|
||||
banner_oam_attr[l].x = BANNER_FAR_LEFT_POS + l*(BANNER_WIDTH + BANNER_INTERVAL) - div2 * DOT_PER_FRAME;
|
||||
G2_SetOBJEffect(&banner_oam_attr[l],GX_OAM_EFFECT_NONE,0);
|
||||
|
||||
G2_SetOBJEffect(&banner_oam_attr[l],effect,0);
|
||||
}
|
||||
}else
|
||||
{
|
||||
// そのoamが担当する場所にはバナーがない
|
||||
G2_SetOBJEffect(&banner_oam_attr[l],GX_OAM_EFFECT_NODISPLAY,0);
|
||||
}
|
||||
}
|
||||
|
||||
// アフィンパラメータの設定
|
||||
SetAffineAnimation( &flipparam );
|
||||
}
|
||||
|
||||
// バナー関係の描画
|
||||
// 思ったよりVRAMへのロードが高速だったので、
|
||||
// 特に難しいことを考えず表示するイメージデータだけ毎フレームVRAMにロード
|
||||
static void BannerDraw(int selected, TitleProperty *titleprop)
|
||||
{
|
||||
static int fadecount = 0;
|
||||
static int old_selected = -1;
|
||||
|
||||
// デフォルトバナーをTitlePropertyに埋め込み
|
||||
SetDefaultBanner( titleprop );
|
||||
|
||||
// バナーカウンタのバナーセット
|
||||
SetBannerCounter( titleprop );
|
||||
|
||||
// OAMデータの設定
|
||||
SetOAMAttr();
|
||||
|
||||
// OAMをVRAMへロード
|
||||
DC_FlushRange(&banner_oam_attr, sizeof(banner_oam_attr));
|
||||
GX_LoadOAM(&banner_oam_attr, 0, sizeof(banner_oam_attr));
|
||||
|
||||
@ -377,7 +417,7 @@ BOOL LauncherFadeout( TitleProperty *pTitleList )
|
||||
DrawScrollBar( pTitleList );
|
||||
|
||||
#ifdef DBGBNR
|
||||
BannerDraw( s_csr, selected, pTitleList );
|
||||
BannerDraw( selected, pTitleList );
|
||||
#endif
|
||||
|
||||
// 描画少し追加
|
||||
@ -662,7 +702,7 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
|
||||
DrawScrollBar( pTitleList );
|
||||
|
||||
#ifdef DBGBNR
|
||||
BannerDraw( s_csr, selected, pTitleList );
|
||||
BannerDraw( selected, pTitleList );
|
||||
#endif
|
||||
|
||||
// RTC情報の取得&表示
|
||||
|
||||
@ -20,8 +20,9 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
||||
|
||||
ICON_DIR = ./icon
|
||||
|
||||
BANNER_ICON = $(ICON_DIR)/gameIcon.bmp
|
||||
BANNER_SPEC = banner_v3.bsf
|
||||
BANNER_SPEC = test-utf16_v3.TWL.bsf
|
||||
|
||||
MAKEBANNER = $(TWL_TOOLSDIR)/bin/makebanner.TWL.exe
|
||||
|
||||
TARGETS = banner.bnr
|
||||
INSTALL_DIR = ./
|
||||
@ -30,9 +31,6 @@ INSTALL_TARGETS = $(TARGETS)
|
||||
BANNER_ICON_NAME = $(basename $(BANNER_ICON))
|
||||
|
||||
LDIRT_CLEAN = $(TARGETS) \
|
||||
$(BANNER_ICON_NAME).nbfs \
|
||||
$(BANNER_ICON_NAME).nbfc \
|
||||
$(BANNER_ICON_NAME).nbfp \
|
||||
$(TARGETS:.bnr=.srl)
|
||||
|
||||
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
||||
@ -42,8 +40,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
||||
#----------------------------------------------------------------------------
|
||||
do-build: $(TARGETS)
|
||||
|
||||
$(TARGETS): $(BANNER_SPEC) $(BANNER_ICON)
|
||||
$(NTEXCONV) -no -bg -bgb -bgnc $(BANNER_ICON) >/dev/null && \
|
||||
$(MAKEBANNER) -d -N $(BANNER_ICON_NAME) $(BANNER_SPEC) $(TARGETS)
|
||||
$(TARGETS): $(BANNER_SPEC)
|
||||
$(MAKEBANNER) -d -p TWL $(BANNER_SPEC) $(TARGETS)
|
||||
|
||||
#
|
||||
|
||||
BIN
build/systemMenu_RED/PictoChat/banner/icon/msk_pictchat_icon.bin
Normal file
BIN
build/systemMenu_RED/PictoChat/banner/icon/msk_pictchat_icon.bin
Normal file
Binary file not shown.
BIN
build/systemMenu_RED/PictoChat/banner/test-utf16_v3.TWL.bsf
Normal file
BIN
build/systemMenu_RED/PictoChat/banner/test-utf16_v3.TWL.bsf
Normal file
Binary file not shown.
@ -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
|
||||
Loading…
Reference in New Issue
Block a user