mirror of
https://github.com/dborth/vbagx.git
synced 2024-11-25 12:06:53 +01:00
video zooming works
This commit is contained in:
parent
826af5846d
commit
09ad69dbf4
@ -271,8 +271,8 @@ int FileSelector (int method)
|
||||
p = PAD_ButtonsDown (0);
|
||||
ph = PAD_ButtonsHeld (0);
|
||||
#ifdef HW_RVL
|
||||
wm_ay = WPAD_StickY (0, 0);
|
||||
wm_sx = WPAD_StickX (0, 1);
|
||||
wm_ay = WPAD_Stick (0, 0, 0);
|
||||
wm_sx = WPAD_Stick (0, 1, 1);
|
||||
|
||||
wp = WPAD_ButtonsDown (0);
|
||||
wh = WPAD_ButtonsHeld (0);
|
||||
|
@ -82,14 +82,13 @@ unsigned int ncpadmap[] = {
|
||||
WPAD_BUTTON_2, WPAD_BUTTON_1
|
||||
};
|
||||
|
||||
#ifdef HW_RVL
|
||||
/****************************************************************************
|
||||
* WPAD_StickX
|
||||
* WPAD_Stick
|
||||
*
|
||||
* Get X value from Wii Joystick (classic, nunchuk) input
|
||||
* Get X/Y value from Wii Joystick (classic, nunchuk) input
|
||||
***************************************************************************/
|
||||
|
||||
s8 WPAD_StickX(u8 chan,u8 right)
|
||||
s8 WPAD_Stick(u8 chan, u8 right, int axis)
|
||||
{
|
||||
float mag = 0.0;
|
||||
float ang = 0.0;
|
||||
@ -123,63 +122,19 @@ s8 WPAD_StickX(u8 chan,u8 right)
|
||||
break;
|
||||
}
|
||||
|
||||
/* calculate X value (angle need to be converted into radian) */
|
||||
/* calculate x/y value (angle need to be converted into radian) */
|
||||
if (mag > 1.0) mag = 1.0;
|
||||
else if (mag < -1.0) mag = -1.0;
|
||||
double val = mag * sin((PI * ang)/180.0f);
|
||||
double val;
|
||||
|
||||
if(axis == 0) // x-axis
|
||||
val = mag * sin((PI * ang)/180.0f);
|
||||
else // y-axis
|
||||
val = mag * cos((PI * ang)/180.0f);
|
||||
|
||||
return (s8)(val * 128.0f);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* WPAD_StickY
|
||||
*
|
||||
* Get Y value from Wii Joystick (classic, nunchuk) input
|
||||
***************************************************************************/
|
||||
|
||||
s8 WPAD_StickY(u8 chan, u8 right)
|
||||
{
|
||||
float mag = 0.0;
|
||||
float ang = 0.0;
|
||||
WPADData *data = WPAD_Data(chan);
|
||||
|
||||
switch (data->exp.type)
|
||||
{
|
||||
case WPAD_EXP_NUNCHUK:
|
||||
case WPAD_EXP_GUITARHERO3:
|
||||
if (right == 0)
|
||||
{
|
||||
mag = data->exp.nunchuk.js.mag;
|
||||
ang = data->exp.nunchuk.js.ang;
|
||||
}
|
||||
break;
|
||||
|
||||
case WPAD_EXP_CLASSIC:
|
||||
if (right == 0)
|
||||
{
|
||||
mag = data->exp.classic.ljs.mag;
|
||||
ang = data->exp.classic.ljs.ang;
|
||||
}
|
||||
else
|
||||
{
|
||||
mag = data->exp.classic.rjs.mag;
|
||||
ang = data->exp.classic.rjs.ang;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* calculate X value (angle need to be converted into radian) */
|
||||
if (mag > 1.0) mag = 1.0;
|
||||
else if (mag < -1.0) mag = -1.0;
|
||||
double val = mag * cos((PI * ang)/180.0f);
|
||||
|
||||
return (s8)(val * 128.0f);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* DecodeJoy
|
||||
*
|
||||
@ -196,10 +151,10 @@ u32 DecodeJoy(unsigned short pad)
|
||||
u32 J = 0;
|
||||
|
||||
#ifdef HW_RVL
|
||||
signed char wm_ax = WPAD_StickX ((u8)pad, 0);
|
||||
signed char wm_ay = WPAD_StickY ((u8)pad, 0);
|
||||
signed char wm_ax = WPAD_Stick ((u8)pad, 0, 0);
|
||||
signed char wm_ay = WPAD_Stick ((u8)pad, 0, 1);
|
||||
u32 wp = WPAD_ButtonsHeld (pad);
|
||||
signed char wm_sx = WPAD_StickX (0,1); // CC right joystick
|
||||
signed char wm_sx = WPAD_Stick (0,1,0); // CC right joystick
|
||||
|
||||
u32 exp_type;
|
||||
if ( WPAD_Probe(pad, &exp_type) != 0 ) exp_type = WPAD_EXP_NONE;
|
||||
@ -280,7 +235,7 @@ u32 DecodeJoy(unsigned short pad)
|
||||
}
|
||||
#endif
|
||||
|
||||
// Zoom feature
|
||||
// Turbo feature
|
||||
if(
|
||||
(gc_px > 70)
|
||||
#ifdef HW_RVL
|
||||
@ -317,12 +272,25 @@ u32 GetJoy()
|
||||
int pad = 0;
|
||||
|
||||
s8 gc_px = PAD_SubStickX (0);
|
||||
s8 gc_py = PAD_SubStickY (0);
|
||||
|
||||
#ifdef HW_RVL
|
||||
s8 wm_sx = WPAD_StickX (0,1);
|
||||
s8 wm_sx = WPAD_Stick (0,1,0);
|
||||
s8 wm_sy = WPAD_Stick (0,1,1);
|
||||
u32 wm_pb = WPAD_ButtonsHeld (0); // wiimote / expansion button info
|
||||
#endif
|
||||
|
||||
// Check for video zoom
|
||||
if (GCSettings.NGCZoom)
|
||||
{
|
||||
if (gc_py < -36 || gc_py > 36)
|
||||
zoom ((float) gc_py / -36);
|
||||
#ifdef HW_RVL
|
||||
if (wm_sy < -36 || wm_sy > 36)
|
||||
zoom ((float) wm_sy / -36);
|
||||
#endif
|
||||
}
|
||||
|
||||
// request to go back to menu
|
||||
if ((gc_px < -70)
|
||||
#ifdef HW_RVL
|
||||
|
@ -22,8 +22,7 @@ extern unsigned int wmpadmap[];
|
||||
extern unsigned int ccpadmap[];
|
||||
extern unsigned int ncpadmap[];
|
||||
|
||||
s8 WPAD_StickX(u8 chan,u8 right);
|
||||
s8 WPAD_StickY(u8 chan, u8 right);
|
||||
s8 WPAD_Stick(u8 chan,u8 right, int axis);
|
||||
|
||||
u32 GetJoy();
|
||||
|
||||
|
@ -94,7 +94,7 @@ LoadManager ()
|
||||
/****************************************************************************
|
||||
* Preferences Menu
|
||||
***************************************************************************/
|
||||
static int prefmenuCount = 9;
|
||||
static int prefmenuCount = 10;
|
||||
static char prefmenu[][50] = {
|
||||
|
||||
"Load Method",
|
||||
@ -105,6 +105,7 @@ static char prefmenu[][50] = {
|
||||
"Auto Load",
|
||||
"Auto Save",
|
||||
"Verify MC Saves",
|
||||
"Enable Zooming",
|
||||
|
||||
"Save Preferences",
|
||||
"Back to Main Menu"
|
||||
@ -148,6 +149,9 @@ PreferencesMenu ()
|
||||
GCSettings.SaveMethod++;
|
||||
if(GCSettings.SaveMethod == METHOD_MC_SLOTB)
|
||||
GCSettings.SaveMethod++;
|
||||
prefmenu[6][0] = 0;
|
||||
#else
|
||||
sprintf (prefmenu[6], "Verify MC Saves %s", GCSettings.VerifySaves == true ? " ON" : "OFF");
|
||||
#endif
|
||||
|
||||
// correct load/save methods out of bounds
|
||||
@ -186,7 +190,8 @@ PreferencesMenu ()
|
||||
else if (GCSettings.AutoSave == 2) sprintf (prefmenu[5],"Auto Save SNAPSHOT");
|
||||
else if (GCSettings.AutoSave == 3) sprintf (prefmenu[5],"Auto Save BOTH");
|
||||
|
||||
//sprintf (prefmenu[6], "Verify MC Saves %s", GCSettings.VerifySaves == true ? " ON" : "OFF");
|
||||
sprintf (prefmenu[7], "Enable Zooming %s",
|
||||
GCSettings.NGCZoom == true ? " ON" : "OFF");
|
||||
|
||||
ret = RunMenu (prefmenu, prefmenuCount, (char*)"Preferences", 16);
|
||||
|
||||
@ -223,11 +228,15 @@ PreferencesMenu ()
|
||||
break;
|
||||
|
||||
case 7:
|
||||
GCSettings.NGCZoom ^= 1;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
SavePrefs(GCSettings.SaveMethod, NOTSILENT);
|
||||
break;
|
||||
|
||||
case -1: /*** Button B ***/
|
||||
case 8:
|
||||
case 9:
|
||||
quit = 1;
|
||||
break;
|
||||
|
||||
@ -243,12 +252,13 @@ PreferencesMenu ()
|
||||
int
|
||||
GameMenu ()
|
||||
{
|
||||
int gamemenuCount = 7;
|
||||
int gamemenuCount = 8;
|
||||
char gamemenu[][50] = {
|
||||
"Return to Game",
|
||||
"Reset Game",
|
||||
"Load SRAM", "Save SRAM",
|
||||
"Load Game Snapshot", "Save Game Snapshot",
|
||||
"Reset Zoom",
|
||||
"Back to Main Menu"
|
||||
};
|
||||
|
||||
@ -275,6 +285,9 @@ GameMenu ()
|
||||
gamemenu[3][0] = '\0';
|
||||
gamemenu[5][0] = '\0';
|
||||
}
|
||||
// disable Reset Zoom if Zooming is off
|
||||
if(!GCSettings.NGCZoom)
|
||||
gamemenu[6][0] = '\0';
|
||||
|
||||
ret = RunMenu (gamemenu, gamemenuCount, (char*)"Game Menu");
|
||||
|
||||
@ -306,8 +319,13 @@ GameMenu ()
|
||||
SaveBatteryOrState(GCSettings.SaveMethod, 1, NOTSILENT);
|
||||
break;
|
||||
|
||||
case 6: // Reset Zoom
|
||||
zoom_reset ();
|
||||
quit = retval = 1;
|
||||
break;
|
||||
|
||||
case -1: // Button B
|
||||
case 6: // Return to previous menu
|
||||
case 7: // Return to previous menu
|
||||
retval = 0;
|
||||
quit = 1;
|
||||
break;
|
||||
|
@ -538,7 +538,7 @@ RunMenu (char items[][50], int maxitems, char *title, int fontsize, int x)
|
||||
gc_ay = PAD_StickY (0);
|
||||
p = PAD_ButtonsDown (0);
|
||||
#ifdef HW_RVL
|
||||
wm_ay = WPAD_StickY (0,0);
|
||||
wm_ay = WPAD_Stick (0,0,1);
|
||||
wp = WPAD_ButtonsDown (0);
|
||||
#endif
|
||||
|
||||
|
@ -45,6 +45,7 @@ struct SGCSettings{
|
||||
char smbgcid[20];
|
||||
char smbsvid[20];
|
||||
char smbshare[20];
|
||||
int NGCZoom; // 0 - off, 1 - on
|
||||
int VerifySaves;
|
||||
};
|
||||
|
||||
|
@ -46,4 +46,5 @@ DefaultSettings ()
|
||||
GCSettings.smbgcid[0] = 0;
|
||||
|
||||
GCSettings.VerifySaves = 0;
|
||||
GCSettings.NGCZoom = 0; // zooming default off
|
||||
}
|
||||
|
@ -40,6 +40,8 @@ static int texturesize;
|
||||
GXTexObj texobj;
|
||||
static Mtx view;
|
||||
static int vwidth, vheight, oldvwidth, oldvheight;
|
||||
static int video_vaspect, video_haspect;
|
||||
float zoom_level = 1;
|
||||
|
||||
#define HASPECT 80
|
||||
#define VASPECT 45
|
||||
@ -73,6 +75,27 @@ static camera cam = { {0.0F, 0.0F, 0.0F},
|
||||
{0.0F, 0.0F, -0.5F}
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Drawing screen
|
||||
***************************************************************************/
|
||||
void
|
||||
clearscreen ()
|
||||
{
|
||||
int colour = COLOR_BLACK;
|
||||
|
||||
whichfb ^= 1;
|
||||
VIDEO_ClearFrameBuffer (vmode, xfb[whichfb], colour);
|
||||
memcpy (xfb[whichfb], &bg, 1280 * 480);
|
||||
}
|
||||
|
||||
void
|
||||
showscreen ()
|
||||
{
|
||||
VIDEO_SetNextFramebuffer (xfb[whichfb]);
|
||||
VIDEO_Flush ();
|
||||
VIDEO_WaitVSync ();
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* StartGX
|
||||
****************************************************************************/
|
||||
@ -157,6 +180,7 @@ void InitialiseVideo ()
|
||||
VIDEO_SetNextFramebuffer(xfb[0]);
|
||||
|
||||
GX_Start();
|
||||
clearscreen();
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -211,24 +235,20 @@ static void draw_square(Mtx v)
|
||||
|
||||
void GX_Render_Init(int width, int height, int haspect, int vaspect)
|
||||
{
|
||||
/*** Set new aspect (now with crap AR hack!) ***/
|
||||
square[0] = square[9] = (-haspect - 7);
|
||||
square[3] = square[6] = (haspect + 7);
|
||||
square[1] = square[4] = (vaspect + 7);
|
||||
square[7] = square[10] = (-vaspect - 7);
|
||||
|
||||
/*** Allocate 32byte aligned texture memory ***/
|
||||
texturesize = (width * height) * 2;
|
||||
|
||||
|
||||
if (texturemem)
|
||||
free(texturemem);
|
||||
|
||||
|
||||
texturemem = (u8 *) memalign(32, texturesize);
|
||||
|
||||
memset(texturemem, 0, texturesize);
|
||||
|
||||
/*** Setup for first call to scaler ***/
|
||||
vwidth = vheight = oldvwidth = oldvheight = -1;
|
||||
video_vaspect = vaspect;
|
||||
video_haspect = haspect;
|
||||
}
|
||||
/****************************************************************************
|
||||
* GX_Render
|
||||
@ -254,7 +274,22 @@ void GX_Render(int width, int height, u8 * buffer, int pitch)
|
||||
|
||||
if ((oldvheight != vheight) || (oldvwidth != vwidth))
|
||||
{
|
||||
/** Update scaling **/
|
||||
// Update scaling
|
||||
int xscale = video_haspect;
|
||||
int yscale = video_vaspect;
|
||||
|
||||
// change zoom
|
||||
xscale *= zoom_level;
|
||||
yscale *= zoom_level;
|
||||
|
||||
// Set new aspect (now with crap AR hack!)
|
||||
square[0] = square[9] = (-xscale - 7);
|
||||
square[3] = square[6] = (xscale + 7);
|
||||
square[1] = square[4] = (yscale + 7);
|
||||
square[7] = square[10] = (-yscale - 7);
|
||||
|
||||
GX_InvVtxCache (); // update vertex cache
|
||||
|
||||
oldvwidth = vwidth;
|
||||
oldvheight = vheight;
|
||||
draw_init();
|
||||
@ -263,7 +298,6 @@ void GX_Render(int width, int height, u8 * buffer, int pitch)
|
||||
GX_SetViewport(0, 0, vmode->fbWidth, vmode->efbHeight, 0, 1);
|
||||
}
|
||||
|
||||
GX_InvVtxCache();
|
||||
GX_InvalidateTexAll();
|
||||
GX_SetTevOp(GX_TEVSTAGE0, GX_DECAL);
|
||||
GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
|
||||
@ -316,25 +350,27 @@ void GX_Render(int width, int height, u8 * buffer, int pitch)
|
||||
SMBTimer++;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Drawing screen
|
||||
* Zoom Functions
|
||||
***************************************************************************/
|
||||
void
|
||||
clearscreen (int c)
|
||||
zoom (float speed)
|
||||
{
|
||||
int colour = COLOR_BLACK;
|
||||
if (zoom_level > 1)
|
||||
zoom_level += (speed / -100.0);
|
||||
else
|
||||
zoom_level += (speed / -200.0);
|
||||
|
||||
whichfb ^= 1;
|
||||
VIDEO_ClearFrameBuffer (vmode, xfb[whichfb], colour);
|
||||
memcpy (xfb[whichfb], &bg, 1280 * 480);
|
||||
if (zoom_level < 0.5) zoom_level = 0.5;
|
||||
else if (zoom_level > 10.0) zoom_level = 10.0;
|
||||
|
||||
oldvheight = 0; // update video
|
||||
}
|
||||
|
||||
void
|
||||
showscreen ()
|
||||
zoom_reset ()
|
||||
{
|
||||
VIDEO_SetNextFramebuffer (xfb[whichfb]);
|
||||
VIDEO_Flush ();
|
||||
VIDEO_WaitVSync ();
|
||||
}
|
||||
zoom_level = 1.0;
|
||||
|
||||
oldvheight = 0; // update video
|
||||
}
|
||||
|
@ -18,7 +18,9 @@ void InitialiseVideo ();
|
||||
void GX_Start();
|
||||
void GX_Render_Init(int width, int height, int haspect, int vaspect);
|
||||
void GX_Render(int width, int height, u8 * buffer, int pitch);
|
||||
void clearscreen (int colour = COLOR_BLACK);
|
||||
void clearscreen ();
|
||||
void showscreen ();
|
||||
void zoom (float speed);
|
||||
void zoom_reset ();
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user