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:
yoshida_teruhisa 2008-01-30 01:30:19 +00:00
parent 5c183b6f10
commit 2c5b3337da
7 changed files with 154 additions and 62 deletions

View File

@ -33,6 +33,49 @@
// bannerCounter.c // 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 BNC_getFAD( BannerCounter *c )
{ {
FrameAnimeData ret; FrameAnimeData ret;
@ -40,12 +83,26 @@ FrameAnimeData BNC_getFAD( BannerCounter *c )
{ {
ret.image = c->banner->v1.image; ret.image = c->banner->v1.image;
ret.pltt = c->banner->v1.pltt; ret.pltt = c->banner->v1.pltt;
ret.vflip = FALSE;
ret.hflip = FALSE; ret.hflip = FALSE;
ret.vflip = FALSE;
} }
else 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; return ret;
} }

View File

@ -29,7 +29,8 @@ extern "C" {
typedef struct BannerCounter typedef struct BannerCounter
{ {
u32 count; u32 control;
u8 count;
TWLBannerFile *banner; TWLBannerFile *banner;
} }
BannerCounter; BannerCounter;
@ -49,12 +50,7 @@ FrameAnimeData;
static inline void BNC_resetCount( BannerCounter *c ) static inline void BNC_resetCount( BannerCounter *c )
{ {
c->count = 0; c->count = 0;
} c->control = 0;
static inline void BNC_initCounter( BannerCounter *c, TWLBannerFile *b)
{
c->banner = b;
c->count = 0;
} }
static inline void BNC_setBanner( BannerCounter *c, TWLBannerFile *b) 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; 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 ) static inline TWLBannerFile* BNC_getBanner( BannerCounter *c )
{ {
return c->banner; return c->banner;
} }
static inline void BNC_incrementCount( BannerCounter *c ) void BNC_incrementCount( BannerCounter *c );
{
c->count++;
}
FrameAnimeData BNC_getFAD( BannerCounter *c ); FrameAnimeData BNC_getFAD( BannerCounter *c );
FrameAnimeData BNC_getFADAndIncCount( BannerCounter *c ); FrameAnimeData BNC_getFADAndIncCount( BannerCounter *c );

View File

