From e11901bc0958f3cc26a3673331afe35b546495bb Mon Sep 17 00:00:00 2001 From: dimok321 <15055714+dimok789@users.noreply.github.com> Date: Mon, 21 Feb 2011 19:41:48 +0000 Subject: [PATCH] *Changed FreeTypeGX to use IA4 textures for font glyphs (saves a bit memory) *Fixed cutoff of box cover when it is too near and increased zoom range of the box cover. Reworked the move/zoom of the cover. *Change wiimote icon when grabbing and dragging the box cover to grab icon *Fixed bug in homebrew browser (crash) *Changed a few default GX view configurations *Use proper size of wiimote pointer image instead of hard coded values *Reworked scroll/B hold movement stuff from the game list layout *Removed buildtype.sh and added the define directly in makefile. No need to make an extra header for that. *Changed makefile a to allow different IOS build modes. The build IOS is used at the start of the loader to load the settings under. If the build IOS is the same as the settings boot IOS the startup is a lot faster since no IOS reload is required. To build yourself a special IOS build version type:"make IOS=XXX" where XXX is the number of the IOS (CSettings.cp has to be recompiled for that at least). If nothing is defined IOS222 is taken. There will now be always two versions supplied (IOS222 and IOS249 version). If another build is required build it yourself. You can see the revisions until now as the "IOS249 build version" since they behaved like that. --- HBC/META.XML | 4 +- Makefile | 22 ++- buildtype.sh | 14 -- gui.pnproj | 2 +- source/BoxCover/BoxCover.cpp | 80 +++++----- source/BoxCover/BoxCover.hpp | 3 +- source/FileOperations/DirList.cpp | 63 +++++--- source/FileOperations/DirList.h | 4 + source/FreeTypeGX.cpp | 96 ++++++----- source/filelist.h | 12 ++ source/homebrewboot/HomebrewBrowser.cpp | 33 +++- source/images/player1_grab.png | Bin 0 -> 2293 bytes source/images/player2_grab.png | Bin 0 -> 2434 bytes source/images/player3_grab.png | Bin 0 -> 2485 bytes source/images/player4_grab.png | Bin 0 -> 2460 bytes source/libwiigui/gui_box.cpp | 5 + source/libwiigui/gui_button.cpp | 4 +- source/libwiigui/gui_circle.cpp | 6 + source/libwiigui/gui_cross.cpp | 6 + source/libwiigui/gui_gamebrowser.cpp | 201 +++++++++++++----------- source/menu.cpp | 10 +- source/network/update.cpp | 1 - source/prompts/PromptWindows.cpp | 1 - source/prompts/gameinfo.cpp | 2 +- source/settings/CSettings.cpp | 2 +- source/sys.cpp | 1 - source/themes/Resources.cpp | 4 + source/video.cpp | 70 +++------ source/video.h | 2 - 29 files changed, 365 insertions(+), 283 deletions(-) delete mode 100755 buildtype.sh create mode 100644 source/images/player1_grab.png create mode 100644 source/images/player2_grab.png create mode 100644 source/images/player3_grab.png create mode 100644 source/images/player4_grab.png diff --git a/HBC/META.XML b/HBC/META.XML index c57744b0..9132690a 100644 --- a/HBC/META.XML +++ b/HBC/META.XML @@ -2,8 +2,8 @@ USB Loader GX USB Loader GX Team - 2.0 r1072 - 201102121826 + 2.0 r1073 + 201102141852 Loads games from USB-devices USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. diff --git a/Makefile b/Makefile index 989da6ae..ed6edcab 100644 --- a/Makefile +++ b/Makefile @@ -51,15 +51,26 @@ SOURCES := source \ DATA := data INCLUDES := source +#--------------------------------------------------------------------------------- +# Default cIOS to load into to load the settings +#--------------------------------------------------------------------------------- +ifndef $(IOS) +IOS = 222 +endif + #--------------------------------------------------------------------------------- # options for code generation #--------------------------------------------------------------------------------- - -CFLAGS = -g -O3 -Wall -Wno-multichar -Wno-unused-parameter -Wextra $(MACHDEP) $(INCLUDE) +CFLAGS = -g -O3 -Wall -Wno-multichar -Wno-unused-parameter -Wextra $(MACHDEP) $(INCLUDE) -DBUILD_IOS=$(IOS) CXXFLAGS = -Xassembler -aln=$@.lst $(CFLAGS) LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size -include $(PROJECTDIR)/Make.config +ifeq ($(BUILDMODE),channel) +CFLAGS += -DFULLCHANNEL +CXXFLAGS += -DFULLCHANNEL +endif + #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- @@ -137,15 +148,11 @@ export OUTPUT := $(CURDIR)/$(TARGET) #--------------------------------------------------------------------------------- $(BUILD): @[ -d $@ ] || mkdir -p $@ - @/bin/bash ./buildtype.sh @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile -# @echo debug... -# start geckoreader.exe channel: @[ -d build ] || mkdir -p build - @/bin/bash ./buildtype.sh FULLCHANNEL - @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + @$(MAKE) BUILDMODE=channel --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile #--------------------------------------------------------------------------------- lang: @@ -160,7 +167,6 @@ theme: #--------------------------------------------------------------------------------- all: @[ -d build ] || mkdir -p build - @./buildtype.sh @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile language diff --git a/buildtype.sh b/buildtype.sh deleted file mode 100755 index 22066e27..00000000 --- a/buildtype.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -if [ ! -z "$1" ]; -then - if [ ! -s source/buildtype.h ]; - then - echo "#define $1" > source/buildtype.h - fi -else - if [[ ! -f source/buildtype.h || -s source/buildtype.h ]]; - then - cp /dev/null source/buildtype.h - fi -fi diff --git a/gui.pnproj b/gui.pnproj index 2f251a5d..8dfb6431 100644 --- a/gui.pnproj +++ b/gui.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/BoxCover/BoxCover.cpp b/source/BoxCover/BoxCover.cpp index 8d563454..2650394c 100644 --- a/source/BoxCover/BoxCover.cpp +++ b/source/BoxCover/BoxCover.cpp @@ -25,6 +25,8 @@ #include "BoxMesh.hpp" #include "themes/CTheme.h" +extern GuiImageData * pointer[4]; + BoxCover::BoxCover(GuiImageData * img, bool flat) : GuiImage(img), boxBorder(Resources::GetFile("boxBorder.png"), Resources::GetFileSize("boxBorder.png")), @@ -42,8 +44,7 @@ BoxCover::BoxCover(GuiImageData * img, bool flat) RotZ = 0.0f; PosX = 0.0f; PosY = 0.0f; - PosZ = -4.5f; - BoxScale = 1.0f; + PosZ = -27.f; AnimRotate = 0.0f; last_manual_move_frame = 0; camera = (guVector) {0.0F, 0.0F, 0.0F}; @@ -53,6 +54,15 @@ BoxCover::BoxCover(GuiImageData * img, bool flat) guLookAt(view, &camera, &up, &look); + //! Remove me later + for(int i = 0; i < 4; ++i) + { + char name[50]; + snprintf(name, sizeof(name), "player%i_grab.png", i+1); + GrabPointers[i] = Resources::GetImageData(name); + NormalPointers[i] = pointer[i]; + } + if(flatCover || !image) { defaultBox = Resources::GetImageData("nocoverFull.png"); @@ -73,8 +83,14 @@ BoxCover::BoxCover(GuiImageData * img, bool flat) BoxCover::~BoxCover() { delete defaultBox; + for(int i = 0; i < 4; ++i) + { + pointer[i] = NormalPointers[i]; + delete GrabPointers[i]; + } } +//! Remove me later void BoxCover::WiiPADControl(GuiTrigger *t) { if(t->wpad.btns_d & WPAD_BUTTON_A) @@ -88,16 +104,23 @@ void BoxCover::WiiPADControl(GuiTrigger *t) PosY += movePosY; movePosX = 0.0f; movePosY = 0.0f; + for(int i = 0; i < 4; ++i) + pointer[i] = GrabPointers[i]; } else moveChan = -1; } else if((t->wpad.btns_h & WPAD_BUTTON_A) && moveChan == t->chan && t->wpad.ir.valid) { - movePosX = (t->wpad.ir.x-moveStartPosX) / 180.0f; - movePosY = (moveStartPosY-t->wpad.ir.y) / 180.0f; + movePosX = (t->wpad.ir.x-moveStartPosX) * fabs(PosZ)/3400.f; + movePosY = (moveStartPosY-t->wpad.ir.y) * fabs(PosZ)/3400.f; last_manual_move_frame = frameCount; } + else if(!(t->wpad.btns_h & WPAD_BUTTON_A) && moveChan == t->chan) + { + for(int i = 0; i < 4; ++i) + pointer[i] = NormalPointers[i]; + } if(t->wpad.btns_h & WPAD_BUTTON_UP) { @@ -129,21 +152,13 @@ void BoxCover::WiiPADControl(GuiTrigger *t) } if(t->wpad.btns_h & WPAD_BUTTON_PLUS) { - if(PosZ < -3.4f) - PosZ += 0.1f; - else if(BoxScale < 2.4f) - BoxScale += 0.05f; + if(PosZ < -2.8f) + PosZ += 0.4f*fabs(PosZ)/19.f; } if(t->wpad.btns_h & WPAD_BUTTON_MINUS) { - if(BoxScale > 1.0f) - BoxScale -= 0.05f; - else - { - BoxScale = 1.0f; - PosZ -= 0.1f; - if(PosZ < -6.0f) PosZ = -6.0f; - } + if(PosZ > -43.0f) + PosZ -= 0.4f*fabs(PosZ)/19.f; } } @@ -180,9 +195,8 @@ void BoxCover::Draw() u8 BoxAlpha = (int) (alpha+angleDyn) & 0xFF; Mtx44 projection; - guPerspective(projection, 45, (f32)screenwidth/(f32)screenheight, fabs(PosZ)-1.3f > 1.0f ? fabs(PosZ)-1.3f : 1.0f, -300.0F); + guPerspective(projection, 8, (f32)screenwidth/(f32)screenheight, 1.0f, 300.0F); GX_LoadProjectionMtx(projection, GX_PERSPECTIVE); - GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); GX_SetVtxDesc(GX_VA_POS, GX_INDEX8); GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); @@ -201,7 +215,7 @@ void BoxCover::Draw() guMtxRotAxisDeg(modelView, &cubeAxis, RotZ-Animation); guMtxConcat(modelView3, modelView2, modelView2); guMtxConcat(modelView2, modelView, modelView); - guMtxScaleApply(modelView, modelView, BoxScale, BoxScale, BoxScale); + //guMtxScaleApply(modelView, modelView, BoxScale, BoxScale, BoxScale); guMtxTransApply(modelView, modelView, PosX+xoffsetDyn/680.0f+movePosX, PosY+yoffsetDyn/680.0f+movePosY, PosZ); guMtxConcat(view,modelView,modelView); @@ -289,11 +303,6 @@ void BoxCover::Draw() GX_End(); } - GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); - GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); - GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - UpdateEffects(); } @@ -309,17 +318,17 @@ void BoxCover::UpdateEffects() if(effects & EFFECT_BOX_FLY_CENTRE) { if(PosX > 0.01f) - PosX -= effectAmount/1000.0f; + PosX -= effectAmount/1200.0f; if(PosY > 0.01f) - PosY -= effectAmount/1000.0f; + PosY -= effectAmount/1200.0f; if(PosX < -0.01f) - PosX += effectAmount/1000.0f; + PosX += effectAmount/1200.0f; if(PosY < -0.01f) - PosY += effectAmount/1000.0f; + PosY += effectAmount/1200.0f; movePosX = 0.0f; movePosY = 0.0f; - PosZ += 0.1f; + PosZ += 0.4f; RotY += effectAmount/4.9f; if(fabs(PosX) < 0.1f && fabs(PosY) < 0.1f) @@ -333,18 +342,16 @@ void BoxCover::UpdateEffects() else if(effects & EFFECT_BOX_FLY_BACK) { if(PosX > PosXOrig+0.1f) - PosX -= effectAmount/1000.0f; + PosX -= effectAmount/1200.0f; if(PosY > PosYOrig+0.1f) - PosY -= effectAmount/1000.0f; + PosY -= effectAmount/1200.0f; if(PosX < PosXOrig-0.1f) - PosX += effectAmount/1000.0f; + PosX += effectAmount/1200.0f; if(PosY < PosYOrig-0.1f) - PosY += effectAmount/1000.0f; + PosY += effectAmount/1200.0f; - PosZ -= 0.1f; + PosZ -= 0.4f; RotY -= effectAmount/4.9f; - if(BoxScale > 1.0f) - BoxScale -= 0.08f; if(movePosX > 0.1f) movePosX -= 0.1f; @@ -359,7 +366,6 @@ void BoxCover::UpdateEffects() { movePosX = 0.0f; movePosY = 0.0f; - BoxScale = 1.0f; PosX = PosXOrig; PosY = PosYOrig; PosZ = PosZOrig; diff --git a/source/BoxCover/BoxCover.hpp b/source/BoxCover/BoxCover.hpp index 02257b93..f16cf5b5 100644 --- a/source/BoxCover/BoxCover.hpp +++ b/source/BoxCover/BoxCover.hpp @@ -58,7 +58,6 @@ class BoxCover : public GuiImage f32 PosXOrig; f32 PosYOrig; f32 PosZOrig; - f32 BoxScale; f32 AnimRotate; f32 Animation; f32 Animation2; @@ -73,6 +72,8 @@ class BoxCover : public GuiImage guVector camera, up, look; GuiImageData boxBorder; GuiImageData *defaultBox; + GuiImageData *NormalPointers[4]; + GuiImageData *GrabPointers[4]; Mtx view; GXTexObj coverTex; GXTexObj boxBorderTex; diff --git a/source/FileOperations/DirList.cpp b/source/FileOperations/DirList.cpp index 08a73eee..8bc7d1ff 100644 --- a/source/FileOperations/DirList.cpp +++ b/source/FileOperations/DirList.cpp @@ -50,19 +50,26 @@ DirList::~DirList() bool DirList::LoadPath(const char * folder, const char *filter, u32 flags) { - if(!folder) + if(!folder) return false; + + std::string folderpath(folder); + + return LoadPath(folderpath, filter, flags); +} + +bool DirList::LoadPath(std::string &folderpath, const char *filter, u32 flags) +{ + if(folderpath.size() < 3) return false; - struct stat st; struct dirent *dirent = NULL; DIR *dir = NULL; - std::string folderpath = folder; if(folderpath[folderpath.size()-1] == '/') - folderpath.erase(folderpath.size()-1, 1); + folderpath.erase(folderpath.size()-1); - const char * notRoot = strchr(folderpath.c_str(), '/'); - if(!notRoot) + bool isRoot = (folderpath.find('/') == std::string::npos); + if(isRoot) folderpath += '/'; dir = opendir(folderpath.c_str()); @@ -70,22 +77,28 @@ bool DirList::LoadPath(const char * folder, const char *filter, u32 flags) return false; char * filename = new (std::nothrow) char[MAXPATHLEN]; - if(!filename) + struct stat *st = new (std::nothrow) struct stat; + if(!filename || !st) { + delete [] filename; + delete filename; closedir(dir); return false; } while ((dirent = readdir(dir)) != 0) { + if(!dirent->d_name) + continue; + snprintf(filename, MAXPATHLEN, "%s/%s", folderpath.c_str(), dirent->d_name); - if(stat(filename, &st) != 0) + if(stat(filename, st) != 0) continue; snprintf(filename, MAXPATHLEN, dirent->d_name); - if(st.st_mode & S_IFDIR) + if(st->st_mode & S_IFDIR) { if(!(flags & Dirs)) continue; @@ -95,10 +108,11 @@ bool DirList::LoadPath(const char * folder, const char *filter, u32 flags) if(flags & CheckSubfolders) { - std::string newFolder = folderpath; - if(notRoot) newFolder += '/'; - newFolder += filename; - LoadPath(newFolder.c_str(), filter, flags); + int length = folderpath.size(); + if(!isRoot) folderpath += '/'; + folderpath += filename; + LoadPath(folderpath, filter, flags); + folderpath.erase(length); } } else @@ -114,15 +128,16 @@ bool DirList::LoadPath(const char * folder, const char *filter, u32 flags) continue; if(strtokcmp(fileext, filter, ",") == 0) - AddEntrie(folderpath.c_str(), filename, st.st_size, (st.st_mode & S_IFDIR) ? true : false); + AddEntrie(folderpath.c_str(), filename, st->st_size, (st->st_mode & S_IFDIR) ? true : false); } else { - AddEntrie(folderpath.c_str(), filename, st.st_size, (st.st_mode & S_IFDIR) ? true : false); + AddEntrie(folderpath.c_str(), filename, st->st_size, (st->st_mode & S_IFDIR) ? true : false); } } closedir(dir); delete [] filename; + delete st; return true; } @@ -168,13 +183,10 @@ static bool SortCallback(const FileInfos & f1, const FileInfos & f2) if(f1.isDir && !(f2.isDir)) return true; if(!(f1.isDir) && f2.isDir) return false; - const char * Filename1 = FullpathToFilename(f1.FilePath); - const char * Filename2 = FullpathToFilename(f2.FilePath); + if(f1.FilePath && !f2.FilePath) return true; + if(!f1.FilePath) return false; - if(Filename1 && !Filename2) return true; - if(!Filename1 && Filename2) return false; - - if(strcasecmp(Filename1, Filename2) > 0) + if(strcasecmp(f1.FilePath, f2.FilePath) > 0) return false; return true; @@ -182,7 +194,14 @@ static bool SortCallback(const FileInfos & f1, const FileInfos & f2) void DirList::SortList() { - std::sort(FileInfo.begin(), FileInfo.end(), SortCallback); + if(FileInfo.size() > 1) + std::sort(FileInfo.begin(), FileInfo.end(), SortCallback); +} + +void DirList::SortList(bool (*SortFunc)(const FileInfos &a, const FileInfos &b)) +{ + if(FileInfo.size() > 1) + std::sort(FileInfo.begin(), FileInfo.end(), SortFunc); } int DirList::GetFileIndex(const char *filename) diff --git a/source/FileOperations/DirList.h b/source/FileOperations/DirList.h index 5d2c6d08..142d4da3 100644 --- a/source/FileOperations/DirList.h +++ b/source/FileOperations/DirList.h @@ -28,6 +28,7 @@ #define ___DIRLIST_H_ #include +#include #include typedef struct @@ -49,6 +50,7 @@ class DirList ~DirList(); //! Load all the files from a directory bool LoadPath(const char * path, const char *filter = NULL, u32 flags = Files | Dirs); + bool LoadPath(std::string &path, const char *filter = NULL, u32 flags = Files | Dirs); //! Get a filename of the list //!\param list index const char * GetFilename(int index); @@ -65,6 +67,8 @@ class DirList int GetFilecount() { return FileInfo.size(); }; //! Sort list by filepath void SortList(); + //! Custom sort command for custom sort functions definitions + void SortList(bool (*SortFunc)(const FileInfos &a, const FileInfos &b)); //! Get the index of the specified filename int GetFileIndex(const char *filename); //! Enum for search/filter flags diff --git a/source/FreeTypeGX.cpp b/source/FreeTypeGX.cpp index 7c6fffab..ff250197 100644 --- a/source/FreeTypeGX.cpp +++ b/source/FreeTypeGX.cpp @@ -21,10 +21,14 @@ */ #include "FreeTypeGX.h" -#include "utils/tools.h" using namespace std; +#define EXPLODE_UINT8_TO_UINT32(x) ((x << 24) | (x << 16) | (x << 8) | x) +#define ALIGN8(x) (((x) + 7) & ~7) +#define ALIGN32(x) (((x) + 31) & ~31) +#define RGBA_TO_IA4(x) (((x & 0x0000f000) >> 8) | ((x & 0x000000f0) >> 4)) + /** * Convert a short char string to a wide char string. * @@ -132,14 +136,10 @@ void FreeTypeGX::unloadFont() */ ftgxCharData * FreeTypeGX::cacheGlyphData(wchar_t charCode, int16_t pixelSize) { - map >::iterator itr; - map::iterator itr2; - - itr = fontData.find(pixelSize); + map >::iterator itr = fontData.find(pixelSize); if (itr != fontData.end()) { - itr2 = itr->second.find(charCode); - + map::iterator itr2 = itr->second.find(charCode); if (itr2 != itr->second.end()) { return &itr2->second; @@ -172,12 +172,12 @@ ftgxCharData * FreeTypeGX::cacheGlyphData(wchar_t charCode, int16_t pixelSize) { FT_Bitmap *glyphBitmap = &ftFace->glyph->bitmap; - textureWidth = ALIGN(glyphBitmap->width); - textureHeight = ALIGN(glyphBitmap->rows); + textureWidth = ALIGN8(glyphBitmap->width); + textureHeight = ALIGN8(glyphBitmap->rows); if(textureWidth == 0) - textureWidth = 4; + textureWidth = 8; if(textureHeight == 0) - textureHeight = 4; + textureHeight = 8; fontData[pixelSize][charCode].renderOffsetX = (int16_t) ftFace->glyph->bitmap_left; fontData[pixelSize][charCode].glyphAdvanceX = (uint16_t) (ftFace->glyph->advance.x >> 6); @@ -225,37 +225,52 @@ uint16_t FreeTypeGX::cacheGlyphDataComplete(int16_t pixelSize) * * @param bmp A pointer to the most recently rendered glyph's bitmap. * @param charData A pointer to an allocated ftgxCharData structure whose data represent that of the last rendered glyph. - * - * - * Optimized for RGBA8 use by Dimok. */ + void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) { - int length = ALIGN32(((charData->textureWidth+3)>>2)*((charData->textureHeight+3)>>2)*32*2); + uint32_t *glyphData = (uint32_t *) memalign(32, charData->textureWidth * charData->textureHeight * 4); + memset(glyphData, 0x00, charData->textureWidth * charData->textureHeight * 4); - uint8_t * glyphData = (uint8_t *) memalign(32, length); - if (!glyphData) return; + uint8_t *bmsrc = (uint8_t *)bmp->buffer; + uint32_t *dest = glyphData, *ptr = dest; - memset(glyphData, 0x00, length); + for (uint16_t imagePosY = 0; imagePosY < bmp->rows; ++imagePosY) + { + for (uint16_t imagePosX = 0; imagePosX < bmp->width; ++imagePosX) + { + *ptr++ = EXPLODE_UINT8_TO_UINT32(*bmsrc); + ++bmsrc; + } + ptr = dest += charData->textureWidth; + } - uint8_t *src = (uint8_t *) bmp->buffer; - uint32_t offset; + uint32_t bufferSize = charData->textureWidth * charData->textureHeight; + uint32_t* dataBufferIA4 = (uint32_t *)memalign(32, ALIGN32(bufferSize)); + memset(dataBufferIA4, 0x00, bufferSize); - for (int imagePosY = 0; imagePosY < bmp->rows; ++imagePosY) - { - for (int imagePosX = 0; imagePosX < bmp->width; ++imagePosX) - { - offset = (((((imagePosY >> 2) * (charData->textureWidth >> 2) + (imagePosX >> 2)) << 5) + ((imagePosY & 3) << 2) + (imagePosX & 3)) << 1); - glyphData[offset] = *src; - glyphData[offset + 1] = *src; - glyphData[offset + 32] = *src; - glyphData[offset + 33] = *src; - ++src; - } - } - DCFlushRange(glyphData, length); + uint32_t *src = glyphData; + uint8_t* dst = (uint8_t *) dataBufferIA4; - charData->glyphDataTexture = glyphData; + for(uint16_t y = 0; y < charData->textureHeight; y += 4) { + for(uint16_t x = 0; x < charData->textureWidth; x += 8) { + for(uint16_t rows = 0; rows < 4; rows++) { + *dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 0)]); + *dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 1)]); + *dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 2)]); + *dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 3)]); + *dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 4)]); + *dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 5)]); + *dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 6)]); + *dst++ = RGBA_TO_IA4(src[((y + rows) * charData->textureWidth) + (x + 7)]); + } + } + } + + DCFlushRange(dataBufferIA4, bufferSize); + free(glyphData); + + charData->glyphDataTexture = (uint8_t *) dataBufferIA4; } /** @@ -368,7 +383,7 @@ uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, int16_t z, const wchar_t *te } GX_InitTexObj(&glyphTexture, glyphData->glyphDataTexture, glyphData->textureWidth, - glyphData->textureHeight, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); + glyphData->textureHeight, GX_TF_IA4, GX_CLAMP, GX_CLAMP, GX_FALSE); copyTextureToFramebuffer(&glyphTexture, glyphData->textureWidth, glyphData->textureHeight, x_pos + glyphData->renderOffsetX + x_offset, y - glyphData->renderOffsetY + y_offset, z, color); @@ -540,8 +555,9 @@ void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 te GX_LoadTexObj(texObj, GX_TEXMAP0); GX_InvalidateTexAll(); - GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_Begin(GX_QUADS, this->vertexIndex, 4); GX_Position3s16(screenX, screenY, screenZ); @@ -560,9 +576,6 @@ void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 te GX_Color4u8(color.r, color.g, color.b, color.a); GX_TexCoord2f32(0.0f, 1.0f); GX_End(); - - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); } /** @@ -580,6 +593,8 @@ void FreeTypeGX::copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, i int16_t screenZ, GXColor color) { GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); GX_Begin(GX_QUADS, this->vertexIndex, 4); @@ -596,6 +611,5 @@ void FreeTypeGX::copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, i GX_Color4u8(color.r, color.g, color.b, color.a); GX_End(); - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); + GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); } diff --git a/source/filelist.h b/source/filelist.h index dd364ad0..486057fb 100644 --- a/source/filelist.h +++ b/source/filelist.h @@ -242,6 +242,18 @@ extern const u32 player3_point_png_size; extern const u8 player4_point_png[]; extern const u32 player4_point_png_size; +extern const u8 player1_grab_png[]; +extern const u32 player1_grab_png_size; + +extern const u8 player2_grab_png[]; +extern const u32 player2_grab_png_size; + +extern const u8 player3_grab_png[]; +extern const u32 player3_grab_png_size; + +extern const u8 player4_grab_png[]; +extern const u32 player4_grab_png_size; + extern const u8 rplayer1_point_png[]; extern const u32 rplayer1_point_png_size; diff --git a/source/homebrewboot/HomebrewBrowser.cpp b/source/homebrewboot/HomebrewBrowser.cpp index 4dfae5bd..2f400cdf 100644 --- a/source/homebrewboot/HomebrewBrowser.cpp +++ b/source/homebrewboot/HomebrewBrowser.cpp @@ -184,16 +184,25 @@ void HomebrewBrowser::SetupMainButtons() } else { - const char * shortpath = strrchr(HomebrewList->GetFilename(i), '/'); - if(shortpath) + const char * shortpath = HomebrewList->GetFilepath(i); + const char * ptr = shortpath; + const char * ptr2 = NULL; + while(*ptr != '\0') { - metapath = shortpath; - metapath = '/'; - metapath = HomebrewList->GetFilename(i); - HomebrewName = metapath.c_str(); + if(*ptr == '/') + { + shortpath = ptr2; + ptr2 = ptr; + } + + ++ptr; } - else - HomebrewName = HomebrewList->GetFilename(i); + if(!shortpath && ptr2) + shortpath = ptr2; + else if(!shortpath) + shortpath = HomebrewList->GetFilename(i); + + HomebrewName = shortpath; MainButtonDesc[i]->SetText(" "); MainButtonDescOver[i]->SetText(" "); } @@ -369,6 +378,14 @@ int HomebrewBrowser::ReceiveFile() { // It's compressed, uncompress u8 *unc = (u8 *) malloc(uncfilesize); + if(!unc) + { + ProgressStop(); + free(buffer); + CloseConnection(); + WindowPrompt(tr( "Not enough memory." ), 0, tr( "OK" )); + return MENU_NONE; + } uLongf f = uncfilesize; error = uncompress(unc, &f, buffer, infilesize) != Z_OK; uncfilesize = f; diff --git a/source/images/player1_grab.png b/source/images/player1_grab.png new file mode 100644 index 0000000000000000000000000000000000000000..d95c2b35a7a3631944cd8ecc750b8900d9b7b667 GIT binary patch literal 2293 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 H8<6lH$%BXh literal 0 HcmV?d00001 diff --git a/source/images/player3_grab.png b/source/images/player3_grab.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c3546ba9aa3b2049997b2a4314e9d3b62ca12a GIT binary patch literal 2485 zcmb`JS0LMq0>=MFt)sPPqg1Sms9l@byS6H7RjFCWCKBy&D@Lh`9-*ky+A~J99HVB{ zCU&hvtWbiOIo#g&`*PaS+ zy)Q*n@FGhJYF@xgVEKyeBa#(E+9M zl0$b%@zy>R;T!2GXLT&bG$Mvn8T@PTk5KUA2ULzQb&MG`6z@c{x(pmB;foIYhS5rx zfNAOV%}oNX!d@*5pEOlkL^RTxmOJGTZY~PU_XoBzBn30|j)J`^#Vy{IW3j448%4B3 zTlBsYc2$K7`OFtTgq^=oClB>@iaqwttbAZ)oz0v$BAaX@^~t(Wt3q)il}E-w4dk@g z66!pVA!KiodB-s_GSc7$|98n0zPbI+nQHg#pNj%O=Tmi5PEN(u)m1vMJBKlFbaJ{? zwSo=KmwB$}(rN{TzTitbMP7U7mq+0d?4jbL!hwK))>jJ1~rI?Ps zn+0q!G-Zw(Plr{X^VM8?V93f!r(YU4r+vsF()pq%nT;@BY%te}(ET>BW$QB~iWfeE zaNXj(es^X9Dye@~QC>d&XvhD&odxVdn6KvH zH7bX{mYVw#E{P|fA-h2!&~Q0XL;XWshc4=K=koI7UT=)omv4u}p#pEr3Je$^NkJfe zSzr?z2Z!~54S(g(Wi8yy%+tRIC@_Q+kx2BS>`dqCB*Yn)>1?EGKzqhzs1vHe3s1x! zMaT>IgGH?1l$?T8I5_?SGZRCBNz2z+(v5q{ zl+UK=I!V=G#oGRdJ~8&hmuPN47I^y%{BlSl2cO|GA!@Nr&2jyc95;3Qv*qS<`J~DQ z>FU~te^h%ql2Odqb;+*aMxkx3g)}X@>-p zMx1DgEULQLbGfSEnTHB)J}M^wy@V=&6~T!NsPZFCCKjh^z`WVi#FX5~jRx;Ac7uPm z|7C8t?t8H{UlTSocp2=OV1$w3l}0&6Tv;ULDW| zosk*JW&iz9@#z4X6_vBb;J}_{&ij}ADO{^1Na$yg(+85~rRD^zMj+H9NY5(P>Ox72 zR2;Oq+c7H`_WhuZ%gGD^pBc|pM}9BKDSzC`+A^|;l(h5m4e0G94}V-~kp1#ir`!pT(<4f=s~aef^uKo5Xz6qycH@u zyY`V93A!|kyqnFK*jq0@n+&LBq<&>WFf3;&AaKli_A+R=x7Fl1#uH0+nAa&VDOt5aJ3L>SQO|M44(n z%E>zf1sqk!viH!Q8DCQF#!~oU6U?oU60|i>>^TQW=ZaCQHRfMBNcY)}E}K^-5+4yK z9WSH=7X`_2gg|6|Shf3!asXdKtizASbP@9g-Lxslb+=OUN^ilaTu0c8b%*UT`D3H2 z9*?W@vciFLi%qg#R55P{54<0;;%Q}?{!OdEt?@Gh8$2ZIXA@@c7#aNK0Rw8KXPgLtSp=x9!nUh|oiSHcq_DNa8{9Rnmi_E zxQ6hfdodZhCUrWtzjjKF*Y4I`y)WElw+IA2JDitc?an5V+gjk6hhz7;Mz#5^B`f(Oun$R=zHJ}Wl!Lt_~i#QEM$^x$tS9Bg5#w|e6z8^ zc(#xDZm$`NwN%{vO;* zOWLdR^o4Jg94+ho!(d}mxS7ZRZ>tCHRk(H6Nu6*_c;V&R)nB&G^Bw}yFb}`(J3G&f zlN&alTl&5YVWdQw=S#UpZA77*r)Vq0Ex{$zadJ%0G`BVSk1VVt05?reCdTIT@!yUM zzXc^0E+40U@zA^0M}RBY0DNHOF!f7D7||7roQeJQ~| zrkTe5e&o!e8I`>nvcu0NsfC6McQtW*yq?2f6JHY`WrHWT6-vvH2xNR)=(YR9&U)&U yKXBGhf1a|Qyg-`>h=>79fd2my-7N$yD=^fQIFZ5Glm6?60cJ+lhPC>hFaHBG1*n(+ literal 0 HcmV?d00001 diff --git a/source/images/player4_grab.png b/source/images/player4_grab.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9a814eea6203a9b2044dd3c94d4d67e973226f GIT binary patch literal 2460 zcmb`J_aoGe1IIr{kB?FSgZ&^yo*1GfmceHUYgx$PYu^a-O20AM`}6GQZ)xs6*-{q1K2 z^!K$=_~e@SCepn@m#o>111y9Bj6Fq|8n_*cl|VH8Y)4{4N!r$4iD^9GhH~-oAXbx`qVU@?}C%hQkd?7#El94H^xfAUc3M z&n24Xy!o8>Lx;-tW9NVq{zJ^l8>z50`(45(Uq#TS@k?V((N}lJ@-iYD?$2vGxw$Fs z|D3y2)DSM?_+(%mYE(i)voU>`L-Q!E@`kda$`Alx?k7vz7MF%D)Mk4n4;iRdexKtl}J* zJeAUcr7&$Qc1cXEGtzr=a&j2+tMZ!N5%&<%S%Lok95OO8&pmOCeluB~Psja%L)!T4 zESsyVYpoBlU}N-&u!3tF|8%9(G8wr`ax=ei<3?@JGBOES_#XMRU*leK+gtji8JXaf z2yP_Na8hR8!NK)bGWfg*GZxQxsn0s`LJg}_U9X(4r@6Vg{nnjY_KS^ZRMZ?5i733) zT^F}!D)uCZ@r@9iaFcxk)^a1hyhO3LKo40Q*YJnf<~=1wW_PbT_~Aow!$!}CCidlk z`Eq9qi;FMF;XqFOVxxC%&ggXE-~RC#%>5S{$T=N#VWOZr)cLw7Zqy(voGZ<_`_*8} zW!U8qR^H);;j6On_NrYAWpg$Z-rY$c4ollA!Ziu8cVZu&bTh#l_$|hJGi*nT`Q@Gr z>;?ULdaOI(h0HA*%`VBcF_&wO#7a>r=W1OKeWwg{>?MJe+8(qeWrWa8ieES#w9(t7CcI?=2H=ePon9uQ<%W&3Ml{?b=Xjge6UYGQZZQtBK`Zc>e$@ zDFDg;@%qJq9(M;D+gQ8^O4d3{kQWOSEo}8(j3%eOw(4>8M1%7TYQ3HNq#J%^R%;Zk z&sW?fJvQ#c3)>_T6!2=@3y}*!DO%7KLl##S@bV8fJ1y`5n*3n4b%$(wGl3~srjB|m z>iUhFd)l}b2s3ja75K3u9{Nf@;XDBKcp?8~r-VPq*Hw%ON0TTIfodo&Ol*ou_FrLAoKq~vr@1a0^{Unk*0?r2lg^^{s+}ZUgPza^OH;J zbJb+WrLGDRvs>1@yTc5}j{LViznV}Z)jc`gqYR1s$09=%+2du9Ws5~uPjt4D>6mY! zowXS^aX4B3R79~Wm`f6))|O>Q6j>e7EV3&~jCavj|0U59w5%}o_z?fY2QeND6-#*A z&b+zQQ%cPgTVDC|g)IAWMCPL2d0Csh(IZ_$rll~3%5e{y|H84@8vRViWXSJE3R1)# zV;iuVBDlS~f5ytk{gS6{sJrfumZvo5hZ9?*TDq{tsCh+z4Q)K4L9vQ{qWk9qk|m?3 z@&T5f^b|jYYEbQ6pES#FUA=5xe7_tI=;08=Pk2PnypG0`@2-xMfQ$NxoRD{7N7e1p z%7b$qGtXGm{SO2gyJwSEj)iP(@P^tT2F4xO2gzUhn-kX5vr7v!GR1JRqr9gQ#^pby zdl8^)8S%umHY?d4o~z1~auLzH;iOcB{DK1H2#WS7?yT-q6mO^l`c`L0H)t~j55H3D zb#H$L;oNOZgGyY#XH4y=4_XcQGWY4j`L$2x8B?O~!(gL1hn-BGldp1lQl}qn>j^VE z-cCaIQ{0<>_6p4e#8x=e_tGb1l`^aW*0poO1&A}V^1UZ6A4R%Hu!&ez`1Q~$ugh;t1;yZ#am8|iOQ5?hzvOK^=Ym>^g=b1e?;s$Q?W z)TuLKLTt^xlM?d%`sX)a%3xU|2(?ULQ2Pbt0i>vSlHYV6Cbl^ysbk8E!07mjXN?7l zvBKZ!g8JJ!-Cg@RQ|#(8dOJa z5Hxl7zhuJOJoIK6D{=1$Zs~K3X#uxoosTTZMCp!SRQIJ(F@aq!DShUjQdA`v@{!_+ zUX+iH?(u-&86xmafYwOkViIov@>JZ49(+WPIf4x9>vBYOm*&HH&up_n9>71s0Bcn8 h{|GkL6Ne}ekay4dwE)W@>i69OEKF@os*OBi{sl`Zjk^E< literal 0 HcmV?d00001 diff --git a/source/libwiigui/gui_box.cpp b/source/libwiigui/gui_box.cpp index 4f7f3f3e..3e6512c4 100644 --- a/source/libwiigui/gui_box.cpp +++ b/source/libwiigui/gui_box.cpp @@ -25,6 +25,10 @@ void GuiBox::Draw() { + GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); + GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); u32 n = filled ? 4 : 5; f32 x = GetLeft(); f32 y = GetTop(); @@ -39,4 +43,5 @@ void GuiBox::Draw() GX_Color4u8(color[i].r, color[i].g, color[i].b, color[i].a); } GX_End(); + GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); } diff --git a/source/libwiigui/gui_button.cpp b/source/libwiigui/gui_button.cpp index 2d4ade53..5ea77005 100644 --- a/source/libwiigui/gui_button.cpp +++ b/source/libwiigui/gui_button.cpp @@ -10,7 +10,7 @@ #include "gui.h" -static int scrollison; +static int scrollison = 0; /** * Constructor for the GuiButton class. @@ -351,9 +351,9 @@ void GuiButton::DrawTooltip() } void GuiButton::ScrollIsOn(int f) { - LOCK( this ); scrollison = f; } + void GuiButton::Update(GuiTrigger * t) { LOCK( this ); diff --git a/source/libwiigui/gui_circle.cpp b/source/libwiigui/gui_circle.cpp index 631d77c2..ccbefe9d 100644 --- a/source/libwiigui/gui_circle.cpp +++ b/source/libwiigui/gui_circle.cpp @@ -47,6 +47,11 @@ void GuiCircle::SetLinewidth(float s) void GuiCircle::Draw() { + GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); + GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); + int loopAmount = filled ? accuracy : accuracy+1; GX_Begin(filled ? GX_TRIANGLEFAN : GX_LINESTRIP, GX_VTXFMT0, loopAmount); @@ -60,4 +65,5 @@ void GuiCircle::Draw() GX_Color4u8(color.r, color.g, color.b, color.a); } GX_End(); + GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); } diff --git a/source/libwiigui/gui_cross.cpp b/source/libwiigui/gui_cross.cpp index 93feab20..482edeb7 100644 --- a/source/libwiigui/gui_cross.cpp +++ b/source/libwiigui/gui_cross.cpp @@ -25,6 +25,11 @@ void GuiCross::Draw() { + GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); + GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); + f32 x1 = GetLeft(); f32 x2 = x1 + width; f32 y1 = GetTop(); @@ -40,4 +45,5 @@ void GuiCross::Draw() GX_Position3f32(x1, y2, 0.0f); GX_Color4u8(color.r, color.g, color.b, color.a); GX_End(); + GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); } diff --git a/source/libwiigui/gui_gamebrowser.cpp b/source/libwiigui/gui_gamebrowser.cpp index 95112b71..ec3ee586 100644 --- a/source/libwiigui/gui_gamebrowser.cpp +++ b/source/libwiigui/gui_gamebrowser.cpp @@ -23,7 +23,10 @@ #include #define GAMESELECTSIZE 30 -int txtscroll = 0; +// scrolldelay affects how fast the list scrolls +// when the arrows are clicked +static const u32 DEFAULT_SCROLL_DELAY = 4; + /** * Constructor for the GuiGameBrowser class. */ @@ -359,12 +362,16 @@ void GuiGameBrowser::Update(GuiTrigger * t) LOCK( this ); if (state == STATE_DISABLED || !t || !gameList.size()) return; + static int pressedChan = -1; int next, prev; int old_listOffset = listOffset; static int position2; - // scrolldelay affects how fast the list scrolls - // when the arrows are clicked - float scrolldelay = 3.5; + static u32 scrolldelay = 0; + + if(t->wpad.btns_d) + { + pressedChan = t->chan; + } if (scrollbaron == 1) { @@ -376,11 +383,9 @@ void GuiGameBrowser::Update(GuiTrigger * t) next = listOffset; - u32 buttonshold = ButtonsHold(); - - if (buttonshold != WPAD_BUTTON_UP && buttonshold != WPAD_BUTTON_DOWN) + if(pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_h & WPAD_BUTTON_UP) && + !(t->wpad.btns_h & WPAD_BUTTON_DOWN) && !(t->wpad.btns_h & WPAD_BUTTON_B))) { - for (int i = 0; i < pagesize; i++) { if (next >= 0) next = this->FindMenuItem(next, 1); @@ -389,8 +394,8 @@ void GuiGameBrowser::Update(GuiTrigger * t) { if (i != selectedItem && game[i]->GetState() == STATE_SELECTED) game[i]->ResetState(); - else if (i == selectedItem && game[i]->GetState() == STATE_DEFAULT) game[selectedItem]->SetState( - STATE_SELECTED, t->chan); + else if (i == selectedItem && game[i]->GetState() == STATE_DEFAULT) + game[selectedItem]->SetState(STATE_SELECTED, t->chan); } game[i]->Update(t); @@ -407,86 +412,14 @@ void GuiGameBrowser::Update(GuiTrigger * t) if (scrollbaron == 1) { - if (t->Down() || arrowDownBtn->GetState() == STATE_CLICKED || arrowDownBtn->GetState() == STATE_HELD) //down { - - next = this->FindMenuItem(gameIndex[selectedItem], 1); - - if (next >= 0) - { - if (selectedItem == pagesize - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - } - else if (game[selectedItem + 1]->IsVisible()) - { - game[selectedItem]->ResetState(); - game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - // scrollbarBoxBtn->Draw(); - usleep(10000 * scrolldelay); - } - if (!(ButtonsHold() & WPAD_BUTTON_A)) arrowDownBtn->ResetState(); - } - else if (t->Up() || arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD) //up - { - prev = this->FindMenuItem(gameIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - game[selectedItem]->ResetState(); - game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - // scrollbarBoxBtn->Draw(); - usleep(10000 * scrolldelay); - } - if (!(ButtonsHold() & WPAD_BUTTON_A)) arrowUpBtn->ResetState(); - } - int position1 = t->wpad.ir.y; - - if (position2 == 0 && position1 > 0) - { - position2 = position1; - } - - if ((buttonshold & WPAD_BUTTON_B) && position1 > 0) - { - scrollbarBoxBtn->ScrollIsOn(1); - if (position2 > position1) - { - - prev = this->FindMenuItem(gameIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - game[selectedItem]->ResetState(); - game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - // scrollbarBoxBtn->Draw(); - usleep(10000 * scrolldelay); - } - } - else if (position2 < position1) + if(scrolldelay > 0) + --scrolldelay; + else { + if(arrowDownBtn->GetState() == STATE_CLICKED || arrowDownBtn->GetState() == STATE_HELD) + scrolldelay = DEFAULT_SCROLL_DELAY; next = this->FindMenuItem(gameIndex[selectedItem], 1); if (next >= 0) @@ -502,13 +435,94 @@ void GuiGameBrowser::Update(GuiTrigger * t) game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); selectedItem++; } - // scrollbarBoxBtn->Draw(); - usleep(10000 * scrolldelay); } } - + if (pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_d & WPAD_BUTTON_A) && !(t->wpad.btns_h & WPAD_BUTTON_A))) + arrowDownBtn->ResetState(); } - else if (!(buttonshold & WPAD_BUTTON_B)) + else if (t->Up() || arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD) //up + { + if(scrolldelay > 0) + --scrolldelay; + else + { + if(arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD) + scrolldelay = DEFAULT_SCROLL_DELAY; + prev = this->FindMenuItem(gameIndex[selectedItem], -1); + + if (prev >= 0) + { + if (selectedItem == 0) + { + // move list up by 1 + listOffset = prev; + } + else + { + game[selectedItem]->ResetState(); + game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); + selectedItem--; + } + } + } + if (pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_d & WPAD_BUTTON_A) && !(t->wpad.btns_h & WPAD_BUTTON_A))) + arrowUpBtn->ResetState(); + } + int position1 = t->wpad.ir.y; + + if (position2 == 0 && t->wpad.ir.valid) + { + position2 = position1; + } + + if (pressedChan == t->chan && (t->wpad.btns_h & WPAD_BUTTON_B) && t->wpad.ir.valid) + { + if(scrolldelay > 0) + --scrolldelay; + else + { + scrolldelay = DEFAULT_SCROLL_DELAY-2; + scrollbarBoxBtn->ScrollIsOn(1); + if (position2 > position1) + { + prev = this->FindMenuItem(gameIndex[selectedItem], -1); + + if (prev >= 0) + { + if (selectedItem == 0) + { + // move list up by 1 + listOffset = prev; + } + else + { + game[selectedItem]->ResetState(); + game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); + selectedItem--; + } + } + } + else if (position2 < position1) + { + next = this->FindMenuItem(gameIndex[selectedItem], 1); + if (next >= 0) + { + if (selectedItem == pagesize - 1) + { + // move list down by 1 + listOffset = this->FindMenuItem(listOffset, 1); + } + else if (game[selectedItem + 1]->IsVisible()) + { + game[selectedItem]->ResetState(); + game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); + selectedItem++; + } + } + } + } + } + else if (pressedChan == -1 || (pressedChan == t->chan && !(t->wpad.btns_h & WPAD_BUTTON_B))) { scrollbarBoxBtn->ScrollIsOn(0); position2 = 0; @@ -600,6 +614,11 @@ void GuiGameBrowser::Update(GuiTrigger * t) } } + if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h) + { + pressedChan = -1; + } + if (old_listOffset != listOffset) UpdateListEntries(); if (updateCB) updateCB(this); diff --git a/source/menu.cpp b/source/menu.cpp index 14b66473..4c64d180 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -106,15 +106,17 @@ static void * UpdateGUI(void *arg) } mainWindow->Draw(); - if (Settings.tooltips == ON && Theme::ShowTooltips && mainWindow->GetState() != STATE_DISABLED) mainWindow->DrawTooltip(); + if (Settings.tooltips && Theme::ShowTooltips && mainWindow->GetState() != STATE_DISABLED) mainWindow->DrawTooltip(); for (i = 3; i >= 0; i--) { if (userInput[i].wpad.ir.valid) { - Menu_DrawImg(userInput[i].wpad.ir.x - 48, userInput[i].wpad.ir.y - 48, 200.0, 96, 96, - pointer[i]->GetImage(), userInput[i].wpad.ir.angle, Settings.widescreen ? 0.8 : 1, 1, 255, 0, - 0, 0, 0, 0, 0, 0, 0); + Menu_DrawImg(userInput[i].wpad.ir.x - pointer[i]->GetWidth()/2, + userInput[i].wpad.ir.y - pointer[i]->GetHeight()/2, + 9900.0f, pointer[i]->GetWidth(), pointer[i]->GetHeight(), + pointer[i]->GetImage(), userInput[i].wpad.ir.angle, + Settings.widescreen ? 0.8f : 1.f, 1.f, 255, 0, 0, 0, 0, 0, 0, 0, 0); } } diff --git a/source/network/update.cpp b/source/network/update.cpp index 552f714d..469fe1dd 100644 --- a/source/network/update.cpp +++ b/source/network/update.cpp @@ -49,7 +49,6 @@ #include "xml/WiiTDB.hpp" #include "wad/nandtitle.h" #include "wad/wad.h" -#include "buildtype.h" #include "sys.h" #include "svnrev.h" diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index a8d26718..bcc83835 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -41,7 +41,6 @@ #include "language/UpdateLanguage.h" #include "gecko.h" #include "lstub.h" -#include "buildtype.h" /*** Extern variables ***/ s32 gameStart = 0; diff --git a/source/prompts/gameinfo.cpp b/source/prompts/gameinfo.cpp index 2b17087c..652dfee4 100644 --- a/source/prompts/gameinfo.cpp +++ b/source/prompts/gameinfo.cpp @@ -363,7 +363,7 @@ static int InternalShowGameInfo(char *ID) else { boxCov = new BoxCover(cover, loadFlatCover); - boxCov->SetPosition(-1.75f, 0.4f, -5.0f); + boxCov->SetPosition(-1.6f, 0.4f, -27.0f); boxCov->SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 40); if(GameInfo.CaseColor == 0xFF0000) diff --git a/source/settings/CSettings.cpp b/source/settings/CSettings.cpp index 9ce5ddab..be017878 100644 --- a/source/settings/CSettings.cpp +++ b/source/settings/CSettings.cpp @@ -91,7 +91,7 @@ void CSettings::SetDefault() tooltips = ON; gamesound = ON; parentalcontrol = PARENTAL_LVL_ADULT; - cios = 249; + cios = BUILD_IOS; gridRows = 3; error002 = 2; partition = -1; diff --git a/source/sys.cpp b/source/sys.cpp index cf495bdc..f21a1677 100644 --- a/source/sys.cpp +++ b/source/sys.cpp @@ -24,7 +24,6 @@ #include "gecko.h" #include "xml/xml.h" #include "wad/nandtitle.h" -#include "buildtype.h" extern "C" { diff --git a/source/themes/Resources.cpp b/source/themes/Resources.cpp index d98ecfdc..7b1b7fa7 100644 --- a/source/themes/Resources.cpp +++ b/source/themes/Resources.cpp @@ -72,6 +72,10 @@ RecourceFile Resources::RecourceFiles[] = {"player2_point.png", player2_point_png, player2_point_png_size, NULL, 0}, {"player3_point.png", player3_point_png, player3_point_png_size, NULL, 0}, {"player4_point.png", player4_point_png, player4_point_png_size, NULL, 0}, + {"player1_grab.png", player1_grab_png, player1_grab_png_size, NULL, 0}, + {"player2_grab.png", player2_grab_png, player2_grab_png_size, NULL, 0}, + {"player3_grab.png", player3_grab_png, player3_grab_png_size, NULL, 0}, + {"player4_grab.png", player4_grab_png, player4_grab_png_size, NULL, 0}, {"rplayer1_point.png", rplayer1_point_png, rplayer1_point_png_size, NULL, 0}, {"rplayer2_point.png", rplayer2_point_png, rplayer2_point_png_size, NULL, 0}, {"rplayer3_point.png", rplayer3_point_png, rplayer3_point_png_size, NULL, 0}, diff --git a/source/video.cpp b/source/video.cpp index 3f5a4e4a..ed85d606 100644 --- a/source/video.cpp +++ b/source/video.cpp @@ -26,19 +26,16 @@ static GXRModeObj *vmode; // Menu video mode static unsigned char gp_fifo[DEFAULT_FIFO_SIZE] ATTRIBUTE_ALIGN ( 32 ); static Mtx GXmodelView2D; static Mtx44 projection; -int screenheight; -int screenwidth; +int screenheight = 480; +int screenwidth = 640; u32 frameCount = 0; -u8 * gameScreenTex = NULL; // a GX texture screen capture of the game -u8 * gameScreenTex2 = NULL; // a GX texture screen capture of the game (copy) - /**************************************************************************** * ResetVideo_Menu * * Reset the video/rendering mode for the menu ****************************************************************************/ -void ResetVideo_Menu() +static void ResetVideo_Menu() { f32 yscale; u32 xfbHeight; @@ -85,15 +82,15 @@ void ResetVideo_Menu() GX_SetNumChans(1); GX_SetNumTexGens(1); - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); guMtxIdentity(GXmodelView2D); - guMtxTransApply(GXmodelView2D, GXmodelView2D, 0.0F, 0.0F, -200.0F); + guMtxTransApply(GXmodelView2D, GXmodelView2D, 0.0F, 0.0F, -9900.0F); GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); - guOrtho(projection, 0, 479, 0, 639, 0, 300); + guOrtho(projection, 0, screenheight-1, 0, screenwidth-1, 0, 10000); GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC); GX_SetViewport(0.0f, 0.0f, vmode->fbWidth, vmode->efbHeight, 0.0f, 1.0f); @@ -220,7 +217,8 @@ void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[] GX_LoadTexObj(&texObj, GX_TEXMAP0); GX_InvalidateTexAll(); - GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); Mtx m, m1, m2, mv; @@ -228,18 +226,13 @@ void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[] height *= 0.5f; guMtxIdentity(m1); guMtxScaleApply(m1, m1, scaleX, scaleY, 1.0f); - guVector axis = ( guVector ) - { - 0 , 0, 1 - }; - guMtxRotAxisDeg ( m2, &axis, degrees ); - // guMtxConcat(m2,m1,m); + guVector axis = (guVector) {0 , 0, 1}; + guMtxRotAxisDeg (m2, &axis, degrees); guMtxConcat(m1, m2, m); guMtxTransApply(m, m, xpos + width + 0.5f, ypos + height + 0.5f, zpos); guMtxConcat(GXmodelView2D, m, mv); GX_LoadPosMtxImm(mv, GX_PNMTX0); - // GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position3f32(-width + XX1, -height + YY1, 0); @@ -258,13 +251,9 @@ void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[] GX_Color4u8(0xFF, 0xFF, 0xFF, alpha); GX_TexCoord2f32(0, 1); - // - GX_End(); - GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); + GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); } /**************************************************************************** @@ -274,7 +263,11 @@ void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[] ***************************************************************************/ void Menu_DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color, u8 filled) { + GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); + GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); u8 fmt; long n; @@ -301,6 +294,7 @@ void Menu_DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color, u8 f GX_Color4u8(color.r, color.g, color.b, color.a); } GX_End(); + GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); } void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 distance, u8 data[], f32 deg_alpha, @@ -316,7 +310,8 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 GX_LoadTexObj(&texObj, GX_TEXMAP0); GX_InvalidateTexAll(); - GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); f32 cos_beta = cos(DegToRad( deg_beta )); @@ -332,17 +327,10 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 guMtxIdentity(m1); guMtxScaleApply(m1, m1, scaleX, scaleY, 1.0); - guVector axis2 = ( guVector ) - { - 0 , 1, 0 - }; + guVector axis2 = (guVector) {0 , 1, 0}; guMtxRotAxisDeg ( m2, &axis2, deg_beta ); - guVector axis = ( guVector ) - { - 0 , 0, 1 - }; + guVector axis = (guVector) {0 , 0, 1}; guMtxRotAxisDeg ( m3, &axis, deg_alpha ); - // guMtxConcat(m2,m1,m); guMtxConcat(m3, m4, m3); // move distance then rotate z-axis guMtxConcat(m2, m3, m2); // rotate y-axis guMtxConcat(m1, m2, m); // scale @@ -355,9 +343,9 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 guMtxConcat(GXmodelView2D, m, mv); GX_LoadPosMtxImm(mv, GX_PNMTX0); + GX_Begin(GX_QUADS, GX_VTXFMT0, 4); if (shadow) { - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position3f32(-width, -height, 0); GX_Color4u8(0, 0, 0, alpha); GX_TexCoord2f32(0, 0); @@ -376,7 +364,6 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 } else { - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); GX_Position3f32(-width, -height, 0); GX_Color4u8(0xFF, 0xFF, 0xFF, alpha); GX_TexCoord2f32(0, 0); @@ -396,9 +383,6 @@ void Menu_DrawDiskCover(f32 xpos, f32 ypos, f32 zpos, u16 width, u16 height, u16 GX_End(); GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); - - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); } void Menu_DrawTPLImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, GXTexObj *texObj, f32 degrees, f32 scaleX, @@ -409,7 +393,8 @@ void Menu_DrawTPLImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, GXTexO GX_LoadTexObj(texObj, GX_TEXMAP0); GX_InvalidateTexAll(); - GX_SetTevOp(GX_TEVSTAGE0, GX_REPLACE); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); Mtx m, m1, m2, mv; @@ -417,10 +402,7 @@ void Menu_DrawTPLImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, GXTexO height *= .5; guMtxIdentity(m1); guMtxScaleApply(m1, m1, scaleX, scaleY, 1.0); - guVector axis = ( guVector ) - { - 0 , 0, 1 - }; + guVector axis = (guVector) {0 , 0, 1}; guMtxRotAxisDeg ( m2, &axis, degrees ); guMtxConcat(m1, m2, m); @@ -446,10 +428,8 @@ void Menu_DrawTPLImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, GXTexO GX_TexCoord2f32(0, 1); GX_End(); - GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - GX_SetVtxDesc(GX_VA_TEX0, GX_NONE); + GX_LoadPosMtxImm(GXmodelView2D, GX_PNMTX0); } /**************************************************************************** * TakeScreenshot diff --git a/source/video.h b/source/video.h index 902dd4fc..fe83b04f 100644 --- a/source/video.h +++ b/source/video.h @@ -12,9 +12,7 @@ #include void InitVideo(); -void InitVideodebug(); void StopGX(); -void ResetVideo_Menu(); void Menu_Render(); void Menu_DrawImg(f32 xpos, f32 ypos, f32 zpos, f32 width, f32 height, u8 data[], f32 degrees, f32 scaleX, f32 scaleY, u8 alphaF, int XX1, int YY1, int XX2, int YY2, int XX3, int YY3, int XX4, int YY4);