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
//===============================================
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;
}

View File

@ -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 );

View File

@ -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情報の取得表示

View File

@ -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)
#

View File

@ -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