diff --git a/source/ngc/filesel.cpp b/source/ngc/filesel.cpp index 982a994..ba0db1d 100644 --- a/source/ngc/filesel.cpp +++ b/source/ngc/filesel.cpp @@ -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); diff --git a/source/ngc/input.cpp b/source/ngc/input.cpp index d34510a..0e8d91a 100644 --- a/source/ngc/input.cpp +++ b/source/ngc/input.cpp @@ -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 diff --git a/source/ngc/input.h b/source/ngc/input.h index 37e0170..4d1ef6a 100644 --- a/source/ngc/input.h +++ b/source/ngc/input.h @@ -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(); diff --git a/source/ngc/menu.cpp b/source/ngc/menu.cpp index 12537c5..cb549bd 100644 --- a/source/ngc/menu.cpp +++ b/source/ngc/menu.cpp @@ -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; diff --git a/source/ngc/menudraw.cpp b/source/ngc/menudraw.cpp index 538ee4f..40ec773 100644 --- a/source/ngc/menudraw.cpp +++ b/source/ngc/menudraw.cpp @@ -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 diff --git a/source/ngc/vba.h b/source/ngc/vba.h index 0a8d9ca..0b502a5 100644 --- a/source/ngc/vba.h +++ b/source/ngc/vba.h @@ -45,6 +45,7 @@ struct SGCSettings{ char smbgcid[20]; char smbsvid[20]; char smbshare[20]; + int NGCZoom; // 0 - off, 1 - on int VerifySaves; }; diff --git a/source/ngc/vbaconfig.cpp b/source/ngc/vbaconfig.cpp index 79ba729..7087107 100644 --- a/source/ngc/vbaconfig.cpp +++ b/source/ngc/vbaconfig.cpp @@ -46,4 +46,5 @@ DefaultSettings () GCSettings.smbgcid[0] = 0; GCSettings.VerifySaves = 0; + GCSettings.NGCZoom = 0; // zooming default off } diff --git a/source/ngc/video.cpp b/source/ngc/video.cpp index ac0e12a..a7cb0cf 100644 --- a/source/ngc/video.cpp +++ b/source/ngc/video.cpp @@ -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 +} diff --git a/source/ngc/video.h b/source/ngc/video.h index f152e6e..4c694a8 100644 --- a/source/ngc/video.h +++ b/source/ngc/video.h @@ -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