+added missing image

+added throbber support
~fixed texture rotation
~improved wiimote pointing
This commit is contained in:
ekeeke31 2009-05-23 17:29:53 +00:00
parent 2a26480498
commit 599aecb9d0
13 changed files with 105 additions and 67 deletions

View File

@ -63,7 +63,7 @@ u32 dvd_read (void *dst, u32 len, u64 offset)
dvd[7] = 3;
/*** Enable reading with DMA ***/
while (dvd[7] & 1);
while (dvd[7] & 1) usleep(10);
memcpy (dst, buffer, len);
/*** Ensure it has completed ***/
@ -88,7 +88,7 @@ u32 dvd_read (void *dst, u32 len, u64 offset)
****************************************************************************/
void dvd_motor_off( )
{
GUI_MsgBoxOpen("Information", "Stopping DVD drive ...");
GUI_MsgBoxOpen("Information", "Stopping DVD drive ...", 1);
#ifndef HW_RVL
dvd[0] = 0x2e;
@ -99,7 +99,7 @@ void dvd_motor_off( )
dvd[5] = 0;
dvd[6] = 0;
dvd[7] = 1; // Do immediate
while (dvd[7] & 1);
while (dvd[7] & 1) usleep(10);
/*** PSO Stops blackscreen at reload ***/
dvd[0] = 0x14;
@ -133,7 +133,7 @@ void uselessinquiry ()
dvd[6] = 0x20;
dvd[7] = 1;
while (dvd[7] & 1);
while (dvd[7] & 1) usleep(10);
}
/****************************************************************************
@ -152,7 +152,7 @@ void dvd_drive_detect()
dvd[5] = 0x80000000;
dvd[6] = 0x20;
dvd[7] = 3;
while( dvd[7] & 1 );
while( dvd[7] & 1 ) usleep(10);
DCFlushRange((void *)0x80000000, 32);
int driveid = (int)inquiry[2];

View File

@ -302,7 +302,7 @@ int DVD_LoadFile(u8 *buffer)
{
char msg[50];
sprintf(msg,"Loading %d bytes...", length);
GUI_MsgBoxOpen("Information",msg);
GUI_MsgBoxOpen("Information",msg,1);
/* How many 2k blocks to read */
int blocks = length / 2048;
int readoffset = 0;
@ -351,7 +351,7 @@ int DVD_Open(void)
if (!getpvd())
{
/* mount DVD */
GUI_MsgBoxOpen("Information", "Mounting DVD ... Wait");
GUI_MsgBoxOpen("Information", "Mounting DVD ...",1);
#ifdef HW_RVL
u32 val;
@ -364,7 +364,7 @@ int DVD_Open(void)
}
DI_Mount();
while(DI_GetStatus() & DVD_INIT);
while(DI_GetStatus() & DVD_INIT) usleep(10);
if (!(DI_GetStatus() & DVD_READY))
{
char msg[50];

View File

@ -196,7 +196,7 @@ int FAT_LoadFile(u8 *buffer)
{
char msg[50];
sprintf(msg,"Loading %d bytes ...", length);
GUI_MsgBoxOpen("Information",msg);
GUI_MsgBoxOpen("Information",msg,1);
fread(buffer, 1, length, sdfile);
fclose(sdfile);
return length;

View File

@ -232,8 +232,8 @@ int ManageSRAM (u8 direction, u8 device)
char filename[MAXJOLIET];
if (direction) GUI_MsgBoxOpen("Information","Loading SRAM ...");
else GUI_MsgBoxOpen("Information","Saving SRAM ...");
if (direction) GUI_MsgBoxOpen("Information","Loading SRAM ...",1);
else GUI_MsgBoxOpen("Information","Saving SRAM ...",1);
/* clean buffer */
memset(savebuffer, 0, STATE_SIZE);
@ -432,8 +432,8 @@ int ManageState (u8 direction, u8 device)
char filename[MAXJOLIET];
if (direction) GUI_MsgBoxOpen("Information","Loading State ...");
else GUI_MsgBoxOpen("Information","Saving State ...");
if (direction) GUI_MsgBoxOpen("Information","Loading State ...",1);
else GUI_MsgBoxOpen("Information","Saving State ...",1);
/* clean buffer */
memset(savebuffer, 0, STATE_SIZE);

View File

@ -131,7 +131,7 @@ int UnZipBuffer (unsigned char *outbuffer, u64 discoffset, char *filename)
memcpy (&pkzip, &readbuffer, sizeof (PKZIPHEADER));
sprintf (msg, "Unzipping %d bytes ...", FLIP32 (pkzip.uncompressedSize));
GUI_MsgBoxOpen("Information",msg);
GUI_MsgBoxOpen("Information",msg,1);
/*** Prepare the zip stream ***/
memset (&zs, 0, sizeof (z_stream));

View File

@ -316,22 +316,20 @@ int FileSelector(unsigned char *buffer)
y = m_input.ir.y;
/* draw wiimote pointer */
gxResetAngle(m_input.ir.angle);
gxDrawTexture(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,255);
gxResetAngle(0.0);
gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255);
/* find selected item */
yoffset = PAGEOFFSET - 2;
yoffset = PAGEOFFSET - 4;
m->selected = m->max_buttons + 2;
for (i = offset; i < (offset + PAGESIZE) && (i < maxfiles); i++)
{
if ((x<=380)&&(y>=yoffset)&&(y<(yoffset+24)))
if ((x<=380)&&(y>=yoffset)&&(y<(yoffset+(bar_over.h))))
{
selection = i;
m->selected = -1;
break;
}
yoffset += 24;
yoffset += (bar_over.h);
}
/* find selected button */

View File

@ -484,9 +484,7 @@ int GUI_UpdateMenu(gui_menu *menu)
int y = m_input.ir.y;
/* draw wiimote pointer */
gxResetAngle(m_input.ir.angle);
gxDrawTexture(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,255);
gxResetAngle(0.0);
gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255);
/* check for valid buttons */
selected = max_buttons + 2;
@ -804,9 +802,7 @@ int GUI_WindowPrompt(gui_menu *parent, char *title, char *items[], u8 nb_items)
y = m_input.ir.y;
/* draw wiimote pointer */
gxResetAngle(m_input.ir.angle);
gxDrawTexture(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,255);
gxResetAngle(0.0);
gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255);
/* check for valid buttons */
selected = -1;
@ -935,9 +931,7 @@ void GUI_SlideMenuTitle(gui_menu *m, int title_offset)
y = m_input.ir.y;
/* draw wiimote pointer */
gxResetAngle(m_input.ir.angle);
gxDrawTexture(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,255);
gxResetAngle(0.0);
gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255);
/* check for valid buttons */
m->selected = m->max_buttons + 2;
@ -1010,6 +1004,12 @@ static void *MsgBox_Thread(void *arg)
if (message_box.msg)
FONT_writeCenter(message_box.msg,18,xwindow,xwindow+message_box.window->width,ypos,(GXColor)WHITE);
/* draw throbber */
if (message_box.throbber)
{
gxDrawTextureRotate(message_box.throbber,xwindow+(message_box.window->width-message_box.throbber->width)/2,ywindow+message_box.window->height-message_box.throbber->height-20,message_box.throbber->width,message_box.throbber->height,(message_box.progress * 360.0) / 100.0, 255);
}
/* draw exit message */
if (message_box.buttonB)
{
@ -1026,6 +1026,10 @@ static void *MsgBox_Thread(void *arg)
/* update display */
gxSetScreen();
/* update progression */
message_box.progress++;
if (message_box.progress > 100) message_box.progress = 0;
}
else
{
@ -1045,7 +1049,7 @@ void GUI_MsgBoxUpdate(gui_menu *parent, char *title, char *msg)
}
/* setup current Message Box */
void GUI_MsgBoxOpen(char *title, char *msg)
void GUI_MsgBoxOpen(char *title, char *msg, bool throbber)
{
if (SILENT) return;
@ -1058,6 +1062,7 @@ void GUI_MsgBoxOpen(char *title, char *msg)
/* initialize default textures */
message_box.window = gxTextureOpenPNG(Frame_s4_png,0);
message_box.top = gxTextureOpenPNG(Frame_s4_title_png,0);
if (throbber) message_box.throbber = gxTextureOpenPNG(Frame_throbber_png,0);
/* window position */
int xwindow = (vmode->fbWidth - message_box.window->width)/2;
@ -1093,6 +1098,7 @@ void GUI_MsgBoxOpen(char *title, char *msg)
}
/* resume LWP thread for MessageBox refresh */
message_box.progress = 0;
message_box.refresh = TRUE;
LWP_ResumeThread(msgboxthread);
}
@ -1151,6 +1157,7 @@ void GUI_MsgBoxClose(void)
gxTextureClose(&message_box.top);
gxTextureClose(&message_box.buttonA);
gxTextureClose(&message_box.buttonB);
gxTextureClose(&message_box.throbber);
}
}
@ -1159,7 +1166,8 @@ void GUI_WaitPrompt(char *title, char *msg)
if (SILENT) return;
/* update message box */
GUI_MsgBoxOpen(title, msg);
gxTextureClose(&message_box.throbber);
GUI_MsgBoxOpen(title, msg, 0);
/* allocate texture memory */
message_box.buttonA = gxTextureOpenPNG(Key_A_png,0);
@ -1198,7 +1206,7 @@ void GUI_Initialize(void)
{
/* create LWP thread for MessageBox refresh */
message_box.refresh = FALSE;
LWP_CreateThread (&msgboxthread, MsgBox_Thread, NULL, NULL, 0, 50);
LWP_CreateThread (&msgboxthread, MsgBox_Thread, NULL, NULL, 0, 10);
LWP_SuspendThread(msgboxthread);
}

