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 00000000..d95c2b35 Binary files /dev/null and b/source/images/player1_grab.png differ diff --git a/source/images/player2_grab.png b/source/images/player2_grab.png new file mode 100644 index 00000000..5f3f6abd Binary files /dev/null and b/source/images/player2_grab.png differ diff --git a/source/images/player3_grab.png b/source/images/player3_grab.png new file mode 100644 index 00000000..c0c3546b Binary files /dev/null and b/source/images/player3_grab.png differ diff --git a/source/images/player4_grab.png b/source/images/player4_grab.png new file mode 100644 index 00000000..7e9a814e Binary files /dev/null and b/source/images/player4_grab.png differ 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);