@ -79,8 +79,10 @@ extern u16 bg_scr_data2[32 * 32];
static void LoadBannerFiles( void ); static void LoadBannerFiles( void );
static void BannerInit( void ); static void BannerInit( void );
static void SetDefaultBanner( TitleProperty *titleprop ); static void SetDefaultBanner( TitleProperty *titleprop );
static void SetAffineAnimation( int cursor ); static void SetAffineAnimation( BOOL (*flipparam)[4] );
static void BannerDraw(int cursor, int selected, TitleProperty *titleprop); 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 SelectCenterFunc( u16 *csr, TPData *tgt );
static BOOL SelectFunc( u16 *csr, TPData *tgt ); static BOOL SelectFunc( u16 *csr, TPData *tgt );
static void ProcessBackLightPads( void ); static void ProcessBackLightPads( void );
@ -200,27 +202,33 @@ static void SetDefaultBanner( TitleProperty *titleprop )
} }
} }
// アフィンパラメータの設定 // 中央2枚(banner_oam_attr[2],banner_oam_attr[3])のバナーのアフィンパラメータの設定
static void SetAffineAnimation( int cursor ) // flipparamは左h,左v,右h,右vの順序
static void SetAffineAnimation( BOOL (*flipparam)[4] )
{ {
MtxFx22 mtx; MtxFx22 mtx;
static double wav; static double wav;
if(cursor%FRAME_PER_SELECT == 0){ // 適当に波打たせてみる fx32 param;
if(s_csr%FRAME_PER_SELECT == 0){ // 適当に波打たせてみる
double s = sin(wav); double s = sin(wav);
s_selected_banner_size = FX32_HALF - (long)( 0x80 * ( s - 1 ) ); 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; if(!s_wavstop) wav += 0.1;
}else{ // 適当に大きさを変えてみる }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; wav = 0;
} }
mtx._00 = param * ( (*flipparam)[0] ? -1 : 1 );
mtx._01 = 0; mtx._01 = 0;
mtx._10 = 0; mtx._10 = 0;
mtx._11 = mtx._00; mtx._11 = param * ( (*flipparam)[1] ? -1 : 1 );
G2_SetOBJAffine((GXOamAffine *)(&banner_oam_attr[0]), &mtx); G2_SetOBJAffine((GXOamAffine *)(&banner_oam_attr[0]), &mtx);// 中央左のバナー
mtx._00 = FX32_ONE - FX32_HALF*(cursor%FRAME_PER_SELECT)/FRAME_PER_SELECT; param = FX32_ONE - FX32_HALF*(s_csr%FRAME_PER_SELECT)/FRAME_PER_SELECT;
mtx._11 = mtx._00; mtx._00 = param * ( (*flipparam)[2] ? -1 : 1 );
G2_SetOBJAffine((GXOamAffine *)(&banner_oam_attr[4]), &mtx); mtx._11 = param * ( (*flipparam)[3] ? -1 : 1 );
G2_SetOBJAffine((GXOamAffine *)(&banner_oam_attr[4]), &mtx);// 中央右のバナー
} }
static void SetBannerCounter( TitleProperty *titleprop ) static void SetBannerCounter( TitleProperty *titleprop )
@ -241,27 +249,14 @@ static void SetBannerCounter( TitleProperty *titleprop )
} }
} }
// バナー関係の描画 // OAMデータの設定
// 思ったよりVRAMへのロードが高速だったので、 static void SetOAMAttr( void )
// 特に難しいことを考えず表示するイメージデータだけ毎フレームVRAMにロード
static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
{ {
int l; int l;
int div1 = cursor / FRAME_PER_SELECT; int div1 = s_csr / FRAME_PER_SELECT;
int div2 = cursor % FRAME_PER_SELECT; int div2 = s_csr % FRAME_PER_SELECT;
static int fadecount = 0; BOOL flipparam[4];
static int old_selected = -1;
// デフォルトバナーをTitlePropertyに埋め込み
SetDefaultBanner( titleprop );
// アフィンパラメータだけ先に設定しておく
SetAffineAnimation( cursor );
// バナーカウンタのバナーセット
SetBannerCounter( titleprop );
// OAMデータ設定
for (l=0;l<MAX_SHOW_BANNER;l++) for (l=0;l<MAX_SHOW_BANNER;l++)
{ {
int num = div1 - 2 + 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; 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_SetOBJEffect(&banner_oam_attr[l], GX_OAM_EFFECT_AFFINE_DOUBLE, l-2);
G2_SetOBJPosition(&banner_oam_attr[l], G2_SetOBJPosition(&banner_oam_attr[l],
BANNER_FAR_LEFT_POS - BANNER_WIDTH/2 + l*(BANNER_WIDTH + BANNER_INTERVAL) - div2 * DOT_PER_FRAME, BANNER_FAR_LEFT_POS - BANNER_WIDTH/2 + l*(BANNER_WIDTH + BANNER_INTERVAL) - div2 * DOT_PER_FRAME,
BANNER_TOP - BANNER_HEIGHT/2 ); 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; 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 }else
{ {
// そのoamが担当する場所にはバナーがない
G2_SetOBJEffect(&banner_oam_attr[l],GX_OAM_EFFECT_NODISPLAY,0); 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)); DC_FlushRange(&banner_oam_attr, sizeof(banner_oam_attr));
GX_LoadOAM(&banner_oam_attr, 0, sizeof(banner_oam_attr)); GX_LoadOAM(&banner_oam_attr, 0, sizeof(banner_oam_attr));
@ -377,7 +417,7 @@ BOOL LauncherFadeout( TitleProperty *pTitleList )
DrawScrollBar( pTitleList ); DrawScrollBar( pTitleList );
#ifdef DBGBNR #ifdef DBGBNR
BannerDraw( s_csr, selected, pTitleList ); BannerDraw( selected, pTitleList );
#endif #endif
// 描画少し追加 // 描画少し追加
@ -662,7 +702,7 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
DrawScrollBar( pTitleList ); DrawScrollBar( pTitleList );
#ifdef DBGBNR #ifdef DBGBNR
BannerDraw( s_csr, selected, pTitleList ); BannerDraw( selected, pTitleList );
#endif #endif
// RTC情報の取得表示 // RTC情報の取得表示

View File

@ -20,8 +20,9 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
ICON_DIR = ./icon ICON_DIR = ./icon
BANNER_ICON = $(ICON_DIR)/gameIcon.bmp BANNER_SPEC = test-utf16_v3.TWL.bsf
BANNER_SPEC = banner_v3.bsf
MAKEBANNER = $(TWL_TOOLSDIR)/bin/makebanner.TWL.exe
TARGETS = banner.bnr TARGETS = banner.bnr
INSTALL_DIR = ./ INSTALL_DIR = ./
@ -30,9 +31,6 @@ INSTALL_TARGETS = $(TARGETS)
BANNER_ICON_NAME = $(basename $(BANNER_ICON)) BANNER_ICON_NAME = $(basename $(BANNER_ICON))
LDIRT_CLEAN = $(TARGETS) \ LDIRT_CLEAN = $(TARGETS) \
$(BANNER_ICON_NAME).nbfs \
$(BANNER_ICON_NAME).nbfc \
$(BANNER_ICON_NAME).nbfp \
$(TARGETS:.bnr=.srl) $(TARGETS:.bnr=.srl)
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
@ -42,8 +40,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
do-build: $(TARGETS) do-build: $(TARGETS)
$(TARGETS): $(BANNER_SPEC) $(BANNER_ICON) $(TARGETS): $(BANNER_SPEC)
$(NTEXCONV) -no -bg -bgb -bgnc $(BANNER_ICON) >/dev/null && \ $(MAKEBANNER) -d -p TWL $(BANNER_SPEC) $(TARGETS)
$(MAKEBANNER) -d -N $(BANNER_ICON_NAME) $(BANNER_SPEC) $(TARGETS)
# #

View File

@ -6,12 +6,12 @@ u32 bg_char_data[8 * 6] = {
0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc, 0xcccccccc, 0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc, 0xcccccccc,
0xdddddddd, 0xdddddddd, 0xdddddddd, 0xeeeeeeee,// 0002h 0xdddddddd, 0xdddddddd, 0xdddddddd, 0xeeeeeeee,// 0002h
0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,// 0003h 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee,// 0003h
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee,
0x11111111, 0x11111111, 0x11111111, 0x11111111,// 0004h 0x11111111, 0x11111111, 0x11111111, 0x11111111,// 0004h
0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111,
0xffffffff, 0xffffff11, 0xffffff11, 0xffff11ff,// 0005h() 0xeeeeeeee, 0xeeeeee11, 0xeeeeee11, 0xeeee11ee,// 0005h()
0xffff11ff, 0xff11ffff, 0xff11ffff, 0x11ffffff, 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, 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,//23
0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801, 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 u16 bg_scr_data2[32 * 32];//スクリーンデータ2