View File

@ -121,14 +121,16 @@ typedef struct
typedef struct
{
bool refresh; /* messagebox current state */
gui_menu *parent; /* parent menu */
char title[64]; /* box title */
char msg[64]; /* box message */
gx_texture *window; /* pointer to box texture */
gx_texture *top; /* pointer to box title texture */
gx_texture *buttonA; /* pointer to button A texture */
gx_texture *buttonB; /* pointer to button B texture */
u32 progress; /* progress counter */
bool refresh; /* messagebox current state */
gui_menu *parent; /* parent menu */
char title[64]; /* box title */
char msg[64]; /* box message */
gx_texture *window; /* pointer to box texture */
gx_texture *top; /* pointer to box title texture */
gx_texture *buttonA; /* pointer to button A texture */
gx_texture *buttonB; /* pointer to button B texture */
gx_texture *throbber; /* pointer to throbber texture */
} gui_message;
/* Menu Inputs */
@ -165,6 +167,7 @@ extern const u8 Frame_s3_png[];
extern const u8 Frame_s4_png[];
extern const u8 Frame_s1_title_png[];
extern const u8 Frame_s4_title_png[];
extern const u8 Frame_throbber_png[];
/* ROM Browser */
extern const u8 Overlay_bar_png[];
@ -276,7 +279,7 @@ extern int GUI_UpdateMenu(gui_menu *menu);
extern int GUI_RunMenu(gui_menu *menu);
extern int GUI_WindowPrompt(gui_menu *parent, char *title, char *items[], u8 nb_items);
extern void GUI_SlideMenuTitle(gui_menu *m, int title_offset);
extern void GUI_MsgBoxOpen(char *title, char *msg);
extern void GUI_MsgBoxOpen(char *title, char *msg, bool throbber);
extern void GUI_MsgBoxUpdate(gui_menu *parent, char *title, char *msg);
extern void GUI_MsgBoxClose(void);
extern void GUI_WaitPrompt(char *title, char *msg);

