mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
バナー表示正常化、バナー表示を活線挿抜に対応する準備完了
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@102 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
90d1670798
commit
1815111691
@ -121,12 +121,12 @@ static inline void DBG_SetRed(u32 y_pos)
|
||||
|
||||
static void * AllocForNAM(unsigned long size)
|
||||
{
|
||||
return OS_AllocFromHeap( OS_ARENA_WRAM_MAIN, OS_CURRENT_HEAP_HANDLE, size );
|
||||
return OS_AllocFromHeap( OS_ARENA_MAIN, OS_CURRENT_HEAP_HANDLE, size );
|
||||
}
|
||||
|
||||
static void FreeForNAM(void *p)
|
||||
{
|
||||
OS_FreeToHeap( OS_ARENA_WRAM_MAIN, OS_CURRENT_HEAP_HANDLE, p);
|
||||
OS_FreeToHeap( OS_ARENA_MAIN, OS_CURRENT_HEAP_HANDLE, p);
|
||||
}
|
||||
|
||||
// SystemMenuの初期化
|
||||
@ -239,37 +239,6 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size)
|
||||
NAMTitleId titleIdArray[TITLE_ID_BUF_SIZE];
|
||||
static BannerFile bannerBuf[TITLE_ID_BUF_SIZE];
|
||||
gotten = NAM_GetTitleList(titleIdArray, TITLE_ID_BUF_SIZE);
|
||||
|
||||
/*
|
||||
{
|
||||
static const char ppp[] = "nand:/title_e/00010001/50434854/content/title.tmd";
|
||||
|
||||
|
||||
FSFile f[1];
|
||||
int len = sizeof(ESTitleMeta);
|
||||
|
||||
FS_InitFile(f);
|
||||
|
||||
if (!FS_OpenFileEx(f, ppp, FS_PERMIT_R))
|
||||
{ // ファイルが存在すれば上書きします
|
||||
OS_TWarning("\"%s\" does not exist.\n", ppp);
|
||||
}
|
||||
|
||||
OS_TPrintf("filelength = %d\n",FS_GetFileLength(f));
|
||||
|
||||
OS_TPrintf("sizeof(ESTitleMeta) = %d\n",len);
|
||||
|
||||
DC_InvalidateRange(dst, (u32)len);
|
||||
size = FS_ReadFile(f, dst, len);
|
||||
if (size < 0)
|
||||
{
|
||||
OS_TWarning("FS_ReadFile() failed.\n");
|
||||
}else
|
||||
{
|
||||
OS_TWarning("OK.\n");
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
// バナーの読み込み……別の関数に移すべきかも。
|
||||
// 毎フレーム変化を見る必要がある。
|
||||
@ -379,6 +348,10 @@ AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle )
|
||||
// アプリロード
|
||||
// アプリ認証
|
||||
|
||||
// 実験用。実際にはこれ使えない(静的に8MBも退避メモリを確保してくれるので無理)
|
||||
// ので、自前のロードプログラムが必要。
|
||||
//NAM_LaunchTitle(pBootTitle->titleID);
|
||||
|
||||
// パラメータチェック
|
||||
if( !SYSMi_CheckTitlePointer( pBootTitle ) ) {
|
||||
return AUTH_RESULT_TITLE_POINTER_ERROR;
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
#include <twl.h>
|
||||
#include "misc.h"
|
||||
#include "launcher.h"
|
||||
#include <math.h>
|
||||
|
||||
|
||||
// define data------------------------------------------
|
||||
@ -28,6 +29,7 @@
|
||||
#define B_LIGHT_BUTTON_BOTTOM_X ( B_LIGHT_BUTTON_TOP_X + 7 )
|
||||
#define B_LIGHT_BUTTON_BOTTOM_Y ( B_LIGHT_BUTTON_TOP_Y + 2 )
|
||||
|
||||
#define CURSOR_PER_SELECT 14
|
||||
|
||||
// extern data------------------------------------------
|
||||
|
||||
@ -41,6 +43,8 @@ static void DrawLauncher(u16 nowCsr, const MenuParam *pMenu);
|
||||
static int s_csr = 0; // メニューのカーソル位置
|
||||
static const u16 *s_pStrLauncher[ LAUNCHER_ELEMENT_NUM ]; // ロゴメニュー用文字テーブルへのポインタリスト
|
||||
|
||||
static u64 old_titleIdArray[TITLE_PROPERTY_NUM];
|
||||
|
||||
// const data -----------------------------------------
|
||||
//===============================================
|
||||
// Launcher.c
|
||||
@ -116,8 +120,8 @@ static BannerFile *card_banner;
|
||||
static BannerFile *download_banner;
|
||||
static u8 image_index_list[TITLE_PROPERTY_NUM];
|
||||
static const int MAX_SHOW_BANNER = 6;
|
||||
static GXOamAttr banner_oam_attr[MAX_SHOW_BANNER];
|
||||
static u8 *pbanner_image_list[TITLE_PROPERTY_NUM*2];
|
||||
static GXOamAttr banner_oam_attr[MAX_SHOW_BANNER+10];// アフィンパラメータ埋める関係で少し大きめ
|
||||
static u8 *pbanner_image_list[TITLE_PROPERTY_NUM];
|
||||
static int banner_count = 0;
|
||||
|
||||
static void LoadBannerFiles()
|
||||
@ -140,11 +144,16 @@ static void BannerInit()
|
||||
int l;
|
||||
LoadBannerFiles();
|
||||
|
||||
MI_CpuClearFast(old_titleIdArray, sizeof(old_titleIdArray) );
|
||||
MI_DmaFill32(3, banner_oam_attr, 192, sizeof(banner_oam_attr)); // let out of the screen if not display
|
||||
|
||||
// ここでやるべきじゃない気がするBGとOBJの設定
|
||||
GX_SetVisiblePlane(GX_PLANEMASK_OBJ | GX_PLANEMASK_BG0); // display only OBJ&BG0
|
||||
GX_SetOBJVRamModeChar(GX_OBJVRAMMODE_CHAR_1D_128K); // 2D mapping mode
|
||||
|
||||
// パレット読み込み
|
||||
// 本来は、読み込んだバナーによってパレットも変更する必要があるのかもしれないが、どの道最大256色
|
||||
// 17個以上のバナーをそれぞれ違うパレットで同時に表示はできないはず。
|
||||
GX_LoadOBJPltt( empty_banner->v1.pltt, 0, BNR_PLTT_SIZE );
|
||||
|
||||
//OBJATTRの初期化……後で値を弄って場所やらキャラクターを変えたりする
|
||||
@ -163,7 +172,6 @@ static void BannerInit()
|
||||
0, // palette
|
||||
0); // affine
|
||||
}
|
||||
G2_SetOBJEffect(&banner_oam_attr[2], GX_OAM_EFFECT_AFFINE_DOUBLE, 0);
|
||||
DC_FlushRange(&banner_oam_attr, sizeof(banner_oam_attr));
|
||||
}
|
||||
|
||||
@ -171,8 +179,21 @@ static void BannerInit()
|
||||
static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
|
||||
{
|
||||
static int count = 0;
|
||||
int l;
|
||||
|
||||
int l;
|
||||
MtxFx22 mtx;
|
||||
|
||||
/*
|
||||
static int testcount=0;
|
||||
testcount++;
|
||||
if( (testcount/5)%2 ==1 ) titleprop[1].titleID = 0;//1secごとにTitlePropertyの2を変化させてみる活線挿抜擬似テスト
|
||||
else
|
||||
{
|
||||
titleprop[1].titleID = 1;
|
||||
titleprop[1].pBanner = download_banner;
|
||||
}
|
||||
*/
|
||||
|
||||
// TitleProperty弄り
|
||||
for(l=0;l<TITLE_PROPERTY_NUM;l++)
|
||||
{
|
||||
@ -187,47 +208,81 @@ static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
|
||||
}
|
||||
|
||||
// TitlePropertyを見てVRAMにキャラクタデータをロード
|
||||
for(l=0;l<TITLE_PROPERTY_NUM;l++)
|
||||
{
|
||||
if(titleprop[l].titleID != old_titleIdArray[l])
|
||||
{
|
||||
// titleID変更されていたら、一からVRAMへのバナー画像ロードしなおし
|
||||
banner_count = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for(l=0;l<TITLE_PROPERTY_NUM;l++)
|
||||
{
|
||||
u8 m;
|
||||
u8 *pban=((BannerFile *)titleprop[l].pBanner)->v1.image;
|
||||
for(m=0;m<banner_count;m++){
|
||||
if(pban == pbanner_image_list[m]) break;
|
||||
if(pban == pbanner_image_list[m]){
|
||||
image_index_list[l]=m;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(m == banner_count)
|
||||
{
|
||||
if(banner_count<TITLE_PROPERTY_NUM*2-1){//バナー画像バッファオーバー時の処理かなり適当……あとで要変更
|
||||
if(banner_count<TITLE_PROPERTY_NUM-1){
|
||||
GX_LoadOBJ(pban, (u32)m*BNR_IMAGE_SIZE , BNR_IMAGE_SIZE);
|
||||
pbanner_image_list[m] = pban;
|
||||
banner_count++;
|
||||
image_index_list[l]=m;
|
||||
}
|
||||
else
|
||||
{ // バナー画像リストオーバー時は、titleIDが更新されずにバナーのみ入れ替わっている(アニメーション?)
|
||||
// 下の実装では少し不安。一から全部ロードしなおすほうが安心。
|
||||
GX_LoadOBJ(pban, (u32)image_index_list[l]*BNR_IMAGE_SIZE , BNR_IMAGE_SIZE);
|
||||
pbanner_image_list[image_index_list[l]] = pban;
|
||||
}
|
||||
}
|
||||
image_index_list[l]=m;// 後の参照用
|
||||
|
||||
old_titleIdArray[l] = titleprop[l].titleID;// 後の参照用
|
||||
}
|
||||
|
||||
count++;
|
||||
|
||||
|
||||
// アフィンパラメータだけ設定しておく
|
||||
{
|
||||
static double wav;
|
||||
if(cursor%CURSOR_PER_SELECT == 0){
|
||||
double s = sin(wav);
|
||||
mtx._00 = 0x880 - (long)(0x80*s);
|
||||
wav += 0.1;
|
||||
}else{
|
||||
mtx._00 = FX32_HALF + FX32_HALF*(cursor%CURSOR_PER_SELECT)/CURSOR_PER_SELECT;
|
||||
wav = 0;
|
||||
}
|
||||
}
|
||||
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%CURSOR_PER_SELECT)/CURSOR_PER_SELECT;
|
||||
mtx._11 = mtx._00;
|
||||
G2_SetOBJAffine((GXOamAffine *)(&banner_oam_attr[4]), &mtx);
|
||||
|
||||
// OAMデータを弄って位置など変更
|
||||
for (l=0;l<MAX_SHOW_BANNER;l++)
|
||||
{
|
||||
int num = cursor/12 - 2 + l;
|
||||
int num = cursor/CURSOR_PER_SELECT - 2 + l;
|
||||
if(-1 < num && num < TITLE_PROPERTY_NUM){
|
||||
banner_oam_attr[l].charNo = image_index_list[num]*4;
|
||||
if(l == 2)
|
||||
|
||||
if(l == 2 || l == 3)
|
||||
{
|
||||
GXOamAffine *test = (GXOamAffine *)&banner_oam_attr[2];
|
||||
MtxFx22 mtx;
|
||||
mtx._00 = FX32_ONE;
|
||||
mtx._01 = 0;
|
||||
mtx._10 = 0;
|
||||
mtx._11 = FX32_ONE;
|
||||
G2_SetOBJPosition(&banner_oam_attr[l], 128-32-(cursor%12)*4, 96-16);
|
||||
G2_SetOBJAffine((GXOamAffine *)&banner_oam_attr[l], &mtx);
|
||||
test=test+1;
|
||||
test=test-1;
|
||||
G2_SetOBJEffect(&banner_oam_attr[l], GX_OAM_EFFECT_AFFINE_DOUBLE, l-2);
|
||||
G2_SetOBJPosition(&banner_oam_attr[l], 128-32-64-48+l*56-(cursor%CURSOR_PER_SELECT)*4, 96-16);
|
||||
}else
|
||||
{
|
||||
banner_oam_attr[l].x = 128-16-64-32+l*48-(cursor%12)*4;
|
||||
banner_oam_attr[l].x = 128-16-64-48+l*56-(cursor%CURSOR_PER_SELECT)*4;
|
||||
G2_SetOBJEffect(&banner_oam_attr[l],GX_OAM_EFFECT_NONE,0);
|
||||
}
|
||||
}else
|
||||
@ -238,7 +293,7 @@ static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
|
||||
DC_FlushRange(&banner_oam_attr, sizeof(banner_oam_attr));
|
||||
GX_LoadOAM(&banner_oam_attr, 0, sizeof(banner_oam_attr));
|
||||
|
||||
// ゲーム名表示
|
||||
// アプリ名表示
|
||||
{
|
||||
NNSG2dChar *str = ((BannerFile *)titleprop[selected].pBanner)->v1.gameName[GetNCDWork()->option.language];
|
||||
int width = NNS_G2dTextCanvasGetStringWidth(&gTextCanvas, str, NULL);
|
||||
@ -257,7 +312,7 @@ void LauncherInit( TitleProperty *pTitleList )
|
||||
int i;
|
||||
GX_DispOff();
|
||||
GXS_DispOff();
|
||||
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
|
||||
NNS_G2dCharCanvasClear( &gCanvas, TXT_UCOLOR_GRAY );
|
||||
|
||||
DrawBackLightSwitch();
|
||||
|
||||
@ -298,7 +353,7 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
|
||||
static int selected = 0;
|
||||
|
||||
// 文字描画クリア
|
||||
NNS_G2dCharCanvasClear(&gCanvas,TXT_COLOR_WHITE);
|
||||
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
|
||||
|
||||
PrintfSJIS( 0, 0, TXT_COLOR_BLUE, "TWL-SYSTEM MENU ver.%06x", SYSMENU_VER );
|
||||
DrawBackLightSwitch();
|
||||
@ -335,11 +390,11 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
|
||||
if(csr_v == 0) csr_v = -1;
|
||||
}
|
||||
s_csr += csr_v;
|
||||
if((TITLE_PROPERTY_NUM-1)*12 < s_csr) s_csr = (TITLE_PROPERTY_NUM-1)*12;
|
||||
if((TITLE_PROPERTY_NUM-1)*CURSOR_PER_SELECT < s_csr) s_csr = (TITLE_PROPERTY_NUM-1)*CURSOR_PER_SELECT;
|
||||
if( s_csr < 0 ) s_csr = 0;
|
||||
if(s_csr%12 == 0){
|
||||
if(s_csr%CURSOR_PER_SELECT == 0){
|
||||
csr_v = 0;
|
||||
selected = s_csr/12;
|
||||
selected = s_csr/CURSOR_PER_SELECT;
|
||||
}
|
||||
// tp_select = SelectMenuByTP( &s_csr, &s_launcherParam );
|
||||
|
||||
@ -350,10 +405,18 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
|
||||
#endif
|
||||
|
||||
if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐
|
||||
/*
|
||||
if( s_launcherPos[ 0 ].enable ) {
|
||||
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
|
||||
return NULL;
|
||||
}
|
||||
*/
|
||||
if(pTitleList[selected].titleID != 0)
|
||||
{
|
||||
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
|
||||
//return &pTitleList[selected];
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user