diff options
-rw-r--r-- | backends/platform/wii/Makefile | 8 | ||||
-rw-r--r-- | backends/platform/wii/gx_supp.cpp | 47 | ||||
-rw-r--r-- | backends/platform/wii/gx_supp.h | 7 | ||||
-rw-r--r-- | backends/platform/wii/osystem.cpp | 28 | ||||
-rw-r--r-- | backends/platform/wii/osystem.h | 3 | ||||
-rw-r--r-- | backends/platform/wii/osystem_gfx.cpp | 75 | ||||
-rw-r--r-- | dists/wii/READMII | 19 |
7 files changed, 149 insertions, 38 deletions
diff --git a/backends/platform/wii/Makefile b/backends/platform/wii/Makefile index d17a7cb41e..ddd4ef17b5 100644 --- a/backends/platform/wii/Makefile +++ b/backends/platform/wii/Makefile @@ -3,7 +3,7 @@ DEBUG_WII = 1 # builds a gamecube version. cleanup object files before flipping this -GAMECUBE = 0 +GAMECUBE = 1 ENABLE_SCUMM = STATIC_PLUGIN ENABLE_SCUMM_7_8 = STATIC_PLUGIN @@ -154,8 +154,10 @@ distclean: distclean-wii distclean-wii: @-$(RM) dist -ifeq ($(GAMECUBE),1) upload: +ifeq ($(GAMECUBE),1) + $(DEVKITPPC)/bin/geckoupload $(TARGET).dol +else $(DEVKITPPC)/bin/wiiload $(TARGET).dol endif @@ -167,6 +169,7 @@ else $(CP) $(TARGET).dol dist/scummvm/boot.dol $(CP) $(DISTPATH)/meta.xml dist/scummvm/ $(CP) $(DISTPATH)/icon.png dist/scummvm/ +endif $(CP) $(DISTPATH)/READMII dist/scummvm/ $(CP) $(srcdir)/AUTHORS dist/scummvm/ $(CP) $(srcdir)/COPYING dist/scummvm/ @@ -175,5 +178,4 @@ else $(CP) $(srcdir)/README dist/scummvm/ $(CP) $(DIST_FILES_THEMES) dist/scummvm/ $(CP) $(DIST_FILES_ENGINEDATA) dist/scummvm/ -endif diff --git a/backends/platform/wii/gx_supp.cpp b/backends/platform/wii/gx_supp.cpp index 4c7b8ed58a..436deddbb8 100644 --- a/backends/platform/wii/gx_supp.cpp +++ b/backends/platform/wii/gx_supp.cpp @@ -1,6 +1,7 @@ /**************************************************************************** * Generic GX Support for Emulators * softdev 2007 +* dhewg 2008 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,12 +22,13 @@ * These are pretty standard functions to setup and use GX scaling. ****************************************************************************/ -#include <gccore.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> +#include "gx_supp.h" + #define DEFAULT_FIFO_SIZE (256 * 1024) #define HASPECT 320 @@ -39,18 +41,19 @@ extern "C" { /*** 2D ***/ static u32 whichfb; static u32 *xfb[2]; -static GXRModeObj *vmode; +GXRModeObj *vmode = NULL; /*** 3D GX ***/ static u8 *gp_fifo; /*** Texture memory ***/ -static u8 *texturemem; +static u8 *texturemem = NULL; static u32 texturesize; -GXTexObj texobj; +static GXTexObj texobj; static Mtx view; static u16 vwidth, vheight, oldvwidth, oldvheight; +static float tex_xT = 0.0f, tex_yT = 0.0f; /* New texture based scaler */ typedef struct tagcamera { @@ -74,6 +77,10 @@ static camera cam = { void GX_InitVideo() { vmode = VIDEO_GetPreferredMode(NULL); + + vmode->viWidth = 678; + vmode->viXOrigin = (VI_MAX_WIDTH_PAL - 678) / 2; + VIDEO_Configure(vmode); xfb[0] = (u32 *) MEM_K0_TO_K1 (SYS_AllocateFramebuffer(vmode)); @@ -93,6 +100,15 @@ void GX_InitVideo() { VIDEO_WaitVSync(); } +void GX_SetTexTrans(float xT, float yT) { + tex_xT = xT; + tex_yT = yT; +} + +void GX_SetCamPosZ(float f) { + cam.pos.z = f; +} + /**************************************************************************** * Scaler Support Functions ****************************************************************************/ @@ -128,7 +144,7 @@ static void draw_square(Mtx v) { Mtx mv; guMtxIdentity(m); - guMtxTransApply(m, m, 0, 0, -100); + guMtxTransApply(m, m, tex_xT, tex_yT, -100); guMtxConcat(v, m, mv); GX_LoadPosMtxImm(mv, GX_PNMTX0); @@ -144,9 +160,9 @@ static void draw_square(Mtx v) { * StartGX ****************************************************************************/ void GX_Start(u16 width, u16 height, s16 haspect, s16 vaspect) { + static bool inited = false; Mtx p; - - GX_AbortFrame(); + GXColor gxbackground = { 0, 0, 0, 0xff }; /*** Set new aspect ***/ square[0] = square[9] = -haspect; @@ -156,9 +172,20 @@ void GX_Start(u16 width, u16 height, s16 haspect, s16 vaspect) { /*** Allocate 32byte aligned texture memory ***/ texturesize = (width * height) * 2; + + if (texturemem) + free(texturemem); + texturemem = (u8 *) memalign(32, texturesize); + memset(texturemem, 0, texturesize); - GXColor gxbackground = { 0, 0, 0, 0xff }; + /*** Setup for first call to scaler ***/ + oldvwidth = oldvheight = -1; + + if (inited) + return; + + inited = true; /*** Clear out FIFO area ***/ memset(gp_fifo, 0, DEFAULT_FIFO_SIZE); @@ -184,12 +211,8 @@ void GX_Start(u16 width, u16 height, s16 haspect, s16 vaspect) { guPerspective(p, 60, 1.33f, 10.0f, 1000.0f); GX_LoadProjectionMtx(p, GX_PERSPECTIVE); - memset(texturemem, 0, texturesize); GX_Flush(); - - /*** Setup for first call to scaler ***/ - vwidth = vheight = -1; } /**************************************************************************** diff --git a/backends/platform/wii/gx_supp.h b/backends/platform/wii/gx_supp.h index 9393e93a26..108a94f0e7 100644 --- a/backends/platform/wii/gx_supp.h +++ b/backends/platform/wii/gx_supp.h @@ -1,6 +1,7 @@ /**************************************************************************** * Generic GX Scaler * softdev 2007 +* dhewg 2008 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,11 +24,17 @@ #ifndef _WII_GX_SUPP_H_ #define _WII_GX_SUPP_H_ +#include <gccore.h> + #ifdef __cplusplus extern "C" { #endif +extern GXRModeObj *vmode; + void GX_InitVideo(); +void GX_SetTexTrans(float xT, float yT); +void GX_SetCamPosZ(float f); void GX_Start(u16 width, u16 height, s16 haspect, s16 vaspect); void GX_Render(u16 width, u16 height, u8 *buffer, u16 pitch); diff --git a/backends/platform/wii/osystem.cpp b/backends/platform/wii/osystem.cpp index 3ec32126f0..505f93c820 100644 --- a/backends/platform/wii/osystem.cpp +++ b/backends/platform/wii/osystem.cpp @@ -19,8 +19,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "osystem.h" #include "backends/fs/wii/wii-fs-factory.h" +#include "common/config-manager.h" + +#include "osystem.h" #include <unistd.h> @@ -51,7 +53,9 @@ OSystem_Wii::OSystem_Wii() : _currentHeight(0), _supportedGraphicsModes(NULL), - _activeGraphicsMode(-1), + _activeGraphicsMode(0), + + _fullscreen(false), _mouseVisible(false), _mouseX(0), @@ -98,6 +102,8 @@ void OSystem_Wii::initBackend() { _mixer = new Audio::MixerImpl(this); _timer = new DefaultTimerManager(); + _fullscreen = ConfMan.getBool("fullscreen"); + initGfx(); initSfx(); initEvents(); @@ -112,14 +118,28 @@ void OSystem_Wii::quit() { } bool OSystem_Wii::hasFeature(Feature f) { - return f == kFeatureCursorHasPalette; + return (f == kFeatureFullscreenMode) || + (f == kFeatureCursorHasPalette); } void OSystem_Wii::setFeatureState(Feature f, bool enable) { + switch (f) { + case kFeatureFullscreenMode: + _fullscreen = enable; + setGraphicsMode(_activeGraphicsMode); + break; + default: + break; + } } bool OSystem_Wii::getFeatureState(Feature f) { - return false; + switch (f) { + case kFeatureFullscreenMode: + return _fullscreen; + default: + return false; + } } uint32 OSystem_Wii::getMillis() { diff --git a/backends/platform/wii/osystem.h b/backends/platform/wii/osystem.h index 71bf9bce2e..94c0fa76b3 100644 --- a/backends/platform/wii/osystem.h +++ b/backends/platform/wii/osystem.h @@ -73,6 +73,8 @@ private: OSystem::GraphicsMode *_supportedGraphicsModes; s32 _activeGraphicsMode; + bool _fullscreen; + bool _mouseVisible; s32 _mouseX, _mouseY; u32 _mouseWidth, _mouseHeight; @@ -110,7 +112,6 @@ public: virtual bool getFeatureState(Feature f); virtual const GraphicsMode *getSupportedGraphicsModes() const; virtual int getDefaultGraphicsMode() const; - bool setGraphicsMode(const char *name); virtual bool setGraphicsMode(int mode); virtual int getGraphicsMode() const; virtual void initSize(uint width, uint height); diff --git a/backends/platform/wii/osystem_gfx.cpp b/backends/platform/wii/osystem_gfx.cpp index 1e54233c93..faad41d5f0 100644 --- a/backends/platform/wii/osystem_gfx.cpp +++ b/backends/platform/wii/osystem_gfx.cpp @@ -27,7 +27,12 @@ #define MAX_FPS 30 enum GraphicModeID { - GM_DEFAULT + GM_DEFAULT = 0, + GM_OVERSCAN1, + GM_OVERSCAN2, + GM_OVERSCAN3, + GM_OVERSCAN4, + GM_OVERSCAN5 }; void OSystem_Wii::initGfx() { @@ -42,6 +47,11 @@ void OSystem_Wii::initGfx() { _overlayWidth = 640; _overlayHeight = 480; +#ifndef GAMECUBE + if (CONF_GetAspectRatio() && _fullscreen) + _overlayHeight = 360; +#endif + _overlaySize = _overlayWidth * _overlayHeight * 2; _overlayPixels = (OverlayColor *) memalign(32, _overlaySize); @@ -51,17 +61,32 @@ void OSystem_Wii::initGfx() { _cursorPalette = (u16 *) memalign(32, 256 * 2); memset(_cursorPalette, 0, 256 * 2); - _supportedGraphicsModes = new OSystem::GraphicsMode[2]; - _supportedGraphicsModes[0].name = strdup("gx"); - _supportedGraphicsModes[0].description = strdup("wii hardware scaler"); + _supportedGraphicsModes = new OSystem::GraphicsMode[7]; + _supportedGraphicsModes[0].name = strdup("standard"); + _supportedGraphicsModes[0].description = strdup("standard"); _supportedGraphicsModes[0].id = GM_DEFAULT; - _supportedGraphicsModes[1].name = 0; - _supportedGraphicsModes[1].description = 0; - _supportedGraphicsModes[1].id = 0; - - _texture = (u16 *) memalign(32, _overlaySize); - - GX_Start(_overlayWidth, _overlayHeight, 320, 240); + _supportedGraphicsModes[1].name = strdup("overscan1"); + _supportedGraphicsModes[1].description = strdup("overscan 1"); + _supportedGraphicsModes[1].id = GM_OVERSCAN1; + _supportedGraphicsModes[2].name = strdup("overscan2"); + _supportedGraphicsModes[2].description = strdup("overscan 2"); + _supportedGraphicsModes[2].id = GM_OVERSCAN2; + _supportedGraphicsModes[3].name = strdup("overscan3"); + _supportedGraphicsModes[3].description = strdup("overscan 3"); + _supportedGraphicsModes[3].id = GM_OVERSCAN3; + _supportedGraphicsModes[4].name = strdup("overscan4"); + _supportedGraphicsModes[4].description = strdup("overscan 4"); + _supportedGraphicsModes[4].id = GM_OVERSCAN4; + _supportedGraphicsModes[5].name = strdup("overscan5"); + _supportedGraphicsModes[5].description = strdup("overscan 5"); + _supportedGraphicsModes[5].id = GM_OVERSCAN5; + _supportedGraphicsModes[6].name = 0; + _supportedGraphicsModes[6].description = 0; + _supportedGraphicsModes[6].id = 0; + + _texture = (u16 *) memalign(32, 640 * 480 * 2); + + setGraphicsMode(_activeGraphicsMode); } void OSystem_Wii::deinitGfx() { @@ -111,13 +136,24 @@ int OSystem_Wii::getDefaultGraphicsMode() const { return GM_DEFAULT; } -bool OSystem_Wii::setGraphicsMode(const char *mode) { - setGraphicsMode(GM_DEFAULT); +bool OSystem_Wii::setGraphicsMode(int mode) { + s16 xar, yar; - return true; -} + printf("setGraphicsMode %d\n", mode); + + xar = vmode->viWidth / 2; + yar = vmode->xfbHeight / 2; + +#ifndef GAMECUBE + if (CONF_GetAspectRatio() && !_fullscreen) + xar /= 1.33f; +#endif + + GX_SetCamPosZ(400 - mode * 10); + GX_Start(640, 480, xar, yar); + + _activeGraphicsMode = mode; -bool OSystem_Wii::setGraphicsMode(int mode) { return true; } @@ -129,6 +165,8 @@ void OSystem_Wii::initSize(uint width, uint height) { if (_gameWidth != width || _gameHeight != height) { printf("initSize %u %u\n", width, height); + assert((width <= 640) && (height <= 480)); + _gameWidth = width; _gameHeight = height; @@ -136,12 +174,15 @@ void OSystem_Wii::initSize(uint width, uint height) { free(_gamePixels); _gamePixels = (u8 *) memalign(32, _gameWidth * _gameHeight); + memset(_gamePixels, 0, _gameWidth * _gameHeight); if (!_overlayVisible) { _currentWidth = _gameWidth; _currentHeight = _gameHeight; updateEventScreenResolution(); } + + setGraphicsMode(_activeGraphicsMode); } } @@ -320,6 +361,8 @@ void OSystem_Wii::unlockScreen() { } void OSystem_Wii::setShakePos(int shakeOffset) { + GX_SetTexTrans(0, (float) -shakeOffset * ((float) vmode->efbHeight / + (float) _currentHeight)); } void OSystem_Wii::showOverlay() { diff --git a/dists/wii/READMII b/dists/wii/READMII index 87efe21d68..c0c67eafd7 100644 --- a/dists/wii/READMII +++ b/dists/wii/READMII @@ -1,5 +1,5 @@ -Wii port of ScummVM README --------------------------- +Wii/Gamecube port of ScummVM README +----------------------------------- features not compiled in: - the AGI game engine @@ -66,6 +66,21 @@ CONTROLS dpad left: "y" dpad right: "n" +DISPLAY SETUP + + "Graphics mode" + you can choose between multiple overscan options to adjust the screen size + used for drawing. select a higher overscan mode to get rid of black + borders or choose a lower overscan mode if parts of the picture get cropped + + "Fullscreen mode" + If your wii is set to 16:9, this will stretch the picture to fullscreen. + Turning this option off results in black borders on the left and right + sides, but the aspect ratio will be kept. This option has no effect on 4:3 + displays + + you have to restart scummvm after changing one of these options + THANKS shagkur and WinterMute, for devkitppc/libogc and the coorperation |