View File

@ -285,9 +285,9 @@ static gui_butn buttons_main[9] =
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_FADE|BUTTON_OVER_SFX ,{3,0,1,1}, 80,194,148,132},
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_FADE|BUTTON_OVER_SFX ,{3,0,1,1},246,194,148,132},
{&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_FADE|BUTTON_OVER_SFX ,{3,0,1,0},412,194,148,132},
{NULL , BUTTON_FADE|BUTTON_OVER_SFX ,{3,0,1,1}, 0,360, 88, 48},
{NULL , BUTTON_FADE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{2,1,1,1},542,330, 88, 38},
{NULL , BUTTON_FADE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,0,1,0},542,370, 88, 48}
{NULL , BUTTON_FADE|BUTTON_OVER_SFX ,{3,0,1,1}, 10,372, 84, 32},
{NULL , BUTTON_FADE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{2,1,1,1},546,334, 84, 32},
{NULL , BUTTON_FADE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,0,1,0},546,372, 84, 32}
};
/* Controllers Menu */
@ -1506,7 +1506,7 @@ static void ctrlmenu(void)
case 12: /* Controller Keys Configuration */
if (config.input[player].device < 0) break;
GUI_MsgBoxOpen("Keys Configuration", "");
GUI_MsgBoxOpen("Keys Configuration", "",0);
if (config.input[player].padtype == DEVICE_6BUTTON)
{
/* 6-buttons gamepad */

View File

@ -662,6 +662,56 @@ void gxDrawTexture(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha)
}
}
void gxDrawTextureRotate(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, f32 angle, u8 alpha)
{
if (!texture) return;
if (texture->data)
{
/* load texture object */
GXTexObj texObj;
GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE);
GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4);
GX_LoadTexObj(&texObj, GX_TEXMAP0);
GX_InvalidateTexAll();
/* vertex coordinate */
x -= (vmode->fbWidth/2);
y -= (vmode->efbHeight/2);
/* Modelview rotation */
Mtx m,mv;
Vector axis = (Vector) {0,0,1};
guLookAt(mv, &cam.pos, &cam.up, &cam.view);
guMtxRotAxisDeg (m, &axis, angle);
guMtxTransApply(m,m, x+w/2,y+h/2,0);
guMtxConcat(mv,m,mv);
GX_LoadPosMtxImm(mv, GX_PNMTX0);
GX_Flush();
/* draw textured quad */
GX_Begin(GX_QUADS, GX_VTXFMT0, 4);
GX_Position2s16(-w/2,-h/2);
GX_Color4u8(0xff,0xff,0xff,alpha);
GX_TexCoord2f32(0.0, 0.0);
GX_Position2s16(w/2,-h/2);
GX_Color4u8(0xff,0xff,0xff,alpha);
GX_TexCoord2f32(1.0, 0.0);
GX_Position2s16(w/2,h/2);
GX_Color4u8(0xff,0xff,0xff,alpha);
GX_TexCoord2f32(1.0, 1.0);
GX_Position2s16(-w/2,h/2);
GX_Color4u8(0xff,0xff,0xff,alpha);
GX_TexCoord2f32(0.0, 1.0);
GX_End ();
GX_DrawDone();
/* restore default Modelview */
guLookAt(mv, &cam.pos, &cam.up, &cam.view);
GX_LoadPosMtxImm(mv, GX_PNMTX0);
GX_Flush();
}
}
void gxDrawTextureRepeat(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha)
{
if (!texture) return;
@ -794,27 +844,6 @@ void gxCopyScreenshot(gx_texture *texture)
DCFlushRange(texture->data, texture->width * texture->height * 4);
}
void gxResetAngle(f32 angle)
{
Mtx view;
if (angle)
{
Mtx m,m1;
Vector axis = (Vector) {0,0,1};
guLookAt(m, &cam.pos, &cam.up, &cam.view);
guMtxRotAxisDeg (m1, &axis, angle);
guMtxConcat(m,m1,view);
}
else
{
guLookAt(view, &cam.pos, &cam.up, &cam.view);
}
GX_LoadPosMtxImm(view, GX_PNMTX0);
GX_Flush();
}
void gxSetScreen(void)
{
GX_CopyDisp(xfb[whichfb], GX_FALSE);

View File

@ -51,9 +51,9 @@ extern u8 gc_pal;
extern void gxDrawRectangle(s32 x, s32 y, s32 w, s32 h, u8 alpha, GXColor color);
extern void gxDrawTexture(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha);
extern void gxDrawTextureRepeat(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha);
extern void gxDrawTextureRotate(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, f32 angle, u8 alpha);
extern void gxDrawScreenshot(u8 alpha);
extern void gxCopyScreenshot(gx_texture *texture);
extern void gxResetAngle(f32 angle);
extern void gxClearScreen(GXColor color);
extern void gxSetScreen(void);

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB